mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
Add initial value setting for variables in Z3 API, solver, and optimize modules
This commit is contained in:
parent
0ba306e7b3
commit
48712b4f60
31 changed files with 297 additions and 9 deletions
|
@ -459,6 +459,21 @@ extern "C" {
|
|||
Z3_CATCH;
|
||||
}
|
||||
|
||||
|
||||
void Z3_API Z3_optimize_set_initial_value(Z3_context c, Z3_optimize o, Z3_ast var, Z3_ast value) {
|
||||
Z3_TRY;
|
||||
LOG_Z3_optimize_set_initial_value(c, o, var, value);
|
||||
RESET_ERROR_CODE();
|
||||
if (to_expr(var)->get_sort() != to_expr(value)->get_sort()) {
|
||||
SET_ERROR_CODE(Z3_INVALID_USAGE, "variable and value should have same sort");
|
||||
return;
|
||||
}
|
||||
ast_manager& m = mk_c(c)->m();
|
||||
if (!m.is_value(to_expr(value))) {
|
||||
SET_ERROR_CODE(Z3_INVALID_USAGE, "a proper value was not supplied");
|
||||
return;
|
||||
}
|
||||
to_optimize_ptr(o)->initialize_value(to_expr(var), to_expr(value));
|
||||
Z3_CATCH;
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -1143,5 +1143,23 @@ extern "C" {
|
|||
Z3_CATCH_RETURN(nullptr);
|
||||
}
|
||||
|
||||
void Z3_API Z3_solver_set_initial_value(Z3_context c, Z3_solver s, Z3_ast var, Z3_ast value) {
|
||||
Z3_TRY;
|
||||
LOG_Z3_solver_set_initial_value(c, s, var, value);
|
||||
RESET_ERROR_CODE();
|
||||
if (to_expr(var)->get_sort() != to_expr(value)->get_sort()) {
|
||||
SET_ERROR_CODE(Z3_INVALID_USAGE, "variable and value should have same sort");
|
||||
return;
|
||||
}
|
||||
ast_manager& m = mk_c(c)->m();
|
||||
if (!m.is_value(to_expr(value))) {
|
||||
SET_ERROR_CODE(Z3_INVALID_USAGE, "a proper value was not supplied");
|
||||
return;
|
||||
}
|
||||
to_solver_ref(s)->user_propagate_initialize_value(to_expr(var), to_expr(value));
|
||||
Z3_CATCH;
|
||||
}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
|
|
@ -2865,6 +2865,17 @@ namespace z3 {
|
|||
check_error();
|
||||
return result;
|
||||
}
|
||||
void set_initial_value(expr const& var, expr const& value) {
|
||||
Z3_solver_set_initial_value(ctx(), m_solver, var, value);
|
||||
check_error();
|
||||
}
|
||||
void set_initial_value(expr const& var, int i) {
|
||||
set_initial_value(var, ctx().num_val(i, var.get_sort()));
|
||||
}
|
||||
void set_initial_value(expr const& var, bool b) {
|
||||
set_initial_value(var, ctx().bool_val(b));
|
||||
}
|
||||
|
||||
expr proof() const { Z3_ast r = Z3_solver_get_proof(ctx(), m_solver); check_error(); return expr(ctx(), r); }
|
||||
friend std::ostream & operator<<(std::ostream & out, solver const & s);
|
||||
|
||||
|
@ -3330,6 +3341,17 @@ namespace z3 {
|
|||
handle add(expr const& e, unsigned weight) {
|
||||
return add_soft(e, weight);
|
||||
}
|
||||
void set_initial_value(expr const& var, expr const& value) {
|
||||
Z3_optimize_set_initial_value(ctx(), m_opt, var, value);
|
||||
check_error();
|
||||
}
|
||||
void set_initial_value(expr const& var, int i) {
|
||||
set_initial_value(var, ctx().num_val(i, var.get_sort()));
|
||||
}
|
||||
void set_initial_value(expr const& var, bool b) {
|
||||
set_initial_value(var, ctx().bool_val(b));
|
||||
}
|
||||
|
||||
handle maximize(expr const& e) {
|
||||
return handle(Z3_optimize_maximize(ctx(), m_opt, e));
|
||||
}
|
||||
|
|
|
@ -7353,6 +7353,13 @@ class Solver(Z3PPObject):
|
|||
Z3_solver_get_levels(self.ctx.ref(), self.solver, trail.vector, len(trail), levels)
|
||||
return trail, levels
|
||||
|
||||
def set_initial_value(self, var, value):
|
||||
"""initialize the solver's state by setting the initial value of var to value
|
||||
"""
|
||||
s = var.sort()
|
||||
value = s.cast(value)
|
||||
Z3_solver_set_initial_value(self.ctx.ref(), self.solver, var.ast, value.ast)
|
||||
|
||||
def trail(self):
|
||||
"""Return trail of the solver state after a check() call.
|
||||
"""
|
||||
|
@ -8032,6 +8039,13 @@ class Optimize(Z3PPObject):
|
|||
return [asoft(a) for a in arg]
|
||||
return asoft(arg)
|
||||
|
||||
def set_initial_value(self, var, value):
|
||||
"""initialize the solver's state by setting the initial value of var to value
|
||||
"""
|
||||
s = var.sort()
|
||||
value = s.cast(value)
|
||||
Z3_optimize_set_initial_value(self.ctx.ref(), self.optimize, var.ast, value.ast)
|
||||
|
||||
def maximize(self, arg):
|
||||
"""Add objective function to maximize."""
|
||||
return OptimizeObjective(
|
||||
|
|
|
@ -7241,6 +7241,18 @@ extern "C" {
|
|||
|
||||
bool Z3_API Z3_solver_propagate_consequence(Z3_context c, Z3_solver_callback cb, unsigned num_fixed, Z3_ast const* fixed, unsigned num_eqs, Z3_ast const* eq_lhs, Z3_ast const* eq_rhs, Z3_ast conseq);
|
||||
|
||||
|
||||
/**
|
||||
\brief provide an initialization hint to the solver. The initialization hint is used to calibrate an initial value of the expression that
|
||||
represents a variable. If the variable is Boolean, the initial phase is set according to \c value. If the variable is an integer or real,
|
||||
the initial Simplex tableau is recalibrated to attempt to follow the value assignment.
|
||||
|
||||
def_API('Z3_solver_set_initial_value', VOID, (_in(CONTEXT), _in(SOLVER), _in(AST), _in(AST)))
|
||||
*/
|
||||
|
||||
void Z3_API Z3_solver_set_initial_value(Z3_context c, Z3_solver s, Z3_ast var, Z3_ast value);
|
||||
|
||||
|
||||
/**
|
||||
\brief Check whether the assertions in a given solver are consistent or not.
|
||||
|
||||
|
|
|
@ -139,6 +139,18 @@ extern "C" {
|
|||
*/
|
||||
void Z3_API Z3_optimize_pop(Z3_context c, Z3_optimize d);
|
||||
|
||||
/**
|
||||
\brief provide an initialization hint to the solver.
|
||||
The initialization hint is used to calibrate an initial value of the expression that
|
||||
represents a variable. If the variable is Boolean, the initial phase is set
|
||||
according to \c value. If the variable is an integer or real,
|
||||
the initial Simplex tableau is recalibrated to attempt to follow the value assignment.
|
||||
|
||||
def_API('Z3_optimize_set_initial_value', VOID, (_in(CONTEXT), _in(OPTIMIZE), _in(AST), _in(AST)))
|
||||
*/
|
||||
|
||||
void Z3_API Z3_optimize_set_initial_value(Z3_context c, Z3_optimize o, Z3_ast var, Z3_ast value);
|
||||
|
||||
/**
|
||||
\brief Check consistency and produce optimal values.
|
||||
\param c - context
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue