Make integerencoding a completely separate pass... Fix issue of changing ordersets
[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
10 IntegerEncodingTransform::IntegerEncodingTransform(CSolver *_solver)
11         : Transform(_solver)
12 {
13         orderIntEncoding = new HashTableOrderIntEncoding();
14 }
15
16 IntegerEncodingTransform::~IntegerEncodingTransform() {
17         orderIntEncoding->resetanddelete();
18 }
19
20 void IntegerEncodingTransform::doTransform() {
21         HashsetOrder *orders = solver->getActiveOrders()->copy();
22         SetIteratorOrder * orderit=orders->iterator();
23         while(orderit->hasNext()) {
24                 Order *order = orderit->next();
25                 if (GETVARTUNABLE(solver->getTuner(), order->type, ORDERINTEGERENCODING, &onoff))
26                         integerEncode(order);
27         }
28         delete orders;
29         delete orderit;
30 }
31
32 void IntegerEncodingTransform::integerEncode(Order *currOrder) {
33         IntegerEncodingRecord *encodingRecord = NULL;
34         if (!orderIntEncoding->contains(currOrder)) {
35                 encodingRecord = new IntegerEncodingRecord(
36                         solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->set->getSize() - 1));
37                 orderIntEncoding->put(currOrder, encodingRecord);
38         } else {
39                 encodingRecord = orderIntEncoding->get(currOrder);
40         }
41         uint size = currOrder->constraints.getSize();
42         for (uint i = 0; i < size; i++) {
43                 orderIntegerEncodingSATEncoder(currOrder, currOrder->constraints.get(i));
44         }
45         currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord));
46         solver->getActiveOrders()->remove(currOrder);
47 }
48
49
50 void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(Order * currOrder, BooleanOrder *boolOrder) {
51         IntegerEncodingRecord *ierec = orderIntEncoding->get(currOrder);
52         //getting two elements and using LT predicate ...
53         Element *elem1 = ierec->getOrderIntegerElement(solver, boolOrder->first);
54         Element *elem2 = ierec->getOrderIntegerElement(solver, boolOrder->second);
55         Set *sarray[] = {ierec->getSecondarySet(), ierec->getSecondarySet()};
56         Predicate *predicate = solver->createPredicateOperator(SATC_LT, sarray, 2);
57         Element *parray[] = {elem1, elem2};
58         Boolean *boolean = solver->applyPredicate(predicate, parray, 2);
59         solver->addConstraint(boolean);
60         solver->replaceBooleanWithBoolean(boolOrder, boolean);
61 }
62