1 #include "polarityassignment.h"
4 void computePolarities(CSolver *This) {
5 SetIteratorBoolean *iterator = This->getConstraints();
6 while (iterator->hasNext()) {
7 Boolean *boolean = iterator->next();
8 updatePolarity(boolean, P_TRUE);
9 updateMustValue(boolean, BV_MUSTBETRUE);
10 computePolarityAndBooleanValue(boolean);
15 void updatePolarity(Boolean *This, Polarity polarity) {
16 This->polarity = (Polarity) (This->polarity | polarity);
19 void updateMustValue(Boolean *This, BooleanValue value) {
20 This->boolVal = (BooleanValue) (This->boolVal | value);
23 void computePolarityAndBooleanValue(Boolean *This) {
29 return computePredicatePolarityAndBooleanValue((BooleanPredicate *)This);
31 return computeLogicOpPolarityAndBooleanValue((BooleanLogic *)This);
37 void computePredicatePolarityAndBooleanValue(BooleanPredicate *This) {
38 if (This->undefStatus != NULL) {
39 updatePolarity(This->undefStatus, P_BOTHTRUEFALSE);
40 computePolarityAndBooleanValue(This->undefStatus);
44 void computeLogicOpPolarityAndBooleanValue(BooleanLogic *This) {
45 computeLogicOpBooleanValue(This);
46 computeLogicOpPolarity(This);
47 uint size = This->inputs.getSize();
48 for (uint i = 0; i < size; i++) {
49 computePolarityAndBooleanValue(This->inputs.get(i));
53 Polarity negatePolarity(Polarity This) {
67 BooleanValue negateBooleanValue(BooleanValue This) {
73 return BV_MUSTBEFALSE;
81 void computeLogicOpPolarity(BooleanLogic *This) {
82 Polarity parentpolarity = This->polarity;
86 uint size = This->inputs.getSize();
87 for (uint i = 0; i < size; i++) {
88 Boolean *tmp = This->inputs.get(i);
89 updatePolarity(tmp, parentpolarity);
94 Boolean *tmp = This->inputs.get(0);
95 updatePolarity(tmp, negatePolarity(parentpolarity));
100 updatePolarity(This->inputs.get(0), P_BOTHTRUEFALSE);
101 updatePolarity(This->inputs.get(1), P_BOTHTRUEFALSE);
105 Boolean *left = This->inputs.get(0);
106 updatePolarity(left, negatePolarity( parentpolarity));
107 Boolean *right = This->inputs.get(1);
108 updatePolarity(right, parentpolarity);
116 void computeLogicOpBooleanValue(BooleanLogic *This) {
117 BooleanValue parentbv = This->boolVal;
120 if (parentbv == BV_MUSTBETRUE || parentbv == BV_UNSAT) {
121 uint size = This->inputs.getSize();
122 for (uint i = 0; i < size; i++) {
123 updateMustValue(This->inputs.get(i), parentbv);
129 if (parentbv == BV_MUSTBEFALSE || parentbv == BV_UNSAT) {
130 uint size = This->inputs.getSize();
131 for (uint i = 0; i < size; i++) {
132 updateMustValue(This->inputs.get(i), parentbv);
138 updateMustValue(This->inputs.get(0), negateBooleanValue(parentbv));
141 //implies is really an or with the first term negated
142 if (parentbv == BV_MUSTBEFALSE || parentbv == BV_UNSAT) {
143 uint size = This->inputs.getSize();
144 updateMustValue(This->inputs.get(0), negateBooleanValue(parentbv));
145 updateMustValue(This->inputs.get(1), parentbv);