One bug in our port and another bug in the original version
[satune.git] / src / Translator / decomposeorderresolver.cc
1
2 /*
3  * File:   DecomposeOrderResolver.cc
4  * Author: hamed
5  *
6  * Created on September 1, 2017, 10:36 AM
7  */
8
9 #include "decomposeorderresolver.h"
10 #include "order.h"
11 #include "ordernode.h"
12 #include "ordergraph.h"
13
14 DecomposeOrderResolver::DecomposeOrderResolver(OrderGraph *_graph, Vector<Order *> &_orders) :
15         graph(_graph),
16         orders(_orders.getSize(), _orders.expose())
17 {
18 }
19
20 DecomposeOrderResolver::~DecomposeOrderResolver() {
21 }
22
23 bool DecomposeOrderResolver::resolveOrder(uint64_t first, uint64_t second) {
24         OrderNode *from = graph->lookupOrderNodeFromOrderGraph(first);
25         ASSERT(from != NULL);
26         OrderNode *to = graph->lookupOrderNodeFromOrderGraph(second);
27         ASSERT(to != NULL);
28
29         if (from->sccNum != to->sccNum) {
30                 OrderEdge *edge = graph->lookupOrderEdgeFromOrderGraph(from, to);
31                 if (edge != NULL && edge->mustPos) {
32                         return true;
33                 } else if ( edge != NULL && edge->mustNeg) {
34                         return false;
35                 } else {
36                         switch (graph->getOrder()->type) {
37                         case SATC_TOTAL:
38                                 return from->sccNum < to->sccNum;
39                         case SATC_PARTIAL:
40                         //Adding support for partial order ...
41                         default:
42                                 ASSERT(0);
43                         }
44                 }
45         } else {
46                 Order *suborder = NULL;
47                 // We should ask this query from the suborder ....
48                 suborder = orders.get(from->sccNum);
49                 ASSERT(suborder != NULL);
50                 return suborder->encoding.resolver->resolveOrder(from->id, to->id);
51         }
52 }
53