1 #include "satencoder.h"
5 #include "constraint.h"
9 #include "tableentry.h"
12 #include "predicate.h"
15 SATEncoder * allocSATEncoder() {
16 SATEncoder *This=ourmalloc(sizeof (SATEncoder));
18 This->cnf=createCNF();
22 void deleteSATEncoder(SATEncoder *This) {
27 void encodeAllSATEncoder(CSolver *csolver, SATEncoder * This) {
28 VectorBoolean *constraints=csolver->constraints;
29 uint size=getSizeVectorBoolean(constraints);
30 for(uint i=0;i<size;i++) {
31 Boolean *constraint=getVectorBoolean(constraints, i);
32 Edge c= encodeConstraintSATEncoder(This, constraint);
35 addConstraintCNF(This->cnf, c);
39 Edge encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint) {
40 switch(GETBOOLEANTYPE(constraint)) {
42 return encodeOrderSATEncoder(This, (BooleanOrder *) constraint);
44 return encodeVarSATEncoder(This, (BooleanVar *) constraint);
46 return encodeLogicSATEncoder(This, (BooleanLogic *) constraint);
48 return encodePredicateSATEncoder(This, (BooleanPredicate *) constraint);
50 model_print("Unhandled case in encodeConstraintSATEncoder %u", GETBOOLEANTYPE(constraint));
55 void getArrayNewVarsSATEncoder(SATEncoder* encoder, uint num, Edge * carray) {
56 for(uint i=0;i<num;i++)
57 carray[i]=getNewVarSATEncoder(encoder);
60 Edge getNewVarSATEncoder(SATEncoder *This) {
61 return constraintNewVar(This->cnf);
64 Edge encodeVarSATEncoder(SATEncoder *This, BooleanVar * constraint) {
65 if (edgeIsNull(constraint->var)) {
66 constraint->var=getNewVarSATEncoder(This);
68 return constraint->var;
71 Edge encodeLogicSATEncoder(SATEncoder *This, BooleanLogic * constraint) {
72 Edge array[getSizeArrayBoolean(&constraint->inputs)];
73 for(uint i=0;i<getSizeArrayBoolean(&constraint->inputs);i++)
74 array[i]=encodeConstraintSATEncoder(This, getArrayBoolean(&constraint->inputs, i));
76 switch(constraint->op) {
78 return constraintAND(This->cnf, getSizeArrayBoolean(&constraint->inputs), array);
80 return constraintOR(This->cnf, getSizeArrayBoolean(&constraint->inputs), array);
82 ASSERT( getSizeArrayBoolean(&constraint->inputs)==1);
83 return constraintNegate(array[0]);
85 ASSERT( getSizeArrayBoolean(&constraint->inputs)==2);
86 return constraintXOR(This->cnf, array[0], array[1]);
88 ASSERT( getSizeArrayBoolean( &constraint->inputs)==2);
89 return constraintIMPLIES(This->cnf, array[0], array[1]);
91 model_print("Unhandled case in encodeLogicSATEncoder %u", constraint->op);
96 Edge encodePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint) {
97 switch(GETPREDICATETYPE(constraint->predicate) ){
99 return encodeTablePredicateSATEncoder(This, constraint);
101 return encodeOperatorPredicateSATEncoder(This, constraint);
108 Edge encodeTablePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint){
109 switch(constraint->encoding.type){
110 case ENUMERATEIMPLICATIONS:
111 case ENUMERATEIMPLICATIONSNEGATE:
112 return encodeEnumTablePredicateSATEncoder(This, constraint);
122 void encodeElementSATEncoder(SATEncoder* encoder, Element *This){
123 switch( GETELEMENTTYPE(This) ){
125 addConstraintCNF(encoder->cnf, encodeElementFunctionSATEncoder(encoder, (ElementFunction*) This));
134 Edge encodeElementFunctionSATEncoder(SATEncoder* encoder, ElementFunction *This){
135 switch(GETFUNCTIONTYPE(This->function)){
137 return encodeTableElementFunctionSATEncoder(encoder, This);
139 return encodeOperatorElementFunctionSATEncoder(encoder, This);
146 Edge encodeTableElementFunctionSATEncoder(SATEncoder* encoder, ElementFunction* This){
147 switch(getElementFunctionEncoding(This)->type){
148 case ENUMERATEIMPLICATIONS:
149 return encodeEnumTableElemFunctionSATEncoder(encoder, This);