LogVars ConstraintTree::expand (LogVar X) { moveToBottom ({X}); assert (isCountNormalized (X)); CTNodes nodes = getNodesAtLevel (logVars_.size() - 1); unsigned nrSymbols = getConditionalCount (X); for (CTNodes::const_iterator it = nodes.begin(); it != nodes.end(); ++ it) { Symbols symbols; const CTChilds& childs = (*it)->childs(); for (CTChilds::const_iterator chIt = childs.begin(); chIt != childs.end(); ++ chIt) { symbols.push_back ((*chIt)->symbol()); } (*it)->removeAndDeleteAllChilds(); CTNode* prev = *it; assert (symbols.size() == nrSymbols); for (size_t j = 0; j < nrSymbols; j++) { CTNode* newNode = new CTNode (symbols[j], (*it)->level() + j); prev->mergeSubtree (newNode); prev = newNode; } } LogVars newLvs; logVars_.pop_back(); for (size_t i = 0; i < nrSymbols; i++) { logVars_.push_back (LogVar (logVarSet_.back() + 1)); newLvs.push_back (LogVar (logVarSet_.back() + 1)); logVarSet_.insert (LogVar (logVarSet_.back() + 1)); } logVarSet_ -= X; return newLvs; }
void readLiftedEvidence ( YAP_Term observedList, ObservedFormulas& obsFormulas) { while (observedList != YAP_TermNil()) { YAP_Term pair = YAP_HeadOfTerm (observedList); YAP_Term ground = YAP_ArgOfTerm (1, pair); Symbol functor; Symbols args; if (YAP_IsAtomTerm (ground)) { string name ((char*) YAP_AtomName (YAP_AtomOfTerm (ground))); functor = LiftedUtils::getSymbol (name); } else { assert (YAP_IsApplTerm (ground)); YAP_Functor yapFunctor = YAP_FunctorOfTerm (ground); string name ((char*) (YAP_AtomName (YAP_NameOfFunctor (yapFunctor)))); functor = LiftedUtils::getSymbol (name); unsigned arity = (unsigned) YAP_ArityOfFunctor (yapFunctor); for (unsigned i = 1; i <= arity; i++) { YAP_Term ti = YAP_ArgOfTerm (i, ground); assert (YAP_IsAtomTerm (ti)); string arg ((char *) YAP_AtomName (YAP_AtomOfTerm (ti))); args.push_back (LiftedUtils::getSymbol (arg)); } } unsigned evidence = (unsigned) YAP_IntOfTerm (YAP_ArgOfTerm (2, pair)); bool found = false; for (size_t i = 0; i < obsFormulas.size(); i++) { if (obsFormulas[i].functor() == functor && obsFormulas[i].arity() == args.size() && obsFormulas[i].evidence() == evidence) { obsFormulas[i].addTuple (args); found = true; } } if (found == false) { obsFormulas.push_back (ObservedFormula (functor, evidence, args)); } observedList = YAP_TailOfTerm (observedList); } }
int runLiftedSolver (void) { LiftedNetwork* network = (LiftedNetwork*) YAP_IntOfTerm (YAP_ARG1); YAP_Term taskList = YAP_ARG2; vector<Params> results; ParfactorList pfListCopy (*network->first); LiftedVe::absorveEvidence (pfListCopy, *network->second); while (taskList != YAP_TermNil()) { Grounds queryVars; YAP_Term jointList = YAP_HeadOfTerm (taskList); while (jointList != YAP_TermNil()) { YAP_Term ground = YAP_HeadOfTerm (jointList); if (YAP_IsAtomTerm (ground)) { string name ((char*) YAP_AtomName (YAP_AtomOfTerm (ground))); queryVars.push_back (Ground (LiftedUtils::getSymbol (name))); } else { assert (YAP_IsApplTerm (ground)); YAP_Functor yapFunctor = YAP_FunctorOfTerm (ground); string name ((char*) (YAP_AtomName (YAP_NameOfFunctor (yapFunctor)))); unsigned arity = (unsigned) YAP_ArityOfFunctor (yapFunctor); Symbol functor = LiftedUtils::getSymbol (name); Symbols args; for (unsigned i = 1; i <= arity; i++) { YAP_Term ti = YAP_ArgOfTerm (i, ground); assert (YAP_IsAtomTerm (ti)); string arg ((char *) YAP_AtomName (YAP_AtomOfTerm (ti))); args.push_back (LiftedUtils::getSymbol (arg)); } queryVars.push_back (Ground (functor, args)); } jointList = YAP_TailOfTerm (jointList); } if (Globals::liftedSolver == LiftedSolver::FOVE) { LiftedVe solver (pfListCopy); if (Globals::verbosity > 0 && taskList == YAP_ARG2) { solver.printSolverFlags(); cout << endl; } results.push_back (solver.solveQuery (queryVars)); } else if (Globals::liftedSolver == LiftedSolver::LBP) { LiftedBp solver (pfListCopy); if (Globals::verbosity > 0 && taskList == YAP_ARG2) { solver.printSolverFlags(); cout << endl; } results.push_back (solver.solveQuery (queryVars)); } else { assert (false); } taskList = YAP_TailOfTerm (taskList); } YAP_Term list = YAP_TermNil(); for (size_t i = results.size(); i-- > 0; ) { const Params& beliefs = results[i]; YAP_Term queryBeliefsL = YAP_TermNil(); for (size_t j = beliefs.size(); j-- > 0; ) { YAP_Int sl1 = YAP_InitSlot (list); YAP_Term belief = YAP_MkFloatTerm (beliefs[j]); queryBeliefsL = YAP_MkPairTerm (belief, queryBeliefsL); list = YAP_GetFromSlot (sl1); YAP_RecoverSlots (1); } list = YAP_MkPairTerm (queryBeliefsL, list); } return YAP_Unify (list, YAP_ARG3); }