Fixing a soundness bug in arithmetic and a roubustness problem in rings.
authorTim King <taking@cs.nyu.edu>
Tue, 24 Jun 2014 20:46:09 +0000 (16:46 -0400)
committerMorgan Deters <mdeters@cs.nyu.edu>
Tue, 24 Jun 2014 21:02:17 +0000 (17:02 -0400)
src/theory/arith/arith_ite_utils.cpp
src/theory/arith/theory_arith_private.cpp

index d5dcae72633e82176998c30d6f6259c5217fd561..d3702ccd8017084396f07430bc1ff0c081b8d1a2 100644 (file)
@@ -308,6 +308,9 @@ void ArithIteUtils::addImplications(Node x, Node y){
   // (=> (not x) y)
   // (=> (not y) x)
 
+  x = Rewriter::rewrite(x);
+  y = Rewriter::rewrite(y);
+
   Node xneg = x.negate();
   Node yneg = y.negate();
   d_implies[xneg].insert(y);
@@ -369,9 +372,21 @@ bool ArithIteUtils::solveBinOr(TNode binor){
   Assert(binor[0].getKind() ==  kind::EQUAL);
   Assert(binor[1].getKind() ==  kind::EQUAL);
 
+  //Node n = 
   Node n = applySubstitutions(binor);
+  if(n != binor){
+    n = Rewriter::rewrite(n);
+
+    if(!(n.getKind() == kind::OR &&
+        n.getNumChildren() == 2 &&
+        n[0].getKind() ==  kind::EQUAL &&
+        n[1].getKind() ==  kind::EQUAL)){
+      return false;
+    }
+  }
+
   Assert(n.getKind() == kind::OR);
-  Assert(binor.getNumChildren() == 2);
+  Assert(n.getNumChildren() == 2);
   TNode l = n[0];
   TNode r = n[1];
 
@@ -416,7 +431,7 @@ bool ArithIteUtils::solveBinOr(TNode binor){
 
         NodeManager* nm = NodeManager::currentNM();
 
-        Node cnd = findIteCnd(binor[0], binor[1]);
+        Node cnd = findIteCnd(l, r);
 
         Node sk = nm->mkSkolem("deor", nm->booleanType());
         Node ite = sk.iteNode(otherL, otherR);
index f3bdca7c78e179811927b8c8699455cc6b51c2e4..f6ac951bc2e0498755081b33b441f8520013a754 100644 (file)
@@ -2964,6 +2964,19 @@ void TheoryArithPrivate::solveInteger(Theory::Effort effortLevel){
         if(mipRes == MipClosed){
           d_likelyIntegerInfeasible = true;
           replayLog(approx);
+
+         if(!anyConflict()){
+           //start up simplex
+           d_partialModel.stopQueueingBoundCounts();
+           UpdateTrackingCallback utcb(&d_linEq);
+           d_partialModel.processBoundsQueue(utcb);
+           d_linEq.startTrackingBoundCounts();
+           //call simplex
+           solveRelaxationOrPanic(effortLevel);
+           // shutdown simplex
+           d_linEq.stopTrackingBoundCounts();
+           d_partialModel.startQueueingBoundCounts();
+         }
         }
         if(!(anyConflict() || !d_approxCuts.empty())){
           turnOffApproxFor(options::replayNumericFailurePenalty());