#include "element.h"
Edge getElementValueConstraint(SATEncoder* This, Element* elem, uint64_t value) {
- generateElementEncodingVariables(This, getElementEncoding(elem));
switch(getElementEncoding(elem)->type){
case ONEHOT:
- //FIXME
- ASSERT(0);
- break;
+ return getElementValueOneHotConstraint(This, elem, value);
case UNARY:
ASSERT(0);
break;
case BINARYINDEX:
return getElementValueBinaryIndexConstraint(This, elem, value);
- break;
case ONEHOTBINARY:
ASSERT(0);
break;
ASSERT(type == ELEMSET || type == ELEMFUNCRETURN);
ElementEncoding* elemEnc = getElementEncoding(elem);
for(uint i=0; i<elemEnc->encArraySize; i++){
- if( isinUseElement(elemEnc, i) && elemEnc->encodingArray[i]==value){
+ if(isinUseElement(elemEnc, i) && elemEnc->encodingArray[i]==value) {
return generateBinaryConstraint(This->cnf, elemEnc->numVars, elemEnc->variables, i);
}
}
return E_BOGUS;
}
+Edge getElementValueOneHotConstraint(SATEncoder * This, Element* elem, uint64_t value) {
+ ASTNodeType type = GETELEMENTTYPE(elem);
+ ASSERT(type == ELEMSET || type == ELEMFUNCRETURN);
+ ElementEncoding* elemEnc = getElementEncoding(elem);
+ for(uint i=0; i<elemEnc->encArraySize; i++){
+ if (isinUseElement(elemEnc, i) && elemEnc->encodingArray[i]==value) {
+ return elemEnc->variables[i];
+ }
+ }
+ return E_BOGUS;
+}
+
+void allocElementConstraintVariables(ElementEncoding* This, uint numVars) {
+ This->numVars = numVars;
+ This->variables = ourmalloc(sizeof(Edge) * numVars);
+}
+
+void generateBinaryIndexEncodingVars(SATEncoder *This, ElementEncoding *encoding) {
+ ASSERT(encoding->type==BINARYINDEX);
+ allocElementConstraintVariables(encoding, NUMBITS(encoding->encArraySize-1));
+ getArrayNewVarsSATEncoder(This, encoding->numVars, encoding->variables);
+}
+
+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=0;j<encoding->numVars;j++) {
+ addConstraintCNF(This->cnf, constraintIMPLIES(This->cnf, encoding->variables[i], constraintNegate(encoding->variables[j])));
+ }
+ }
+}
+
+void generateElementEncoding(SATEncoder* This, Element * element) {
+ ElementEncoding* encoding = getElementEncoding(element);
+ ASSERT(encoding->type!=ELEM_UNASSIGNED);
+ if(encoding->variables!=NULL)
+ return;
+ switch(encoding->type) {
+ case ONEHOT:
+ generateOneHotEncodingVars(This, encoding);
+ return;
+ case BINARYINDEX:
+ generateBinaryIndexEncodingVars(This, encoding);
+ return;
+ default:
+ ASSERT(0);
+ }
+}
+
#ifndef SATELEMENTENCODER_H
#define SATELEMENTENCODER_H
+Edge getElementValueOneHotConstraint(SATEncoder * This, Element* elem, uint64_t value);
Edge getElementValueBinaryIndexConstraint(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 generateBinaryIndexEncodingVars(SATEncoder* This, ElementEncoding* encoding);
+void generateElementEncoding(SATEncoder* This, Element* element);
#endif
This->inUseArray=ourcalloc(1, bytes);
}
-void allocElementConstraintVariables(ElementEncoding* This, uint numVars){
- This->numVars = numVars;
- This->variables = ourmalloc(sizeof(Edge) * numVars);
-}
-
void setElementEncodingType(ElementEncoding* This, ElementEncodingType type){
This->type = type;
}
-void generateBinaryIndexEncodingVars(SATEncoder* encoder, ElementEncoding* This){
- ASSERT(This->type==BINARYINDEX);
- allocElementConstraintVariables(This, NUMBITS(This->encArraySize-1));
- getArrayNewVarsSATEncoder(encoder, This->numVars, This->variables);
-}
-
-void generateElementEncodingVariables(SATEncoder* encoder, ElementEncoding* This){
- ASSERT(This->type!=ELEM_UNASSIGNED);
- if(This->variables!=NULL)
- return;
- switch(This->type){
- case BINARYINDEX:
- generateBinaryIndexEncodingVars(encoder, This);
- break;
- default:
- ASSERT(0);
- }
-}