Beispiel #1
0
void ShowResultsForInference(const CPotential * pQueryPot, int slice)
{
    int nnodes;
    const int* domain;
    pQueryPot->GetDomain( &nnodes, &domain );
    std::cout<<" probability distribution for nodes [ ";

    int i;
    for( i = 0; i < nnodes; i++ )
    {
	std::cout<<domain[i]<<" ";
    }


    std::cout<<"] at slice "<<slice<<std::endl;
    CMatrix<float>* pMat = pQueryPot->GetMatrix(matTable);

    // graphical model hase been created using dense matrix
    // so, the marginal is also dense
    EMatrixClass type = pMat->GetMatrixClass();
    if( ! ( type == mcDense || type == mcNumericDense || type == mc2DNumericDense ) )
    {
	assert(0);
    }

    int nEl;
    const float* data;
    static_cast<CNumericDenseMatrix<float>*>(pMat)->GetRawData(&nEl, &data);
    for( i = 0; i < nEl; i++ )
    {
	std::cout<<" "<<data[i];
    }
    std::cout<<std::endl;
}
Beispiel #2
0
void ShowCPD( const CCPD* pCPD )
{
    int nnodes;
    const int* domain;
    pCPD->GetDomain( &nnodes, &domain );
    std::cout<<" node "<<domain[nnodes -1]<<" hase the parents ";

    int i;
    for( i = 0; i < nnodes - 1; i++ )
    {
	std::cout<<domain[i]<<" ";
    }

    std::cout<<std::endl;
    CMatrix<float>* pMat = pCPD->GetMatrix(matTable);

    // graphical model hase been created using dense matrix

    EMatrixClass type = pMat->GetMatrixClass();
    if( ! ( type == mcDense || type == mcNumericDense || type == mc2DNumericDense ) )
    {
	assert(0);
    }

    std::cout<<" conditional probability distribution \n";
    int nEl;
    const float* data;
    static_cast<CNumericDenseMatrix<float>*>(pMat)->GetRawData(&nEl, &data);
    for( i = 0; i < nEl; i++ )
    {
	std::cout<<" "<<data[i];
    }

    std::cout<<std::endl<<std::endl;
}
CPNLBase *
CPersistCondGaussianDistribFun::Load(CContextLoad *pContext)
{
    int nNode;
    bool bFactor;
    bool isUnitFun;
    CCondGaussianDistribFun *pDF;
    const CNodeType *const* ppNodeType;

    LoadForDistribFun(&isUnitFun, &nNode, &ppNodeType, pContext);

    pContext->GetAttribute(&nNode, "NumberOfNodes");
    pContext->GetAttribute(&bFactor, "IsFactor");
    
    CMatrix<CGaussianDistribFun*> *mat = static_cast<CMatrix<CGaussianDistribFun*>*>(
	pContext->Get("DistributionMatrix"));
    bool isDense(mat->GetMatrixClass() == mcDense);
	//dynamic_cast<CSparseMatrix<CGaussianDistribFun*>*>(mat) == 0;

    pDF = CCondGaussianDistribFun::Create(bFactor ? 1:0, nNode, ppNodeType, isDense);

    CMatrixIterator<CGaussianDistribFun*> *it = mat->InitIterator();
    intVector index;

    for(; mat->IsValueHere(it); mat->Next(it))
    {
	mat->Index(it, &index);
	pDF->SetDistribFun(*mat->Value(it), &index.front());
    }

    delete it;

    return pDF;
}
void CSamplingInfEngine::Normalization(CPotential *pot)
{
    
    if( pot->GetDistributionType() != dtTabular )
    {
	const pConstNodeTypeVector *nt = pot->GetDistribFun()->GetNodeTypesVector();
	CDistribFun *pUnitFun = CGaussianDistribFun::
	    CreateUnitFunctionDistribution(nt->size(), &nt->front());
	pot->SetDistribFun(pUnitFun);
	delete pUnitFun;
    }
    else
    {
	CMatrix< float > *pMatToSample;
	pMatToSample = static_cast<CTabularDistribFun*>(pot->GetDistribFun())
	    ->GetMatrix(matTable);
	EMatrixClass mc = pMatToSample->GetMatrixClass();
	if( mc != mcNumericDense || mc != mc2DNumericDense )
	{
	    
	    CMatrixIterator<float>* iter = pMatToSample->InitIterator();
	    for( iter; pMatToSample->IsValueHere( iter ); pMatToSample->Next(iter) )
	    {
		*const_cast<float*>(pMatToSample->Value( iter )) = 1.0f;;
		
	    }
	    delete iter;
	}
	else
	{
	    
	    floatVector *data = const_cast< floatVector *>(
		static_cast<CNumericDenseMatrix<float>*>(pMatToSample)->GetVector());
	    floatVector::iterator it1 = data->begin();
	    floatVector::iterator it2 = data->end();
	    for( ; it1 != it2; it1++ )
	    {
		*it1 = 1.0f;
	    }
	}
	
    }
    
}
void Infer_Process(const CBNet* pBnet)
{
	//create simple evidence for node 0 from BNet
	CEvidence* pEvidForWS = CreateEvidenceForBNet(pBnet);

	//create Naive inference for BNet
	CNaiveInfEngine* pNaiveInf = CNaiveInfEngine::Create( pBnet );

	//enter evidence created before
	pNaiveInf->EnterEvidence( pEvidForWS );

	//set the query node
	int numQueryNds = 1;//*<-
	int queryNds[] = { 3 };//*<-
    //get a marginal for query set of nodes
	pNaiveInf->MarginalNodes( queryNds, numQueryNds );
	const CPotential* pMarg = pNaiveInf->GetQueryJPD();
    //display the evidence node and such velue of BNet
	intVector obsNds;
	pConstValueVector obsVls;
	pEvidForWS->GetObsNodesWithValues(&obsNds, &obsVls);

	int i;
	for( i = 0; i < obsNds.size(); i++ )
	{
		std::cout<<" observed value for node "<<obsNds[i];
		std::cout<<" is "<<obsVls[i]->GetInt()<<std::endl;
	}

	//display the query node and such velue of BNet
	int nnodes;
	const int* domain;
	pMarg->GetDomain( &nnodes, &domain );
	std::cout<<" inference results: \n";

	std::cout<<" probability distribution for nodes [ ";

	for( i = 0; i < nnodes; i++ )
	{
		std::cout<<domain[i]<<" ";
	}

	std::cout<<"]"<<std::endl;

	CMatrix<float>* pMat = pMarg->GetMatrix(matTable);

	// graphical model hase been created using dense matrix
	// so, the marginal is also dense
	EMatrixClass type = pMat->GetMatrixClass();
	if( ! ( type == mcDense || type == mcNumericDense || type == mc2DNumericDense ) )
	{
		assert(0);
	}

	int nEl;
	const float* data;
	static_cast<CNumericDenseMatrix<float>*>(pMat)->GetRawData(&nEl, &data);
	for( i = 0; i < nEl; i++ )
	{
		std::cout<<" "<<data[i];
	}
	std::cout<<std::endl;


	delete pEvidForWS;
	delete pNaiveInf;
}