ElementEncoding* elemEnc = getElementEncoding(elem);
for(uint i=0; i<elemEnc->encArraySize; i++){
if (isinUseElement(elemEnc, i) && elemEnc->encodingArray[i]==value) {
- if ((i+1)==elemEnc->encArraySize)
- return elemEnc->variables[i];
+ if (i==0)
+ return constraintNegate(elemEnc->variables[0]);
+ else if ((i+1)==elemEnc->encArraySize)
+ return elemEnc->variables[i-1];
else
- return constraintAND2(This->cnf, elemEnc->variables[i], constraintNegate(elemEnc->variables[i+1]));
+ return constraintAND2(This->cnf, elemEnc->variables[i-1], constraintNegate(elemEnc->variables[i]));
}
}
return E_BOGUS;
}
void generateUnaryEncodingVars(SATEncoder *This, ElementEncoding *encoding) {
- allocElementConstraintVariables(encoding, encoding->encArraySize);
+ allocElementConstraintVariables(encoding, encoding->encArraySize-1);
getArrayNewVarsSATEncoder(This, encoding->numVars, encoding->variables);
//Add unary constraint
for(uint i=1;i<encoding->numVars;i++) {
}
uint64_t getElementValueBinaryValueSATTranslator(CSolver* This, ElementEncoding* elemEnc){
+ //THIS WILL PROBABLY BE WRONG SINCE THE VALUES CAN BE OFFSET
uint64_t value=0;
for(int i=elemEnc->numVars-1;i>=0;i--) {
value=value<<1;
}
uint64_t getElementValueUnarySATTranslator(CSolver* This, ElementEncoding* elemEnc){
- uint index=0;
- for(int i=elemEnc->numVars-1;i>=0;i--) {
- if (This->satEncoder->cnf->solver->solution[ getEdgeVar( elemEnc->variables[i] ) ])
- index = i;
+ uint i;
+ for(i=0;i<elemEnc->numVars;i++) {
+ if (!This->satEncoder->cnf->solver->solution[ getEdgeVar( elemEnc->variables[i] ) ]) {
+ break;
+ }
}
- ASSERT(elemEnc->encArraySize >index && isinUseElement(elemEnc, index));
- return elemEnc->encodingArray[index];
+
+ return elemEnc->encodingArray[i];
}
uint64_t getElementValueSATTranslator(CSolver* This, Element* element){
bool getBooleanVariableValueSATTranslator( CSolver* This , Boolean* boolean){
int index = getEdgeVar( ((BooleanVar*) boolean)->var );
return This->satEncoder->cnf->solver->solution[index] == true;
-}
\ No newline at end of file
+}