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