Params BeliefProp::getFactorJoint ( FacNode* fn, const VarIds& jointVarIds) { if (runned_ == false) { runSolver(); } Factor res (fn->factor()); const BpLinks& links = getLinks( fn); for (size_t i = 0; i < links.size(); i++) { Factor msg ({links[i]->varNode()->varId()}, {links[i]->varNode()->range()}, getVarToFactorMsg (links[i])); res.multiply (msg); } res.sumOutAllExcept (jointVarIds); res.reorderArguments (jointVarIds); res.normalize(); Params jointDist = res.params(); if (Globals::logDomain) { Util::exp (jointDist); } return jointDist; }
void BeliefProp::calcFactorToVarMsg (BpLink* link) { FacNode* src = link->facNode(); const VarNode* dst = link->varNode(); const BpLinks& links = getLinks (src); // calculate the product of messages that were sent // to factor `src', except from var `dst' unsigned reps = 1; unsigned msgSize = Util::sizeExpected (src->factor().ranges()); Params msgProduct (msgSize, LogAware::multIdenty()); if (Globals::logDomain) { for (size_t i = links.size(); i-- > 0; ) { if (links[i]->varNode() != dst) { if (Constants::showBpCalcs) { std::cout << " message from " << links[i]->varNode()->label(); std::cout << ": " ; } Util::apply_n_times (msgProduct, getVarToFactorMsg (links[i]), reps, std::plus<double>()); if (Constants::showBpCalcs) { std::cout << std::endl; } } reps *= links[i]->varNode()->range(); } } else { for (size_t i = links.size(); i-- > 0; ) { if (links[i]->varNode() != dst) { if (Constants::showBpCalcs) { std::cout << " message from " << links[i]->varNode()->label(); std::cout << ": " ; } Util::apply_n_times (msgProduct, getVarToFactorMsg (links[i]), reps, std::multiplies<double>()); if (Constants::showBpCalcs) { std::cout << std::endl; } } reps *= links[i]->varNode()->range(); } } Factor result (src->factor().arguments(), src->factor().ranges(), msgProduct); result.multiply (src->factor()); if (Constants::showBpCalcs) { std::cout << " message product: " << msgProduct << std::endl; std::cout << " original factor: " << src->factor().params(); std::cout << std::endl; std::cout << " factor product: " << result.params() << std::endl; } result.sumOutAllExcept (dst->varId()); if (Constants::showBpCalcs) { std::cout << " marginalized: " << result.params() << std::endl; } link->nextMessage() = result.params(); LogAware::normalize (link->nextMessage()); if (Constants::showBpCalcs) { std::cout << " curr msg: " << link->message() << std::endl; std::cout << " next msg: " << link->nextMessage() << std::endl; } }