delete nodes;
delete edges;
}
+
+bool OrderGraph::isTherePath(OrderNode *source, OrderNode *destination){
+ HashsetOrderNode visited;
+ visited.add(source);
+ SetIteratorOrderEdge *iterator = source->outEdges.iterator();
+ bool found = false;
+ while(iterator->hasNext()){
+ OrderNode* node = iterator->next()->sink;
+ if(!visited.contains(node)){
+ if( node == destination ){
+ found = true;
+ break;
+ }
+ visited.add(node);
+ found =isTherePathVisit(visited, node, destination);
+ if(found){
+ break;
+ }
+ }
+ }
+ delete iterator;
+ return found;
+}
+
+bool OrderGraph::isTherePathVisit(HashsetOrderNode &visited, OrderNode* current, OrderNode* destination){
+ SetIteratorOrderEdge *iterator = current->outEdges.iterator();
+ bool found = false;
+ while(iterator->hasNext()){
+ OrderNode* node = iterator->next()->sink;
+ if(node == destination){
+ found = true;
+ break;
+ }
+ visited.add(node);
+ if(isTherePathVisit(visited, node, destination)){
+ found = true;
+ break;
+ }
+ }
+ delete iterator;
+ return found;
+}
void addOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
void addMustOrderEdge(OrderNode *node1, OrderNode *node2, BooleanOrder *constr);
OrderEdge *getInverseOrderEdge(OrderEdge *edge);
- Order *getOrder() {return order;}
+ Order *getOrder() {return order;}
+ bool isTherePath(OrderNode* source, OrderNode* destination);
+ bool isTherePathVisit(HashsetOrderNode &visited, OrderNode* current, OrderNode* destination);
SetIteratorOrderNode *getNodes() {return nodes->iterator();}
SetIteratorOrderEdge *getEdges() {return edges->iterator();}
case SATC_TOTAL:
return from->sccNum < to->sccNum;
case SATC_PARTIAL:
- //Adding support for partial order ...
+ return resolvePartialOrder(from, to);
default:
ASSERT(0);
}
}
}
+bool DecomposeOrderResolver::resolvePartialOrder(OrderNode* first, OrderNode* second){
+ if(first->sccNum > second->sccNum){
+ return false;
+ } else {
+ return graph->isTherePath(first, second);
+ }
+
+}
+
public:
DecomposeOrderResolver(OrderGraph *graph, Vector<Order *> &orders);
bool resolveOrder(uint64_t first, uint64_t second);
+ bool resolvePartialOrder(OrderNode* first, OrderNode* second);
virtual ~DecomposeOrderResolver();
private:
OrderGraph *graph;