void VarElim::absorveEvidence (void) { if (Globals::verbosity > 2) { Util::printDashedLine(); cout << "(initial factor list)" << endl; printActiveFactors(); } const VarNodes& varNodes = fg.varNodes(); for (size_t i = 0; i < varNodes.size(); i++) { if (varNodes[i]->hasEvidence()) { if (Globals::verbosity > 1) { cout << "-> aborving evidence on "; cout << varNodes[i]->label() << " = " ; cout << varNodes[i]->getEvidence() << endl; } const vector<size_t>& idxs = varFactors_.find (varNodes[i]->varId())->second; for (size_t j = 0; j < idxs.size(); j++) { Factor* factor = factorList_[idxs[j]]; if (factor->nrArguments() == 1) { factorList_[idxs[j]] = 0; } else { factorList_[idxs[j]]->absorveEvidence ( varNodes[i]->varId(), varNodes[i]->getEvidence()); } } } } }
void VarElim::eliminate (VarId elimVar) { Factor* result = 0; vector<size_t>& idxs = varFactors_.find (elimVar)->second; for (size_t i = 0; i < idxs.size(); i++) { size_t idx = idxs[i]; if (factorList_[idx]) { if (result == 0) { result = new Factor (*factorList_[idx]); } else { result->multiply (*factorList_[idx]); } delete factorList_[idx]; factorList_[idx] = 0; } } totalFactorSize_ += result->size(); if (result->size() > largestFactorSize_) { largestFactorSize_ = result->size(); } if (result != 0 && result->nrArguments() != 1) { result->sumOut (elimVar); factorList_.push_back (result); const VarIds& resultVarIds = result->arguments(); for (size_t i = 0; i < resultVarIds.size(); i++) { vector<size_t>& idxs = varFactors_.find (resultVarIds[i])->second; idxs.push_back (factorList_.size() - 1); } } }