Be consistent
[satune.git] / src / Backend / satencoder.c
1 #include "satencoder.h"
2 #include "structs.h"
3 #include "csolver.h"
4 #include "boolean.h"
5 #include "constraint.h"
6 #include "common.h"
7
8 SATEncoder * allocSATEncoder() {
9         SATEncoder *This=ourmalloc(sizeof (SATEncoder));
10         This->varcount=1;
11         return This;
12 }
13
14 void deleteSATEncoder(SATEncoder *This) {
15         ourfree(This);
16 }
17
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);
24         }
25 }
26
27 Constraint * encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint) {
28         switch(GETBOOLEANTYPE(constraint)) {
29         case ORDERCONST:
30                 return encodeOrderSATEncoder(This, (BooleanOrder *) constraint);
31         case BOOLEANVAR:
32                 return encodeVarSATEncoder(This, (BooleanVar *) constraint);
33         case LOGICOP:
34                 return encodeLogicSATEncoder(This, (BooleanLogic *) constraint);
35         default:
36                 model_print("Unhandled case in encodeConstraintSATEncoder %u", GETBOOLEANTYPE(constraint));
37                 exit(-1);
38         }
39 }
40
41 Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint) {
42         return NULL;
43 }
44
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);
50         return var;
51 }
52
53 Constraint * encodeVarSATEncoder(SATEncoder *This, BooleanVar * constraint) {
54         if (constraint->var == NULL) {
55                 constraint->var=getNewVarSATEncoder(This);
56         }
57         return constraint->var;
58 }
59
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]);
64
65         switch(constraint->op) {
66         case L_AND:
67                 return allocArrayConstraint(AND, constraint->numArray, array);
68         case L_OR:
69                 return allocArrayConstraint(OR, constraint->numArray, array);
70         case L_NOT:
71                 return negateConstraint(allocConstraint(OR, array[0], NULL));
72         case L_XOR: {
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]));
78         }
79         case L_IMPLIES:
80                 return allocConstraint(IMPLIES, array[0], array[1]);
81         default:
82                 model_print("Unhandled case in encodeLogicSATEncoder %u", constraint->op);
83                 exit(-1);
84         }
85 }