b52ccf84921cb5cafe16d314cea7c7deed4bb002
[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 }
14
15 IntegerEncodingTransform::~IntegerEncodingTransform() {
16 }
17
18 void IntegerEncodingTransform::doTransform() {
19         HashsetOrder *orders = solver->getActiveOrders()->copy();
20         SetIteratorOrder * orderit=orders->iterator();
21         while(orderit->hasNext()) {
22                 Order *order = orderit->next();
23                 if (GETVARTUNABLE(solver->getTuner(), order->type, ORDERINTEGERENCODING, &onoff))
24                         integerEncode(order);
25         }
26         delete orders;
27         delete orderit;
28 }
29
30 void IntegerEncodingTransform::integerEncode(Order *currOrder) {
31         IntegerEncodingRecord *encodingRecord =  new IntegerEncodingRecord(
32                 solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->set->getSize() - 1));
33         currOrder->setOrderEncodingType( INTEGERENCODING );
34         uint size = currOrder->constraints.getSize();
35         for (uint i = 0; i < size; i++) {
36                 orderIntegerEncodingSATEncoder(currOrder->constraints.get(i), encodingRecord);
37         }
38         currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord));
39         solver->getActiveOrders()->remove(currOrder);
40 }
41
42
43 void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(BooleanOrder *boolOrder, IntegerEncodingRecord *ierec) {
44         //getting two elements and using LT predicate ...
45         Element *elem1 = ierec->getOrderIntegerElement(solver, boolOrder->first);
46         Element *elem2 = ierec->getOrderIntegerElement(solver, boolOrder->second);
47         Set *sarray[] = {ierec->getSecondarySet(), ierec->getSecondarySet()};
48         Predicate *predicate = solver->createPredicateOperator(SATC_LT, sarray, 2);
49         Element *parray[] = {elem1, elem2};
50         BooleanEdge boolean = solver->applyPredicate(predicate, parray, 2);
51         solver->addConstraint(boolean);
52         solver->replaceBooleanWithBoolean(boolOrder, boolean);
53 }
54