Пример #1
0
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--;
    
}