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--; }
void CBKInfEngine::Forward(const CEvidence *pEvidence, int maximize ) { PNL_CHECK_IS_NULL_POINTER(pEvidence); PNL_CHECK_IS_NULL_POINTER(*m_JTreeInfIter); CJtreeInfEngine *pastEng; if( !m_isExact ) { if(m_CRingDistrOnSep.size()) { pastEng = CJtreeInfEngine::Copy(*m_JTreeInfIter); } else { pastEng = *m_JTreeInfIter; } pastEng->DistributeEvidence(); } else { pastEng = *m_JTreeInfIter; } m_JTreeInfIter++; PNL_CHECK_IS_NULL_POINTER(*m_JTreeInfIter); if( (*m_JTreeInfIter)->GetModel()->GetNumberOfNodes() == GetPriorSliceBNet()->GetNumberOfNodes() ) { //CJtreeInfEngine::Release(&(*m_JTreeInfIter)); delete (*m_JTreeInfIter); (*m_JTreeInfIter) = CJtreeInfEngine::Copy(m_p1_5SliceJtreeInf); } (*m_JTreeInfIter)->ShrinkObserved( pEvidence, maximize ); intVecVector::iterator clustersItFrom, clustersItEnd; if( GetTime() == 1 ) { clustersItFrom = m_clustersPrSl.begin(); clustersItEnd = m_clustersPrSl.end(); } else { clustersItFrom = m_clusters1_5Sl.begin() + m_clustersPrSl.size(); clustersItEnd = m_clusters1_5Sl.end(); } intVecVector::iterator clustersItTo = m_clusters1_5Sl.begin(); intVector::iterator JTreeNdsIt = m_clqs1_5Sl.begin(); distrPVector::iterator sepIt = distrPVector::iterator(); if(m_CRingDistrOnSep.size()) { sepIt = (*m_CDistrOnSepIter).begin(); } const CPotential *queryPot; for( ; clustersItFrom != clustersItEnd; clustersItFrom++, clustersItTo++, JTreeNdsIt++) { pastEng->MarginalNodes( &(clustersItFrom->front()), clustersItFrom->size(), 1 ); if( maximize ) { queryPot = pastEng->GetQueryMPE(); } else { queryPot = pastEng->GetQueryJPD(); } (*m_JTreeInfIter)->MultJTreeNodePotByDistribFun(*JTreeNdsIt, &(clustersItTo->front()), queryPot->GetDistribFun()); if(m_CRingDistrOnSep.size()) { delete (*sepIt); *sepIt = queryPot->GetDistribFun()->CloneWithSharedMatrices(); sepIt++; } } (*m_JTreeInfIter)->CollectEvidence(); if( !m_isExact && m_CRingDistrOnSep.size()) { //CJtreeInfEngine::Release(&pastEng); delete pastEng; pastEng = NULL; } m_CurrentTime++; if(m_CRingDistrOnSep.size()) { m_CDistrOnSepIter++; } }