lifted kc: when not debuging don't keep track of the origin clauses

This commit is contained in:
Tiago Gomes 2012-12-07 11:47:50 +00:00
parent ee1b7dcd21
commit 73b3594c97
2 changed files with 137 additions and 80 deletions

View File

@ -77,9 +77,8 @@ IncExcNode::weight (void) const
double double
LeafNode::weight (void) const LeafNode::weight (void) const
{ {
assert (clauses().size() == 1); assert (clause_.isUnit());
assert (clauses()[0].isUnit()); Clause c = clause_;
Clause c = clauses()[0];
double weight = c.literals()[0].isPositive() double weight = c.literals()[0].isPositive()
? lwcnf_.posWeight (c.literals().front().lid()) ? lwcnf_.posWeight (c.literals().front().lid())
: lwcnf_.negWeight (c.literals().front().lid()); : lwcnf_.negWeight (c.literals().front().lid());
@ -261,7 +260,11 @@ LiftedCircuit::compile (
return; return;
} }
*follow = new CompilationFailedNode (clauses); *follow = new CompilationFailedNode();
if (Globals::verbosity > 1) {
originClausesMap_[*follow] = clauses;
explanationMap_[*follow] = "" ;
}
compilationSucceeded_ = false; compilationSucceeded_ = false;
} }
@ -272,6 +275,9 @@ LiftedCircuit::tryUnitPropagation (
CircuitNode** follow, CircuitNode** follow,
Clauses& clauses) Clauses& clauses)
{ {
if (Globals::verbosity > 1) {
backupClauses_ = clauses;
}
for (size_t i = 0; i < clauses.size(); i++) { for (size_t i = 0; i < clauses.size(); i++) {
if (clauses[i].isUnit()) { if (clauses[i].isUnit()) {
Clauses newClauses; Clauses newClauses;
@ -294,9 +300,13 @@ LiftedCircuit::tryUnitPropagation (
} }
} }
} }
stringstream explanation; AndNode* andNode = new AndNode();
explanation << " UP on" << clauses[i].literals()[0]; if (Globals::verbosity > 1) {
AndNode* andNode = new AndNode (clauses, explanation.str()); originClausesMap_[andNode] = backupClauses_;
stringstream explanation;
explanation << " UP on>" << clauses[i].literals()[0];
explanationMap_[andNode] = explanation.str();
}
Clauses leftClauses = {clauses[i]}; Clauses leftClauses = {clauses[i]};
compile (andNode->leftBranch(), leftClauses); compile (andNode->leftBranch(), leftClauses);
compile (andNode->rightBranch(), newClauses); compile (andNode->rightBranch(), newClauses);
@ -317,6 +327,9 @@ LiftedCircuit::tryIndependence (
if (clauses.size() == 1) { if (clauses.size() == 1) {
return false; return false;
} }
if (Globals::verbosity > 1) {
backupClauses_ = clauses;
}
Clauses depClauses = { clauses[0] }; Clauses depClauses = { clauses[0] };
Clauses indepClauses (clauses.begin() + 1, clauses.end()); Clauses indepClauses (clauses.begin() + 1, clauses.end());
bool finish = false; bool finish = false;
@ -332,7 +345,11 @@ LiftedCircuit::tryIndependence (
} }
} }
if (indepClauses.empty() == false) { if (indepClauses.empty() == false) {
AndNode* andNode = new AndNode (clauses, " Independence"); AndNode* andNode = new AndNode ();
if (Globals::verbosity > 1) {
originClausesMap_[andNode] = backupClauses_;
explanationMap_[andNode] = " Independence" ;
}
compile (andNode->leftBranch(), depClauses); compile (andNode->leftBranch(), depClauses);
compile (andNode->rightBranch(), indepClauses); compile (andNode->rightBranch(), indepClauses);
(*follow) = andNode; (*follow) = andNode;
@ -348,6 +365,9 @@ LiftedCircuit::tryShannonDecomp (
CircuitNode** follow, CircuitNode** follow,
Clauses& clauses) Clauses& clauses)
{ {
if (Globals::verbosity > 1) {
backupClauses_ = clauses;
}
for (size_t i = 0; i < clauses.size(); i++) { for (size_t i = 0; i < clauses.size(); i++) {
const Literals& literals = clauses[i].literals(); const Literals& literals = clauses[i].literals();
for (size_t j = 0; j < literals.size(); j++) { for (size_t j = 0; j < literals.size(); j++) {
@ -364,9 +384,13 @@ LiftedCircuit::tryShannonDecomp (
Clauses rightClauses = { c2 }; Clauses rightClauses = { c2 };
leftClauses.insert (leftClauses.end(), clauses.begin(), clauses.end()); leftClauses.insert (leftClauses.end(), clauses.begin(), clauses.end());
rightClauses.insert (rightClauses.end(), clauses.begin(), clauses.end()); rightClauses.insert (rightClauses.end(), clauses.begin(), clauses.end());
stringstream explanation; OrNode* orNode = new OrNode();
explanation << " SD on " << literals[j]; if (Globals::verbosity > 1) {
OrNode* orNode = new OrNode (clauses, explanation.str()); originClausesMap_[orNode] = backupClauses_;
stringstream explanation;
explanation << " SD on " << literals[j];
explanationMap_[orNode] = explanation.str();
}
compile (orNode->leftBranch(), leftClauses); compile (orNode->leftBranch(), leftClauses);
compile (orNode->rightBranch(), rightClauses); compile (orNode->rightBranch(), rightClauses);
(*follow) = orNode; (*follow) = orNode;
@ -384,6 +408,9 @@ LiftedCircuit::tryInclusionExclusion (
CircuitNode** follow, CircuitNode** follow,
Clauses& clauses) Clauses& clauses)
{ {
if (Globals::verbosity > 1) {
backupClauses_ = clauses;
}
for (size_t i = 0; i < clauses.size(); i++) { for (size_t i = 0; i < clauses.size(); i++) {
Literals depLits = { clauses[i].literals().front() }; Literals depLits = { clauses[i].literals().front() };
Literals indepLits (clauses[i].literals().begin() + 1, Literals indepLits (clauses[i].literals().begin() + 1,
@ -433,9 +460,13 @@ LiftedCircuit::tryInclusionExclusion (
plus2Clauses.push_back (c2); plus2Clauses.push_back (c2);
minusClauses.push_back (c1); minusClauses.push_back (c1);
minusClauses.push_back (c2); minusClauses.push_back (c2);
stringstream explanation; IncExcNode* ieNode = new IncExcNode();
explanation << " IncExc on clause nº " << i + 1; if (Globals::verbosity > 1) {
IncExcNode* ieNode = new IncExcNode (clauses, explanation.str()); originClausesMap_[ieNode] = backupClauses_;
stringstream explanation;
explanation << " IncExc on clause nº " << i + 1;
explanationMap_[ieNode] = explanation.str();
}
compile (ieNode->plus1Branch(), plus1Clauses); compile (ieNode->plus1Branch(), plus1Clauses);
compile (ieNode->plus2Branch(), plus2Clauses); compile (ieNode->plus2Branch(), plus2Clauses);
compile (ieNode->minusBranch(), minusClauses); compile (ieNode->minusBranch(), minusClauses);
@ -455,6 +486,9 @@ LiftedCircuit::tryIndepPartialGrounding (
{ {
// assumes that all literals have logical variables // assumes that all literals have logical variables
// else, shannon decomp was possible // else, shannon decomp was possible
if (Globals::verbosity > 1) {
backupClauses_ = clauses;
}
LogVars rootLogVars; LogVars rootLogVars;
LogVarSet lvs = clauses[0].ipgCandidates(); LogVarSet lvs = clauses[0].ipgCandidates();
for (size_t i = 0; i < lvs.size(); i++) { for (size_t i = 0; i < lvs.size(); i++) {
@ -466,9 +500,13 @@ LiftedCircuit::tryIndepPartialGrounding (
for (size_t j = 0; j < clauses.size(); j++) { for (size_t j = 0; j < clauses.size(); j++) {
newClauses[j].addIpgLogVar (rootLogVars[j]); newClauses[j].addIpgLogVar (rootLogVars[j]);
} }
SetAndNode* node = new SetAndNode (ct.size(), clauses); SetAndNode* setAndNode = new SetAndNode (ct.size());
*follow = node; if (Globals::verbosity > 1) {
compile (node->follow(), newClauses); originClausesMap_[setAndNode] = backupClauses_;
explanationMap_[setAndNode] = " IPG" ;
}
*follow = setAndNode;
compile (setAndNode->follow(), newClauses);
return true; return true;
} }
} }
@ -531,6 +569,9 @@ LiftedCircuit::tryAtomCounting (
return false; return false;
} }
} }
if (Globals::verbosity > 1) {
backupClauses_ = clauses;
}
for (size_t i = 0; i < clauses.size(); i++) { for (size_t i = 0; i < clauses.size(); i++) {
Literals literals = clauses[i].literals(); Literals literals = clauses[i].literals();
for (size_t j = 0; j < literals.size(); j++) { for (size_t j = 0; j < literals.size(); j++) {
@ -539,7 +580,11 @@ LiftedCircuit::tryAtomCounting (
&& ! clauses[i].isCountedLogVar (literals[j].logVars().front())) { && ! clauses[i].isCountedLogVar (literals[j].logVars().front())) {
unsigned nrGroundings = clauses[i].constr().projectedCopy ( unsigned nrGroundings = clauses[i].constr().projectedCopy (
literals[j].logVars()).size(); literals[j].logVars()).size();
SetOrNode* setOrNode = new SetOrNode (nrGroundings, clauses); SetOrNode* setOrNode = new SetOrNode (nrGroundings);
if (Globals::verbosity > 1) {
originClausesMap_[setOrNode] = backupClauses_;
explanationMap_[setOrNode] = " AC" ;
}
Clause c1 (clauses[i].constr().projectedCopy (literals[j].logVars())); Clause c1 (clauses[i].constr().projectedCopy (literals[j].logVars()));
Clause c2 (clauses[i].constr().projectedCopy (literals[j].logVars())); Clause c2 (clauses[i].constr().projectedCopy (literals[j].logVars()));
c1.addLiteral (literals[j]); c1.addLiteral (literals[j]);
@ -734,9 +779,10 @@ LiftedCircuit::smoothCircuit (CircuitNode* node)
} }
case CircuitNodeType::LEAF_NODE: { case CircuitNodeType::LEAF_NODE: {
LeafNode* casted = dynamic_cast<LeafNode*>(node);
propagLits.insert (LitLvTypes ( propagLits.insert (LitLvTypes (
node->clauses()[0].literals()[0].lid(), casted->clause().literals()[0].lid(),
node->clauses()[0].logVarTypes(0))); casted->clause().logVarTypes(0)));
} }
default: default:
@ -754,6 +800,10 @@ LiftedCircuit::createSmoothNode (
CircuitNode** prev) CircuitNode** prev)
{ {
if (missingLits.empty() == false) { if (missingLits.empty() == false) {
if (Globals::verbosity > 1) {
// assert (Util::contains (originClausesMap_, prev));
backupClauses_ = originClausesMap_[*prev];
}
Clauses clauses; Clauses clauses;
for (size_t i = 0; i < missingLits.size(); i++) { for (size_t i = 0; i < missingLits.size(); i++) {
LiteralId lid = missingLits[i].lid(); LiteralId lid = missingLits[i].lid();
@ -771,8 +821,11 @@ LiftedCircuit::createSmoothNode (
clauses.push_back (c); clauses.push_back (c);
} }
SmoothNode* smoothNode = new SmoothNode (clauses, *lwcnf_); SmoothNode* smoothNode = new SmoothNode (clauses, *lwcnf_);
*prev = new AndNode ((*prev)->clauses(), smoothNode, *prev = new AndNode (smoothNode, *prev);
*prev, " Smoothing"); if (Globals::verbosity > 1) {
originClausesMap_[*prev] = backupClauses_;
explanationMap_[*prev] = " Smoothing" ;
}
} }
} }
@ -879,7 +932,7 @@ LiftedCircuit::exportToGraphViz (CircuitNode* node, ofstream& os)
os << auxNode << " [" << opStyle << "label=\"\"]" << endl; os << auxNode << " [" << opStyle << "label=\"\"]" << endl;
os << escapeNode (node) << " -> " << auxNode; os << escapeNode (node) << " -> " << auxNode;
os << " [label=\"" << node->explanation() << "\"]" ; os << " [label=\"" << getExplanationString (node) << "\"]" ;
os << endl; os << endl;
os << auxNode << " -> " ; os << auxNode << " -> " ;
@ -903,7 +956,7 @@ LiftedCircuit::exportToGraphViz (CircuitNode* node, ofstream& os)
os << auxNode << " [" << opStyle << "label=\"\"]" << endl; os << auxNode << " [" << opStyle << "label=\"\"]" << endl;
os << escapeNode (node) << " -> " << auxNode; os << escapeNode (node) << " -> " << auxNode;
os << " [label=\"" << node->explanation() << "\"]" ; os << " [label=\"" << getExplanationString (node) << "\"]" ;
os << endl; os << endl;
os << auxNode << " -> " ; os << auxNode << " -> " ;
@ -927,7 +980,7 @@ LiftedCircuit::exportToGraphViz (CircuitNode* node, ofstream& os)
os << auxNode << " [" << opStyle << "label=\"(X)\"]" << endl; os << auxNode << " [" << opStyle << "label=\"(X)\"]" << endl;
os << escapeNode (node) << " -> " << auxNode; os << escapeNode (node) << " -> " << auxNode;
os << " [label=\"" << node->explanation() << "\"]" ; os << " [label=\"" << getExplanationString (node) << "\"]" ;
os << endl; os << endl;
os << auxNode << " -> " ; os << auxNode << " -> " ;
@ -945,7 +998,7 @@ LiftedCircuit::exportToGraphViz (CircuitNode* node, ofstream& os)
os << auxNode << " [" << opStyle << "label=\"∧(X)\"]" << endl; os << auxNode << " [" << opStyle << "label=\"∧(X)\"]" << endl;
os << escapeNode (node) << " -> " << auxNode; os << escapeNode (node) << " -> " << auxNode;
os << " [label=\"" << node->explanation() << "\"]" ; os << " [label=\"" << getExplanationString (node) << "\"]" ;
os << endl; os << endl;
os << auxNode << " -> " ; os << auxNode << " -> " ;
@ -964,7 +1017,7 @@ LiftedCircuit::exportToGraphViz (CircuitNode* node, ofstream& os)
os << auxNode << " [" << opStyle << "label=\"+ - +\"]" ; os << auxNode << " [" << opStyle << "label=\"+ - +\"]" ;
os << endl; os << endl;
os << escapeNode (node) << " -> " << auxNode; os << escapeNode (node) << " -> " << auxNode;
os << " [label=\"" << node->explanation() << "\"]" ; os << " [label=\"" << getExplanationString (node) << "\"]" ;
os << endl; os << endl;
os << auxNode << " -> " ; os << auxNode << " -> " ;
@ -1027,14 +1080,31 @@ LiftedCircuit::escapeNode (const CircuitNode* node) const
string
LiftedCircuit::getExplanationString (CircuitNode* node)
{
return Util::contains (explanationMap_, node)
? explanationMap_[node]
: "" ;
}
void void
LiftedCircuit::printClauses ( LiftedCircuit::printClauses (
const CircuitNode* node, CircuitNode* node,
ofstream& os, ofstream& os,
string extraOptions) string extraOptions)
{ {
const Clauses& clauses = node->clauses(); Clauses clauses;
if (node->clauses().empty() == false) { if (Util::contains (originClausesMap_, node)) {
clauses = originClausesMap_[node];
} else if (getCircuitNodeType (node) == CircuitNodeType::LEAF_NODE) {
clauses = { (dynamic_cast<LeafNode*>(node))->clause() } ;
} else if (getCircuitNodeType (node) == CircuitNodeType::SMOOTH_NODE) {
clauses = (dynamic_cast<SmoothNode*>(node))->clauses();
}
if (clauses.empty() == false) {
os << escapeNode (node); os << escapeNode (node);
os << " [shape=box," << extraOptions << "label=\"" ; os << " [shape=box," << extraOptions << "label=\"" ;
for (size_t i = 0; i < clauses.size(); i++) { for (size_t i = 0; i < clauses.size(); i++) {
@ -1043,6 +1113,8 @@ LiftedCircuit::printClauses (
} }
os << "\"]" ; os << "\"]" ;
os << endl; os << endl;
} else {
os << " [shape=box]" << endl;
} }
} }

View File

@ -23,20 +23,9 @@ enum CircuitNodeType {
class CircuitNode class CircuitNode
{ {
public: public:
CircuitNode (const Clauses& clauses, string explanation = "") CircuitNode (void) { }
: clauses_(clauses), explanation_(explanation) { }
const Clauses& clauses (void) const { return clauses_; }
Clauses clauses (void) { return clauses_; }
virtual double weight (void) const = 0; virtual double weight (void) const = 0;
string explanation (void) const { return explanation_; }
private:
Clauses clauses_;
string explanation_;
}; };
@ -44,9 +33,7 @@ class CircuitNode
class OrNode : public CircuitNode class OrNode : public CircuitNode
{ {
public: public:
OrNode (const Clauses& clauses, string explanation = "") OrNode (void) : CircuitNode(), leftBranch_(0), rightBranch_(0) { }
: CircuitNode (clauses, explanation),
leftBranch_(0), rightBranch_(0) { }
CircuitNode** leftBranch (void) { return &leftBranch_; } CircuitNode** leftBranch (void) { return &leftBranch_; }
CircuitNode** rightBranch (void) { return &rightBranch_; } CircuitNode** rightBranch (void) { return &rightBranch_; }
@ -63,24 +50,10 @@ class OrNode : public CircuitNode
class AndNode : public CircuitNode class AndNode : public CircuitNode
{ {
public: public:
AndNode (const Clauses& clauses, string explanation = "") AndNode (void) : CircuitNode(), leftBranch_(0), rightBranch_(0) { }
: CircuitNode (clauses, explanation),
leftBranch_(0), rightBranch_(0) { } AndNode (CircuitNode* leftBranch, CircuitNode* rightBranch)
: CircuitNode(), leftBranch_(leftBranch), rightBranch_(rightBranch) { }
AndNode (
const Clauses& clauses,
CircuitNode* leftBranch,
CircuitNode* rightBranch,
string explanation = "")
: CircuitNode (clauses, explanation),
leftBranch_(leftBranch), rightBranch_(rightBranch) { }
AndNode (
CircuitNode* leftBranch,
CircuitNode* rightBranch,
string explanation = "")
: CircuitNode ({}, explanation),
leftBranch_(leftBranch), rightBranch_(rightBranch) { }
CircuitNode** leftBranch (void) { return &leftBranch_; } CircuitNode** leftBranch (void) { return &leftBranch_; }
CircuitNode** rightBranch (void) { return &rightBranch_; } CircuitNode** rightBranch (void) { return &rightBranch_; }
@ -97,9 +70,8 @@ class AndNode : public CircuitNode
class SetOrNode : public CircuitNode class SetOrNode : public CircuitNode
{ {
public: public:
SetOrNode (unsigned nrGroundings, const Clauses& clauses) SetOrNode (unsigned nrGroundings)
: CircuitNode (clauses, " AC"), follow_(0), : CircuitNode(), follow_(0), nrGroundings_(nrGroundings) { }
nrGroundings_(nrGroundings) { }
CircuitNode** follow (void) { return &follow_; } CircuitNode** follow (void) { return &follow_; }
@ -121,9 +93,8 @@ class SetOrNode : public CircuitNode
class SetAndNode : public CircuitNode class SetAndNode : public CircuitNode
{ {
public: public:
SetAndNode (unsigned nrGroundings, const Clauses& clauses) SetAndNode (unsigned nrGroundings)
: CircuitNode (clauses, " IPG"), follow_(0), : CircuitNode(), follow_(0), nrGroundings_(nrGroundings) { }
nrGroundings_(nrGroundings) { }
CircuitNode** follow (void) { return &follow_; } CircuitNode** follow (void) { return &follow_; }
@ -139,9 +110,8 @@ class SetAndNode : public CircuitNode
class IncExcNode : public CircuitNode class IncExcNode : public CircuitNode
{ {
public: public:
IncExcNode (const Clauses& clauses, string explanation) IncExcNode (void)
: CircuitNode (clauses, explanation), plus1Branch_(0), : CircuitNode(), plus1Branch_(0), plus2Branch_(0), minusBranch_(0) { }
plus2Branch_(0), minusBranch_(0) { }
CircuitNode** plus1Branch (void) { return &plus1Branch_; } CircuitNode** plus1Branch (void) { return &plus1Branch_; }
CircuitNode** plus2Branch (void) { return &plus2Branch_; } CircuitNode** plus2Branch (void) { return &plus2Branch_; }
@ -161,11 +131,16 @@ class LeafNode : public CircuitNode
{ {
public: public:
LeafNode (const Clause& clause, const LiftedWCNF& lwcnf) LeafNode (const Clause& clause, const LiftedWCNF& lwcnf)
: CircuitNode (Clauses() = {clause}), lwcnf_(lwcnf) { } : CircuitNode(), clause_(clause), lwcnf_(lwcnf) { }
const Clause& clause (void) const { return clause_; }
Clause& clause (void) { return clause_; }
double weight (void) const; double weight (void) const;
private: private:
Clause clause_;
const LiftedWCNF& lwcnf_; const LiftedWCNF& lwcnf_;
}; };
@ -175,11 +150,16 @@ class SmoothNode : public CircuitNode
{ {
public: public:
SmoothNode (const Clauses& clauses, const LiftedWCNF& lwcnf) SmoothNode (const Clauses& clauses, const LiftedWCNF& lwcnf)
: CircuitNode (clauses), lwcnf_(lwcnf) { } : CircuitNode(), clauses_(clauses), lwcnf_(lwcnf) { }
double weight (void) const; const Clauses& clauses (void) const { return clauses_; }
Clauses clauses (void) { return clauses_; }
double weight (void) const;
private: private:
Clauses clauses_;
const LiftedWCNF& lwcnf_; const LiftedWCNF& lwcnf_;
}; };
@ -188,7 +168,7 @@ class SmoothNode : public CircuitNode
class TrueNode : public CircuitNode class TrueNode : public CircuitNode
{ {
public: public:
TrueNode (void) : CircuitNode ({}) { } TrueNode (void) : CircuitNode() { }
double weight (void) const; double weight (void) const;
}; };
@ -198,8 +178,7 @@ class TrueNode : public CircuitNode
class CompilationFailedNode : public CircuitNode class CompilationFailedNode : public CircuitNode
{ {
public: public:
CompilationFailedNode (const Clauses& clauses) CompilationFailedNode (void) : CircuitNode() { }
: CircuitNode (clauses) { }
double weight (void) const; double weight (void) const;
}; };
@ -261,13 +240,19 @@ class LiftedCircuit
void exportToGraphViz (CircuitNode* node, ofstream&); void exportToGraphViz (CircuitNode* node, ofstream&);
void printClauses (const CircuitNode* node, ofstream&, void printClauses (CircuitNode* node, ofstream&,
string extraOptions = ""); string extraOptions = "");
string escapeNode (const CircuitNode* node) const; string escapeNode (const CircuitNode* node) const;
string getExplanationString (CircuitNode* node);
CircuitNode* root_; CircuitNode* root_;
const LiftedWCNF* lwcnf_; const LiftedWCNF* lwcnf_;
Clauses backupClauses_;
unordered_map<CircuitNode*, Clauses> originClausesMap_;
unordered_map<CircuitNode*, string> explanationMap_;
bool compilationSucceeded_; bool compilationSucceeded_;
}; };