Edge getElementValueUnaryConstraint(SATEncoder * This, Element* elem, uint64_t value) {
ASTNodeType type = GETELEMENTTYPE(elem);
- ASSERT(type == ELEMSET || type == ELEMFUNCRETURN);
+ ASSERT(type == ELEMSET || type == ELEMFUNCRETURN || type == ELEMCONST);
ElementEncoding* elemEnc = getElementEncoding(elem);
for(uint i=0; i<elemEnc->encArraySize; i++){
if (isinUseElement(elemEnc, i) && elemEnc->encodingArray[i]==value) {
+ if(elemEnc->numVars == 0)
+ return E_True;
if (i==0)
return constraintNegate(elemEnc->variables[0]);
else if ((i+1)==elemEnc->encArraySize)
return constraintAND2(This->cnf, elemEnc->variables[i-1], constraintNegate(elemEnc->variables[i]));
}
}
- return E_BOGUS;
+ return E_False;
}
Edge getElementValueBinaryValueConstraint(SATEncoder * This, Element* element, uint64_t value){
getArrayNewVarsSATEncoder(This, encoding->numVars, encoding->variables);
}
-void generateOneHotEncodingVars(SATEncoder *This, ElementEncoding *encoding) {
- allocElementConstraintVariables(encoding, getSetSize( getElementSet(encoding->element)));
+void generateOneHotEncodingVars(SATEncoder *This, ElementEncoding *encoding) {
+ allocElementConstraintVariables(encoding, encoding->encArraySize);
getArrayNewVarsSATEncoder(This, encoding->numVars, encoding->variables);
for(uint i=0;i<encoding->numVars;i++) {
for(uint j=i+1;j<encoding->numVars;j++) {
void naiveEncodingElement(Element * This) {
ElementEncoding * encoding = getElementEncoding(This);
if (getElementEncodingType(encoding) == ELEM_UNASSIGNED) {
- setElementEncodingType(encoding, ONEHOT);
+ setElementEncodingType(encoding, UNARY);
encodingArrayInitialization(encoding);
}
}
}
+uint getSizeEncodingArray(ElementEncoding *This, uint setSize){
+ switch(This->type){
+ case BINARYINDEX:
+ return NEXTPOW2(setSize);
+ case ONEHOT:
+ case UNARY:
+ return setSize;
+ default:
+ ASSERT(0);
+ }
+ return -1;
+}
+
void encodingArrayInitialization(ElementEncoding *This) {
Element * element=This->element;
Set * set= getElementSet(element);
ASSERT(set->isRange==false);
uint size=getSizeVectorInt(set->members);
- uint encSize=NEXTPOW2(size);
+ uint encSize=getSizeEncodingArray(This, size);
allocEncodingArrayElement(This, encSize);
allocInUseArrayElement(This, encSize);
for(uint i=0;i<size;i++) {