From 1380adcfb54bc011365fa8227ce760574a51dbbb Mon Sep 17 00:00:00 2001 From: Tiago Gomes Date: Tue, 15 May 2012 16:45:24 +0100 Subject: [PATCH] support getting tuples of repeated log vars --- packages/CLPBN/clpbn/bp/ConstraintTree.cpp | 35 +++++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/packages/CLPBN/clpbn/bp/ConstraintTree.cpp b/packages/CLPBN/clpbn/bp/ConstraintTree.cpp index 94d49e111..c6d304135 100644 --- a/packages/CLPBN/clpbn/bp/ConstraintTree.cpp +++ b/packages/CLPBN/clpbn/bp/ConstraintTree.cpp @@ -457,12 +457,39 @@ ConstraintTree::tupleSet (unsigned stopLevel) const TupleSet -ConstraintTree::tupleSet (const LogVars& lvs) -{ +ConstraintTree::tupleSet (const LogVars& originalLvs) +{ + LogVars uniqueLvs; + for (unsigned i = 0; i < originalLvs.size(); i++) { + if (Util::contains (uniqueLvs, originalLvs[i]) == false) { + uniqueLvs.push_back (originalLvs[i]); + } + } + Tuples tuples; - moveToTop (lvs); - unsigned stopLevel = lvs.size(); + moveToTop (uniqueLvs); + unsigned stopLevel = uniqueLvs.size(); getTuples (root_, Tuples(), stopLevel, tuples, CTNodes() = {}); + + if (originalLvs.size() != uniqueLvs.size()) { + vector indexes; + indexes.reserve (originalLvs.size()); + for (unsigned i = 0; i < originalLvs.size(); i++) { + indexes.push_back (Util::vectorIndex (uniqueLvs, originalLvs[i])); + } + Tuples tuples2; + tuples2.reserve (tuples.size()); + for (unsigned i = 0; i < tuples.size(); i++) { + Tuple t; + t.reserve (originalLvs.size()); + for (unsigned j = 0; j < originalLvs.size(); j++) { + t.push_back (tuples[i][indexes[j]]); + } + tuples2.push_back (t); + } + return TupleSet (tuples2); + } + return TupleSet (tuples); }