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 model_print("Unhandled case in encodeConstraintSATEncoder %u", GETBOOLEANTYPE(constraint));
41 Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint) {
45 Constraint * getNewVarSATEncoder(SATEncoder *This) {
46 Constraint * var=allocVarConstraint(VAR, This->varcount);
47 Constraint * varneg=allocVarConstraint(NOTVAR, This->varcount++);
48 setNegConstraint(var, varneg);
49 setNegConstraint(varneg, var);
53 Constraint * encodeVarSATEncoder(SATEncoder *This, BooleanVar * constraint) {
54 if (constraint->var == NULL) {
55 constraint->var=getNewVarSATEncoder(This);
57 return constraint->var;
60 Constraint * encodeLogicSATEncoder(SATEncoder *This, BooleanLogic * constraint) {
61 Constraint * array[constraint->numArray];
62 for(uint i=0;i<constraint->numArray;i++)
63 array[i]=encodeConstraintSATEncoder(This, constraint->array[i]);
65 switch(constraint->op) {
67 return allocArrayConstraint(AND, constraint->numArray, array);
69 return allocArrayConstraint(OR, constraint->numArray, array);
71 return negateConstraint(allocConstraint(OR, array[0], NULL));
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 return allocConstraint(IMPLIES, array[0], array[1]);
82 model_print("Unhandled case in encodeLogicSATEncoder %u", constraint->op);