#include "integerencoding.h"
-#include "orderelement.h"
+#include "set.h"
#include "order.h"
#include "satencoder.h"
#include "csolver.h"
-#include "predicate.h"
-#include "element.h"
-#include "rewriter.h"
-#include "set.h"
+#include "integerencodingrecord.h"
+#include "integerencorderresolver.h"
+#include "tunable.h"
+
+IntegerEncodingTransform::IntegerEncodingTransform(CSolver *_solver)
+ : Transform(_solver)
+{
+}
+IntegerEncodingTransform::~IntegerEncodingTransform() {
+}
-void orderIntegerEncodingSATEncoder(SATEncoder *This, BooleanOrder *boolOrder) {
- Order *order = boolOrder->order;
- if (order->elementTable == NULL) {
- order->initializeOrderElementsHashTable();
+void IntegerEncodingTransform::doTransform() {
+ HashsetOrder *orders = solver->getActiveOrders()->copy();
+ SetIteratorOrder *orderit = orders->iterator();
+ while (orderit->hasNext()) {
+ Order *order = orderit->next();
+ if (GETVARTUNABLE(solver->getTuner(), order->type, ORDERINTEGERENCODING, &offon))
+ integerEncode(order);
}
- //getting two elements and using LT predicate ...
- ElementSet *elem1 = (ElementSet *)getOrderIntegerElement(This, order, boolOrder->first);
- ElementSet *elem2 = (ElementSet *)getOrderIntegerElement(This, order, boolOrder->second);
- Set *sarray[] = {elem1->set, elem2->set};
- Predicate *predicate = This->solver->createPredicateOperator(LT, sarray, 2);
- Element *parray[] = {elem1, elem2};
- Boolean *boolean = This->solver->applyPredicate(predicate, parray, 2);
- This->solver->addConstraint(boolean);
- This->solver->replaceBooleanWithBoolean(boolOrder, boolean);
+ delete orders;
+ delete orderit;
+}
+
+void IntegerEncodingTransform::integerEncode(Order *currOrder) {
+ IntegerEncodingRecord *encodingRecord = new IntegerEncodingRecord(
+ solver->createRangeSet(currOrder->set->getType(), 0, (uint64_t) currOrder->set->getSize() - 1));
+ currOrder->setOrderEncodingType( INTEGERENCODING );
+ uint size = currOrder->constraints.getSize();
+ for (uint i = 0; i < size; i++) {
+ orderIntegerEncodingSATEncoder(currOrder->constraints.get(i), encodingRecord);
+ }
+ currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord));
+ solver->getActiveOrders()->remove(currOrder);
}
-Element *getOrderIntegerElement(SATEncoder *This,Order *order, uint64_t item) {
- HashSetOrderElement *eset = order->elementTable;
- OrderElement oelement(item, NULL);
- if ( !eset->contains(&oelement)) {
- Set *set = This->solver->createRangeSet(order->set->type, 1, (uint64_t) order->set->getSize());
- Element *elem = This->solver->getElementVar(set);
- eset->add(new OrderElement(item, elem));
- return elem;
- } else
- return eset->get(&oelement)->elem;
+void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(BooleanOrder *boolOrder, IntegerEncodingRecord *ierec) {
+ //getting two elements and using LT predicate ...
+ Element *elem1 = ierec->getOrderIntegerElement(solver, boolOrder->first);
+ Element *elem2 = ierec->getOrderIntegerElement(solver, boolOrder->second);
+ Set *sarray[] = {ierec->getSecondarySet(), ierec->getSecondarySet()};
+ Predicate *predicate = solver->createPredicateOperator(SATC_LT, sarray, 2);
+ Element *parray[] = {elem1, elem2};
+ BooleanEdge boolean = solver->applyPredicate(predicate, parray, 2);
+ solver->replaceBooleanWithBoolean(boolOrder, boolean);
}