Allow to use the initial assignment for CAD (#5177)
authorGereon Kremer <gereon.kremer@cs.rwth-aachen.de>
Thu, 1 Oct 2020 16:24:55 +0000 (18:24 +0200)
committerGitHub <noreply@github.com>
Thu, 1 Oct 2020 16:24:55 +0000 (11:24 -0500)
While the CAD subsolver already provided for a way to use the linear model to seed the model search, it was not actually used yet.
This PR now does use it, though it is disabled by a Boolean flag.

src/options/arith_options.toml
src/theory/arith/nl/cad/cdcac.cpp
src/theory/arith/nl/cad_solver.cpp

index fde48d3f7aa200f6da34e3371e83136aae48174d..da3a8dc8885711e29146c975648530f456f4b901 100644 (file)
@@ -568,6 +568,14 @@ header = "options/arith_options.h"
   default    = "false"
   help       = "whether to use the cylindrical algebraic decomposition solver for non-linear arithmetic"
 
+[[option]]
+  name       = "nlCadUseInitial"
+  category   = "regular"
+  long       = "nl-cad-initial"
+  type       = "bool"
+  default    = "false"
+  help       = "whether to use the linear model as initial guess for the cylindrical algebraic decomposition solver"
+
 [[option]]
   name       = "nlICP"
   category   = "regular"
index e1c752cd4dcd50ad4246763ca8f6bf2c357943f4..57a8b51df68ad192161af82504dd0b4dbbce1efa 100644 (file)
@@ -19,6 +19,7 @@
 
 #ifdef CVC4_POLY_IMP
 
+#include "options/arith_options.h"
 #include "theory/arith/nl/cad/projections.h"
 #include "theory/arith/nl/cad/variable_ordering.h"
 
@@ -80,6 +81,7 @@ void CDCAC::computeVariableOrdering()
 
 void CDCAC::retrieveInitialAssignment(NlModel& model, const Node& ran_variable)
 {
+  if (!options::nlCadUseInitial()) return;
   d_initialAssignment.clear();
   Trace("cdcac") << "Retrieving initial assignment:" << std::endl;
   for (const auto& var : d_variableOrdering)
@@ -138,7 +140,7 @@ bool CDCAC::sampleOutsideWithInitial(const std::vector<CACInterval>& infeasible,
                                      poly::Value& sample,
                                      std::size_t cur_variable)
 {
-  if (cur_variable < d_initialAssignment.size())
+  if (options::nlCadUseInitial() && cur_variable < d_initialAssignment.size())
   {
     const poly::Value& suggested = d_initialAssignment[cur_variable];
     for (const auto& i : infeasible)
index 6ae75a837bf574e5177e42d73352c5bd03117039..b63a8398c9c1b466179e99eb128464186a7644c9 100644 (file)
@@ -59,6 +59,7 @@ void CadSolver::initLastCall(const std::vector<Node>& assertions)
     d_CAC.getConstraints().addConstraint(a);
   }
   d_CAC.computeVariableOrdering();
+  d_CAC.retrieveInitialAssignment(d_model, d_ranVariable);
 #else
   Warning() << "Tried to use CadSolver but libpoly is not available. Compile "
                "with --poly."