CPNLBase *
CPersistCondSoftMaxDistribFun::Load(CContextLoad *pContext)
{
    int nNode;
    bool bFactor;
    bool isUnitFun;
    CCondSoftMaxDistribFun *pDF;
    const CNodeType *const* ppNodeType;

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

    pContext->GetAttribute(&nNode, "NumberOfNodes");
    pContext->GetAttribute(&bFactor, "IsFactor");
    
    CMatrix<CSoftMaxDistribFun*> *mat = static_cast<CMatrix<CSoftMaxDistribFun*>*>(
        pContext->Get("DistributionMatrix"));

    pDF = CCondSoftMaxDistribFun::Create(nNode, ppNodeType);

    CMatrixIterator<CSoftMaxDistribFun*> *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;
	    }
	}
	
    }
    
}
bool CSamplingInfEngine::
ConvertingFamilyToPot( int node, const CEvidence* pEv )
{
    bool ret = false;
    CPotential* potToSample = m_potsToSampling[node];
    Normalization(potToSample);
    int i;
    if( !IsAllNdsTab() )
    {
	
	if( GetModel()->GetModelType() == mtBNet )
	{
	    
	    for( i = 0; i < m_environment[node].size(); i++ )
	    {            
		int num = m_environment[node][i];
		CPotential *pot1 = static_cast< CCPD* >( m_currentFactors[ num ] )
		    ->ConvertWithEvidenceToPotential(pEv);
		CPotential *pot2 = pot1->Marginalize(&node, 1);
		delete pot1;
		*potToSample *= *pot2;
		delete pot2;
	    }
	}
	
	else
	{
	    for( i = 0; i < m_environment[node].size(); i++ )
	    {
		int num = m_environment[node][i];
		CPotential *pot1 = static_cast< CPotential* >( m_currentFactors[ num ] )
		    ->ShrinkObservedNodes(pEv);
		CPotential *pot2 = pot1->Marginalize(&node, 1);
		delete pot1;
		*potToSample *= *pot2;
		delete pot2;
	    }
	}
	
    }
    else
    {
	
	CMatrix< float > *pMatToSample;
	pMatToSample = static_cast<CTabularDistribFun*>(potToSample->GetDistribFun())
	    ->GetMatrix(matTable);
	
	intVector dims;
	intVector vls;
	intVector domain;
	
	for( i = 0; i < m_environment[node].size(); i++ )
	{            
	    int num = m_environment[node][i];
	    m_currentFactors[ num ]->GetDomain(&domain);
	    GetObsDimsWithVls( domain, node, pEv, &dims, &vls); 
	    CMatrix< float > *pMat;
	    pMat = static_cast<CTabularDistribFun*>(m_currentFactors[ num ]->
		GetDistribFun())->GetMatrix(matTable);
	    pMat->ReduceOp( &dims.front(), dims.size(), 2, &vls.front(),
		pMatToSample, PNL_ACCUM_TYPE_MUL );
	    dims.clear();
	    vls.clear();
	    domain.clear();
	    
	}
    }
    
    //check for non zero elements
    CMatrix<float> *pMat;
    if( potToSample->GetDistributionType()==dtTabular )
    {	
	pMat = potToSample->GetDistribFun()->GetMatrix(matTable);
    }
    else
    {
	CGaussianDistribFun* pDistr = static_cast<CGaussianDistribFun*>(potToSample->GetDistribFun());
	if(pDistr->GetMomentFormFlag())
	{
	    pMat = pDistr->GetMatrix(matCovariance);
	}
	else
	{
	    pMat = pDistr->GetMatrix(matK);

	}
    }
    CMatrixIterator<float>* iter = pMat->InitIterator();
    for( iter; pMat->IsValueHere( iter ); pMat->Next(iter) )
    {
	
	if(*(pMat->Value( iter )) > FLT_EPSILON)
	{
	    ret = true;
	    break;
	}
    }
    delete iter;
    return ret;
}