Handle better formulas like f(X,X)
This commit is contained in:
parent
0a661b0462
commit
691188d5c9
@ -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());
|
||||
|
@ -200,7 +200,7 @@ class ConstraintTree
|
||||
|
||||
ConstraintTrees ground (LogVar);
|
||||
|
||||
void copyLogVar (LogVar,LogVar);
|
||||
void cloneLogVar (LogVar, LogVar);
|
||||
|
||||
ConstraintTree& operator= (const ConstraintTree& ct);
|
||||
|
||||
|
@ -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_));
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user