From: bdemsky <bdemsky@uci.edu> Date: Wed, 23 Aug 2017 05:38:45 +0000 (-0700) Subject: Implement Partial->Total Conversion X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=9cb55c1cf260106cf90f7aa39b08157d113599bd;p=satune.git Implement Partial->Total Conversion --- diff --git a/src/Encoders/orderencoder.c b/src/Encoders/orderencoder.c index 066695c..a43d39d 100644 --- a/src/Encoders/orderencoder.c +++ b/src/Encoders/orderencoder.c @@ -327,7 +327,9 @@ void localMustAnalysisPartial(CSolver *solver, OrderGraph *graph) { void decomposeOrder(CSolver *This, Order *order, OrderGraph *graph) { VectorOrder ordervec; + VectorOrder partialcandidatevec; initDefVectorOrder(&ordervec); + initDefVectorOrder(&partialcandidatevec); uint size = getSizeVectorBooleanOrder(&order->constraints); for (uint i = 0; i < size; i++) { BooleanOrder *orderconstraint = getVectorBooleanOrder(&order->constraints, i); @@ -353,6 +355,10 @@ void decomposeOrder(CSolver *This, Order *order, OrderGraph *graph) { neworder = allocOrder(order->type, set); pushVectorOrder(This->allOrders, neworder); setExpandVectorOrder(&ordervec, from->sccNum, neworder); + if (order->type == PARTIAL) + setExpandVectorOrder(&partialcandidatevec, from->sccNum, neworder); + else + setExpandVectorOrder(&partialcandidatevec, from->sccNum, NULL); } if (from->status != ADDEDTOSET) { from->status = ADDEDTOSET; @@ -362,11 +368,25 @@ void decomposeOrder(CSolver *This, Order *order, OrderGraph *graph) { to->status = ADDEDTOSET; addElementMSet((MutableSet *)neworder->set, to->id); } + if (order->type == PARTIAL) { + OrderEdge *edge = getOrderEdgeFromOrderGraph(graph, from, to); + if (edge->polNeg) + setExpandVectorOrder(&partialcandidatevec, from->sccNum, NULL); + } orderconstraint->order = neworder; addOrderConstraint(neworder, orderconstraint); } } + + uint pcvsize=getSizeVectorOrder(&partialcandidatevec); + for(uint i=0;i<pcvsize;i++) { + Order * neworder=getVectorOrder(&partialcandidatevec, i); + if (neworder != NULL) + neworder->type = TOTAL; + } + deleteVectorArrayOrder(&ordervec); + deleteVectorArrayOrder(&partialcandidatevec); } void orderAnalysis(CSolver *This) {