3 * File: orderpairresolver.cc
6 * Created on September 1, 2017, 3:36 PM
9 #include "orderpairresolver.h"
10 #include "ordergraph.h"
12 #include "orderedge.h"
13 #include "ordernode.h"
14 #include "satencoder.h"
17 OrderPairResolver::OrderPairResolver(CSolver *_solver, Order *_order) :
23 OrderPairResolver::~OrderPairResolver() {
26 bool OrderPairResolver::resolveOrder(uint64_t first, uint64_t second) {
27 if (order->graph != NULL) {
28 // For the cases that tuning framework decides no to build a graph for order ...
29 OrderGraph *graph = order->graph;
30 OrderNode *from = graph->lookupOrderNodeFromOrderGraph(first);
32 OrderNode *to = graph->lookupOrderNodeFromOrderGraph(second);
35 OrderEdge *edge = graph->lookupOrderEdgeFromOrderGraph(from, to);
37 if (edge != NULL && edge->mustPos) {
39 } else if ( edge != NULL && edge->mustNeg) {
44 //Couldn't infer from graph. Should call the SAT Solver ...
45 switch ( order->type) {
47 resolveTotalOrder(first, second);
49 //TODO: Support for partial order ...
58 bool OrderPairResolver::resolveTotalOrder(uint64_t first, uint64_t second) {
59 ASSERT(order->orderPairTable != NULL);
60 OrderPair pair(first, second, E_NULL);
61 Edge var = getOrderConstraint(order->orderPairTable, &pair);
64 return getValueCNF(solver->getSATEncoder()->getCNF(), var);