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;
85 uint size = This->inputs.getSize();
86 for (uint i = 0; i < size; i++) {
87 Boolean *tmp = This->inputs.get(i);
88 updatePolarity(tmp, parentpolarity);
93 Boolean *tmp = This->inputs.get(0);
94 updatePolarity(tmp, negatePolarity(parentpolarity));
98 updatePolarity(This->inputs.get(0), P_BOTHTRUEFALSE);
99 updatePolarity(This->inputs.get(1), P_BOTHTRUEFALSE);
107 void computeLogicOpBooleanValue(BooleanLogic *This) {
108 BooleanValue parentbv = This->boolVal;
111 if (parentbv == BV_MUSTBETRUE || parentbv == BV_UNSAT) {
112 uint size = This->inputs.getSize();
113 for (uint i = 0; i < size; i++) {
114 updateMustValue(This->inputs.get(i), parentbv);
120 updateMustValue(This->inputs.get(0), negateBooleanValue(parentbv));