Z3
Loading...
Searching...
No Matches
Optimize Class Reference
Inheritance diagram for Optimize:

Public Member Functions

 __init__ (self, optimize=None, ctx=None)
 __copy__ (self)
 __deepcopy__ (self, memo={})
 __del__ (self)
 __enter__ (self)
 __exit__ (self, *exc_info)
 set (self, *args, **keys)
 help (self)
 param_descrs (self)
 assert_exprs (self, *args)
 add (self, *args)
 __iadd__ (self, fml)
 assert_and_track (self, a, p)
 add_soft (self, arg, weight="1", id=None)
 set_initial_value (self, var, value)
 maximize (self, arg)
 minimize (self, arg)
 push (self)
 pop (self)
 check (self, *assumptions)
 reason_unknown (self)
 model (self)
 unsat_core (self)
 lower (self, obj)
 upper (self, obj)
 lower_values (self, obj)
 upper_values (self, obj)
 from_file (self, filename)
 from_string (self, s)
 assertions (self)
 objectives (self)
 __repr__ (self)
 sexpr (self)
 statistics (self)
 translate (self, target)
 set_on_model (self, on_model)
Public Member Functions inherited from Z3PPObject
 use_pp (self)

Data Fields

 ctx = _get_ctx(ctx)
 optimize = Z3_mk_optimize(self.ctx.ref())

Protected Attributes

 _on_models_id = None

Additional Inherited Members

Protected Member Functions inherited from Z3PPObject
 _repr_html_ (self)

Detailed Description

Optimize API provides methods for solving using objective functions and weighted soft constraints

Definition at line 8583 of file z3py.py.

Constructor & Destructor Documentation

◆ __init__()

__init__ ( self,
optimize = None,
ctx = None )

Definition at line 8586 of file z3py.py.

8586 def __init__(self, optimize=None, ctx=None):
8587 self.ctx = _get_ctx(ctx)
8588 if optimize is None:
8589 self.optimize = Z3_mk_optimize(self.ctx.ref())
8590 else:
8591 self.optimize = optimize
8592 self._on_models_id = None
8593 Z3_optimize_inc_ref(self.ctx.ref(), self.optimize)
8594
void Z3_API Z3_optimize_inc_ref(Z3_context c, Z3_optimize d)
Increment the reference counter of the given optimize context.
Z3_optimize Z3_API Z3_mk_optimize(Z3_context c)
Create a new optimize context.

◆ __del__()

__del__ ( self)

Definition at line 8601 of file z3py.py.

8601 def __del__(self):
8602 if self.optimize is not None and self.ctx.ref() is not None and Z3_optimize_dec_ref is not None:
8603 Z3_optimize_dec_ref(self.ctx.ref(), self.optimize)
8604 if self._on_models_id is not None:
8605 del _on_models[self._on_models_id]
8606
void Z3_API Z3_optimize_dec_ref(Z3_context c, Z3_optimize d)
Decrement the reference counter of the given optimize context.

Member Function Documentation

◆ __copy__()

__copy__ ( self)

Definition at line 8595 of file z3py.py.

8595 def __copy__(self):
8596 return self.translate(self.ctx)
8597

◆ __deepcopy__()

__deepcopy__ ( self,
memo = {} )

Definition at line 8598 of file z3py.py.

8598 def __deepcopy__(self, memo={}):
8599 return self.translate(self.ctx)
8600

◆ __enter__()

__enter__ ( self)

Definition at line 8607 of file z3py.py.

8607 def __enter__(self):
8608 self.push()
8609 return self
8610

◆ __exit__()

__exit__ ( self,
* exc_info )

Definition at line 8611 of file z3py.py.

8611 def __exit__(self, *exc_info):
8612 self.pop()
8613

◆ __iadd__()

__iadd__ ( self,
fml )

Definition at line 8645 of file z3py.py.

8645 def __iadd__(self, fml):
8646 self.add(fml)
8647 return self
8648

◆ __repr__()

__repr__ ( self)
Return a formatted string with all added rules and constraints.

Definition at line 8792 of file z3py.py.

8792 def __repr__(self):
8793 """Return a formatted string with all added rules and constraints."""
8794 return self.sexpr()
8795

◆ add()

add ( self,
* args )
Assert constraints as background axioms for the optimize solver. Alias for assert_expr.

Definition at line 8641 of file z3py.py.

8641 def add(self, *args):
8642 """Assert constraints as background axioms for the optimize solver. Alias for assert_expr."""
8643 self.assert_exprs(*args)
8644

◆ add_soft()

add_soft ( self,
arg,
weight = "1",
id = None )
Add soft constraint with optional weight and optional identifier.
   If no weight is supplied, then the penalty for violating the soft constraint
   is 1.
   Soft constraints are grouped by identifiers. Soft constraints that are
   added without identifiers are grouped by default.

Definition at line 8678 of file z3py.py.

8678 def add_soft(self, arg, weight="1", id=None):
8679 """Add soft constraint with optional weight and optional identifier.
8680 If no weight is supplied, then the penalty for violating the soft constraint
8681 is 1.
8682 Soft constraints are grouped by identifiers. Soft constraints that are
8683 added without identifiers are grouped by default.
8684 """
8685 if _is_int(weight):
8686 weight = "%d" % weight
8687 elif isinstance(weight, float):
8688 weight = "%f" % weight
8689 if not isinstance(weight, str):
8690 raise Z3Exception("weight should be a string or an integer")
8691 if id is None:
8692 id = ""
8693 id = to_symbol(id, self.ctx)
8694
8695 def asoft(a):
8696 v = Z3_optimize_assert_soft(self.ctx.ref(), self.optimize, a.as_ast(), weight, id)
8697 return OptimizeObjective(self, v, False)
8698 if sys.version_info.major >= 3 and isinstance(arg, Iterable):
8699 return [asoft(a) for a in arg]
8700 return asoft(arg)
8701
unsigned Z3_API Z3_optimize_assert_soft(Z3_context c, Z3_optimize o, Z3_ast a, Z3_string weight, Z3_symbol id)
Assert soft constraint to the optimization context.

◆ assert_and_track()

assert_and_track ( self,
a,
p )
Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.

If `p` is a string, it will be automatically converted into a Boolean constant.

>>> x = Int('x')
>>> p3 = Bool('p3')
>>> s = Optimize()
>>> s.assert_and_track(x > 0,  'p1')
>>> s.assert_and_track(x != 1, 'p2')
>>> s.assert_and_track(x < 0,  p3)
>>> print(s.check())
unsat
>>> c = s.unsat_core()
>>> len(c)
2
>>> Bool('p1') in c
True
>>> Bool('p2') in c
False
>>> p3 in c
True

Definition at line 8649 of file z3py.py.

8649 def assert_and_track(self, a, p):
8650 """Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.
8651
8652 If `p` is a string, it will be automatically converted into a Boolean constant.
8653
8654 >>> x = Int('x')
8655 >>> p3 = Bool('p3')
8656 >>> s = Optimize()
8657 >>> s.assert_and_track(x > 0, 'p1')
8658 >>> s.assert_and_track(x != 1, 'p2')
8659 >>> s.assert_and_track(x < 0, p3)
8660 >>> print(s.check())
8661 unsat
8662 >>> c = s.unsat_core()
8663 >>> len(c)
8664 2
8665 >>> Bool('p1') in c
8666 True
8667 >>> Bool('p2') in c
8668 False
8669 >>> p3 in c
8670 True
8671 """
8672 if isinstance(p, str):
8673 p = Bool(p, self.ctx)
8674 _z3_assert(isinstance(a, BoolRef), "Boolean expression expected")
8675 _z3_assert(isinstance(p, BoolRef) and is_const(p), "Boolean expression expected")
8676 Z3_optimize_assert_and_track(self.ctx.ref(), self.optimize, a.as_ast(), p.as_ast())
8677
void Z3_API Z3_optimize_assert_and_track(Z3_context c, Z3_optimize o, Z3_ast a, Z3_ast t)
Assert tracked hard constraint to the optimization context.

◆ assert_exprs()

assert_exprs ( self,
* args )
Assert constraints as background axioms for the optimize solver.

Definition at line 8629 of file z3py.py.

8629 def assert_exprs(self, *args):
8630 """Assert constraints as background axioms for the optimize solver."""
8631 args = _get_args(args)
8632 s = BoolSort(self.ctx)
8633 for arg in args:
8634 if isinstance(arg, Goal) or isinstance(arg, AstVector):
8635 for f in arg:
8636 Z3_optimize_assert(self.ctx.ref(), self.optimize, f.as_ast())
8637 else:
8638 arg = s.cast(arg)
8639 Z3_optimize_assert(self.ctx.ref(), self.optimize, arg.as_ast())
8640
void Z3_API Z3_optimize_assert(Z3_context c, Z3_optimize o, Z3_ast a)
Assert hard constraint to the optimization context.

◆ assertions()

assertions ( self)
Return an AST vector containing all added constraints.

Definition at line 8784 of file z3py.py.

8784 def assertions(self):
8785 """Return an AST vector containing all added constraints."""
8786 return AstVector(Z3_optimize_get_assertions(self.ctx.ref(), self.optimize), self.ctx)
8787
Z3_ast_vector Z3_API Z3_optimize_get_assertions(Z3_context c, Z3_optimize o)
Return the set of asserted formulas on the optimization context.

◆ check()

check ( self,
* assumptions )
Check consistency and produce optimal values.

Definition at line 8733 of file z3py.py.

8733 def check(self, *assumptions):
8734 """Check consistency and produce optimal values."""
8735 assumptions = _get_args(assumptions)
8736 num = len(assumptions)
8737 _assumptions = (Ast * num)()
8738 for i in range(num):
8739 _assumptions[i] = assumptions[i].as_ast()
8740 return CheckSatResult(Z3_optimize_check(self.ctx.ref(), self.optimize, num, _assumptions))
8741
Z3_lbool Z3_API Z3_optimize_check(Z3_context c, Z3_optimize o, unsigned num_assumptions, Z3_ast const assumptions[])
Check consistency and produce optimal values.

◆ from_file()

from_file ( self,
filename )
Parse assertions and objectives from a file

Definition at line 8776 of file z3py.py.

8776 def from_file(self, filename):
8777 """Parse assertions and objectives from a file"""
8778 Z3_optimize_from_file(self.ctx.ref(), self.optimize, filename)
8779
void Z3_API Z3_optimize_from_file(Z3_context c, Z3_optimize o, Z3_string s)
Parse an SMT-LIB2 file with assertions, soft constraints and optimization objectives....

◆ from_string()

from_string ( self,
s )
Parse assertions and objectives from a string

Definition at line 8780 of file z3py.py.

8780 def from_string(self, s):
8781 """Parse assertions and objectives from a string"""
8782 Z3_optimize_from_string(self.ctx.ref(), self.optimize, s)
8783
void Z3_API Z3_optimize_from_string(Z3_context c, Z3_optimize o, Z3_string s)
Parse an SMT-LIB2 string with assertions, soft constraints and optimization objectives....

◆ help()

help ( self)
Display a string describing all available options.

Definition at line 8621 of file z3py.py.

8621 def help(self):
8622 """Display a string describing all available options."""
8623 print(Z3_optimize_get_help(self.ctx.ref(), self.optimize))
8624
Z3_string Z3_API Z3_optimize_get_help(Z3_context c, Z3_optimize t)
Return a string containing a description of parameters accepted by optimize.

◆ lower()

lower ( self,
obj )

Definition at line 8756 of file z3py.py.

8756 def lower(self, obj):
8757 if not isinstance(obj, OptimizeObjective):
8758 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8759 return obj.lower()
8760

◆ lower_values()

lower_values ( self,
obj )

Definition at line 8766 of file z3py.py.

8766 def lower_values(self, obj):
8767 if not isinstance(obj, OptimizeObjective):
8768 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8769 return obj.lower_values()
8770

◆ maximize()

maximize ( self,
arg )
Add objective function to maximize.

Definition at line 8709 of file z3py.py.

8709 def maximize(self, arg):
8710 """Add objective function to maximize."""
8711 return OptimizeObjective(
8712 self,
8713 Z3_optimize_maximize(self.ctx.ref(), self.optimize, arg.as_ast()),
8714 is_max=True,
8715 )
8716
unsigned Z3_API Z3_optimize_maximize(Z3_context c, Z3_optimize o, Z3_ast t)
Add a maximization constraint.

◆ minimize()

minimize ( self,
arg )
Add objective function to minimize.

Definition at line 8717 of file z3py.py.

8717 def minimize(self, arg):
8718 """Add objective function to minimize."""
8719 return OptimizeObjective(
8720 self,
8721 Z3_optimize_minimize(self.ctx.ref(), self.optimize, arg.as_ast()),
8722 is_max=False,
8723 )
8724
unsigned Z3_API Z3_optimize_minimize(Z3_context c, Z3_optimize o, Z3_ast t)
Add a minimization constraint.

◆ model()

model ( self)
Return a model for the last check().

Definition at line 8746 of file z3py.py.

8746 def model(self):
8747 """Return a model for the last check()."""
8748 try:
8749 return ModelRef(Z3_optimize_get_model(self.ctx.ref(), self.optimize), self.ctx)
8750 except Z3Exception:
8751 raise Z3Exception("model is not available")
8752
Z3_model Z3_API Z3_optimize_get_model(Z3_context c, Z3_optimize o)
Retrieve the model for the last Z3_optimize_check.

◆ objectives()

objectives ( self)
returns set of objective functions

Definition at line 8788 of file z3py.py.

8788 def objectives(self):
8789 """returns set of objective functions"""
8790 return AstVector(Z3_optimize_get_objectives(self.ctx.ref(), self.optimize), self.ctx)
8791
Z3_ast_vector Z3_API Z3_optimize_get_objectives(Z3_context c, Z3_optimize o)
Return objectives on the optimization context. If the objective function is a max-sat objective it is...

◆ param_descrs()

param_descrs ( self)
Return the parameter description set.

Definition at line 8625 of file z3py.py.

8625 def param_descrs(self):
8626 """Return the parameter description set."""
8627 return ParamDescrsRef(Z3_optimize_get_param_descrs(self.ctx.ref(), self.optimize), self.ctx)
8628
Z3_param_descrs Z3_API Z3_optimize_get_param_descrs(Z3_context c, Z3_optimize o)
Return the parameter description set for the given optimize object.

◆ pop()

pop ( self)
restore to previously created backtracking point

Definition at line 8729 of file z3py.py.

8729 def pop(self):
8730 """restore to previously created backtracking point"""
8731 Z3_optimize_pop(self.ctx.ref(), self.optimize)
8732
void Z3_API Z3_optimize_pop(Z3_context c, Z3_optimize d)
Backtrack one level.

◆ push()

push ( self)
create a backtracking point for added rules, facts and assertions

Definition at line 8725 of file z3py.py.

8725 def push(self):
8726 """create a backtracking point for added rules, facts and assertions"""
8727 Z3_optimize_push(self.ctx.ref(), self.optimize)
8728
void Z3_API Z3_optimize_push(Z3_context c, Z3_optimize d)
Create a backtracking point.

◆ reason_unknown()

reason_unknown ( self)
Return a string that describes why the last `check()` returned `unknown`.

Definition at line 8742 of file z3py.py.

8742 def reason_unknown(self):
8743 """Return a string that describes why the last `check()` returned `unknown`."""
8744 return Z3_optimize_get_reason_unknown(self.ctx.ref(), self.optimize)
8745
Z3_string Z3_API Z3_optimize_get_reason_unknown(Z3_context c, Z3_optimize d)
Retrieve a string that describes the last status returned by Z3_optimize_check.

◆ set()

set ( self,
* args,
** keys )
Set a configuration option.
The method `help()` return a string containing all available options.

Definition at line 8614 of file z3py.py.

8614 def set(self, *args, **keys):
8615 """Set a configuration option.
8616 The method `help()` return a string containing all available options.
8617 """
8618 p = args2params(args, keys, self.ctx)
8619 Z3_optimize_set_params(self.ctx.ref(), self.optimize, p.params)
8620
void Z3_API Z3_optimize_set_params(Z3_context c, Z3_optimize o, Z3_params p)
Set parameters on optimization context, including parameters for the underlying SMT solver.

◆ set_initial_value()

set_initial_value ( self,
var,
value )
initialize the solver's state by setting the initial value of var to value

Definition at line 8702 of file z3py.py.

8702 def set_initial_value(self, var, value):
8703 """initialize the solver's state by setting the initial value of var to value
8704 """
8705 s = var.sort()
8706 value = s.cast(value)
8707 Z3_optimize_set_initial_value(self.ctx.ref(), self.optimize, var.ast, value.ast)
8708
void Z3_API Z3_optimize_set_initial_value(Z3_context c, Z3_optimize o, Z3_ast v, Z3_ast val)
provide an initialization hint to the solver. The initialization hint is used to calibrate an initial...

◆ set_on_model()

set_on_model ( self,
on_model )
Register a callback that is invoked with every incremental improvement to
objective values. The callback takes a model as argument.
The life-time of the model is limited to the callback so the
model has to be (deep) copied if it is to be used after the callback

Definition at line 8820 of file z3py.py.

8820 def set_on_model(self, on_model):
8821 """Register a callback that is invoked with every incremental improvement to
8822 objective values. The callback takes a model as argument.
8823 The life-time of the model is limited to the callback so the
8824 model has to be (deep) copied if it is to be used after the callback
8825 """
8826 id = len(_on_models) + 41
8827 mdl = Model(self.ctx)
8828 _on_models[id] = (on_model, mdl)
8829 self._on_models_id = id
8831 self.ctx.ref(), self.optimize, mdl.model, ctypes.c_void_p(id), _on_model_eh,
8832 )
8833
8834
void Z3_API Z3_optimize_register_model_eh(Z3_context c, Z3_optimize o, Z3_model m, void *ctx, Z3_model_eh model_eh)
register a model event handler for new models.

◆ sexpr()

sexpr ( self)
Return a formatted string (in Lisp-like format) with all added constraints.
We say the string is in s-expression format.

Definition at line 8796 of file z3py.py.

8796 def sexpr(self):
8797 """Return a formatted string (in Lisp-like format) with all added constraints.
8798 We say the string is in s-expression format.
8799 """
8800 return Z3_optimize_to_string(self.ctx.ref(), self.optimize)
8801
Z3_string Z3_API Z3_optimize_to_string(Z3_context c, Z3_optimize o)
Print the current context as a string.

◆ statistics()

statistics ( self)
Return statistics for the last check`.

Definition at line 8802 of file z3py.py.

8802 def statistics(self):
8803 """Return statistics for the last check`.
8804 """
8805 return Statistics(Z3_optimize_get_statistics(self.ctx.ref(), self.optimize), self.ctx)
8806
Z3_stats Z3_API Z3_optimize_get_statistics(Z3_context c, Z3_optimize d)
Retrieve statistics information from the last call to Z3_optimize_check.

◆ translate()

translate ( self,
target )
Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.

>>> c1 = Context()
>>> c2 = Context()
>>> o1 = Optimize(ctx=c1)
>>> o2 = o1.translate(c2)

Definition at line 8807 of file z3py.py.

8807 def translate(self, target):
8808 """Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.
8809
8810 >>> c1 = Context()
8811 >>> c2 = Context()
8812 >>> o1 = Optimize(ctx=c1)
8813 >>> o2 = o1.translate(c2)
8814 """
8815 if z3_debug():
8816 _z3_assert(isinstance(target, Context), "argument must be a Z3 context")
8817 opt = Z3_optimize_translate(self.ctx.ref(), self.optimize, target.ref())
8818 return Optimize(opt, target)
8819
Z3_optimize Z3_API Z3_optimize_translate(Z3_context c, Z3_optimize o, Z3_context target)
Copy an optimization context from a source to a target context.

◆ unsat_core()

unsat_core ( self)

Definition at line 8753 of file z3py.py.

8753 def unsat_core(self):
8754 return AstVector(Z3_optimize_get_unsat_core(self.ctx.ref(), self.optimize), self.ctx)
8755
Z3_ast_vector Z3_API Z3_optimize_get_unsat_core(Z3_context c, Z3_optimize o)
Retrieve the unsat core for the last Z3_optimize_check The unsat core is a subset of the assumptions ...

◆ upper()

upper ( self,
obj )

Definition at line 8761 of file z3py.py.

8761 def upper(self, obj):
8762 if not isinstance(obj, OptimizeObjective):
8763 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8764 return obj.upper()
8765

◆ upper_values()

upper_values ( self,
obj )

Definition at line 8771 of file z3py.py.

8771 def upper_values(self, obj):
8772 if not isinstance(obj, OptimizeObjective):
8773 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8774 return obj.upper_values()
8775

Field Documentation

◆ _on_models_id

_on_models_id = None
protected

Definition at line 8592 of file z3py.py.

◆ ctx

ctx = _get_ctx(ctx)

Definition at line 8587 of file z3py.py.

◆ optimize

optimize = Z3_mk_optimize(self.ctx.ref())

Definition at line 8589 of file z3py.py.