ASSERT(0);
break;
case BINARYVAL:
- ASSERT(0);
+ return getElementValueBinaryValueConstraint(This, elem, value);
break;
default:
ASSERT(0);
return E_BOGUS;
}
+Edge getElementValueBinaryValueConstraint(SATEncoder * This, Element* element, uint64_t value){
+ ASTNodeType type = GETELEMENTTYPE(element);
+ ASSERT(type == ELEMSET || type == ELEMFUNCRETURN);
+ ElementEncoding* elemEnc = getElementEncoding(element);
+ for(uint i=0; i<elemEnc->encArraySize; i++){
+ if(isinUseElement(elemEnc, i) && elemEnc->encodingArray[i]==value) {
+ return generateBinaryConstraint(This->cnf, elemEnc->numVars, elemEnc->variables, value);
+ // This constraint can be generated right away without iterating over encodingArray
+ // but we need to make sure that element with that value is in use ...
+ }
+ }
+ return E_BOGUS;
+}
+
void allocElementConstraintVariables(ElementEncoding* This, uint numVars) {
This->numVars = numVars;
This->variables = ourmalloc(sizeof(Edge) * numVars);
}
+void generateBinaryValueEncodingVars(SATEncoder* This, ElementEncoding* encoding){
+ ASSERT(encoding->type==BINARYVAL);
+ allocElementConstraintVariables(encoding, getMaximumBitsBinaryValueEncodingVars(encoding));
+ getArrayNewVarsSATEncoder(This, encoding->numVars, encoding->variables);
+}
+
void generateBinaryIndexEncodingVars(SATEncoder *This, ElementEncoding *encoding) {
ASSERT(encoding->type==BINARYINDEX);
allocElementConstraintVariables(encoding, NUMBITS(encoding->encArraySize-1));
case UNARY:
generateUnaryEncodingVars(This, encoding);
return;
+ case ONEHOTBINARY:
+ return;
+ case BINARYVAL:
+ generateBinaryValueEncodingVars(This, encoding);
+ return;
default:
ASSERT(0);
}
Edge getElementValueOneHotConstraint(SATEncoder * This, Element* elem, uint64_t value);
Edge getElementValueUnaryConstraint(SATEncoder * This, Element* elem, uint64_t value);
Edge getElementValueBinaryIndexConstraint(SATEncoder * This, Element* element, uint64_t value);
+Edge getElementValueBinaryValueConstraint(SATEncoder * This, Element* element, uint64_t value);
Edge getElementValueConstraint(SATEncoder* encoder, Element* This, uint64_t value);
void allocElementConstraintVariables(ElementEncoding* This, uint numVars);
void generateOneHotEncodingVars(SATEncoder *This, ElementEncoding *encoding);
void generateUnaryEncodingVars(SATEncoder *This, ElementEncoding *encoding);
void generateBinaryIndexEncodingVars(SATEncoder* This, ElementEncoding* encoding);
+void generateBinaryValueEncodingVars(SATEncoder* This, ElementEncoding* encoding);
void generateElementEncoding(SATEncoder* This, Element* element);
#endif