1 #include "satencoder.h"
5 #include "constraint.h"
9 #include "tableentry.h"
12 #include "predicate.h"
15 SATEncoder::SATEncoder(CSolver *_solver) :
18 vector(allocDefVectorEdge()) {
21 SATEncoder::~SATEncoder() {
23 deleteVectorEdge(vector);
26 void SATEncoder::resetSATEncoder() {
31 int SATEncoder::solve() {
35 void SATEncoder::encodeAllSATEncoder(CSolver *csolver) {
36 SetIteratorBooleanEdge *iterator = csolver->getConstraints();
37 while (iterator->hasNext()) {
38 BooleanEdge constraint = iterator->next();
39 Edge c = encodeConstraintSATEncoder(constraint);
40 addConstraintCNF(cnf, c);
45 Edge SATEncoder::encodeConstraintSATEncoder(BooleanEdge c) {
47 Boolean *constraint = c.getBoolean();
49 if (booledgeMap.contains(constraint)) {
50 Edge e = {(Node *) booledgeMap.get(constraint)};
51 return c.isNegated() ? constraintNegate(e) : e;
54 switch (constraint->type) {
56 result = encodeOrderSATEncoder((BooleanOrder *) constraint);
59 result = encodeVarSATEncoder((BooleanVar *) constraint);
62 result = encodeLogicSATEncoder((BooleanLogic *) constraint);
65 result = encodePredicateSATEncoder((BooleanPredicate *) constraint);
68 result = ((BooleanConst *) constraint)->isTrue() ? E_True : E_False;
71 model_print("Unhandled case in encodeConstraintSATEncoder %u", constraint->type);
74 Polarity p = constraint->polarity;
75 uint pSize = constraint->parents.getSize();
76 if ((pSize > 1 && p != P_BOTHTRUEFALSE ) || pSize > 2) {
77 Edge e = getNewVarSATEncoder();
78 generateProxy(cnf, result, e, p);
79 booledgeMap.put(constraint, e.node_ptr);
83 return c.isNegated() ? constraintNegate(result) : result;
86 void SATEncoder::getArrayNewVarsSATEncoder(uint num, Edge *carray) {
87 for (uint i = 0; i < num; i++)
88 carray[i] = getNewVarSATEncoder();
91 Edge SATEncoder::getNewVarSATEncoder() {
92 return constraintNewVar(cnf);
95 Edge SATEncoder::encodeVarSATEncoder(BooleanVar *constraint) {
96 if (edgeIsNull(constraint->var)) {
97 constraint->var = getNewVarSATEncoder();
99 return constraint->var;
102 Edge SATEncoder::encodeLogicSATEncoder(BooleanLogic *constraint) {
103 Edge array[constraint->inputs.getSize()];
104 for (uint i = 0; i < constraint->inputs.getSize(); i++)
105 array[i] = encodeConstraintSATEncoder(constraint->inputs.get(i));
107 switch (constraint->op) {
109 return constraintAND(cnf, constraint->inputs.getSize(), array);
111 return constraintNegate(array[0]);
113 ASSERT(constraint->inputs.getSize() == 2);
114 return constraintIFF(cnf, array[0], array[1]);
118 //Don't handle, translate these away...
120 model_print("Unhandled case in encodeLogicSATEncoder %u", constraint->op);
125 Edge SATEncoder::encodePredicateSATEncoder(BooleanPredicate *constraint) {
126 switch (constraint->predicate->type) {
128 return encodeTablePredicateSATEncoder(constraint);
130 return encodeOperatorPredicateSATEncoder(constraint);
137 Edge SATEncoder::encodeTablePredicateSATEncoder(BooleanPredicate *constraint) {
138 switch (constraint->encoding.type) {
139 case ENUMERATEIMPLICATIONS:
140 case ENUMERATEIMPLICATIONSNEGATE:
141 return encodeEnumTablePredicateSATEncoder(constraint);
151 void SATEncoder::encodeElementSATEncoder(Element *element) {
152 /* Check to see if we have already encoded this element. */
153 if (element->getElementEncoding()->variables != NULL)
156 /* Need to encode. */
157 switch ( element->type) {
159 generateElementEncoding(element);
160 encodeElementFunctionSATEncoder((ElementFunction *) element);
163 generateElementEncoding(element);
172 void SATEncoder::encodeElementFunctionSATEncoder(ElementFunction *function) {
173 switch (function->getFunction()->type) {
175 encodeTableElementFunctionSATEncoder(function);
178 encodeOperatorElementFunctionSATEncoder(function);
185 void SATEncoder::encodeTableElementFunctionSATEncoder(ElementFunction *function) {
186 switch (function->getElementFunctionEncoding()->type) {
187 case ENUMERATEIMPLICATIONS:
188 encodeEnumTableElemFunctionSATEncoder(function);