void ConstraintTree::getTuples ( CTNode* n, Tuples currTuples, unsigned stopLevel, Tuples& tuplesCollected, CTNodes& continuationNodes) const { if (n->isRoot() == false) { if (currTuples.size() == 0) { currTuples.push_back ({ n->symbol()}); } else { for (size_t i = 0; i < currTuples.size(); i++) { currTuples[i].push_back (n->symbol()); } } if (n->level() == stopLevel) { for (size_t i = 0; i < currTuples.size(); i++) { tuplesCollected.push_back (currTuples[i]); continuationNodes.push_back (n); } return; } } const CTChilds& childs = n->childs(); for (CTChilds::const_iterator chIt = childs.begin(); chIt != childs.end(); ++ chIt) { getTuples (*chIt, currTuples, stopLevel, tuplesCollected, continuationNodes); } }
Tuples PyList_AsTuples(PyObject* list) { if(!PyList_Check(list)) throw Exception("Indices should be given in a list."); Tuples tuples; // convert list of tuples for(int i = 0; i < PyList_Size(list); ++i) { PyObject* tuple = PyList_GetItem(list, i); if(!PyTuple_Check(tuple) || PyTuple_Size(tuple) != 2) throw Exception("Indices should be stored in a list of 2-tuples."); int m, n; if(!PyArg_ParseTuple(tuple, "ii", &m, &n)) throw Exception("Indices should be integers."); tuples.push_back(make_pair(m, n)); } return tuples; }
Parfactor* readParfactor (YAP_Term pfTerm) { // read dist id unsigned distId = YAP_IntOfTerm (YAP_ArgOfTerm (1, pfTerm)); // read the ranges Ranges ranges; YAP_Term rangeList = YAP_ArgOfTerm (3, pfTerm); while (rangeList != YAP_TermNil()) { unsigned range = (unsigned) YAP_IntOfTerm (YAP_HeadOfTerm (rangeList)); ranges.push_back (range); rangeList = YAP_TailOfTerm (rangeList); } // read parametric random vars ProbFormulas formulas; unsigned count = 0; unordered_map<YAP_Term, LogVar> lvMap; YAP_Term pvList = YAP_ArgOfTerm (2, pfTerm); while (pvList != YAP_TermNil()) { YAP_Term formulaTerm = YAP_HeadOfTerm (pvList); if (YAP_IsAtomTerm (formulaTerm)) { string name ((char*) YAP_AtomName (YAP_AtomOfTerm (formulaTerm))); Symbol functor = LiftedUtils::getSymbol (name); formulas.push_back (ProbFormula (functor, ranges[count])); } else { LogVars logVars; YAP_Functor yapFunctor = YAP_FunctorOfTerm (formulaTerm); string name ((char*) YAP_AtomName (YAP_NameOfFunctor (yapFunctor))); Symbol functor = LiftedUtils::getSymbol (name); unsigned arity = (unsigned) YAP_ArityOfFunctor (yapFunctor); for (unsigned i = 1; i <= arity; i++) { YAP_Term ti = YAP_ArgOfTerm (i, formulaTerm); unordered_map<YAP_Term, LogVar>::iterator it = lvMap.find (ti); if (it != lvMap.end()) { logVars.push_back (it->second); } else { unsigned newLv = lvMap.size(); lvMap[ti] = newLv; logVars.push_back (newLv); } } formulas.push_back (ProbFormula (functor, logVars, ranges[count])); } count ++; pvList = YAP_TailOfTerm (pvList); } // read the parameters const Params& params = readParameters (YAP_ArgOfTerm (4, pfTerm)); // read the constraint Tuples tuples; if (lvMap.size() >= 1) { YAP_Term tupleList = YAP_ArgOfTerm (5, pfTerm); while (tupleList != YAP_TermNil()) { YAP_Term term = YAP_HeadOfTerm (tupleList); assert (YAP_IsApplTerm (term)); YAP_Functor yapFunctor = YAP_FunctorOfTerm (term); unsigned arity = (unsigned) YAP_ArityOfFunctor (yapFunctor); assert (lvMap.size() == arity); Tuple tuple (arity); for (unsigned i = 1; i <= arity; i++) { YAP_Term ti = YAP_ArgOfTerm (i, term); if (YAP_IsAtomTerm (ti) == false) { cerr << "error: constraint has free variables" << endl; abort(); } string name ((char*) YAP_AtomName (YAP_AtomOfTerm (ti))); tuple[i - 1] = LiftedUtils::getSymbol (name); } tuples.push_back (tuple); tupleList = YAP_TailOfTerm (tupleList); } } return new Parfactor (formulas, params, tuples, distId); }