1 #include "orderdecompose.h"
5 #include "ordergraph.h"
9 #include "mutableset.h"
13 void decomposeOrder(CSolver *This, Order *order, OrderGraph *graph) {
14 Vector<Order *> ordervec;
15 Vector<Order *> partialcandidatevec;
16 uint size = order->constraints.getSize();
17 for (uint i = 0; i < size; i++) {
18 BooleanOrder *orderconstraint = order->constraints.get(i);
19 OrderNode *from = getOrderNodeFromOrderGraph(graph, orderconstraint->first);
20 OrderNode *to = getOrderNodeFromOrderGraph(graph, orderconstraint->second);
21 model_print("from->sccNum:%u\tto->sccNum:%u\n", from->sccNum, to->sccNum);
22 if (from->sccNum != to->sccNum) {
23 OrderEdge *edge = getOrderEdgeFromOrderGraph(graph, from, to);
25 replaceBooleanWithTrue(This, (Boolean *)orderconstraint);
26 } else if (edge->polNeg) {
27 replaceBooleanWithFalse(This, (Boolean *)orderconstraint);
29 //This case should only be possible if constraint isn't in AST
33 //Build new order and change constraint's order
34 Order *neworder = NULL;
35 if (ordervec.getSize() > from->sccNum)
36 neworder = ordervec.get(from->sccNum);
37 if (neworder == NULL) {
38 MutableSet *set = new MutableSet(order->set->type);
39 neworder = new Order(order->type, set);
40 This->allOrders.push(neworder);
41 ordervec.setExpand(from->sccNum, neworder);
42 if (order->type == PARTIAL)
43 partialcandidatevec.setExpand(from->sccNum, neworder);
45 partialcandidatevec.setExpand(from->sccNum, NULL);
47 if (from->status != ADDEDTOSET) {
48 from->status = ADDEDTOSET;
49 ((MutableSet *)neworder->set)->addElementMSet(from->id);
51 if (to->status != ADDEDTOSET) {
52 to->status = ADDEDTOSET;
53 ((MutableSet *)neworder->set)->addElementMSet(to->id);
55 if (order->type == PARTIAL) {
56 OrderEdge *edge = getOrderEdgeFromOrderGraph(graph, from, to);
58 partialcandidatevec.setExpand(from->sccNum, NULL);
60 orderconstraint->order = neworder;
61 neworder->addOrderConstraint(orderconstraint);
65 uint pcvsize=partialcandidatevec.getSize();
66 for(uint i=0;i<pcvsize;i++) {
67 Order * neworder=partialcandidatevec.get(i);
68 if (neworder != NULL){
69 neworder->type = TOTAL;
70 model_print("i=%u\t", i);