Solver Manager
-
class SolverManager
Public Functions
-
void clear()
Clear all data.
-
RNGenerator &get_rng() const
Get the associated global random number generator.
- Returns:
A reference to the RNG instance.
-
SolverSeedGenerator &get_sng()
Get the associated solver seed generator.
- Returns:
A reference to the solver seed generator instance.
-
const TheorySet &get_enabled_theories() const
Get set of enabled theories.
- Returns:
The set of currently enabled theories.
-
std::ostream &get_trace()
Get a reference to the trace stream.
- Returns:
A reference to the trace stream.
-
void mark_option_used(const std::string &opt)
Mark given option as already configured.
- Parameters:
opt – The option to mark.
-
uint64_t get_num_terms_max_level() const
Get the number of created terms in the top scope.
- Returns:
the number of created terms in the current top scope.
-
size_t get_num_vars() const
Get the number of available variables.
- Returns:
The number of available variables.
-
void add_sort(Sort &sort, SortKind sort_kind, bool parametric = false, bool well_founded = true)
Add sort to sort database.
Parametric sorts are not added to the main database (the database that we pick sorts from), but to a separate database that we only pick from when we explicitly need parametric sorts (see pick_sort_dt_param()).
We only add well founded sorts. A sort that is not well founded gets an id to trace the return statement of mk-sort, but is otherwise discarded.
- Parameters:
sort – The sort to add to the databse.
sort_kind – The kind of the sort.
parametric – True if given sort has parameter sorts.
well_founded – True if fiven sort is well founded.
-
void add_value(Term &term, Sort &sort, SortKind sort_kind, const AbsTerm::SpecialValueKind &value_kind = AbsTerm::SPECIAL_VALUE_NONE)
Add value to term database.
- Parameters:
term – The term to add to the database.
sort – The sort of the term to add.
sort_kind – The sort of the sort of the term to add.
value_kind – The kind of the special value, AbsTerm::SPECIAL_VALUE_NONE if given term is not a special value.
-
void add_string_char_value(Term &term)
Add string value of length 1.
- Parameters:
term – A term representing a string value of length 1.
-
void add_input(Term &term, Sort &sort, SortKind sort_kind)
Add input to term database.
- Parameters:
term – A term representing an input.
sort – The sort of the term.
sort_kind – The kind of the sort of the term.
-
void add_var(Term &term, Sort &sort, SortKind sort_kind)
Add var to term database.
- Parameters:
term – A term representing a variable.
sort – The sort of the term.
sort_kind – The kind of the sort of the term.
-
void add_const(Term &term, Sort &sort, SortKind sort_kind)
Add const to term database.
- Parameters:
term – A term representing a constant.
sort – The sort of the term.
sort_kind – The kind of the sort of the term.
-
void add_term(Term &term, SortKind sort_kind, const std::vector<Term> &args = {})
Add non-input term to term database.
- Parameters:
term – A term representing anything other than an input
sort_kind – The kind of the sort of the term.
args – The argument terms to the given term.
-
std::string pick_symbol(const std::string &prefix = "_x")
Pick arbitrary symbol (simple or piped). Simple symbols are generated as
<prefix><id>
.- Parameters:
prefix – The prefix of the symbol.
- Returns:
An arbitrary symbol.
-
SortKind pick_sort_kind(bool with_terms = true)
Pick sort kind of existing (= created) sort.
Optionally restrict selection to sort kinds with terms only if
with_terms
is true.Note
This excludes parametric datatype sorts.
- Parameters:
with_terms – True to only pick sort kinds of a sort for which we have already created terms.
- Returns:
The sort kind.
-
SortKind pick_sort_kind(const SortKindSet &sort_kinds, bool with_terms = true)
Pick sort kind of existing (= created) sort out of given set of sort kinds. Asserts that a sort of any of the given kinds exists.
Optionally restrict selection to sort kinds with terms only if
with_terms
is true.Note
This excludes parametric datatype sorts.
- Parameters:
sort_kinds – The set of sort kinds to pick from.
with_terms – True to only pick sort kinds of a sort for which we have already created terms.
- Returns:
The sort kind.
-
SortKind pick_sort_kind_excluding(const SortKindSet &exclude_sort_kinds, bool with_terms = true) const
Pick a sort kind of existing (= created) sort, excluding the given sort kinds.
Optionally restrict selection to sort kinds with terms only if
with_terms
is true.Note
This excludes parametric datatype sorts.
- Parameters:
exclude_sort_kinds – The sort kinds to exclude.
with_terms – True to only pick sort kinds of a sort for which we have already created terms.
- Returns:
The sort kind.
-
SortKind pick_sort_kind(uint32_t level, const SortKindSet &exclude_sort_kinds)
Pick sort kind of existing (= created) sort with terms at given level.
Optionally, exclude given sort kinds.
Note
This excludes parametric datatype sorts.
- Parameters:
level – The scope level of existing terms to pick the sort kind from.
exclude_sort_kinds – The sort kinds to exclude.
- Returns:
The sort kind.
-
SortKindData &pick_sort_kind_data()
Pick enabled sort kind (and get its data).
Only sort kinds of enabled theories are picked. This function does not guarantee that a sort of this kind alreay exists.
Note
This excludes parametric datatype sorts.
- Returns:
The sort kind.
-
Op::Kind pick_op_kind(bool with_terms = true, SortKind sort_kind = SORT_ANY)
Pick enabled operator kind (and get its data).
Optionally restricted to operator kinds that create terms of given sort kind.
Only operator kinds of enabled theories are picked.
- Parameters:
with_terms – True to only pick operator kinds of already created terms.
sort_kind – The sort kind of terms of the operator kind to select.
- Returns:
The operator kind.
-
Op &get_op(const Op::Kind &kind)
Get the Op data for given operator kind.
- Parameters:
kind – The operator kind.
- Returns:
The configuration data of the operator.
-
Term pick_value()
Pick a value of any sort.
Note
Requires that a value of any sort exists.
- Returns:
The value.
-
Term pick_value(Sort sort)
Pick a value of given sort.
Note
Requires that a value of given sort exists.
- Parameters:
sort – The sort of the value to pick.
- Returns:
The value.
-
Term pick_string_char_value()
Pick string value with length 1.
- Returns:
A term representing a string value of length 1.
-
Term pick_term(Sort sort)
Pick a term of given sort.
Note
Requires that terms of this sort exist.
- Parameters:
sort – The sort of the term to pick.
- Returns:
The term.
-
Term pick_term(SortKind sort_kind, size_t level)
Pick term of given sort kind and scope level.
Note
Requires that terms of this sort kind exist.
- Parameters:
sort_kind – The kind of the sort of the term to pick.
level – The scope level of the term to pick.
- Returns:
The term.
-
Term pick_term(SortKind sort_kind)
Pick term of given sort kind.
Note
Requires that terms of this sort kind exist.
- Parameters:
sort_kind – The kind of the sort of the term to pick.
- Returns:
The term.
-
Term pick_term()
Pick any term.
Note
Requires that terms of any sort kind exist.
- Returns:
The term.
-
Term pick_term(size_t level)
Pick any term from given level.
Note
Requires that terms of any sort kind exist.
- Parameters:
level – The scope level of the term to pick.
- Returns:
The term.
-
Term pick_term_min_level(Sort sort, size_t level)
Pick any term from any level from the given level to the max level.
Note
Requires that terms of any sort kind exist.
- Parameters:
sort – The sort of the term to pick.
level – The scope level of the term to pick.
- Returns:
The term.
-
Term pick_fun(const std::vector<Sort> &domain_sorts)
Pick function term with given domain sorts.
Note
Requires that such terms exist.
- Parameters:
domain_sorts – The sorts of the domain of the function to pick.
- Returns:
A term representing a function.
-
Term pick_var()
Pick variable from current scope level.
Note
Requires that a variable exists.
- Returns:
A term representing a variable.
-
std::vector<Term> pick_vars(size_t num_vars) const
Pick
num_vars
variables.Note
Requires that at least
num_vars
variables exist.- Parameters:
num_vars – The number of variables to pick.
- Returns:
A vector with the picked variables.
-
void remove_var(const Term &var)
Remove variable from current scope level.
Note
Must be called before calling add_term.
- Parameters:
var – The variable to remove.
-
Term pick_quant_term(Sort sort)
Pick term of given sort from current scope level.
- Returns:
The term.
-
void add_assumption(Term t)
Add given term to the set of currently assumed assumptions.
- Parameters:
t – The assumption to cache.
-
Term pick_assumed_assumption()
Pick assumption out of the set of currently assumed assumptions.
Note
Requires that d_assumptions is not empty.
- Returns:
A term representing an assumptions.
-
void reset()
Reset solver manager state into start mode.
-
void reset_sat()
Reset solver manager state into assert mode.
After this call, calling
get_unsat_assumptions()
get_unsat_core() and is not possible until after the next SAT call.
-
bool has_value() const
Determine if term database contains any value of any sort.
- Returns:
True if term database contains any value of any sort.
-
bool has_value(Sort sort) const
Determine if term database contains any value of given sort.
- Returns:
True if term database contains any value of given sort.
-
bool has_string_char_value() const
Determine if we already created string values with length 1.
- Returns:
True if we already created string values with length 1.
-
bool has_term() const
Determine if term database contains any term.
- Returns:
True if term database contains any term.
-
bool has_term(size_t level) const
Determine if term database contains any term on given level.
- Parameters:
level – The scope level to query for terms.
- Returns:
True if term database contains any term on given level.
-
bool has_term(SortKind sort_kind, size_t level) const
Determine if term database contains any term of given sort kind at given level.
- Parameters:
sort_kind – The sort kind of the terms to query for.
level – The scope level to query for terms.
- Returns:
True if term database contains any term of given sort kind at given level.
-
bool has_term(SortKind sort_kind) const
Determine if term database contains any term of given sort kind.
- Parameters:
sort_kind – The sort kind of the terms to query for.
- Returns:
true if term database contains any term of given sort kind.
-
bool has_term(const SortKindSet &sort_kinds) const
Determine if term database contains any term of one of the given sort kinds.
- Parameters:
sort_kinds – The sort kinds.
- Returns:
True if term database contains any term of one of the given sort kinds.
-
bool has_term(Sort sort) const
Determine if term database contains any term of given sort.
- Parameters:
sort – The sort of the terms to query for.
- Returns:
true if term database contains any term of given sort.
-
bool has_assumed() const
Determine if d_assumptions is not empty.
- Returns:
True if d_assumptions is not empty.
-
bool has_fun(const std::vector<Sort> &domain_sorts) const
Determine if term database contains a function term with given domain sorts.
- Parameters:
domain_sorts – The domain sorts of the function to query for.
- Returns:
True if term database contains a function term with given domain sorts.
-
bool has_var() const
Determine if term database contains a variable.
- Returns:
true if term database contains a variable.
-
bool has_quant_body() const
Determine if term database contains a variable and a Boolean term in the current scope level.
- Returns:
True if term database contains a variable and a Boolean term in the current scope level.
-
bool has_quant_term() const
Determine if term database contains a variable and a term of any sort in the current scope level.
- Returns:
True if term database contains a variable and a term of any sort in the current scope level.
-
bool has_quant_term(Sort sort) const
Determine if term database contains a variable and a term of given sort in the current scope level.
- Returns:
True if term database contains a variable and a term of given sort in the current scope level.
-
Term find_term(Term term, Sort sort, SortKind sort_kind)
Find the Term in the Term database that wraps the same solver term with the given sort and sort kind.
Note
We need this for Terms returned by the solver that are only wrapped solver terms without sort information.
- Returns:
A nullptr if given Term is not in the term database.
-
Term get_term(uint64_t id) const
Get the term with the given id.
- Parameters:
id – The id of the term.
- Returns:
The term with the given id.
-
Term get_untraced_term(uint64_t id) const
Get the untraced term with the given id.
- Parameters:
id – The id of the term.
- Returns:
The untraced term with the given id.
-
Sort pick_sort()
Pick sort.
It is not guaranteed that there exist terms of the returned sort.
Note
This excludes parametric datatype sorts.
- Returns:
The sort.
-
Sort pick_sort_with_sort_params()
Pick sort that has sort parameters.
It is not guaranteed that there exist terms of the returned sort.
Note
This includes (parametric) datatype sorts.
- Returns:
The sort.
-
Sort pick_sort(SortKind sort_kind, bool with_terms = true)
Pick sort of given sort kind.
Optionally restrict selection to sorts with terms only if
with_terms
is true.Note
This excludes parametric datatype sorts.
- Parameters:
sort_kind – The sort_kind of the sort to pick.
with_terms – True to restrict to sorts with already created terms.
- Returns:
The sort.
-
Sort pick_sort(const SortKindSet &sort_kinds, bool with_terms = true)
Pick sort of any of the given sort kinds.
Optionally restrict selection to sorts with terms only if
with_terms
is true.- Parameters:
sort_kinds – The set of sort kinds to pick from.
with_terms – True to restrict to sorts with already created terms.
- Returns:
This excludes parametric datatype sorts.
-
Sort pick_sort_excluding(const SortKindSet &exclude_sort_kinds, bool with_terms = true)
Pick sort, excluding sorts of kinds included in
exclude_sort_kinds
.It is not guaranteed that there exist terms of the returned sort.
- Parameters:
exclude_sort_kinds – The sort kinds to exclude.
with_terms – True to restrict to sorts with already created terms.
- Returns:
This excludes parametric datatype sorts.
-
Sort pick_sort_bv(uint32_t bw, bool with_terms = true)
Pick bit-vector sort with given bit-width.
Optionally restrict selection to sorts with terms only if
with_terms
is true.- Parameters:
bw – The bit-width of the bit-vector sort to pick.
with_terms – True to restrict to sorts with already created terms.
- Returns:
The sort.
-
Sort pick_sort_bv_max(uint32_t bw_max, bool with_terms = true)
Pick bit-vector sort with given maximum bit-width.
Optionally restrict selection to sorts with terms only if
with_terms
is true.- Parameters:
bw_max – The maximum bit-width (incl.) of the bit-vector sort to pick.
with_terms – True to restrict to sorts with already created terms.
- Returns:
The sort.
-
bool has_sort() const
Determine if any sort has been created.
This does not guarantee that any terms have been created.
Note
This excludes parametric datatype sorts.
- Returns:
True if any sort has been created.
-
bool has_sort(SortKind sort_kind) const
Determine if a sort of given kind exists.
This does not guarantee that any terms of this sort have been created.
Note
This excludes parametric datatype sorts.
- Parameters:
sort_kind – The sort kind to check for created sorts.
- Returns:
True if a sort of given kind exists.
-
bool has_sort(const SortKindSet &sort_kinds) const
Determine if a sort of any of the given kinds exists.
This does not guarantee that any terms of these sorts have been created.
Note
This excludes parametric datatype sorts.
- Parameters:
sort_kinds – The sort kinds to check for created sorts.
- Returns:
True if a sort of any of the given kinds exists.
-
bool has_sort(Sort sort) const
Determine if given sort already exists.
This does not guarantee that any terms of this sort have been created.
- Returns:
sort The sort to query for.
- Returns:
True if given sort already exists.
-
bool has_sort_excluding(const std::unordered_set<SortKind> &exclude_sort_kinds, bool with_terms = true) const
Determine if sorts of a kind other than the kinds given in exclude_sort_kinds have been created.
Optionally restrict selection to sorts with terms only if
with_terms
is true.Note
This excludes parametric datatype sorts.
- Parameters:
exclude_sort_kinds – The sort kinds to exclude.
with_terms – True to restrict to sorts with already created terms.
- Returns:
True if sort of a kind other than the given kinds have been created.
-
bool has_sort_excluding(uint32_t level, const std::unordered_set<SortKind> &exclude_sort_kinds) const
Determine if terms with sorts of a kind other than the kinds given in
exclude_sort_kinds
at the given scope level have been created.- Parameters:
level – The scope level.
exclude_sort_kinds – The sort kinds to exclude.
- Returns:
True if terms with sorts of a kind other than the kinds given in
exclude_sort_kinds
have been created.
-
bool has_sort_with_sort_params() const
Determine if sorts that have sort parameters have been created.
Note
This includes non-parametric datatypes.
- Returns:
True if sorts that have sort parameters have been created.
-
bool has_sort_bv(uint32_t bw, bool with_terms = true) const
Determine if a bit-vector sort with given bit-width exists.
Optionally restrict selection to sorts with terms only if
with_terms
is true.- Returns:
True if a bit-vector sort with given bit-width exists.
-
bool has_sort_bv_max(uint32_t bw_max, bool with_terms = true) const
Determine if a bit-vector sort up to given maximum bit-width exists.
Optionally restrict selection to sorts with terms only if
with_terms
is true.- Returns:
True if a bit-vector sort up to given maximum bit-width exists.
-
bool has_sort_dt_parametric() const
Determine if a parametric datatypes sort exists.
- Returns:
True if a parametric datatypes sort exists.
-
Sort get_untraced_sort(uint64_t id) const
Get the untraced sort with the given id.
- Returns:
The untraced sort with the given id.
-
Sort find_sort(Sort sort) const
Find a matching sort for the given sort in the sort database
d_sorts
.- Parameters:
sort – The sort to find.
- Returns:
The sort cached in
d_sorts
, if found, else the given sort.
-
std::pair<std::string, std::string> pick_option(std::string name = "", std::string value = "")
Pick an option and an option value.
If either are given, enforce option or value. If no option or the given option / value can be set, return empty pair.
- Parameters:
name – The option name.
value – The option value.
- Returns:
A pair of picked option name and value.
-
void clear_assumptions()
Clear cached set of assumptions.
-
void add_option(SolverOption *opt)
Add solver option.
- Parameters:
opt – The solver option to add.
-
void report_result(Solver::Result res)
Report solver result to solver manager.
- Parameters:
res – The solver result.
-
SolverProfile &get_profile()
Get the currently configured solver profile.
- Returns:
The solver profile.
Public Members
-
bool d_arith_linear = false
True to restrict arithmetic operators to linear fragment.
-
bool d_simple_symbols = false
True if all symbols for terms should be of the form ‘_sX’ rather than a random string.
-
bool d_incremental = false
True if incremental solving is enabled. (SMT-LIB: option :incremental).
-
bool d_model_gen = false
True if model generation is enabled. (SMT-LIB: option :produce-models).
-
bool d_unsat_assumptions = false
True if producing unsat assumptions is enabled. (SMT-LIB: option :produce-unsat-assumptions).
-
bool d_unsat_cores = false
True if producing unsat cores is enabled. (SMT-LIB: option :produce-unsat-cores).
-
uint32_t d_n_push_levels = 0
The number of scope levels previously pushed.
-
bool d_sat_called = false
True if a previous check-sat call is still “active”, i.e., if no formulas have been asserted or assumed since. While true it is save to check failed assumptions and query model values.
-
uint32_t d_n_sat_calls = 0
The number of check-sat calls issued.
-
statistics::Statistics *d_mbt_stats
A pointer to the murxla-level statistics object.
-
struct Stats
-
void clear()