From 9d5801ef7f6e82f79fd12f5d39d0b08cb8c27933 Mon Sep 17 00:00:00 2001 From: Tiago Gomes Date: Sat, 5 May 2012 23:11:32 +0100 Subject: [PATCH] ony summout a group of rand vars if they not appear in another position on the parfactor --- packages/CLPBN/clpbn/bp/FoveSolver.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/CLPBN/clpbn/bp/FoveSolver.cpp b/packages/CLPBN/clpbn/bp/FoveSolver.cpp index e844c5b78..97712035a 100644 --- a/packages/CLPBN/clpbn/bp/FoveSolver.cpp +++ b/packages/CLPBN/clpbn/bp/FoveSolver.cpp @@ -190,9 +190,22 @@ SumOutOperator::validOp ( if (isToEliminate (*pfIters[0], group, query) == false) { return false; } + unordered_map groupToRange; for (unsigned i = 0; i < pfIters.size(); i++) { - int fIdx = (*pfIters[i])->indexOfGroup (group); + const ProbFormulas& formulas = (*pfIters[i])->arguments(); + int fIdx = -1; + for (unsigned j = 0; j < formulas.size(); j++) { + if (formulas[j].group() == group) { + if (fIdx != -1) { + // only summout a group of rand vars if they don't + // appear in another position on the factor + return false; + } else { + fIdx = j; + } + } + } if ((*pfIters[i])->argument (fIdx).contains ( (*pfIters[i])->elimLogVars()) == false) { return false;