Supporting SMT-LIB's (reset) command on the API level is dangerous and not required -- it's sufficient to just destroy the solver object and create a new one if necessary. It's dangerous because invalidated objects can be passed in after a reset, and we would need to find a clean way to guard against this. We want to guard against this in the future, but for now it is cleaner to make it explicit (by not having this functionality in the API but forcing the user to destroy and recreate the solver object) that these objects can't be reused.
CVC4_API_SOLVER_TRY_CATCH_END;
}
-/**
- * ( reset )
- */
-void Solver::reset(void) const { d_smtEngine->reset(); }
-
/**
* ( reset-assertions )
*/
*/
void push(uint32_t nscopes = 1) const;
- /**
- * Reset the solver.
- * SMT-LIB: ( reset )
- */
- void reset() const;
-
/**
* Remove all assertions.
* SMT-LIB: ( reset-assertions )
def push(self, nscopes=1):
self.csolver.push(nscopes)
- def reset(self):
- self.csolver.reset()
-
def resetAssertions(self):
self.csolver.resetAssertions()
#include <string>
#include <vector>
-#include "api/cvc4cpp.h"
#include "main/main.h"
#include "smt/command.h"
void printStatsIncremental(std::ostream& out, const std::string& prvsStatsString, const std::string& curStatsString);
-CommandExecutor::CommandExecutor(api::Solver* solver, Options& options)
- : d_solver(solver),
+CommandExecutor::CommandExecutor(Options& options)
+ : d_solver(new api::Solver(&options)),
d_smtEngine(d_solver->getSmtEngine()),
d_options(options),
d_stats("driver"),
d_result(),
- d_replayStream(NULL)
-{}
+ d_replayStream(nullptr)
+{
+}
void CommandExecutor::flushStatistics(std::ostream& out) const
{
{
flushStatistics(*d_options.getErr());
}
- d_solver->reset();
+ /* We have to keep options passed via CL on reset. These options are stored
+ * in CommandExecutor::d_options (populated and created in the driver), and
+ * CommandExecutor::d_options only contains *these* options since the
+ * NodeManager copies the options into a new options object before SmtEngine
+ * configures additional options based on the given CL options.
+ * We can thus safely reuse CommandExecutor::d_options here. */
+ d_solver.reset(new api::Solver(&d_options));
}
bool CommandExecutor::doCommandSingleton(Command* cmd)
#include <iosfwd>
#include <string>
+#include "api/cvc4cpp.h"
#include "expr/expr_manager.h"
#include "options/options.h"
#include "smt/command.h"
namespace main {
-class CommandExecutor {
-private:
+class CommandExecutor
+{
+ private:
std::string d_lastStatistics;
-protected:
- api::Solver* d_solver;
- SmtEngine* d_smtEngine;
- Options& d_options;
- StatisticsRegistry d_stats;
- Result d_result;
- ExprStream* d_replayStream;
-
-public:
- CommandExecutor(api::Solver* solver, Options& options);
-
- virtual ~CommandExecutor()
- {
- if (d_replayStream != NULL)
- {
- delete d_replayStream;
- }
+ protected:
+ std::unique_ptr<api::Solver> d_solver;
+ SmtEngine* d_smtEngine;
+ Options& d_options;
+ StatisticsRegistry d_stats;
+ Result d_result;
+ ExprStream* d_replayStream;
+
+ public:
+ CommandExecutor(Options& options);
+
+ virtual ~CommandExecutor()
+ {
+ if (d_replayStream != NULL)
+ {
+ delete d_replayStream;
+ }
}
/**
*/
bool doCommand(CVC4::Command* cmd);
+ /** Get a pointer to the solver object owned by this CommandExecutor. */
+ api::Solver* getSolver() { return d_solver.get(); }
+
Result getResult() const { return d_result; }
void reset();
private:
CommandExecutor();
-};/* class CommandExecutor */
+}; /* class CommandExecutor */
bool smtEngineInvoke(SmtEngine* smt, Command* cmd, std::ostream *out);
// important even for muzzled builds (to get result output right)
(*(opts.getOut())) << language::SetLanguage(opts.getOutputLanguage());
- // Create the expression manager using appropriate options
- std::unique_ptr<api::Solver> solver;
- solver.reset(new api::Solver(&opts));
- pExecutor = new CommandExecutor(solver.get(), opts);
+ // Create the command executor to execute the parsed commands
+ pExecutor = new CommandExecutor(opts);
std::unique_ptr<Parser> replayParser;
if (opts.getReplayInputFilename() != "")
{
std::string replayFilename = opts.getReplayInputFilename();
- ParserBuilder replayParserBuilder(solver.get(), replayFilename, opts);
+ ParserBuilder replayParserBuilder(
+ pExecutor->getSolver(), replayFilename, opts);
if( replayFilename == "-") {
if( inputFromStdin ) {
pExecutor->doCommand(cmd);
delete cmd;
}
- InteractiveShell shell(solver.get());
+ InteractiveShell shell(pExecutor->getSolver());
if(opts.getInteractivePrompt()) {
Message() << Configuration::getPackageName()
<< " " << Configuration::getVersionString();
// delete cmd;
}
- ParserBuilder parserBuilder(solver.get(), filename, opts);
+ ParserBuilder parserBuilder(pExecutor->getSolver(), filename, opts);
if( inputFromStdin ) {
#if defined(CVC4_COMPETITION_MODE) && !defined(CVC4_SMTCOMP_APPLICATION_TRACK)
delete cmd;
}
- ParserBuilder parserBuilder(solver.get(), filename, opts);
+ ParserBuilder parserBuilder(pExecutor->getSolver(), filename, opts);
if( inputFromStdin ) {
#if defined(CVC4_COMPETITION_MODE) && !defined(CVC4_SMTCOMP_APPLICATION_TRACK)
regress0/smtlib/global-decls.smt2
regress0/smtlib/issue4028.smt2
regress0/smtlib/reason-unknown.smt2
+ regress0/smtlib/reset.smt2
regress0/smtlib/reset-assertions1.smt2
regress0/smtlib/reset-assertions2.smt2
regress0/smtlib/reset-assertions-global.smt2
--- /dev/null
+; COMMAND-LINE: --produce-models
+; EXPECT: true
+; EXPECT: false
+; EXPECT: true
+(get-option :produce-models)
+(set-option :produce-models false)
+(get-option :produce-models)
+(reset)
+(get-option :produce-models)