return This;
}
-void deleteNodeInfo(NodeInfo* info){
+void deleteNodeInfo(NodeInfo* info) {
ourfree(info);
}
return orderGraph;
}
-void DFS(OrderGraph* graph, VectorOrderNode* finishNodes, HashTableNodeInfo* nodeToInfo){
+void DFS(OrderGraph* graph, VectorOrderNode* finishNodes, HashTableNodeInfo* nodeToInfo) {
uint timer=0;
HSIteratorOrderNode* iterator = iteratorOrderNode(graph->nodes);
while(hasNextOrderNode(iterator)){
deleteIterOrderNode(iterator);
}
-void DFSReverse(OrderGraph* graph, VectorOrderNode* finishNodes, HashTableNodeInfo* nodeToInfo){
+void DFSReverse(OrderGraph* graph, VectorOrderNode* finishNodes, HashTableNodeInfo* nodeToInfo) {
uint timer=0;
uint size = getSizeVectorOrderNode(finishNodes);
for(int i=size-1; i>=0; i--){
}
void DFSNodeVisit(OrderNode* node, VectorOrderNode* finishNodes,
- HashTableNodeInfo* nodeToInfo, uint* timer, bool isReverse){
+ HashTableNodeInfo* nodeToInfo, uint* timer, bool isReverse) {
(*timer)++;
model_print("Timer in DFSNodeVisit:%u\n", *timer);
HSIteratorOrderEdge* iterator = isReverse?iteratorOrderEdge(node->inEdges):iteratorOrderEdge(node->outEdges);
deleteIterOrderEdge(iterator);
}
-void initializeNodeInfoSCC(OrderGraph* graph, HashTableNodeInfo* nodeToInfo){
+void initializeNodeInfoSCC(OrderGraph* graph, HashTableNodeInfo* nodeToInfo) {
HSIteratorOrderNode* iterator = iteratorOrderNode(graph->nodes);
while(hasNextOrderNode(iterator)){
putNodeInfo(nodeToInfo, nextOrderNode(iterator), allocNodeInfo());
deleteIterOrderNode(iterator);
}
-void resetNodeInfoStatusSCC(OrderGraph* graph, HashTableNodeInfo* nodeToInfo){
+void resetNodeInfoStatusSCC(OrderGraph* graph, HashTableNodeInfo* nodeToInfo) {
HSIteratorOrderNode* iterator = iteratorOrderNode(graph->nodes);
while(hasNextOrderNode(iterator)){
NodeInfo* info= getNodeInfo(nodeToInfo, nextOrderNode(iterator));
deleteIterOrderNode(iterator);
}
-void computeStronglyConnectedComponentGraph(OrderGraph* graph){
+void computeStronglyConnectedComponentGraph(OrderGraph* graph) {
VectorOrderNode finishNodes;
initDefVectorOrderNode(& finishNodes);
HashTableNodeInfo* nodeToInfo = allocHashTableNodeInfo(HT_INITIAL_CAPACITY, HT_DEFAULT_FACTOR);
resetNodeInfoStatusSCC(graph, nodeToInfo);
DFSReverse(graph, &finishNodes, nodeToInfo);
deleteHashTableNodeInfo(nodeToInfo);
+ deleteVectorArrayOrderNode(&finishNodes);
}
-void removeMustBeTrueNodes(OrderGraph* graph){
+void removeMustBeTrueNodes(OrderGraph* graph) {
//TODO: Nodes that all the incoming/outgoing edges are MUST_BE_TRUE
}
+bool searchForNode(OrderNode *src, OrderNode *dst) {
+ bool found=false;
+ VectorOrderNode stack;
+ initDefVectorOrderNode(&stack);
+ pushVectorOrderNode(&stack, src);
+ HashSetOrderNode* discovered = allocHashSetOrderNode(16, 0.3);
+ while(getSizeVectorOrderNode(&stack) != 0) {
+ OrderNode* node = lastVectorOrderNode(&stack); popVectorOrderNode(&stack);
+ HSIteratorOrderEdge *edgeit = iteratorOrderEdge(node->outEdges);
+ while(hasNextOrderEdge(edgeit)) {
+ OrderEdge* edge = nextOrderEdge(edgeit);
+ if (edge->polPos) {
+ OrderNode *edge_dst = edge->sink;
+ if (edge_dst == dst)
+ goto exitloop;
+ if (addHashSetOrderNode(discovered, edge_dst)) {
+ pushVectorOrderNode(&stack, edge_dst);
+ }
+ }
+ }
+ deleteIterOrderEdge(edgeit);
+ }
+ exitloop:
+ deleteHashSetOrderNode(discovered);
+ deleteVectorArrayOrderNode(&stack);
+ return found;
+}
+
+void completePartialOrderGraph(OrderGraph* graph) {
+ HSIteratorOrderNode* iterator = iteratorOrderNode(graph->nodes);
+ while(hasNextOrderNode(iterator)) {
+ OrderNode* node = nextOrderNode(iterator);
+ HSIteratorOrderEdge *edgeit = iteratorOrderEdge(node->outEdges);
+ while(hasNextOrderEdge(edgeit)) {
+ OrderEdge* edge = nextOrderEdge(edgeit);
+ if(edge->polNeg) {
+ if (edge->polPos || searchForNode(node, edge->sink)) {
+ OrderEdge * newedge = getOrderEdgeFromOrderGraph(graph, edge->sink, edge->source);
+ newedge->pseudoPos = true;
+ }
+ }
+ }
+ deleteIterOrderEdge(edgeit);
+ }
+ deleteIterOrderNode(iterator);
+}
+
void orderAnalysis(CSolver* This){
uint size = getSizeVectorOrder(This->allOrders);
for(uint i=0; i<size; i++){
Order* order = getVectorOrder(This->allOrders, i);
OrderGraph* graph = buildOrderGraph(order);
+ if (order->type==PARTIAL) {
+ completePartialOrderGraph(graph);
+ }
removeMustBeTrueNodes(graph);
computeStronglyConnectedComponentGraph(graph);
deleteOrderGraph(graph);
case P_BOTHTRUEFALSE:
case P_TRUE:{
OrderEdge* _1to2 = getOrderEdgeFromOrderGraph(graph, node1, node2);
- _1to2->polPos=true;
if (mustval==BV_MUSTBETRUE || mustval == BV_UNSAT)
- _1to2->mustPos=true;
+ _1to2->mustPos = true;
+ _1to2->polPos = true;
addNewOutgoingEdge(node1, _1to2);
addNewIncomingEdge(node2, _1to2);
if(constr->polarity == P_TRUE)
case P_FALSE:{
if (order->type==TOTAL) {
OrderEdge* _2to1 = getOrderEdgeFromOrderGraph(graph, node2, node1);
- _2to1->polPos=true;
if (mustval==BV_MUSTBEFALSE || mustval == BV_UNSAT)
- _2to1->mustPos=true;
+ _2to1->mustPos = true;
+ _2to1->polPos = true;
addNewOutgoingEdge(node2, _2to1);
addNewIncomingEdge(node1, _2to1);
} else {
OrderEdge* _1to2 = getOrderEdgeFromOrderGraph(graph, node1, node2);
- _1to2->polNeg=true;
if (mustval==BV_MUSTBEFALSE || mustval == BV_UNSAT)
- _1to2->mustNeg=true;
+ _1to2->mustNeg = true;
+ _1to2->polNeg = true;
addNewOutgoingEdge(node1, _1to2);
addNewIncomingEdge(node2, _1to2);
}
return edge;
}
+OrderEdge* getInverseOrderEdge(OrderGraph* graph, OrderEdge *edge) {
+ OrderEdge inverseedge={edge->sink, edge->source, false, false, false, false, false};
+ OrderEdge * tmp=getHashSetOrderEdge(graph->edges, &inverseedge);
+ return tmp;
+}
+
void addOrderConstraintToOrderGraph(OrderGraph* graph, Boolean* constr) {
BooleanOrder* bOrder = (BooleanOrder*) constr;
OrderNode* from = getOrderNodeFromOrderGraph(graph, bOrder->first);