1 #include "integerencoding.h"
4 #include "satencoder.h"
6 #include "integerencodingrecord.h"
7 #include "integerencorderresolver.h"
10 IntegerEncodingTransform::IntegerEncodingTransform(CSolver *_solver)
13 orderIntEncoding = new HashTableOrderIntEncoding();
16 IntegerEncodingTransform::~IntegerEncodingTransform() {
17 orderIntEncoding->resetanddelete();
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))
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 currOrder->setOrderEncodingType( INTEGERENCODING );
40 encodingRecord = orderIntEncoding->get(currOrder);
42 uint size = currOrder->constraints.getSize();
43 for (uint i = 0; i < size; i++) {
44 orderIntegerEncodingSATEncoder(currOrder, currOrder->constraints.get(i));
46 currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord));
47 solver->getActiveOrders()->remove(currOrder);
51 void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(Order * currOrder, BooleanOrder *boolOrder) {
52 IntegerEncodingRecord *ierec = orderIntEncoding->get(currOrder);
53 //getting two elements and using LT predicate ...
54 Element *elem1 = ierec->getOrderIntegerElement(solver, boolOrder->first);
55 Element *elem2 = ierec->getOrderIntegerElement(solver, boolOrder->second);
56 Set *sarray[] = {ierec->getSecondarySet(), ierec->getSecondarySet()};
57 Predicate *predicate = solver->createPredicateOperator(SATC_LT, sarray, 2);
58 Element *parray[] = {elem1, elem2};
59 BooleanEdge boolean = solver->applyPredicate(predicate, parray, 2);
60 solver->addConstraint(boolean);
61 solver->replaceBooleanWithBoolean(boolOrder, boolean);