5 void CSolver::replaceBooleanWithTrue(BooleanEdge bexpr) {
6 if (constraints.contains(bexpr.negate())) {
7 constraints.remove(bexpr.negate());
10 if (constraints.contains(bexpr)) {
11 constraints.remove(bexpr);
14 replaceBooleanWithTrueNoRemove(bexpr);
17 void CSolver::replaceBooleanWithTrueNoRemove(BooleanEdge bexpr) {
18 uint size = bexpr->parents.getSize();
19 for (uint i = 0; i < size; i++) {
20 Boolean *parent = bexpr->parents.get(i);
21 BooleanLogic *logicop = (BooleanLogic *) parent;
22 switch (logicop->op) {
24 handleANDTrue(logicop, bexpr);
27 handleIFFTrue(logicop, bexpr);
38 void CSolver::replaceBooleanWithBoolean(BooleanEdge oldb, BooleanEdge newb) {
40 if (oldb.isNegated()) {
44 if (constraints.contains(oldb)) {
45 constraints.remove(oldb);
46 constraints.add(newb);
48 if (constraints.contains(oldb.negate())) {
49 constraints.remove(oldb.negate());
50 constraints.add(newb.negate());
53 BooleanEdge oldbnegated = oldb.negate();
54 uint size = oldb->parents.getSize();
55 for (uint i = 0; i < size; i++) {
56 Boolean *parent = oldb->parents.get(i);
57 BooleanLogic *logicop = (BooleanLogic *) parent;
59 uint parentsize = logicop->inputs.getSize();
61 for (uint j = 0; j < parentsize; j++) {
62 BooleanEdge b = logicop->inputs.get(i);
64 logicop->inputs.set(i, newb);
65 newb->parents.push(parent);
66 } else if (b == oldbnegated) {
67 logicop->inputs.set(i, newb.negate());
68 newb->parents.push(parent);
74 void CSolver::handleIFFTrue(BooleanLogic *bexpr, BooleanEdge child) {
75 uint size = bexpr->inputs.getSize();
76 BooleanEdge b0 = bexpr->inputs.get(0);
77 BooleanEdge b1 = bexpr->inputs.get(1);
78 BooleanEdge childnegate = child.negate();
80 replaceBooleanWithBoolean(BooleanEdge(bexpr), b1);
81 } else if (b0 == childnegate) {
82 replaceBooleanWithBoolean(BooleanEdge(bexpr), b1.negate());
83 } else if (b1 == child) {
84 replaceBooleanWithBoolean(BooleanEdge(bexpr), b0);
85 } else if (b1 == childnegate) {
86 replaceBooleanWithBoolean(BooleanEdge(bexpr), b0.negate());
91 void CSolver::handleANDTrue(BooleanLogic *bexpr, BooleanEdge child) {
92 BooleanEdge childNegate=child.negate();
94 for (uint i = 0; i < bexpr->inputs.getSize(); i++) {
95 BooleanEdge b = bexpr->inputs.get(i);
98 bexpr->inputs.remove(i);
102 if (b == childNegate) {
103 replaceBooleanWithFalse(bexpr);
108 uint size=bexpr->inputs.getSize();
110 replaceBooleanWithTrue(bexpr);
111 } else if (size == 1) {
112 replaceBooleanWithBoolean(bexpr, bexpr->inputs.get(0));
116 void CSolver::replaceBooleanWithFalse(BooleanEdge bexpr) {
117 replaceBooleanWithTrue(bexpr.negate());