Bug fixes for Java API + Exactly one constraints + Adding support for getting the...
[satune.git] / src / csolver.cc
index 81aeb8e84e12a333b4c6207a0454a830e3c54e8a..a02227e0b82ddedcb52c063ae99bb3611fa8fa2d 100644 (file)
@@ -395,6 +395,26 @@ BooleanEdge CSolver::rewriteLogicalOperation(LogicOp op, BooleanEdge *array, uin
        return applyLogicalOperation(op, newarray, asize);
 }
 
+BooleanEdge CSolver::applyExactlyOneConstraint (BooleanEdge *array, uint asize){
+       BooleanEdge newarray[asize + 1];
+
+       newarray[asize] = applyLogicalOperation(SATC_OR, array, asize);
+       for (uint i=0; i< asize; i++){
+               BooleanEdge oprand1 = array[i];
+               BooleanEdge carray [asize -1];
+               uint index = 0;
+               for( uint j =0; j< asize; j++){
+                       if(i != j){
+                               BooleanEdge oprand2 = applyLogicalOperation(SATC_NOT, array[j]);
+                               carray[index++] = applyLogicalOperation(SATC_IMPLIES, oprand1, oprand2);
+                       }
+               }
+               ASSERT(index == asize -1);
+               newarray[i] = applyLogicalOperation(SATC_AND, carray, asize-1);
+       }
+       return applyLogicalOperation(SATC_AND, newarray, asize+1);
+}
+
 BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge *array, uint asize) {
        if (!useInterpreter()) {
                BooleanEdge newarray[asize];