Add option to only dump unsolved queries for --sygus-query-gen (#3173)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Sat, 10 Aug 2019 17:56:05 +0000 (12:56 -0500)
committerGitHub <noreply@github.com>
Sat, 10 Aug 2019 17:56:05 +0000 (12:56 -0500)
src/options/options_handler.cpp
src/options/options_handler.h
src/options/quantifiers_modes.h
src/options/quantifiers_options.toml
src/theory/quantifiers/query_generator.cpp
src/theory/quantifiers/query_generator.h

index b0a1cd1ad54c983ac101cd59cccf74dc4fe405f7..874c57629047027c7e76378c39ea88d1f6539b75 100644 (file)
@@ -504,6 +504,21 @@ trust  \n\
 \n\
 ";
 
+const std::string OptionsHandler::s_sygusQueryDumpFileHelp =
+    "\
+Query file options supported by --sygus-query-gen-dump-files:\n\
+\n\
+none (default) \n\
++ Do not dump query files when using --sygus-query-gen.\n\
+\n\
+all \n\
++ Dump all query files.\n\
+\n\
+unsolved \n\
++ Dump query files that the subsolver did not solve.\n\
+\n\
+";
+
 const std::string OptionsHandler::s_sygusFilterSolHelp =
     "\
 Modes for filtering sygus solutions supported by --sygus-filter-sol:\n\
@@ -959,6 +974,34 @@ theory::quantifiers::CegisSampleMode OptionsHandler::stringToCegisSampleMode(
   }
 }
 
+theory::quantifiers::SygusQueryDumpFilesMode
+OptionsHandler::stringToSygusQueryDumpFilesMode(std::string option,
+                                                std::string optarg)
+{
+  if (optarg == "none")
+  {
+    return theory::quantifiers::SYGUS_QUERY_DUMP_NONE;
+  }
+  else if (optarg == "all")
+  {
+    return theory::quantifiers::SYGUS_QUERY_DUMP_ALL;
+  }
+  else if (optarg == "unsolved")
+  {
+    return theory::quantifiers::SYGUS_QUERY_DUMP_UNSOLVED;
+  }
+  else if (optarg == "help")
+  {
+    puts(s_sygusQueryDumpFileHelp.c_str());
+    exit(1);
+  }
+  else
+  {
+    throw OptionException(
+        std::string("unknown option for --sygus-query-gen-dump-files: `")
+        + optarg + "'.  Try --sygus-query-gen-dump-files help.");
+  }
+}
 theory::quantifiers::SygusFilterSolMode
 OptionsHandler::stringToSygusFilterSolMode(std::string option,
                                            std::string optarg)
@@ -977,7 +1020,7 @@ OptionsHandler::stringToSygusFilterSolMode(std::string option,
   }
   else if (optarg == "help")
   {
-    puts(s_cegisSampleHelp.c_str());
+    puts(s_sygusFilterSolHelp.c_str());
     exit(1);
   }
   else
index 9a596ddfcefd430e53cee85d632174eb3c65b8e1..84b7002e3016c0e8a401760a292ac8f96c59c8b9 100644 (file)
@@ -114,6 +114,8 @@ public:
       std::string option, std::string optarg);
   theory::quantifiers::CegisSampleMode stringToCegisSampleMode(
       std::string option, std::string optarg);
+  theory::quantifiers::SygusQueryDumpFilesMode stringToSygusQueryDumpFilesMode(
+      std::string option, std::string optarg);
   theory::quantifiers::SygusFilterSolMode stringToSygusFilterSolMode(
       std::string option, std::string optarg);
   theory::quantifiers::SygusInvTemplMode stringToSygusInvTemplMode(
@@ -269,6 +271,7 @@ public:
   static const std::string s_cegqiSingleInvHelp;
   static const std::string s_cegqiSingleInvRconsHelp;
   static const std::string s_cegisSampleHelp;
+  static const std::string s_sygusQueryDumpFileHelp;
   static const std::string s_sygusFilterSolHelp;
   static const std::string s_sygusInvTemplHelp;
   static const std::string s_sygusActiveGenHelp;
index c9aeda154bb5f171a4a64ec257fb11b623bb0666..049cdef1c201f8a237239bcafae2f24a5b92ad1f 100644 (file)
@@ -272,6 +272,16 @@ enum SygusActiveGenMode
   SYGUS_ACTIVE_GEN_AUTO,
 };
 
+enum SygusQueryDumpFilesMode
+{
+  /** do not dump query files */
+  SYGUS_QUERY_DUMP_NONE,
+  /** dump all query files */
+  SYGUS_QUERY_DUMP_ALL,
+  /** dump query files that were not solved by the subsolver */
+  SYGUS_QUERY_DUMP_UNSOLVED,
+};
+
 enum SygusFilterSolMode
 {
   /** do not filter solutions */
index 8792fb56b439202c5fe99203d4f4d96f05fdc13d..717ee9dae7dab2b77ba2b24b24e2b8feb177b51b 100644 (file)
@@ -1414,10 +1414,12 @@ header = "options/quantifiers_options.h"
 [[option]]
   name       = "sygusQueryGenDumpFiles"
   category   = "regular"
-  long       = "sygus-query-gen-dump-files"
-  type       = "bool"
-  default    = "false"
-  help       = "dump external files corresponding to interesting satisfiability queries with sygus-query-gen"
+  long       = "sygus-query-gen-dump-files=MODE"
+  type       = "CVC4::theory::quantifiers::SygusQueryDumpFilesMode"
+  default    = "CVC4::theory::quantifiers::SYGUS_QUERY_DUMP_NONE"
+  handler    = "stringToSygusQueryDumpFilesMode"
+  includes   = ["options/quantifiers_modes.h"]
+  help       = "mode for dumping external files corresponding to interesting satisfiability queries with sygus-query-gen"
 
 [[option]]
   name       = "sygusFilterSolMode"
index bc7538c1f42eea25b13fb4c0dac4679a6d2d6758..742b3000bba8d2617a9d4f8eb5a79a8b6493fbfb 100644 (file)
@@ -146,37 +146,9 @@ bool QueryGenerator::addTerm(Node n, std::ostream& out)
 void QueryGenerator::checkQuery(Node qy, unsigned spIndex)
 {
   // external query
-  if (options::sygusQueryGenDumpFiles())
+  if (options::sygusQueryGenDumpFiles() == SYGUS_QUERY_DUMP_ALL)
   {
-    // Print the query and the query + its model (commented) to queryN.smt2
-    std::vector<Node> pt;
-    d_sampler->getSamplePoint(spIndex, pt);
-    unsigned nvars = d_vars.size();
-    AlwaysAssert(pt.size() == d_vars.size());
-    std::stringstream fname;
-    fname << "query" << d_queryCount << ".smt2";
-    std::ofstream fs(fname.str(), std::ofstream::out);
-    fs << "(set-logic ALL)" << std::endl;
-    for (unsigned i = 0; i < 2; i++)
-    {
-      for (unsigned j = 0; j < nvars; j++)
-      {
-        Node x = d_vars[j];
-        if (i == 0)
-        {
-          fs << "(declare-fun " << x << " () " << x.getType() << ")";
-        }
-        else
-        {
-          fs << ";(define-fun " << x << " () " << x.getType() << " " << pt[j]
-             << ")";
-        }
-        fs << std::endl;
-      }
-    }
-    fs << "(assert " << qy << ")" << std::endl;
-    fs << "(check-sat)" << std::endl;
-    fs.close();
+    dumpQuery(qy, spIndex);
   }
 
   if (options::sygusQueryGenCheck())
@@ -207,11 +179,51 @@ void QueryGenerator::checkQuery(Node qy, unsigned spIndex)
       ss << "but CVC4 answered unsat!" << std::endl;
       AlwaysAssert(false, ss.str().c_str());
     }
+    if (options::sygusQueryGenDumpFiles() == SYGUS_QUERY_DUMP_UNSOLVED)
+    {
+      if (r.asSatisfiabilityResult().isSat() != Result::SAT)
+      {
+        dumpQuery(qy, spIndex);
+      }
+    }
   }
 
   d_queryCount++;
 }
 
+void QueryGenerator::dumpQuery(Node qy, unsigned spIndex)
+{
+  // Print the query and the query + its model (commented) to queryN.smt2
+  std::vector<Node> pt;
+  d_sampler->getSamplePoint(spIndex, pt);
+  size_t nvars = d_vars.size();
+  AlwaysAssert(pt.size() == d_vars.size());
+  std::stringstream fname;
+  fname << "query" << d_queryCount << ".smt2";
+  std::ofstream fs(fname.str(), std::ofstream::out);
+  fs << "(set-logic ALL)" << std::endl;
+  for (unsigned i = 0; i < 2; i++)
+  {
+    for (size_t j = 0; j < nvars; j++)
+    {
+      Node x = d_vars[j];
+      if (i == 0)
+      {
+        fs << "(declare-fun " << x << " () " << x.getType() << ")";
+      }
+      else
+      {
+        fs << ";(define-fun " << x << " () " << x.getType() << " " << pt[j]
+           << ")";
+      }
+      fs << std::endl;
+    }
+  }
+  fs << "(assert " << qy << ")" << std::endl;
+  fs << "(check-sat)" << std::endl;
+  fs.close();
+}
+
 void QueryGenerator::findQueries(
     Node n,
     std::vector<Node>& queries,
index 749c78c85f24d2ae30996d9ddf0999a08aca94b0..8cb7b27850dbba598e52ac3689f44a62b7920800 100644 (file)
@@ -107,6 +107,11 @@ class QueryGenerator : public ExprMiner
    * reported to be unsatisfiable.
    */
   void checkQuery(Node qy, unsigned spIndex);
+  /**
+   * Dumps query qy to the a file queryN.smt2 for the current counter N;
+   * spIndex specifies the sample point that satisfies it (for debugging).
+   */
+  void dumpQuery(Node qy, unsigned spIndex);
 };
 
 }  // namespace quantifiers