1 #include "satencoder.h"
5 #include "constraint.h"
9 #include "tableentry.h"
13 SATEncoder * allocSATEncoder() {
14 SATEncoder *This=ourmalloc(sizeof (SATEncoder));
15 allocInlineDefVectorConstraint(getSATEncoderAllConstraints(This));
16 allocInlineDefVectorConstraint(getSATEncoderVars(This));
21 void deleteSATEncoder(SATEncoder *This) {
25 void encodeAllSATEncoder(SATEncoder * This, CSolver *csolver) {
26 VectorBoolean *constraints=csolver->constraints;
27 uint size=getSizeVectorBoolean(constraints);
28 for(uint i=0;i<size;i++) {
29 Boolean *constraint=getVectorBoolean(constraints, i);
30 encodeConstraintSATEncoder(This, constraint);
33 size = getSizeVectorElement(csolver->allElements);
34 for(uint i=0; i<size; i++){
35 Element* element = getVectorElement(csolver->allElements, i);
36 switch(GETELEMENTTYPE(element)){
38 encodeFunctionElementSATEncoder(This, (ElementFunction*) element);
42 //ElementSets that aren't used in any constraints/functions
48 Constraint * encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint) {
49 switch(GETBOOLEANTYPE(constraint)) {
51 return encodeOrderSATEncoder(This, (BooleanOrder *) constraint);
53 return encodeVarSATEncoder(This, (BooleanVar *) constraint);
55 return encodeLogicSATEncoder(This, (BooleanLogic *) constraint);
57 return encodePredicateSATEncoder(This, (BooleanPredicate *) constraint);
59 model_print("Unhandled case in encodeConstraintSATEncoder %u", GETBOOLEANTYPE(constraint));
64 void getArrayNewVarsSATEncoder(SATEncoder* encoder, uint num, Constraint **carray) {
65 for(uint i=0;i<num;i++)
66 carray[i]=getNewVarSATEncoder(encoder);
69 Constraint * getNewVarSATEncoder(SATEncoder *This) {
70 Constraint * var=allocVarConstraint(VAR, This->varcount);
71 Constraint * varneg=allocVarConstraint(NOTVAR, This->varcount++);
72 setNegConstraint(var, varneg);
73 setNegConstraint(varneg, var);
74 pushVectorConstraint(getSATEncoderVars(This), var);
78 Constraint * encodeVarSATEncoder(SATEncoder *This, BooleanVar * constraint) {
79 if (constraint->var == NULL) {
80 constraint->var=getNewVarSATEncoder(This);
82 return constraint->var;
85 Constraint * encodeLogicSATEncoder(SATEncoder *This, BooleanLogic * constraint) {
86 Constraint * array[getSizeArrayBoolean(&constraint->inputs)];
87 for(uint i=0;i<getSizeArrayBoolean(&constraint->inputs);i++)
88 array[i]=encodeConstraintSATEncoder(This, getArrayBoolean(&constraint->inputs, i));
90 switch(constraint->op) {
92 return allocArrayConstraint(AND, getSizeArrayBoolean(&constraint->inputs), array);
94 return allocArrayConstraint(OR, getSizeArrayBoolean(&constraint->inputs), array);
96 ASSERT(constraint->numArray==1);
97 return negateConstraint(array[0]);
99 ASSERT(constraint->numArray==2);
100 Constraint * nleft=negateConstraint(cloneConstraint(array[0]));
101 Constraint * nright=negateConstraint(cloneConstraint(array[1]));
102 return allocConstraint(OR,
103 allocConstraint(AND, array[0], nright),
104 allocConstraint(AND, nleft, array[1]));
107 ASSERT(constraint->numArray==2);
108 return allocConstraint(IMPLIES, array[0], array[1]);
110 model_print("Unhandled case in encodeLogicSATEncoder %u", constraint->op);
115 Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint) {
120 Constraint * encodePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint) {
126 Constraint* encodeFunctionElementSATEncoder(SATEncoder* encoder, ElementFunction *This){
127 switch(GETFUNCTIONTYPE(This->function)){
129 return encodeTableElementFunctionSATEncoder(encoder, This);
131 return encodeOperatorElementFunctionSATEncoder(encoder, This);
139 Constraint* encodeTableElementFunctionSATEncoder(SATEncoder* encoder, ElementFunction* This){
140 switch(getElementFunctionEncoding(This)->type){
141 case ENUMERATEIMPLICATIONS:
142 return encodeEnumTableElemFunctionSATEncoder(encoder, This);
151 Constraint* encodeOperatorElementFunctionSATEncoder(SATEncoder* encoder,ElementFunction* This){
155 Constraint* encodeEnumTableElemFunctionSATEncoder(SATEncoder* encoder, ElementFunction* This){
156 ASSERT(GETFUNCTIONTYPE(This->function)==TABLEFUNC);
157 ArrayElement* elements= &This->inputs;
158 Table* table = ((FunctionTable*) (This->function))->table;
159 uint size = getSizeVectorTableEntry(&table->entries);
160 for(uint i=0; i<size; i++){
161 TableEntry* entry = getVectorTableEntry(&table->entries, i);
162 uint inputNum =getSizeArrayElement(elements);
163 Element* el= getArrayElement(elements, i);
164 Constraint* carray[inputNum];
165 for(uint j=0; j<inputNum; j++){
166 carray[inputNum] = getElementValueConstraint(el, entry->inputs[j]);
168 Constraint* row= allocConstraint(IMPLIES, allocArrayConstraint(AND, inputNum, carray),
169 getElementValueConstraint((Element*)This, entry->output));
170 pushVectorConstraint( getSATEncoderAllConstraints(encoder), row);