1 #include "naiveencoder.h"
2 #include "elementencoding.h"
4 #include "functionencoding.h"
14 void naiveEncodingDecision(CSolver* csolver){
15 uint size = getSizeVectorElement(csolver->allElements);
16 for(uint i=0; i<size; i++){
17 Element* element = getVectorElement(csolver->allElements, i);
18 switch(GETELEMENTTYPE(element)){
20 setElementEncodingType(&((ElementSet*)element)->encoding, BINARYINDEX);
21 baseBinaryIndexElementAssign(&((ElementSet*)element)->encoding);
24 setFunctionEncodingType(&((ElementFunction*)element)->functionencoding, ENUMERATEIMPLICATIONS);
31 size = getSizeVectorBoolean(csolver->allBooleans);
32 for(uint i=0; i<size; i++){
33 Boolean* predicate = getVectorBoolean(csolver->allBooleans, i);
34 switch(GETBOOLEANTYPE(predicate)){
36 setFunctionEncodingType(&((BooleanPredicate*)predicate)->encoding, ENUMERATEIMPLICATIONS);
44 void baseBinaryIndexElementAssign(ElementEncoding *This) {
45 Element * element=This->element;
46 ASSERT(element->type == ELEMSET);
47 Set * set= ((ElementSet*)element)->set;
48 ASSERT(set->isRange==false);
49 uint size=getSizeVectorInt(set->members);
50 uint encSize=NEXTPOW2(size);
51 allocEncodingArrayElement(This, encSize);
52 allocInUseArrayElement(This, encSize);
54 for(uint i=0;i<size;i++) {
55 This->encodingArray[i]=getVectorInt(set->members, i);
56 setInUseElement(This, i);
61 void encode(CSolver* csolver){
62 uint size = getSizeVectorElement(csolver->allElements);
63 for(uint i=0; i<size; i++){
64 Element* element = getVectorElement(csolver->allElements, i);
65 switch(GETELEMENTTYPE(element)){
67 naiveEncodeFunctionPredicate(&((ElementFunction*)element)->functionencoding);
74 size = getSizeVectorBoolean(csolver->allBooleans);
75 for(uint i=0; i<size; i++){
76 Boolean* predicate = getVectorBoolean(csolver->allBooleans, i);
77 switch(GETBOOLEANTYPE(predicate)){
79 naiveEncodeFunctionPredicate(&((BooleanPredicate*)predicate)->encoding);
87 void naiveEncodeFunctionPredicate(FunctionEncoding *This){
88 if(This->isFunction) {
89 ASSERT(GETELEMENTTYPE(This->op.function)==ELEMFUNCRETURN);
91 case ENUMERATEIMPLICATIONS:
92 naiveEncodeEnumeratedFunction(This);
95 naiveEncodeCircuitFunction(This);
101 ASSERT(GETBOOLEANTYPE(This->op.predicate) == PREDICATEOP);
102 BooleanPredicate* predicate = (BooleanPredicate*)This->op.predicate;
109 void naiveEncodeCircuitFunction(FunctionEncoding* This){
113 void naiveEncodeEnumeratedFunction(FunctionEncoding* This){
114 ElementFunction* ef =(ElementFunction*)This->op.function;
115 Function * function = ef->function;
116 switch(GETFUNCTIONTYPE(function)){
118 naiveEncodeEnumTableFunc(ef);
121 naiveEncodeEnumOperatingFunc(ef);
128 void naiveEncodeEnumTableFunc(ElementFunction* This){
129 ASSERT(GETFUNCTIONTYPE(This->function)==TABLEFUNC);
130 ArrayElement* elements= &This->inputs;
131 Table* table = ((FunctionTable*) (This->function))->table;
132 uint size = getSizeVectorTableEntry(&table->entries);
133 for(uint i=0; i<size; i++){
134 TableEntry* entry = getVectorTableEntry(&table->entries, i);
135 //FIXME: generate Constraints
140 void naiveEncodeEnumOperatingFunc(ElementFunction* This){