1 #include "naiveencoder.h"
2 #include "elementencoding.h"
4 #include "functionencoding.h"
12 #include "tableentry.h"
17 void naiveEncodingDecision(CSolver *This) {
21 SetIteratorBooleanEdge *iterator = This->getConstraints();
22 while (iterator->hasNext()) {
23 BooleanEdge b = iterator->next();
24 naiveEncodingConstraint(This, b.getBoolean());
29 void naiveEncodingConstraint(CSolver *csolver, Boolean *This) {
35 if (((BooleanOrder *) This)->order->encoding.type == ORDER_UNASSIGNED)
36 ((BooleanOrder *) This)->order->setOrderEncodingType(PAIRWISE);
40 naiveEncodingLogicOp(csolver, (BooleanLogic *) This);
44 naiveEncodingPredicate(csolver, (BooleanPredicate *) This);
52 void naiveEncodingLogicOp(CSolver *csolver, BooleanLogic *This) {
53 for (uint i = 0; i < This->inputs.getSize(); i++) {
54 naiveEncodingConstraint(csolver, This->inputs.get(i).getBoolean());
58 void naiveEncodingPredicate(CSolver *csolver, BooleanPredicate *This) {
59 FunctionEncoding *encoding = This->getFunctionEncoding();
60 if (encoding->getFunctionEncodingType() == FUNC_UNASSIGNED)
61 This->getFunctionEncoding()->setFunctionEncodingType(ENUMERATEIMPLICATIONS);
63 for (uint i = 0; i < This->inputs.getSize(); i++) {
64 Element *element = This->inputs.get(i);
65 naiveEncodingElement(csolver, element);
69 void naiveEncodingElement(CSolver *csolver, Element *This) {
70 ElementEncoding *encoding = This->getElementEncoding();
71 if (encoding->getElementEncodingType() == ELEM_UNASSIGNED) {
72 if (This->type != ELEMCONST) {
73 model_print("INFO: naive encoder is making the decision about element %p....\n", This);
75 uint enc = csolver->getTuner()->getVarTunable(This->getRange()->getType(), NODEENCODING, &NodeEncodingDesc);
76 if (enc == ELEM_UNASSIGNED)
77 enc = csolver->getTuner()->getTunable(NAIVEENCODER, &NaiveEncodingDesc);
78 encoding->setElementEncodingType((ElementEncodingType)enc);
79 encoding->encodingArrayInitialization();
82 if (This->type == ELEMFUNCRETURN) {
83 ElementFunction *function = (ElementFunction *) This;
84 for (uint i = 0; i < function->inputs.getSize(); i++) {
85 Element *element = function->inputs.get(i);
86 naiveEncodingElement(csolver, element);
88 FunctionEncoding *encoding = function->getElementFunctionEncoding();
89 if (encoding->getFunctionEncodingType() == FUNC_UNASSIGNED)
90 function->getElementFunctionEncoding()->setFunctionEncodingType(ENUMERATEIMPLICATIONS);