1 #include "sattranslator.h"
4 #include "satencoder.h"
9 uint64_t getElementValueBinaryIndexSATTranslator(CSolver* This, ElementEncoding* elemEnc){
11 for(int i=elemEnc->numVars-1;i>=0;i--) {
13 if (This->satEncoder->cnf->solver->solution[ getEdgeVar( elemEnc->variables[i] ) ])
16 ASSERT(elemEnc->encArraySize >index && isinUseElement(elemEnc, index));
17 return elemEnc->encodingArray[index];
20 uint64_t getElementValueBinaryValueSATTranslator(CSolver* This, ElementEncoding* elemEnc){
21 //THIS WILL PROBABLY BE WRONG SINCE THE VALUES CAN BE OFFSET
23 for(int i=elemEnc->numVars-1;i>=0;i--) {
25 if (This->satEncoder->cnf->solver->solution[ getEdgeVar( elemEnc->variables[i] ) ])
31 uint64_t getElementValueOneHotSATTranslator(CSolver* This, ElementEncoding* elemEnc){
33 for(int i=elemEnc->numVars-1;i>=0;i--) {
34 if (This->satEncoder->cnf->solver->solution[ getEdgeVar( elemEnc->variables[i] ) ])
37 ASSERT(elemEnc->encArraySize >index && isinUseElement(elemEnc, index));
38 return elemEnc->encodingArray[index];
41 uint64_t getElementValueUnarySATTranslator(CSolver* This, ElementEncoding* elemEnc){
43 for(i=0;i<elemEnc->numVars;i++) {
44 if (!This->satEncoder->cnf->solver->solution[ getEdgeVar( elemEnc->variables[i] ) ]) {
49 return elemEnc->encodingArray[i];
52 uint64_t getElementValueSATTranslator(CSolver* This, Element* element){
53 ElementEncoding* elemEnc = getElementEncoding(element);
54 if(elemEnc->numVars == 0) //case when the set has only one item
55 return getSetElement(getElementSet(element), 0);
56 switch(elemEnc->type){
58 getElementValueOneHotSATTranslator(This, elemEnc);
61 getElementValueUnarySATTranslator(This, elemEnc);
64 return getElementValueBinaryIndexSATTranslator(This, elemEnc);
78 bool getBooleanVariableValueSATTranslator( CSolver* This , Boolean* boolean){
79 int index = getEdgeVar( ((BooleanVar*) boolean)->var );
80 return This->satEncoder->cnf->solver->solution[index] == true;
83 HappenedBefore getOrderConstraintValueSATTranslator(CSolver* This, Order * order, uint64_t first, uint64_t second){
84 ASSERT(order->orderPairTable!= NULL);
85 OrderPair pair={first, second, E_NULL};
86 Edge var = getOrderConstraint(order->orderPairTable, & pair);
89 int index = getEdgeVar( var );
90 return This->satEncoder->cnf->solver->solution[index] ? FIRST: SECOND;