From 691188d5c9a0656df26592e89668f59f10d9c452 Mon Sep 17 00:00:00 2001 From: Tiago Gomes Date: Tue, 18 Dec 2012 23:51:51 +0000 Subject: [PATCH] Handle better formulas like f(X,X) --- packages/CLPBN/horus/ConstraintTree.cpp | 2 +- packages/CLPBN/horus/ConstraintTree.h | 2 +- packages/CLPBN/horus/Parfactor.cpp | 17 +++++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/CLPBN/horus/ConstraintTree.cpp b/packages/CLPBN/horus/ConstraintTree.cpp index bfabc982c..7b3b6bb6f 100644 --- a/packages/CLPBN/horus/ConstraintTree.cpp +++ b/packages/CLPBN/horus/ConstraintTree.cpp @@ -883,7 +883,7 @@ ConstraintTree::ground (LogVar X) void -ConstraintTree::copyLogVar (LogVar X_1, LogVar X_2) +ConstraintTree::cloneLogVar (LogVar X_1, LogVar X_2) { moveToBottom ({X_1}); CTNodes leafs = getNodesAtLevel (logVars_.size()); diff --git a/packages/CLPBN/horus/ConstraintTree.h b/packages/CLPBN/horus/ConstraintTree.h index c50f45dc3..cccb070b4 100644 --- a/packages/CLPBN/horus/ConstraintTree.h +++ b/packages/CLPBN/horus/ConstraintTree.h @@ -200,7 +200,7 @@ class ConstraintTree ConstraintTrees ground (LogVar); - void copyLogVar (LogVar,LogVar); + void cloneLogVar (LogVar, LogVar); ConstraintTree& operator= (const ConstraintTree& ct); diff --git a/packages/CLPBN/horus/Parfactor.cpp b/packages/CLPBN/horus/Parfactor.cpp index 6eaa32e72..38a77892e 100644 --- a/packages/CLPBN/horus/Parfactor.cpp +++ b/packages/CLPBN/horus/Parfactor.cpp @@ -26,7 +26,24 @@ Parfactor::Parfactor ( } } } + LogVar newLv = logVars.size(); constr_ = new ConstraintTree (logVars, tuples); + // Change formulas like f(X,X), X in {(p1),(p2),...} + // to be like f(X,Y), (X,Y) in {(p1,p1),(p2,p2),...}. + // This will simplify shattering on the constraint tree. + for (size_t i = 0; i < args_.size(); i++) { + LogVarSet lvSet; + LogVars& lvs = args_[i].logVars(); + for (size_t j = 0; j < lvs.size(); j++) { + if (lvSet.contains (lvs[j]) == false) { + lvSet |= lvs[j]; + } else { + constr_->cloneLogVar (lvs[j], newLv); + lvs[j] = newLv; + ++ newLv; + } + } + } assert (params_.size() == Util::sizeExpected (ranges_)); }