}
void DecomposeOrderTransform::doTransform() {
- Vector<Order *> *orders = solver->getOrders();
- uint size = orders->getSize();
- for (uint i = 0; i < size; i++) {
- Order *order = orders->get(i);
+ HashsetOrder *orders = solver->getActiveOrders()->copy();
+ SetIteratorOrder * orderit=orders->iterator();
+ while(orderit->hasNext()) {
+ Order *order = orderit->next();
if (GETVARTUNABLE(solver->getTuner(), order->type, DECOMPOSEORDER, &onoff) == 0) {
continue;
decomposeOrder(order, graph);
delete graph;
}
+ delete orderit;
+ delete orders;
}
+
void DecomposeOrderTransform::decomposeOrder (Order *currOrder, OrderGraph *currGraph) {
Vector<Order *> ordervec;
Vector<Order *> partialcandidatevec;
}
}
currOrder->setOrderResolver( new DecomposeOrderResolver(currGraph, ordervec) );
+ solver->getActiveOrders()->remove(currOrder);
uint pcvsize = partialcandidatevec.getSize();
for (uint i = 0; i < pcvsize; i++) {
Order *neworder = partialcandidatevec.get(i);
CMEMALLOC;
private:
- Order *currOrder;
- OrderGraph *currGraph;
};
#endif/* ORDERTRANSFORM_H */
}
void IntegerEncodingTransform::doTransform() {
- Vector<Order *> *orders = solver->getOrders();
- uint size = orders->getSize();
- for (uint i = 0; i < size; i++) {
- Order *order = orders->get(i);
+ HashsetOrder *orders = solver->getActiveOrders()->copy();
+ SetIteratorOrder * orderit=orders->iterator();
+ while(orderit->hasNext()) {
+ Order *order = orderit->next();
if (GETVARTUNABLE(solver->getTuner(), order->type, ORDERINTEGERENCODING, &onoff))
integerEncode(order);
}
+ delete orders;
+ delete orderit;
}
void IntegerEncodingTransform::integerEncode(Order *currOrder) {
}
uint size = currOrder->constraints.getSize();
for (uint i = 0; i < size; i++) {
- orderIntegerEncodingSATEncoder(currOrder->constraints.get(i));
+ orderIntegerEncodingSATEncoder(currOrder, currOrder->constraints.get(i));
}
currOrder->setOrderResolver(new IntegerEncOrderResolver(solver, encodingRecord));
+ solver->getActiveOrders()->remove(currOrder);
}
-void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(BooleanOrder *boolOrder) {
+void IntegerEncodingTransform::orderIntegerEncodingSATEncoder(Order * currOrder, BooleanOrder *boolOrder) {
IntegerEncodingRecord *ierec = orderIntEncoding->get(currOrder);
//getting two elements and using LT predicate ...
Element *elem1 = ierec->getOrderIntegerElement(solver, boolOrder->first);
class IntegerEncodingTransform : public Transform {
public:
IntegerEncodingTransform(CSolver *solver);
- void orderIntegerEncodingSATEncoder(BooleanOrder *boolOrder);
+ void orderIntegerEncodingSATEncoder(Order * currOrder, BooleanOrder *boolOrder);
void doTransform();
void integerEncode(Order *currOrder);
virtual ~IntegerEncodingTransform();
private:
- Order *currOrder;
//FIXME:We can remove it, because we don't need it for translating anymore... -HG
HashTableOrderIntEncoding *orderIntEncoding;
};
#include "hashset.h"
typedef Hashset<Boolean *, uintptr_t, 4> HashsetBoolean;
+typedef Hashset<Order *, uintptr_t, 4> HashsetOrder;
typedef SetIterator<Boolean *, uintptr_t, 4> SetIteratorBoolean;
+typedef SetIterator<Order *, uintptr_t, 4> SetIteratorOrder;
#endif
Order *CSolver::createOrder(OrderType type, Set *set) {
Order *order = new Order(type, set);
allOrders.push(order);
+ activeOrders.add(order);
return order;
}
bool isUnSAT() { return unsat; }
Vector<Order *> *getOrders() { return &allOrders;}
+ HashsetOrder * getActiveOrders() { return &activeOrders;}
Tuner *getTuner() { return tuner; }
/** This is a vector of all order structs that we have allocated. */
Vector<Order *> allOrders;
+ HashsetOrder activeOrders;
+
/** This is a vector of all function structs that we have allocated. */
Vector<Function *> allFunctions;