1 #include "naiveencoder.h"
2 #include "elementencoding.h"
4 #include "functionencoding.h"
12 #include "tableentry.h"
17 void naiveEncodingDecision(CSolver *This) {
18 SetIteratorBooleanEdge *iterator = This->getConstraints();
19 while (iterator->hasNext()) {
20 BooleanEdge b = iterator->next();
21 naiveEncodingConstraint(This, b.getBoolean());
26 void naiveEncodingConstraint(CSolver *csolver, Boolean *This) {
32 if (((BooleanOrder *) This)->order->encoding.type == ORDER_UNASSIGNED)
33 ((BooleanOrder *) This)->order->setOrderEncodingType(PAIRWISE);
37 naiveEncodingLogicOp(csolver, (BooleanLogic *) This);
41 naiveEncodingPredicate(csolver, (BooleanPredicate *) This);
49 void naiveEncodingLogicOp(CSolver *csolver, BooleanLogic *This) {
50 for (uint i = 0; i < This->inputs.getSize(); i++) {
51 naiveEncodingConstraint(csolver, This->inputs.get(i).getBoolean());
55 void naiveEncodingPredicate(CSolver *csolver, BooleanPredicate *This) {
56 FunctionEncoding *encoding = This->getFunctionEncoding();
57 if (encoding->getFunctionEncodingType() == FUNC_UNASSIGNED)
58 This->getFunctionEncoding()->setFunctionEncodingType(ENUMERATEIMPLICATIONS);
60 for (uint i = 0; i < This->inputs.getSize(); i++) {
61 Element *element = This->inputs.get(i);
62 naiveEncodingElement(csolver, element);
66 void naiveEncodingElement(CSolver *csolver, Element *This) {
67 ElementEncoding *encoding = This->getElementEncoding();
68 if (encoding->getElementEncodingType() == ELEM_UNASSIGNED) {
69 if (This->type != ELEMCONST) {
70 model_print("INFO: naive encoder is making the decision about element %p....\n", This);
72 uint enc = csolver->getTuner()->getVarTunable(This->getRange()->getType(), NODEENCODING, &NodeEncodingDesc);
73 if (enc == ELEM_UNASSIGNED)
74 enc = csolver->getTuner()->getTunable(NAIVEENCODER, &NaiveEncodingDesc);
75 encoding->setElementEncodingType((ElementEncodingType)enc);
76 encoding->encodingArrayInitialization();
79 if (This->type == ELEMFUNCRETURN) {
80 ElementFunction *function = (ElementFunction *) This;
81 for (uint i = 0; i < function->inputs.getSize(); i++) {
82 Element *element = function->inputs.get(i);
83 naiveEncodingElement(csolver, element);
85 FunctionEncoding *encoding = function->getElementFunctionEncoding();
86 if (encoding->getFunctionEncodingType() == FUNC_UNASSIGNED)
87 function->getElementFunctionEncoding()->setFunctionEncodingType(ENUMERATEIMPLICATIONS);