1 #include "satencoder.h"
5 #include "constraint.h"
8 SATEncoder * allocSATEncoder() {
9 SATEncoder *This=ourmalloc(sizeof (SATEncoder));
14 void deleteSATEncoder(SATEncoder *This) {
18 void encodeAllSATEncoder(SATEncoder * This, CSolver *csolver) {
19 VectorBoolean *constraints=csolver->constraints;
20 uint size=getSizeVectorBoolean(constraints);
21 for(uint i=0;i<size;i++) {
22 Boolean *constraint=getVectorBoolean(constraints, i);
23 encodeConstraintSATEncoder(This, constraint);
27 Constraint * encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint) {
28 switch(GETBOOLEANTYPE(constraint)) {
30 return encodeOrderSATEncoder(This, (BooleanOrder *) constraint);
32 return encodeVarSATEncoder(This, (BooleanVar *) constraint);
34 return encodeLogicSATEncoder(This, (BooleanLogic *) constraint);
36 return encodePredicateSATEncoder(This, (BooleanPredicate *) constraint);
38 model_print("Unhandled case in encodeConstraintSATEncoder %u", GETBOOLEANTYPE(constraint));
43 Constraint * getNewVarSATEncoder(SATEncoder *This) {
44 Constraint * var=allocVarConstraint(VAR, This->varcount);
45 Constraint * varneg=allocVarConstraint(NOTVAR, This->varcount++);
46 setNegConstraint(var, varneg);
47 setNegConstraint(varneg, var);
51 Constraint * encodeVarSATEncoder(SATEncoder *This, BooleanVar * constraint) {
52 if (constraint->var == NULL) {
53 constraint->var=getNewVarSATEncoder(This);
55 return constraint->var;
58 Constraint * encodeLogicSATEncoder(SATEncoder *This, BooleanLogic * constraint) {
59 Constraint * array[getSizeArrayBoolean(&constraint->inputs)];
60 for(uint i=0;i<getSizeArrayBoolean(&constraint->inputs);i++)
61 array[i]=encodeConstraintSATEncoder(This, getArrayBoolean(&constraint->inputs, i));
63 switch(constraint->op) {
65 return allocArrayConstraint(AND, getSizeArrayBoolean(&constraint->inputs), array);
67 return allocArrayConstraint(OR, getSizeArrayBoolean(&constraint->inputs), array);
69 ASSERT(constraint->numArray==1);
70 return negateConstraint(array[0]);
72 ASSERT(constraint->numArray==2);
73 Constraint * nleft=negateConstraint(cloneConstraint(array[0]));
74 Constraint * nright=negateConstraint(cloneConstraint(array[1]));
75 return allocConstraint(OR,
76 allocConstraint(AND, array[0], nright),
77 allocConstraint(AND, nleft, array[1]));
80 ASSERT(constraint->numArray==2);
81 return allocConstraint(IMPLIES, array[0], array[1]);
83 model_print("Unhandled case in encodeLogicSATEncoder %u", constraint->op);
88 Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint) {
93 Constraint * encodePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint) {