1 #include "transformer.h"
5 #include "ordergraph.h"
9 #include "mutableset.h"
12 #include "orderanalysis.h"
14 #include "transform.h"
16 #include "integerencoding.h"
17 #include "decomposeordertransform.h"
19 Transformer::Transformer(CSolver *_solver):
20 integerEncoding(new IntegerEncodingTransform(_solver)),
21 decomposeOrder(new DecomposeOrderTransform(_solver)),
26 Transformer::~Transformer(){
27 delete integerEncoding;
28 delete decomposeOrder;
31 void Transformer::orderAnalysis() {
32 Vector<Order *> *orders = solver->getOrders();
33 uint size = orders->getSize();
34 for (uint i = 0; i < size; i++) {
35 Order *order = orders->get(i);
36 decomposeOrder->setCurrentOrder(order);
37 if (!decomposeOrder->canExecuteTransform()){
41 OrderGraph *graph = buildOrderGraph(order);
42 if (order->type == SATC_PARTIAL) {
43 //Required to do SCC analysis for partial order graphs. It
44 //makes sure we don't incorrectly optimize graphs with negative
46 completePartialOrderGraph(graph);
50 bool mustReachGlobal = GETVARTUNABLE(solver->getTuner(), order->type, MUSTREACHGLOBAL, &onoff);
53 reachMustAnalysis(solver, graph, false);
55 bool mustReachLocal = GETVARTUNABLE(solver->getTuner(), order->type, MUSTREACHLOCAL, &onoff);
58 //This pair of analysis is also optional
59 if (order->type == SATC_PARTIAL) {
60 localMustAnalysisPartial(solver, graph);
62 localMustAnalysisTotal(solver, graph);
66 bool mustReachPrune = GETVARTUNABLE(solver->getTuner(), order->type, MUSTREACHPRUNE, &onoff);
69 removeMustBeTrueNodes(solver, graph);
71 //This is needed for splitorder
72 computeStronglyConnectedComponentGraph(graph);
73 decomposeOrder->setOrderGraph(graph);
74 decomposeOrder->doTransform();
77 integerEncoding->setCurrentOrder(order);
78 if(!integerEncoding->canExecuteTransform()){
81 integerEncoding->doTransform();