Пример #1
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++;
    }
    
    
}
Пример #2
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--;
    
}
Пример #3
0
int CompareViterbyArHMM( CDBN* pDBN, int nTimeSlice, float eps )
{
    CBNet * pUnrolledDBN;
    pUnrolledDBN = static_cast<CBNet *>( pDBN->UnrollDynamicModel( nTimeSlice ) );


    /////////////////////////////////////////////////////////////////////////////
    //Create inference for unrolled DBN
    ////////////////////////////////////////////////////////////////////////////
    CEvidence *myEvidenceForUnrolledDBN;
    pEvidencesVector myEvidencesForDBN;
    CreateEvidencesArHMM( pDBN, nTimeSlice, &myEvidencesForDBN );
    myEvidenceForUnrolledDBN =
        CreateEvidenceForUnrolledArHMM(pUnrolledDBN , nTimeSlice, myEvidencesForDBN);
    CJtreeInfEngine *pUnrolJTree = CJtreeInfEngine::Create( pUnrolledDBN );

    //////////////////////////////////////////////////////////////////////////////

    /////////////////////////////////////////////////////////////////////////////
    //Create inference (smoothing) for DBN

    C1_5SliceJtreeInfEngine *pDynamicJTree;
    pDynamicJTree = C1_5SliceJtreeInfEngine::Create( pDBN );
    pUnrolJTree->EnterEvidence( myEvidenceForUnrolledDBN, 1 );
    pDynamicJTree->DefineProcedure( ptViterbi, nTimeSlice );
    pDynamicJTree->EnterEvidence( &myEvidencesForDBN.front(), nTimeSlice );
    pDynamicJTree->FindMPE();
    /////////////////////////////////////////////////////////////////////////////
    //
    //////////////////////////////////////////////////////////////////////////
    intVector queryForDBN, queryForDBNPrior;
    intVecVector queryForUnrollBnet;
    DefineQueryArHMM( pDBN, nTimeSlice,
	&queryForDBNPrior,	&queryForDBN, &queryForUnrollBnet );
    int itogResult = TRUE;
    int slice;
    for(slice = 0; slice < nTimeSlice; slice++)
    {

	pUnrolJTree->MarginalNodes( &(queryForUnrollBnet[slice]).front(),
	    (queryForUnrollBnet[slice]).size() );

	if( slice )
	{
	    pDynamicJTree->MarginalNodes( &queryForDBN.front(),
		queryForDBN.size(), slice );
	}
	else
	{
	    pDynamicJTree->MarginalNodes( &queryForDBNPrior.front(),
		queryForDBNPrior.size(), slice );
	}



	intVector pObsNodesOut1;
	intVector pObsNodesOut2;
	pnlVector<const unsigned char*> vals1;
	pnlVector<const unsigned char*> vals2;
	const CEvidence* pEv1 = pUnrolJTree->GetMPE();
	const CEvidence* pEv2 = pDynamicJTree->GetMPE();



	int nObsNodes = pEv1->GetNumberObsNodes();
	const CNodeType *const* nt = pEv1->GetNodeTypes();
	for(int i = 0; i < nObsNodes; i++)
	{
	    if(nt[i]->IsDiscrete())
	    {
		const int v1 = (pEv1->GetValueBySerialNumber(i)->GetInt());
		const int v2 = (pEv2->GetValueBySerialNumber(i)->GetInt());
		if (v2 != v1)
		{
		    itogResult = 0;
		    break;
		}
		
	    }
	    else
	    {
		int nodeSz = nt[i]->GetNodeSize();
		for( int j = 0; j < nodeSz; j++)
		{
		    const float v1 = pEv1->GetValueBySerialNumber(i)[j].GetFlt();
		    const float v2 = pEv2->GetValueBySerialNumber(i)[j].GetFlt();
		    if (v2 != v1)
		    {
			itogResult = 0;
			break;
		    }
		}
	    }
	    
	}
	if( !itogResult )
	{
	    if( pUnrolJTree->GetQueryMPE()->
		IsFactorsDistribFunEqual(pDynamicJTree->GetQueryMPE(), eps ) )
	    {
		itogResult = 1;
	    }
	    else
	    {
		pEv1->Dump();
		pEv2->Dump();
	    }
	}
	

    }
    for( slice = 0; slice < myEvidencesForDBN.size(); slice++ )
    {
	    delete myEvidencesForDBN[slice];
    }
    
    delete myEvidenceForUnrolledDBN;
    
    delete pUnrolJTree;
    
    delete pUnrolledDBN;

    delete pDynamicJTree;

    return itogResult;
}