25#define api_code blue_code
26#define log_code magenta_code
27#define emph_code bright_magenta_code
36 CADICAL_assert (is_power_of_two (S)); \
40 LOG ("API enters state %s" #S "%s", tout.emph_code (), \
41 tout.normal_code ()); \
44void Solver::transition_to_steady_state () {
46 LOG (
"API leaves state %sCONFIGURING%s",
tout.emph_code (),
48 if (internal->
opts.check && internal->
opts.checkproof) {
52 LOG (
"API leaves state %sSATISFIED%s",
tout.emph_code (),
58 LOG (
"API leaves state %sUNSATISFIED%s",
tout.emph_code (),
83static void log_api_call (
Internal *internal,
const char *
name,
85 Logger::log (internal,
"API call %s'%s ()'%s %s",
tout.api_code (),
name,
86 tout.log_code (), suffix);
89static void log_api_call (
Internal *internal,
const char *
name,
int arg,
91 Logger::log (internal,
"API call %s'%s (%d)'%s %s",
tout.api_code (),
92 name, arg,
tout.log_code (), suffix);
95static void log_api_call (
Internal *internal,
const char *
name,
96 const char *arg,
const char *suffix) {
97 Logger::log (internal,
"API call %s'%s (\"%s\")'%s %s",
tout.api_code (),
98 name, arg,
tout.log_code (), suffix);
101static void log_api_call (
Internal *internal,
const char *
name,
102 const char *
a1,
int a2,
const char *s) {
103 Logger::log (internal,
"API call %s'%s (\"%s\", %d)'%s %s",
111static void log_api_call_begin (
Internal *internal,
const char *
name) {
112 Logger::log_empty_line (internal);
113 log_api_call (internal,
name,
"started");
116static void log_api_call_begin (
Internal *internal,
const char *
name,
118 Logger::log_empty_line (internal);
119 log_api_call (internal,
name, arg,
"started");
122static void log_api_call_begin (
Internal *internal,
const char *
name,
124 Logger::log_empty_line (internal);
125 log_api_call (internal,
name, arg,
"started");
128static void log_api_call_begin (
Internal *internal,
const char *
name,
129 const char *arg1,
int arg2) {
130 Logger::log_empty_line (internal);
131 log_api_call (internal,
name, arg1, arg2,
"started");
136static void log_api_call_end (
Internal *internal,
const char *
name) {
137 log_api_call (internal,
name,
"succeeded");
140static void log_api_call_end (
Internal *internal,
const char *
name,
142 log_api_call (internal,
name,
lit,
"succeeded");
145static void log_api_call_end (
Internal *internal,
const char *
name,
147 Logger::log_empty_line (internal);
148 log_api_call (internal,
name, arg,
"succeeded");
151static void log_api_call_end (
Internal *internal,
const char *
name,
152 const char *arg,
bool res) {
153 log_api_call (internal,
name, arg, res ?
"succeeded" :
"failed");
156static void log_api_call_end (
Internal *internal,
const char *
name,
157 const char *arg,
int val,
bool res) {
158 log_api_call (internal,
name, arg, val, res ?
"succeeded" :
"failed");
161static void log_api_call_returns (
Internal *internal,
const char *
name,
163 log_api_call (internal,
name, res ?
"returns 'true'" :
"returns 'false'");
166static void log_api_call_returns (
Internal *internal,
const char *
name,
169 snprintf (fmt,
sizeof fmt,
"returns '%d'", res);
170 log_api_call (internal,
name, fmt);
173static void log_api_call_returns (
Internal *internal,
const char *
name,
176 snprintf (fmt,
sizeof fmt,
"returns '%" PRId64
"'", res);
177 log_api_call (internal,
name, fmt);
180static void log_api_call_returns (
Internal *internal,
const char *
name,
183 snprintf (fmt,
sizeof fmt,
"returns '%d'", res);
184 log_api_call (internal,
name,
lit, fmt);
187static void log_api_call_returns (
Internal *internal,
const char *
name,
188 const char *arg,
bool res) {
189 log_api_call (internal,
name, arg,
190 res ?
"returns 'true'" :
"returns 'false'");
193static void log_api_call_returns (
Internal *internal,
const char *
name,
195 log_api_call (internal,
name,
lit,
196 res ?
"returns 'true'" :
"returns 'false'");
199static void log_api_call_returns (
Internal *internal,
const char *
name,
200 const char *arg,
const char *res) {
201 Logger::log (internal,
"API call %s'%s (\"%s\")'%s returns '%s'",
203 res ? res :
"<null>");
206static void log_api_call_returns (
Internal *internal,
const char *
name,
207 const char *arg1,
int arg2,
209 Logger::log (internal,
"API call %s'%s (\"%s\", %d)'%s returns '%s'",
211 res ? res :
"<null>");
216#define LOG_API_CALL_BEGIN(...) \
218 if (!internal->opts.log) \
220 log_api_call_begin (internal, __VA_ARGS__); \
223#define LOG_API_CALL_END(...) \
225 if (!internal->opts.log) \
227 log_api_call_end (internal, __VA_ARGS__); \
230#define LOG_API_CALL_RETURNS(...) \
232 if (!internal->opts.log) \
234 log_api_call_returns (internal, __VA_ARGS__); \
241#define LOG_API_CALL_BEGIN(...) \
244#define LOG_API_CALL_END(...) \
247#define LOG_API_CALL_RETURNS(...) \
256#ifndef CADICAL_NTRACING
262 if ((internal == 0)) \
264 LOG_API_CALL_BEGIN (__VA_ARGS__); \
265 if (!trace_api_file) \
267 trace_api_call (__VA_ARGS__); \
270void Solver::trace_api_call (
const char *s0)
const {
272 LOG (
"TRACE %s", s0);
273 fprintf (trace_api_file,
"%s\n", s0);
274 fflush (trace_api_file);
277void Solver::trace_api_call (
const char *s0,
int i1)
const {
279 LOG (
"TRACE %s %d", s0, i1);
280 fprintf (trace_api_file,
"%s %d\n", s0, i1);
281 fflush (trace_api_file);
284void Solver::trace_api_call (
const char *s0,
const char *s1)
const {
286 LOG (
"TRACE %s %s", s0, s1);
287 fprintf (trace_api_file,
"%s %s\n", s0, s1);
288 fflush (trace_api_file);
291void Solver::trace_api_call (
const char *s0,
const char *s1,
int i2)
const {
293 LOG (
"TRACE %s %s %d", s0, s1, i2);
294 fprintf (trace_api_file,
"%s %s %d\n", s0, s1, i2);
295 fflush (trace_api_file);
310static bool tracing_api_calls_through_environment_variable_method;
324static bool tracing_nb_lidrup_env_var_method =
false;
328#ifndef CADICAL_NTRACING
329 const char *path =
getenv (
"CADICAL_API_TRACE");
331 path =
getenv (
"CADICALAPITRACE");
333 if (tracing_api_calls_through_environment_variable_method)
334 FATAL (
"can not trace API calls of two solver instances "
335 "using environment variable 'CADICAL_API_TRACE'");
336 if (!(trace_api_file = fopen (path,
"w")))
337 FATAL (
"failed to open file '%s' to trace API calls "
338 "using environment variable 'CADICAL_API_TRACE'",
340 close_trace_api_file =
true;
341 tracing_api_calls_through_environment_variable_method =
true;
343 tracing_api_calls_through_environment_variable_method =
false;
344 close_trace_api_file =
false;
349 adding_clause =
false;
350 adding_constraint =
false;
358#ifndef CADICAL_NTRACING
359 if (tracing_api_calls_through_environment_variable_method)
360 message (
"tracing API calls to '%s'", path);
363 const char *lidrup_path =
getenv (
"CADICAL_LIDRUP_TRACE");
365 lidrup_path =
getenv (
"CADICALLIDRUPTRACE");
377 tracing_nb_lidrup_env_var_method =
true;
379 tracing_nb_lidrup_env_var_method =
false;
392 tracing_nb_lidrup_env_var_method =
false;
398 bool logging = internal->opts.log;
399 int level = internal->level;
400 string prefix = internal->prefix;
406#ifndef CADICAL_NTRACING
407 if (close_trace_api_file) {
408 close_trace_api_file =
false;
410 CADICAL_assert (tracing_api_calls_through_environment_variable_method);
411 fclose (trace_api_file);
412 tracing_api_calls_through_environment_variable_method =
false;
421 printf (
"%s%sLOG %s%d%s API call %s'reset ()'%s succeeded%s\n",
424 tout.normal_code ());
435 int res = external->max_var;
441 TRACE (
"reserve", min_max_var);
443 transition_to_steady_state ();
444 external->reset_extended ();
445 external->init (min_max_var);
450 TRACE (
"reserve_difference", number_of_vars);
452 transition_to_steady_state ();
453 external->reset_extended ();
454 int new_max_var = external->max_var + number_of_vars;
455 external->init (new_max_var);
461#ifndef CADICAL_NTRACING
463void Solver::trace_api_calls (FILE *
file) {
467 REQUIRE (!tracing_api_calls_through_environment_variable_method,
468 "already tracing API calls "
469 "using environment variable 'CADICAL_API_TRACE'");
470 REQUIRE (!trace_api_file,
"called twice");
471 trace_api_file =
file;
473 trace_api_call (
"init");
495 return internal->opts.get (arg);
505 "can only set option 'set (\"%s\", %d)' right after initialization",
508 bool res = internal->opts.set (arg,
val);
518 "can only set option '%s' right after initialization", arg);
520 if (arg[0] !=
'-' || arg[1] !=
'-')
536 internal->opts.optimize (arg);
543 bool res = internal->limit (arg,
val);
555 internal->prefix = str;
568 "can only set configuration '%s' right after initialization",
582 transition_to_steady_state ();
587 else if (!adding_constraint)
629 "first argument 'lits' zero while second argument 'size' not");
630 const int *end = lits + size;
631 for (
const int *
p = lits;
p != end;
p++) {
640 for (
auto lit : lits) {
654 transition_to_steady_state ();
655 external->constrain (
lit);
656 adding_constraint =
lit;
657 if (adding_constraint)
659 else if (!adding_clause)
668 transition_to_steady_state ();
669 external->assume (
lit);
676 int lit = external->lookahead ();
682 TRACE (
"lookahead_cubes");
684 auto cubes = external->generate_cubes (depth, min_depth);
685 TRACE (
"lookahead_cubes");
688 cubes2.
status = cubes.status;
689 cubes2.
cubes = cubes.cubes;
694 TRACE (
"reset_assumptions");
696 transition_to_steady_state ();
697 external->reset_assumptions ();
698 external->reset_concluded ();
703 TRACE (
"reset_constraint");
705 transition_to_steady_state ();
706 external->reset_constraint ();
707 external->reset_concluded ();
714 TRACE (
"propagate_assumptions");
716 transition_to_steady_state ();
717 const int res = external->propagate_assumptions ();
718 if (tracing_nb_lidrup_env_var_method)
734 "can only get implied literals only in unknown state");
735 external->conclude_unknown ();
736 external->implied (entrailed);
737 if (tracing_nb_lidrup_env_var_method)
744int Solver::call_external_solve_and_check_results (
bool preprocess_only) {
745 transition_to_steady_state ();
748 const int res = external->
solve (preprocess_only);
763 if (res == 20 && !external->
assumptions.empty ()) {
766 checker.
set(
"checkproof", 1);
767 checker.
set(
"lrat", 0);
768 checker.
prefix (
"checker ");
770 checker.
set(
"log", 1);
774 if (checker.
solve () != 20)
775 FATAL (
"copying assumption checker failed");
789 const int res = call_external_solve_and_check_results (
false);
791 if (tracing_nb_lidrup_env_var_method)
797 TRACE (
"simplify", rounds);
799 REQUIRE (rounds >= 0,
"negative number of simplification rounds '%d'",
801 internal->limit (
"preprocessing", rounds);
802 const int res = call_external_solve_and_check_results (
true);
814 if (!external->extended)
816 external->conclude_sat ();
817 int res = external->ival (
lit);
829 REQUIRE (!external->propagator,
830 "can only flip when no external propagator is present");
831 bool res = external->flip (
lit);
842 REQUIRE (!external->propagator,
843 "can only flip when no external propagator is present");
844 bool res = external->flippable (
lit);
855 "can only get failed assumptions in unsatisfied state");
856 bool res = external->failed (
lit);
863 TRACE (
"constraint_failed");
866 "can only determine if constraint failed in unsatisfied state");
867 bool res = external->failed_constraint ();
877 int res = external->fixed (
lit);
886 external->phase (
lit);
894 external->unphase (
lit);
903 external->terminate ();
910 REQUIRE (terminator,
"can not connect zero terminator");
912 if (external->terminator)
913 LOG (
"connecting new terminator (disconnecting previous one)");
915 LOG (
"connecting new terminator (no previous one)");
917 external->terminator = terminator;
925 if (external->terminator)
926 LOG (
"disconnecting previous terminator");
928 LOG (
"ignoring to disconnect terminator (no previous one)");
930 external->terminator = 0;
939 REQUIRE (learner,
"can not connect zero learner");
941 if (external->learner)
942 LOG (
"connecting new learner (disconnecting previous one)");
944 LOG (
"connecting new learner (no previous one)");
946 external->learner = learner;
954 if (external->learner)
955 LOG (
"disconnecting previous learner");
957 LOG (
"ignoring to disconnect learner (no previous one)");
959 external->learner = 0;
969 REQUIRE (fixed_listener,
"can not connect zero fixed listener");
972 if (external->fixed_listener)
973 LOG (
"connecting new listener of fixed assignments (disconnecting "
976 LOG (
"connecting new listener of fixed assigments (no previous one)");
978 if (external->fixed_listener)
980 external->fixed_listener = fixed_listener;
992 if (external->fixed_listener)
993 LOG (
"disconnecting previous listener of fixed assignments");
995 LOG (
"ignoring to disconnect listener of fixed assignments (no "
998 external->fixed_listener = 0;
1007 REQUIRE (propagator,
"can not connect zero propagator");
1009 if (external->propagator)
1010 LOG (
"connecting new external propagator (disconnecting previous one)");
1012 LOG (
"connecting new external propagator (no previous one)");
1014 if (external->propagator)
1017 external->propagator = propagator;
1018 internal->connect_propagator ();
1019 internal->external_prop =
true;
1020 internal->external_prop_is_lazy = propagator->
is_lazy;
1029 if (external->propagator)
1030 LOG (
"disconnecting previous external propagator");
1032 LOG (
"ignoring to disconnect external propagator (no previous one)");
1034 if (external->propagator)
1035 external->reset_observed_vars ();
1037 external->propagator = 0;
1038 internal->set_tainted_literal ();
1039 internal->external_prop =
false;
1040 internal->external_prop_is_lazy =
true;
1045 TRACE (
"observe", idx);
1048 external->add_observed_var (idx);
1053 TRACE (
"unobserve", idx);
1056 external->remove_observed_var (idx);
1061 TRACE (
"reset_observed_vars");
1063 external->reset_observed_vars ();
1072 int res = internal->active ();
1078 TRACE (
"redundant");
1080 int64_t res = internal->redundant ();
1086 TRACE (
"irredundant");
1088 int64_t res = internal->irredundant ();
1099 external->freeze (
lit);
1108 "can not melt completely melted literal '%d'",
lit);
1109 external->melt (
lit);
1117 bool res = external->frozen (
lit);
1129 "can only start proof tracing to '%s' right after initialization",
1133 internal->trace (internal_file);
1139 TRACE (
"trace_proof", path);
1143 "can only start proof tracing to '%s' right after initialization",
1146 bool res = (internal_file != 0);
1147 internal->trace (internal_file);
1153 TRACE (
"flush_proof_trace");
1155 REQUIRE (!internal->file_tracers.empty (),
"proof is not traced");
1156 REQUIRE (!internal->file_tracers.back ()->closed (),
1157 "proof trace already closed");
1158 internal->flush_trace (print_statistics_unless_quiet);
1163 TRACE (
"close_proof_trace");
1165 REQUIRE (!internal->file_tracers.empty (),
"proof is not traced");
1166 REQUIRE (!internal->file_tracers.back ()->closed (),
1167 "proof trace already closed");
1168 internal->close_trace (print_statistics_unless_quiet);
1175 bool finalize_clauses) {
1179 "can only start proof tracing to right after initialization");
1180 REQUIRE (tracer,
"can not connect zero tracer");
1181 internal->connect_proof_tracer (tracer, antecedents, finalize_clauses);
1186 bool finalize_clauses) {
1190 "can only start proof tracing to right after initialization");
1191 REQUIRE (tracer,
"can not connect zero tracer");
1192 internal->connect_proof_tracer (tracer, antecedents, finalize_clauses);
1197 bool finalize_clauses) {
1201 "can only start proof tracing to right after initialization");
1202 REQUIRE (tracer,
"can not connect zero tracer");
1203 internal->connect_proof_tracer (tracer, antecedents, finalize_clauses);
1208 bool finalize_clauses) {
1212 "can only start proof tracing right after initialization");
1213 REQUIRE (tracer,
"can not connect zero tracer");
1214 internal->connect_proof_tracer (tracer, antecedents, finalize_clauses);
1221 REQUIRE (tracer,
"can not disconnect zero tracer");
1222 bool res = internal->disconnect_proof_tracer (tracer);
1230 REQUIRE (tracer,
"can not disconnect zero tracer");
1231 bool res = internal->disconnect_proof_tracer (tracer);
1239 REQUIRE (tracer,
"can not disconnect zero tracer");
1240 bool res = internal->disconnect_proof_tracer (tracer);
1252 "can only conclude in satisfied, unsatisfied or inconclusive state");
1254 internal->conclude_unsat ();
1256 external->conclude_sat ();
1258 external->conclude_unknown ();
1274 else if (
file == stderr)
1282 const char *b =
date ();
1283 const char *f =
flags ();
1290 fputs (
"Version ",
file);
1337 internal->opts.print ();
1349 internal->print_statistics ();
1356 TRACE (
"resources");
1358 internal->print_resource_usage ();
1368 "can only read DIMACS file right after initialization");
1376 int &
vars,
int strict) {
1380 "can only read DIMACS file right after initialization");
1393 "can only read DIMACS file right after initialization");
1396 return internal->error_message.init (
"failed to read DIMACS file '%s'",
1405 int &vars,
int strict,
bool &incremental,
1410 "can only read DIMACS file right after initialization");
1424 "can only read DIMACS file right after initialization");
1435const char *Solver::read_solution (
const char *path) {
1440 return internal->error_message.init (
1441 "failed to read solution file '%s'", path);
1443 const char *err = parser->parse_solution ();
1454void Solver::dump_cnf () {
1464 return external->propagator;
1467bool Solver::observed (
int lit) {
1471 bool res = external->observed (
lit);
1476bool Solver::is_witness (
int lit) {
1480 bool res = external->is_witness (
lit);
1489 bool res = external->is_decision (
lit);
1495 TRACE (
"force_backtrack", new_level);
1497 external->force_backtrack (new_level);
1505 bool res = external->traverse_all_frozen_units_as_clauses (it) &&
1506 internal->traverse_clauses (it) &&
1507 internal->traverse_constraint (it);
1515 bool res = external->traverse_all_non_frozen_units_as_witnesses (it) &&
1516 external->traverse_witnesses_backward (it);
1524 bool res = external->traverse_witnesses_forward (it) &&
1525 external->traverse_all_non_frozen_units_as_witnesses (it);
1538 for (
const auto &
lit : c) {
1540 int idx = abs (
lit);
1555 for (
const auto &
lit : c) {
1556 if (!file->put (
lit))
1558 if (!file->put (
' '))
1561 return file->put (
"0\n");
1568#ifndef CADICAL_QUIET
1569 const double start = internal->time ();
1571 internal->restore_clauses ();
1574 LOG (
"found maximal variable %d and %" PRId64
" clauses",
counter.vars,
1577 const char *res = 0;
1579 int actual_max_vars = max (min_max_var,
counter.vars);
1580 MSG (
"writing %s'p cnf %d %" PRId64
"'%s header",
tout.green_code (),
1581 actual_max_vars,
counter.clauses,
tout.normal_code ());
1582 file->put (
"p cnf ");
1583 file->put (actual_max_vars);
1589 res = internal->error_message.init (
1590 "writing to DIMACS file '%s' failed", path);
1593 res = internal->error_message.init (
1594 "failed to open DIMACS file '%s' for writing", path);
1595#ifndef CADICAL_QUIET
1597 const double end = internal->time ();
1598 MSG (
"wrote %" PRId64
" clauses in %.2f seconds %s time",
1600 internal->opts.realtime ?
"real" :
"process");
1614 for (
const auto &
lit : a) {
1617 if (!
file->put (
' '))
1620 return file->put (
'0');
1625 if (!
file->put (
' '))
1629 if (!
file->put (
'\n'))
1639 const char *res = 0;
1640#ifndef CADICAL_QUIET
1641 const double start = internal->time ();
1647 res = internal->error_message.init (
1648 "writing to DIMACS file '%s' failed", path);
1651 res = internal->error_message.init (
1652 "failed to open extension file '%s' for writing", path);
1653#ifndef CADICAL_QUIET
1655 const double end = internal->time ();
1656 MSG (
"wrote %" PRId64
" witnesses in %.2f seconds %s time",
1658 internal->opts.realtime ?
"real" :
"process");
1673 for (
const auto &
lit : c)
1686 dst->push_external_clause_and_witness_on_extension_stack (c, w,
id);
1694 internal->opts.copy (other.internal->
opts);
1699 external->copy_flags (*other.external);
1704void Solver::section (
const char *title) {
1714void Solver::message (
const char *fmt, ...) {
1723 internal->vmessage (fmt, ap);
1728void Solver::message () {
1732#ifndef CADICAL_QUIET
1733 internal->message ();
1737void Solver::verbose (
int level,
const char *fmt, ...) {
1747 internal->vverbose (level, fmt, ap);
1752void Solver::error (
const char *fmt, ...) {
1758 internal->verror (fmt, ap);
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define CADICAL_assert(ignore)
#define REQUIRE_INITIALIZED()
#define LOG_API_CALL_END(...)
#define LOG_API_CALL_RETURNS(...)
#define LOG_API_CALL_BEGIN(...)
bool clause(const vector< int > &c)
bool clause(const vector< int > &c)
static File * write(Internal *, FILE *, const char *name)
static File * read(Internal *, FILE *f, const char *name)
static Option * has(const char *name)
static bool is_preprocessing_option(const char *name)
static bool parse_long_option(const char *, string &, int &)
const char * parse_dimacs(int &vars, int strict)
int simplify(int rounds=3)
void connect_learner(Learner *learner)
const char * write_dimacs(const char *path, int min_max_var=0)
void reset_observed_vars()
bool set_long_option(const char *arg)
void add_observed_var(int var)
bool is_decision(int lit)
void connect_external_propagator(ExternalPropagator *propagator)
void implied(std::vector< int > &implicants)
void force_backtrack(size_t new_level)
CubesWithStatus generate_cubes(int, int min_depth=0)
bool is_valid_limit(const char *arg)
const State & state() const
static bool is_valid_option(const char *name)
void flush_proof_trace(bool print=false)
bool limit(const char *arg, int val)
void connect_proof_tracer(Tracer *tracer, bool antecedents, bool finalize_clauses=false)
int64_t redundant() const
void remove_observed_var(int var)
bool disconnect_proof_tracer(Tracer *tracer)
int64_t irredundant() const
void prefix(const char *verbose_message_prefix)
static bool is_preprocessing_option(const char *name)
void close_proof_trace(bool print=false)
void connect_fixed_listener(FixedAssignmentListener *fixed_listener)
const char * write_extension(const char *path)
void disconnect_external_propagator()
static void build(FILE *file, const char *prefix="c ")
int get(const char *name)
void disconnect_terminator()
bool configure(const char *)
int reserve_difference(int number_of_vars)
static const char * signature()
static bool is_valid_long_option(const char *arg)
bool set(const char *name, int val)
void reserve(int min_max_var)
static void configurations()
bool trace_proof(FILE *file, const char *name)
static const char * version()
bool frozen(int lit) const
void connect_terminator(Terminator *terminator)
void disconnect_learner()
bool traverse_witnesses_backward(WitnessIterator &) const
void copy(Solver &other) const
static bool is_valid_configuration(const char *)
bool traverse_clauses(ClauseIterator &) const
bool traverse_witnesses_forward(WitnessIterator &) const
void disconnect_fixed_listener()
const char * read_dimacs(FILE *file, const char *name, int &vars, int strict=1)
const char * normal_code()
void magenta(bool bright=false)
#define REQUIRE_READY_STATE()
#define REQUIRE_VALID_LIT(...)
#define REQUIRE_VALID_STATE()
#define REQUIRE_VALID_OR_SOLVING_STATE()
const char * identifier()
bool clause(const vector< int > &c)
static bool has(const char *)
static bool set(Options &, const char *)
int solve(bool preprocess_only)
vector< int > assumptions
static bool is_valid_limit(const char *name)
std::vector< std::vector< int > > cubes
WitnessCopier(External *d)
bool witness(const vector< int > &c, const vector< int > &w, int64_t id)
bool witness(const vector< int > &c, const vector< int > &w, int64_t)
bool write(const vector< int > &a)