support smoothing in inclusion-exclusion nodes

This commit is contained in:
Tiago Gomes 2012-10-30 15:48:19 +00:00
parent b31a047635
commit 77ef7b87cd
2 changed files with 47 additions and 40 deletions

View File

@ -498,32 +498,8 @@ LiftedCircuit::smoothCircuit (CircuitNode* node)
TinySet<LiteralId> lids2 = smoothCircuit (*casted->rightBranch());
TinySet<LiteralId> missingLeft = lids2 - lids1;
TinySet<LiteralId> missingRight = lids1 - lids2;
if (missingLeft.empty() == false) {
Clauses clauses;
for (size_t i = 0; i < missingLeft.size(); i++) {
Clause c = lwcnf_->createClauseForLiteral (missingLeft[i]);
c.addAndNegateLiteral (c.literals()[0]);
clauses.push_back (c);
}
SmoothNode* smoothNode = new SmoothNode (clauses);
CircuitNode** prev = casted->leftBranch();
AndNode* andNode = new AndNode ((*prev)->clauses(),
smoothNode, *prev, " Smoothing");
*prev = andNode;
}
if (missingRight.empty() == false) {
Clauses clauses;
for (size_t i = 0; i < missingRight.size(); i++) {
Clause c = lwcnf_->createClauseForLiteral (missingRight[i]);
c.addAndNegateLiteral (c.literals()[0]);
clauses.push_back (c);
}
SmoothNode* smoothNode = new SmoothNode (clauses);
CircuitNode** prev = casted->rightBranch();
AndNode* andNode = new AndNode ((*prev)->clauses(), smoothNode,
*prev, " Smoothing");
*prev = andNode;
}
createSmoothNode (missingLeft, casted->leftBranch());
createSmoothNode (missingRight, casted->rightBranch());
propagatingLids |= lids1;
propagatingLids |= lids2;
break;
@ -549,7 +525,15 @@ LiftedCircuit::smoothCircuit (CircuitNode* node)
}
case CircuitNodeType::INC_EXC_NODE: {
// TODO
IncExcNode* casted = dynamic_cast<IncExcNode*>(node);
TinySet<LiteralId> lids1 = smoothCircuit (*casted->plus1Branch());
TinySet<LiteralId> lids2 = smoothCircuit (*casted->plus2Branch());
TinySet<LiteralId> missingPlus1 = lids2 - lids1;
TinySet<LiteralId> missingPlus2 = lids1 - lids2;
createSmoothNode (missingPlus1, casted->plus1Branch());
createSmoothNode (missingPlus2, casted->plus2Branch());
propagatingLids |= lids1;
propagatingLids |= lids2;
break;
}
@ -570,6 +554,26 @@ LiftedCircuit::smoothCircuit (CircuitNode* node)
void
LiftedCircuit::createSmoothNode (
const TinySet<LiteralId>& missingLids,
CircuitNode** prev)
{
if (missingLids.empty() == false) {
Clauses clauses;
for (size_t i = 0; i < missingLids.size(); i++) {
Clause c = lwcnf_->createClauseForLiteral (missingLids[i]);
c.addAndNegateLiteral (c.literals()[0]);
clauses.push_back (c);
}
SmoothNode* smoothNode = new SmoothNode (clauses);
*prev = new AndNode ((*prev)->clauses(), smoothNode,
*prev, " Smoothing");
}
}
CircuitNodeType
LiftedCircuit::getCircuitNodeType (const CircuitNode* node) const
{
@ -600,16 +604,6 @@ LiftedCircuit::getCircuitNodeType (const CircuitNode* node) const
string
LiftedCircuit::escapeNode (const CircuitNode* node) const
{
stringstream ss;
ss << "\"" << node << "\"" ;
return ss.str();
}
void
LiftedCircuit::exportToGraphViz (CircuitNode* node, ofstream& os)
{
@ -754,6 +748,16 @@ LiftedCircuit::exportToGraphViz (CircuitNode* node, ofstream& os)
string
LiftedCircuit::escapeNode (const CircuitNode* node) const
{
stringstream ss;
ss << "\"" << node << "\"" ;
return ss.str();
}
void
LiftedCircuit::printClauses (
const CircuitNode* node,

View File

@ -209,14 +209,17 @@ class LiftedCircuit
TinySet<LiteralId> smoothCircuit (CircuitNode* node);
CircuitNodeType getCircuitNodeType (const CircuitNode* node) const;
string escapeNode (const CircuitNode* node) const;
void createSmoothNode (const TinySet<LiteralId>& lids,
CircuitNode** prev);
CircuitNodeType getCircuitNodeType (const CircuitNode* node) const;
void exportToGraphViz (CircuitNode* node, ofstream&);
void printClauses (const CircuitNode* node, ofstream&,
string extraOptions = "");
string escapeNode (const CircuitNode* node) const;
CircuitNode* root_;
const LiftedWCNF* lwcnf_;