continue;
}
- DecomposeOrderResolver *dor=new DecomposeOrderResolver(order);
+ DecomposeOrderResolver *dor = new DecomposeOrderResolver(order);
order->setOrderResolver(dor);
-
+
OrderGraph *graph = buildOrderGraph(order);
if (order->type == SATC_PARTIAL) {
//Required to do SCC analysis for partial order graphs. It
}
-void DecomposeOrderTransform::decomposeOrder (Order *currOrder, OrderGraph *currGraph, HashsetOrderEdge *edgesRemoved, DecomposeOrderResolver *dor) {
+void DecomposeOrderTransform::decomposeOrder(Order *currOrder, OrderGraph *currGraph, HashsetOrderEdge *edgesRemoved, DecomposeOrderResolver *dor) {
Vector<Order *> partialcandidatevec;
uint size = currOrder->constraints.getSize();
for (uint i = 0; i < size; i++) {
dor->mustOrderEdge(from->getID(), to->getID());
solver->replaceBooleanWithTrue(orderconstraint);
} else if (edge->polNeg) {
- if (currOrder->type == SATC_TOTAL)
+ if (currOrder->type == SATC_TOTAL)
dor->mustOrderEdge(to->getID(), from->getID());
solver->replaceBooleanWithFalse(orderconstraint);
} else {
OrderNode *srcNode = inEdge->source;
srcNode->outEdges.remove(inEdge);
edgesRemoved->add(inEdge);
+ bool removeOutgoingEdges = !iterin->hasNext();
+
SetIteratorOrderEdge *iterout = node->outEdges.iterator();
while (iterout->hasNext()) {
OrderEdge *outEdge = iterout->next();
OrderNode *sinkNode = outEdge->sink;
- sinkNode->inEdges.remove(outEdge);
- edgesRemoved->add(outEdge);
+ if (removeOutgoingEdges) {
+ sinkNode->inEdges.remove(outEdge);
+ edgesRemoved->add(outEdge);
+ }
//Adding new edge to new sink and src nodes ...
if (srcNode == sinkNode) {
solver->setUnSAT();
delete iterout;
delete iterin;
- graph->removeNode(node);
return;
}
//Add new order constraint
delete iterout;
}
delete iterin;
- graph->removeNode(node);
}
void DecomposeOrderTransform::removeMustBeTrueNodes(OrderGraph *graph, HashsetOrderEdge *edgesRemoved) {