}
}
+void OrderGraph::addEdge(uint64_t first, uint64_t second) {
+ OrderNode *node1 = getOrderNodeFromOrderGraph(first);
+ OrderNode *node2 = getOrderNodeFromOrderGraph(second);
+ OrderEdge *_1to2 = getOrderEdgeFromOrderGraph(node1, node2);
+ _1to2->polPos = true;
+ _1to2->mustPos = true;
+ node1->addNewOutgoingEdge(_1to2);
+ node2->addNewIncomingEdge(_1to2);
+}
+
void OrderGraph::addMustOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr) {
BooleanValue mustval = constr->boolVal;
switch (mustval) {
OrderEdge *lookupOrderEdgeFromOrderGraph(OrderNode *begin, OrderNode *end);
void addOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
void addMustOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
+ void addEdge(uint64_t first, uint64_t second);
OrderEdge *getInverseOrderEdge(OrderEdge *edge);
Order *getOrder() {return order;}
bool isTherePath(OrderNode *source, OrderNode *destination);
}
bool mustReachGlobal = GETVARTUNABLE(solver->getTuner(), order->type, MUSTREACHGLOBAL, &onoff);
-
if (mustReachGlobal)
reachMustAnalysis(solver, graph, false);
bool mustReachLocal = GETVARTUNABLE(solver->getTuner(), order->type, MUSTREACHLOCAL, &onoff);
-
if (mustReachLocal) {
//This pair of analysis is also optional
if (order->type == SATC_PARTIAL) {
decomposeOrder(order, graph, edgesRemoved, dor);
if (edgesRemoved != NULL)
delete edgesRemoved;
+ delete graph;
}
delete orderit;
delete orders;
DecomposeOrderResolver::~DecomposeOrderResolver() {
if (graph != NULL)
delete graph;
- uint size=edges.getSize();
edges.resetAndDelete();
}
return neworder;
}
+void DecomposeOrderResolver::buildGraph() {
+ graph = new OrderGraph(order);
+ SetIteratorDOREdge *iterator = edges.iterator();
+ while(iterator->hasNext()) {
+ DOREdge * doredge = iterator->next();
+ if (doredge->orderindex == 0) {
+ graph->addEdge(doredge->origfirst, doredge->origsecond);
+ } else {
+ Order * suborder = orders.get(doredge->orderindex);
+ bool isEdge = suborder->encoding.resolver->resolveOrder(doredge->newfirst, doredge->newsecond);
+ if (isEdge)
+ graph->addEdge(doredge->origfirst, doredge->origsecond);
+ }
+ }
+ delete iterator;
+ if (order->type == SATC_TOTAL) {
+ graph->computeStronglyConnectedComponentGraph();
+ }
+}
+
bool DecomposeOrderResolver::resolveOrder(uint64_t first, uint64_t second) {
+ if (graph == NULL)
+ buildGraph();
+
OrderNode *from = graph->lookupOrderNodeFromOrderGraph(first);
ASSERT(from != NULL);
OrderNode *to = graph->lookupOrderNodeFromOrderGraph(second);
ASSERT(to != NULL);
- if (from->removed || to->removed) {
- HashsetOrderNode fromset, toset;
- // processNode(&fromset, from, true);
- // processNode(&toset, to, false);
- SetIteratorOrderNode *fromit=fromset.iterator();
- while(fromit->hasNext()) {
- OrderNode * nodefrom=fromit->next();
- SetIteratorOrderNode *toit=toset.iterator();
- while(toit->hasNext()) {
- OrderNode * nodeto=toit->next();
- if (resolveOrder(nodefrom->getID(), nodeto->getID())) {
- delete fromit;
- delete toit;
- return true;
- }
- }
- delete toit;
- }
- delete fromit;
- return false;
- } else if (from->sccNum != to->sccNum) {
- OrderEdge *edge = graph->lookupOrderEdgeFromOrderGraph(from, to);
- switch (graph->getOrder()->type) {
- case SATC_TOTAL:
- return from->sccNum < to->sccNum;
- case SATC_PARTIAL:
- return resolvePartialOrder(from, to);
- default:
- ASSERT(0);
- }
- } else {
- Order *suborder = NULL;
- // We should ask this query from the suborder ....
- suborder = orders.get(from->sccNum);
- ASSERT(suborder != NULL);
- return suborder->encoding.resolver->resolveOrder(from->id, to->id);
+ switch (order->type) {
+ case SATC_TOTAL:
+ return from->sccNum < to->sccNum;
+ case SATC_PARTIAL:
+ return resolvePartialOrder(from, to);
+ default:
+ ASSERT(0);
}
}
} else {
return graph->isTherePath(first, second);
}
-
}