// backtracking search for a feasible assignment private Assignment initialAssignmentRec(FactorGraph mdl, Assignment assn, int fi) { if (fi >= mdl.factors().size()) return assn; Factor f = mdl.getFactor(fi); Factor sliced = f.slice(assn); if (sliced.varSet().isEmpty()) { double val = f.value(assn); if (val > 1e-50) { return initialAssignmentRec(mdl, assn, fi + 1); } else { return null; } } for (AssignmentIterator it = sliced.assignmentIterator(); it.hasNext(); ) { double val = sliced.value(it); if (val > 1e-50) { Assignment new_assn = Assignment.union(assn, it.assignment()); Assignment assn_ret = initialAssignmentRec(mdl, new_assn, fi + 1); if (assn_ret != null) return assn_ret; } it.advance(); } return null; }
public void computeMarginals(FactorGraph mdl) { inLogSpace = mdl.getFactor(0) instanceof LogTableFactor; buildJunctionTree(mdl); propagator.computeMarginals(jtCurrent); totalMessagesSent += propagator.getTotalMessagesSent(); }