+#include <stdint.h>
+
#include "orderanalysis.h"
#include "structs.h"
#include "csolver.h"
void DFSNodeVisit(OrderNode *node, Vector<OrderNode *> *finishNodes, bool isReverse, bool mustvisit, uint sccNum) {
SetIteratorOrderEdge *iterator = isReverse ? node->inEdges.iterator() : node->outEdges.iterator();
+#ifdef TRACE_DEBUG
+ model_print("Node:%lu=>", node->id);
+#endif
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
- if (mustvisit) {
+#ifdef TRACE_DEBUG
+ model_print("Edge:%lu=>",(uintptr_t) edge);
+#endif
+ if (mustvisit) {
if (!edge->mustPos)
continue;
} else
continue;
OrderNode *child = isReverse ? edge->source : edge->sink;
-
- if (child->status == NOTVISITED) {
+#ifdef TRACE_DEBUG
+ model_println("NodeChild:%lu", child->id);
+#endif
+ if (child->status == NOTVISITED) {
child->status = VISITED;
DFSNodeVisit(child, finishNodes, isReverse, mustvisit, sccNum);
child->status = FINISHED;
sinkNode->inEdges.remove(outEdge);
//Adding new edge to new sink and src nodes ...
if(srcNode == sinkNode){
+#ifdef TRACE_DEBUG
+ model_println("bypassMustBe 1");
+#endif
This->setUnSAT();
delete iterout;
delete iterin;
newEdge->mustPos = true;
newEdge->polPos = true;
if (newEdge->mustNeg){
+#ifdef TRACE_DEBUG
+ model_println("BypassMustBe 2");
+#endif
This->setUnSAT();
}
srcNode->outEdges.add(newEdge);
OrderEdge *newedge = graph->getOrderEdgeFromOrderGraph(srcnode, node);
newedge->mustPos = true;
newedge->polPos = true;
- if (newedge->mustNeg)
+ if (newedge->mustNeg){
+#ifdef TRACE_DEBUG
+ model_println("DFS clear 1");
+#endif
solver->setUnSAT();
+ }
srcnode->outEdges.add(newedge);
node->inEdges.add(newedge);
}
if (!edge->mustPos && sources->contains(parent)) {
edge->mustPos = true;
edge->polPos = true;
- if (edge->mustNeg)
- solver->setUnSAT();
+ if (edge->mustNeg){
+#ifdef TRACE_DEBUG
+ model_println("DFS clear 2");
+#endif
+ solver->setUnSAT();
+ }
}
}
delete iterator;
if (!edge->mustNeg && sources->contains(child)) {
edge->mustNeg = true;
edge->polNeg = true;
- if (edge->mustPos)
- solver->setUnSAT();
+ if (edge->mustPos){
+#ifdef TRACE_DEBUG
+ model_println("DFS clear 3: NodeFrom:%lu=>edge%lu=>NodeTo:%lu", node->id, (uintptr_t) edge, child->id);
+#endif
+ solver->setUnSAT();
+ }
}
}
delete iterator;
if (!invEdge->mustPos) {
invEdge->polPos = false;
} else {
+#ifdef TRACE_DEBUG
+ model_println("localMustAnalysis Total");
+#endif
solver->setUnSAT();
}
invEdge->mustNeg = true;
if (edge->mustPos) {
if (!edge->mustNeg) {
edge->polNeg = false;
- } else
+ } else{
+#ifdef TRACE_DEBUG
+ model_println("Local must analysis partial");
+#endif
solver->setUnSAT();
-
+ }
OrderEdge *invEdge = graph->getInverseOrderEdge(edge);
if (invEdge != NULL) {
if (!invEdge->mustPos)
invEdge->polPos = false;
- else
+ else{
+#ifdef TRACE_DEBUG
+ model_println("Local must analysis partial 2");
+#endif
solver->setUnSAT();
-
+ }
invEdge->mustNeg = true;
invEdge->polNeg = true;
}