1 #include "satencoder.h"
5 #include "constraint.h"
7 SATEncoder * allocSATEncoder() {
8 SATEncoder *This=ourmalloc(sizeof (SATEncoder));
13 void deleteSATEncoder(SATEncoder *This) {
17 void encodeAllSATEncoder(SATEncoder * This, CSolver *csolver) {
18 VectorBoolean *constraints=csolver->constraints;
19 uint size=getSizeVectorBoolean(constraints);
20 for(uint i=0;i<size;i++) {
21 Boolean *constraint=getVectorBoolean(constraints, i);
22 encodeConstraintSATEncoder(This, constraint);
26 Constraint * encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint) {
27 switch(GETBOOLEANTYPE(constraint)) {
29 return encodeOrderSATEncoder(This, (BooleanOrder *) constraint);
31 return encodeVarSATEncoder(This, (BooleanVar *) constraint);
33 return encodeLogicSATEncoder(This, (BooleanLogic *) constraint);
35 printf("Unhandled case in encodeConstraintSATEncoder %u", GETBOOLEANTYPE(constraint));
40 Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint) {
44 Constraint * getNewVarSATEncoder(SATEncoder *This) {
45 Constraint * var=allocVarConstraint(VAR, This->varcount);
46 Constraint * varneg=allocVarConstraint(NOTVAR, This->varcount++);
47 setNegConstraint(var, varneg);
48 setNegConstraint(varneg, var);
52 Constraint * encodeVarSATEncoder(SATEncoder *This, BooleanVar * constraint) {
53 if (constraint->var == NULL) {
54 constraint->var=getNewVarSATEncoder(This);
56 return constraint->var;
59 Constraint * encodeLogicSATEncoder(SATEncoder *This, BooleanLogic * constraint) {
60 Constraint * array[constraint->numArray];
61 for(uint i=0;i<constraint->numArray;i++)
62 array[i]=encodeConstraintSATEncoder(This, constraint->array[i]);
64 switch(constraint->op) {
66 return allocArrayConstraint(AND, constraint->numArray, array);
68 return allocArrayConstraint(OR, constraint->numArray, array);
70 return negateConstraint(allocConstraint(OR, array[0], NULL));
72 Constraint * nleft=negateConstraint(cloneConstraint(array[0]));
73 Constraint * nright=negateConstraint(cloneConstraint(array[1]));
74 return allocConstraint(OR,
75 allocConstraint(AND, array[0], nright),
76 allocConstraint(AND, nleft, array[1]));
79 return allocConstraint(IMPLIES, array[0], array[1]);
81 printf("Unhandled case in encodeLogicSATEncoder %u", constraint->op);