1 #include "sattranslator.h"
4 #include "satencoder.h"
9 uint64_t getElementValueBinaryIndexSATTranslator(CSolver* This, ElementEncoding* elemEnc){
11 for(uint i=elemEnc->numVars-1;i>=0;i--) {
13 if (getValueSolver(This->satEncoder->cnf->solver, 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){
22 for(uint i=elemEnc->numVars-1;i>=0;i--) {
24 if (getValueSolver(This->satEncoder->cnf->solver, getEdgeVar( elemEnc->variables[i] )) )
27 if (elemEnc->isBinaryValSigned &&
28 This->satEncoder->cnf->solver->solution[ getEdgeVar( elemEnc->variables[elemEnc->numVars-1])]) {
29 //Do sign extension of negative number
30 uint64_t highbits=0xffffffffffffffff - ((1 << (elemEnc->numVars)) - 1);
33 value+=elemEnc->offset;
37 uint64_t getElementValueOneHotSATTranslator(CSolver* This, ElementEncoding* elemEnc){
39 for(uint i=0; i< elemEnc->numVars; i++) {
40 if (getValueSolver(This->satEncoder->cnf->solver, getEdgeVar( elemEnc->variables[i] )))
43 ASSERT(elemEnc->encArraySize >index && isinUseElement(elemEnc, index));
44 return elemEnc->encodingArray[index];
47 uint64_t getElementValueUnarySATTranslator(CSolver* This, ElementEncoding* elemEnc){
49 for(i=0;i<elemEnc->numVars;i++) {
50 if (! getValueSolver(This->satEncoder->cnf->solver, getEdgeVar( elemEnc->variables[i] )) ) {
55 return elemEnc->encodingArray[i];
58 uint64_t getElementValueSATTranslator(CSolver* This, Element* element){
59 ElementEncoding* elemEnc = getElementEncoding(element);
60 if(elemEnc->numVars == 0) //case when the set has only one item
61 return getSetElement(getElementSet(element), 0);
62 switch(elemEnc->type){
64 return getElementValueOneHotSATTranslator(This, elemEnc);
66 return getElementValueUnarySATTranslator(This, elemEnc);
68 return getElementValueBinaryIndexSATTranslator(This, elemEnc);
82 bool getBooleanVariableValueSATTranslator( CSolver* This , Boolean* boolean){
83 int index = getEdgeVar( ((BooleanVar*) boolean)->var );
84 return getValueSolver(This->satEncoder->cnf->solver, index);
87 HappenedBefore getOrderConstraintValueSATTranslator(CSolver* This, Order * order, uint64_t first, uint64_t second){
88 ASSERT(order->orderPairTable!= NULL);
89 OrderPair pair={first, second, E_NULL};
90 Edge var = getOrderConstraint(order->orderPairTable, &pair);
93 return getValueCNF(This->satEncoder->cnf, var)? FIRST: SECOND;