void BeliefProp::maxResidualSchedule() { if (nIters_ == 1) { for (size_t i = 0; i < links_.size(); i++) { calculateMessage (links_[i]); SortedOrder::iterator it = sortedOrder_.insert (links_[i]); linkMap_.insert (make_pair (links_[i], it)); } return; } for (size_t c = 0; c < links_.size(); c++) { if (Globals::verbosity > 1) { std::cout << "current residuals:" << std::endl; for (SortedOrder::iterator it = sortedOrder_.begin(); it != sortedOrder_.end(); ++it) { std::cout << " " << std::setw (30) << std::left; std::cout << (*it)->toString(); std::cout << "residual = " << (*it)->residual(); std::cout << std::endl; } } SortedOrder::iterator it = sortedOrder_.begin(); BpLink* link = *it; if (link->residual() < accuracy_) { return; } updateMessage (link); link->clearResidual(); sortedOrder_.erase (it); linkMap_.find (link)->second = sortedOrder_.insert (link); // update the messages that depend on message source --> destin const FacNodes& factorNeighbors = link->varNode()->neighbors(); for (size_t i = 0; i < factorNeighbors.size(); i++) { if (factorNeighbors[i] != link->facNode()) { const BpLinks& links = getLinks (factorNeighbors[i]); for (size_t j = 0; j < links.size(); j++) { if (links[j]->varNode() != link->varNode()) { calculateMessage (links[j]); BpLinkMap::iterator iter = linkMap_.find (links[j]); sortedOrder_.erase (iter->second); iter->second = sortedOrder_.insert (links[j]); } } } } if (Globals::verbosity > 1) { Util::printDashedLine(); } } }