void CBKInfEngine::Backward( int maximize ) { m_CurrentTime--; intVecVector::iterator clustersItFrom, clustersItEnd; clustersItFrom = m_clusters1_5Sl.begin(); clustersItEnd = clustersItFrom + GetNumOfClusters(); CJtreeInfEngine *pFutureInf = *m_JTreeInfIter; m_JTreeInfIter--; CJtreeInfEngine *pCurrentInf = *m_JTreeInfIter; intVector::iterator JTreeNdsIt = m_clqs1_5Sl.begin(); intVecVector::iterator clustersItTo; if( pCurrentInf ->GetModel()->GetNumberOfNodes() == GetPriorSliceBNet()->GetNumberOfNodes() ) { clustersItTo = m_clustersPrSl.begin(); JTreeNdsIt = m_clqsPrSl.begin(); } else { clustersItTo = m_clusters1_5Sl.begin()+ m_clustersPrSl.size(); JTreeNdsIt = m_clqs1_5Sl.begin() + m_clustersPrSl.size(); } distrPVector::iterator sepIt = (*m_CDistrOnSepIter).begin(); const CPotential * queryPotF; for( ; clustersItFrom != clustersItEnd; clustersItFrom++, clustersItTo++, JTreeNdsIt++, sepIt++ ) { pFutureInf->MarginalNodes( &(clustersItFrom->front()), clustersItFrom->size(), 1 ); if( maximize ) { queryPotF = pFutureInf->GetQueryMPE(); } else { queryPotF = pFutureInf->GetQueryJPD(); } //hack queryPotF->GetDistribFun()-> DivideInSelfData(&(clustersItTo->front()),&(clustersItTo->front()), *sepIt); pCurrentInf->MultJTreeNodePotByDistribFun(*JTreeNdsIt, &(clustersItTo->front()), queryPotF->GetDistribFun()); } pCurrentInf->DistributeEvidence(); m_CDistrOnSepIter--; }