CCPD* CMlStaticStructLearn::ComputeFactor(intVector vFamily, CGraphicalModel* pGrModel, CEvidence** pEvidences) { int nFamily = vFamily.size(); int DomainSize; const int * domain; const CEvidence * pEv; int i; CTabularDistribFun *pDistribFun; CCPD* iCPD = this->CreateRandomCPD(nFamily, &vFamily.front(), pGrModel); int ncases = m_Vector_pEvidences.size(); if ( !(iCPD->GetDistributionType() == dtSoftMax)) { if (m_ScoreMethod != MarLh) { iCPD->UpdateStatisticsML( pEvidences, ncases ); iCPD->ProcessingStatisticalData(ncases); } else { iCPD->GetDomain(&DomainSize, &domain); pDistribFun = static_cast<CTabularDistribFun *>(iCPD->GetDistribFun()); pDistribFun->InitPseudoCounts(m_K2alfa); for (i=0; i<ncases; i++) { pEv = m_Vector_pEvidences[i]; const CEvidence *pEvidences[] = { pEv }; pDistribFun->BayesUpdateFactor(pEvidences, 1, domain); } pDistribFun->PriorToCPD(); } } else { float **evid = NULL; float **full_evid = NULL; BuildFullEvidenceMatrix(&full_evid); CSoftMaxCPD* SoftMaxFactor = (CSoftMaxCPD*)iCPD; SoftMaxFactor->BuildCurrentEvidenceMatrix(&full_evid, &evid,vFamily, m_Vector_pEvidences.size()); SoftMaxFactor->InitLearnData(); SoftMaxFactor->SetMaximizingMethod(mmGradient); SoftMaxFactor->MaximumLikelihood(evid, m_Vector_pEvidences.size(), 0.00001f, 0.01f); SoftMaxFactor->CopyLearnDataToDistrib(); for (int k = 0; k < SoftMaxFactor->GetDomainSize(); k++) { delete [] evid[k]; } delete [] evid; int i; intVector obsNodes; (m_Vector_pEvidences[0])->GetAllObsNodes(&obsNodes); for (i=0; i<obsNodes.size(); i++) { delete [] full_evid[i]; } delete [] full_evid; }; return iCPD; }