1 #include "satencoder.h"
8 Edge encodeOrderSATEncoder(SATEncoder *This, BooleanOrder *constraint) {
9 switch ( constraint->order->type) {
11 return encodePartialOrderSATEncoder(This, constraint);
13 return encodeTotalOrderSATEncoder(This, constraint);
20 Edge getPairConstraint(SATEncoder *This, HashTableOrderPair *table, OrderPair *pair) {
23 if (pair->first < pair->second) {
25 flipped.first = pair->second;
26 flipped.second = pair->first;
30 if (!containsOrderPair(table, pair)) {
31 constraint = getNewVarSATEncoder(This);
32 OrderPair *paircopy = allocOrderPair(pair->first, pair->second, constraint);
33 putOrderPair(table, paircopy, paircopy);
35 constraint = getOrderPair(table, pair)->constraint;
37 return negate ? constraintNegate(constraint) : constraint;
40 Edge encodeTotalOrderSATEncoder(SATEncoder *This, BooleanOrder *boolOrder) {
41 ASSERT(boolOrder->order->type == TOTAL);
42 if (boolOrder->order->orderPairTable == NULL) {
43 initializeOrderHashTable(boolOrder->order);
44 createAllTotalOrderConstraintsSATEncoder(This, boolOrder->order);
46 HashTableOrderPair *orderPairTable = boolOrder->order->orderPairTable;
47 OrderPair pair = {boolOrder->first, boolOrder->second, E_NULL};
48 Edge constraint = getPairConstraint(This, orderPairTable, &pair);
53 void createAllTotalOrderConstraintsSATEncoder(SATEncoder *This, Order *order) {
55 model_print("in total order ...\n");
57 ASSERT(order->type == TOTAL);
58 VectorInt *mems = order->set->members;
59 HashTableOrderPair *table = order->orderPairTable;
60 uint size = getSizeVectorInt(mems);
61 for (uint i = 0; i < size; i++) {
62 uint64_t valueI = getVectorInt(mems, i);
63 for (uint j = i + 1; j < size; j++) {
64 uint64_t valueJ = getVectorInt(mems, j);
65 OrderPair pairIJ = {valueI, valueJ};
66 Edge constIJ = getPairConstraint(This, table, &pairIJ);
67 for (uint k = j + 1; k < size; k++) {
68 uint64_t valueK = getVectorInt(mems, k);
69 OrderPair pairJK = {valueJ, valueK};
70 OrderPair pairIK = {valueI, valueK};
71 Edge constIK = getPairConstraint(This, table, &pairIK);
72 Edge constJK = getPairConstraint(This, table, &pairJK);
73 addConstraintCNF(This->cnf, generateTransOrderConstraintSATEncoder(This, constIJ, constJK, constIK));
79 Edge getOrderConstraint(HashTableOrderPair *table, OrderPair *pair) {
80 ASSERT(pair->first != pair->second);
83 if (pair->first < pair->second) {
85 flipped.first = pair->second;
86 flipped.second = pair->first;
89 if (!containsOrderPair(table, pair)) {
92 Edge constraint = getOrderPair(table, pair)->constraint;
93 ASSERT(!edgeIsNull(constraint));
94 return negate ? constraintNegate(constraint) : constraint;
97 Edge generateTransOrderConstraintSATEncoder(SATEncoder *This, Edge constIJ,Edge constJK,Edge constIK) {
98 Edge carray[] = {constIJ, constJK, constraintNegate(constIK)};
99 Edge loop1 = constraintOR(This->cnf, 3, carray);
100 Edge carray2[] = {constraintNegate(constIJ), constraintNegate(constJK), constIK};
101 Edge loop2 = constraintOR(This->cnf, 3, carray2 );
102 return constraintAND2(This->cnf, loop1, loop2);
105 Edge encodePartialOrderSATEncoder(SATEncoder *This, BooleanOrder *constraint) {
106 ASSERT(constraint->order->type == PARTIAL);