Add previous concat handling for CBQI BV as heuristic for EQ. (#1528)
authorAina Niemetz <aina.niemetz@gmail.com>
Mon, 22 Jan 2018 18:06:26 +0000 (10:06 -0800)
committerGitHub <noreply@github.com>
Mon, 22 Jan 2018 18:06:26 +0000 (10:06 -0800)
Previously, we computed an inverse for s1 o x, x o s2, s1 o x o s2 while disregarding that invertibility
depends on si. This adds this handling as an optional heuristic for concats over (dis)equality since it improves performance on a considerable number of benchmarks.

src/options/quantifiers_options
src/theory/quantifiers/bv_inverter.cpp

index 2376409e002c5d79f6b96cc2532a5623d19760ef..c6eb1cd5ea09cf39c6613964063c74718ec44400 100644 (file)
@@ -355,6 +355,8 @@ option cbqiBvRmExtract --cbqi-bv-rm-extract bool :read-write :default true
   replaces extract terms with variables for counterexample-guided instantiation for bit-vectors
 option cbqiBvLinearize --cbqi-bv-linear bool :read-write :default true
   linearize adder chains for variables
+option cbqiBvConcInv cbqi-bv-concat-inv --cbqi-bv-concat-inv bool :read-write :default true
+  compute inverse for concat over equalities rather than producing an invertibility condition
  
 ### local theory extensions options 
 
index 3a756819668012598cb328cff0fdbd173fbdcd1a..cf16efbfa3db04e424d87091e8158df57466ea4f 100644 (file)
@@ -2939,7 +2939,32 @@ Node BvInverter::solveBvLit(Node sv,
     }
     else if (k == BITVECTOR_CONCAT)
     {
-      sc = getScBvConcat(pol, litk, index, x, sv_t, t);
+      if (litk == EQUAL && options::cbqiBvConcInv())
+      {
+        /* Compute inverse for s1 o x, x o s2, s1 o x o s2
+         * (while disregarding that invertibility depends on si)
+         * rather than an invertibility condition (the proper handling).
+         * This improves performance on a considerable number of benchmarks.
+         *
+         * x = t[upper:lower]
+         * where
+         * upper = getSize(t) - 1 - sum(getSize(sv_t[i])) for i < index
+         * lower = getSize(sv_t[i]) for i > index  */
+        unsigned upper, lower;
+        upper = bv::utils::getSize(t) - 1;
+        lower = 0;
+        NodeBuilder<> nb(BITVECTOR_CONCAT);
+        for (unsigned i = 0; i < nchildren; i++)
+        {
+          if (i < index) { upper -= bv::utils::getSize(sv_t[i]); }
+          else if (i > index) { lower += bv::utils::getSize(sv_t[i]); }
+        }
+        t = bv::utils::mkExtract(t, upper, lower);
+      }
+      else
+      {
+        sc = getScBvConcat(pol, litk, index, x, sv_t, t);
+      }
     }
     else if (k == BITVECTOR_SIGN_EXTEND)
     {