Merge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/constraint_compiler into...
[satune.git] / src / ASTTransform / integerencoding.cc
1 #include "integerencoding.h"
2 #include "set.h"
3 #include "order.h"
4 #include "satencoder.h"
5 #include "csolver.h"
6 #include "integerencodingrecord.h"
7 #include "integerencorderresolver.h"
8 #include "tunable.h"
9 #include "polarityassignment.h"
10
11 IntegerEncodingTransform::IntegerEncodingTransform(CSolver *_solver)
12         : Transform(_solver)
13 {
14 }
15
16 IntegerEncodingTransform::~IntegerEncodingTransform() {
17 }
18
19 void IntegerEncodingTransform::doTransform() {
20         if (solver->isUnSAT()) {
21                 return;
22         }
23         HashsetOrder *orders = solver->getActiveOrders()->copy();
24         SetIteratorOrder *orderit = orders->iterator();
25         while (orderit->hasNext()) {
26                 Order *order = orderit->next();
27                 if (GETVARTUNABLE(solver->getTuner(), order->type, ORDERINTEGERENCODING, &offon))
28                         integerEncode(order);
29         }
30         delete orders;
31         delete orderit;
32 }
33
34 void IntegerEncodingTransform::integerEncode(Order *currOrder) {
35         IntegerEncodingRecord *encodingRecord =  new IntegerEncodingRecord(
36                 solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->getNumUsed() - 1));
37         currOrder->setOrderEncodingType( INTEGERENCODING );
38
39         Vector<BooleanOrder *> *constraints = currOrder->getConstraints();
40         uint size = constraints->getSize();
41         for (uint i = 0; i < size; i++) {
42                 orderIntegerEncodingSATEncoder(constraints->get(i), encodingRecord);
43         }
44         currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord));
45         solver->getActiveOrders()->remove(currOrder);
46 }
47
48
49 void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(BooleanOrder *boolOrder, IntegerEncodingRecord *ierec) {
50         //getting two elements and using LT predicate ...
51         Element *elem1 = ierec->getOrderIntegerElement(solver, boolOrder->first);
52         Element *elem2 = ierec->getOrderIntegerElement(solver, boolOrder->second);
53         Predicate *predicate = solver->createPredicateOperator(SATC_LT);
54         Element *parray[] = {elem1, elem2};
55         BooleanEdge boolean = solver->applyPredicate(predicate, parray, 2);
56         updateEdgePolarity(boolean, boolOrder);
57         solver->replaceBooleanWithBoolean(boolOrder, boolean);
58 }
59