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 8716 of file z3py.py.

Constructor & Destructor Documentation

◆ __init__()

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

Definition at line 8719 of file z3py.py.

8719 def __init__(self, optimize=None, ctx=None):
8720 self.ctx = _get_ctx(ctx)
8721 if optimize is None:
8722 self.optimize = Z3_mk_optimize(self.ctx.ref())
8723 else:
8724 self.optimize = optimize
8725 self._on_models_id = None
8726 Z3_optimize_inc_ref(self.ctx.ref(), self.optimize)
8727
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 8734 of file z3py.py.

8734 def __del__(self):
8735 if self.optimize is not None and self.ctx.ref() is not None and Z3_optimize_dec_ref is not None:
8736 Z3_optimize_dec_ref(self.ctx.ref(), self.optimize)
8737 if self._on_models_id is not None:
8738 del _on_models[self._on_models_id]
8739
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 8728 of file z3py.py.

8728 def __copy__(self):
8729 return self.translate(self.ctx)
8730

◆ __deepcopy__()

__deepcopy__ ( self,
memo = {} )

Definition at line 8731 of file z3py.py.

8731 def __deepcopy__(self, memo={}):
8732 return self.translate(self.ctx)
8733

◆ __enter__()

__enter__ ( self)

Definition at line 8740 of file z3py.py.

8740 def __enter__(self):
8741 self.push()
8742 return self
8743

◆ __exit__()

__exit__ ( self,
* exc_info )

Definition at line 8744 of file z3py.py.

8744 def __exit__(self, *exc_info):
8745 self.pop()
8746

◆ __iadd__()

__iadd__ ( self,
fml )

Definition at line 8778 of file z3py.py.

8778 def __iadd__(self, fml):
8779 self.add(fml)
8780 return self
8781

◆ __repr__()

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

Definition at line 8925 of file z3py.py.

8925 def __repr__(self):
8926 """Return a formatted string with all added rules and constraints."""
8927 return self.sexpr()
8928

◆ add()

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

Definition at line 8774 of file z3py.py.

8774 def add(self, *args):
8775 """Assert constraints as background axioms for the optimize solver. Alias for assert_expr."""
8776 self.assert_exprs(*args)
8777

◆ 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 8811 of file z3py.py.

8811 def add_soft(self, arg, weight="1", id=None):
8812 """Add soft constraint with optional weight and optional identifier.
8813 If no weight is supplied, then the penalty for violating the soft constraint
8814 is 1.
8815 Soft constraints are grouped by identifiers. Soft constraints that are
8816 added without identifiers are grouped by default.
8817 """
8818 if _is_int(weight):
8819 weight = "%d" % weight
8820 elif isinstance(weight, float):
8821 weight = "%f" % weight
8822 if not isinstance(weight, str):
8823 raise Z3Exception("weight should be a string or an integer")
8824 if id is None:
8825 id = ""
8826 id = to_symbol(id, self.ctx)
8827
8828 def asoft(a):
8829 v = Z3_optimize_assert_soft(self.ctx.ref(), self.optimize, a.as_ast(), weight, id)
8830 return OptimizeObjective(self, v, False)
8831 if sys.version_info.major >= 3 and isinstance(arg, Iterable):
8832 return [asoft(a) for a in arg]
8833 return asoft(arg)
8834
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 8782 of file z3py.py.

8782 def assert_and_track(self, a, p):
8783 """Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.
8784
8785 If `p` is a string, it will be automatically converted into a Boolean constant.
8786
8787 >>> x = Int('x')
8788 >>> p3 = Bool('p3')
8789 >>> s = Optimize()
8790 >>> s.assert_and_track(x > 0, 'p1')
8791 >>> s.assert_and_track(x != 1, 'p2')
8792 >>> s.assert_and_track(x < 0, p3)
8793 >>> print(s.check())
8794 unsat
8795 >>> c = s.unsat_core()
8796 >>> len(c)
8797 2
8798 >>> Bool('p1') in c
8799 True
8800 >>> Bool('p2') in c
8801 False
8802 >>> p3 in c
8803 True
8804 """
8805 if isinstance(p, str):
8806 p = Bool(p, self.ctx)
8807 _z3_assert(isinstance(a, BoolRef), "Boolean expression expected")
8808 _z3_assert(isinstance(p, BoolRef) and is_const(p), "Boolean expression expected")
8809 Z3_optimize_assert_and_track(self.ctx.ref(), self.optimize, a.as_ast(), p.as_ast())
8810
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 8762 of file z3py.py.

8762 def assert_exprs(self, *args):
8763 """Assert constraints as background axioms for the optimize solver."""
8764 args = _get_args(args)
8765 s = BoolSort(self.ctx)
8766 for arg in args:
8767 if isinstance(arg, Goal) or isinstance(arg, AstVector):
8768 for f in arg:
8769 Z3_optimize_assert(self.ctx.ref(), self.optimize, f.as_ast())
8770 else:
8771 arg = s.cast(arg)
8772 Z3_optimize_assert(self.ctx.ref(), self.optimize, arg.as_ast())
8773
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 8917 of file z3py.py.

8917 def assertions(self):
8918 """Return an AST vector containing all added constraints."""
8919 return AstVector(Z3_optimize_get_assertions(self.ctx.ref(), self.optimize), self.ctx)
8920
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 8866 of file z3py.py.

8866 def check(self, *assumptions):
8867 """Check consistency and produce optimal values."""
8868 assumptions = _get_args(assumptions)
8869 num = len(assumptions)
8870 _assumptions = (Ast * num)()
8871 for i in range(num):
8872 _assumptions[i] = assumptions[i].as_ast()
8873 return CheckSatResult(Z3_optimize_check(self.ctx.ref(), self.optimize, num, _assumptions))
8874
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 8909 of file z3py.py.

8909 def from_file(self, filename):
8910 """Parse assertions and objectives from a file"""
8911 Z3_optimize_from_file(self.ctx.ref(), self.optimize, filename)
8912
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 8913 of file z3py.py.

8913 def from_string(self, s):
8914 """Parse assertions and objectives from a string"""
8915 Z3_optimize_from_string(self.ctx.ref(), self.optimize, s)
8916
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 8754 of file z3py.py.

8754 def help(self):
8755 """Display a string describing all available options."""
8756 print(Z3_optimize_get_help(self.ctx.ref(), self.optimize))
8757
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 8889 of file z3py.py.

8889 def lower(self, obj):
8890 if not isinstance(obj, OptimizeObjective):
8891 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8892 return obj.lower()
8893

◆ lower_values()

lower_values ( self,
obj )

Definition at line 8899 of file z3py.py.

8899 def lower_values(self, obj):
8900 if not isinstance(obj, OptimizeObjective):
8901 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8902 return obj.lower_values()
8903

◆ maximize()

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

Definition at line 8842 of file z3py.py.

8842 def maximize(self, arg):
8843 """Add objective function to maximize."""
8844 return OptimizeObjective(
8845 self,
8846 Z3_optimize_maximize(self.ctx.ref(), self.optimize, arg.as_ast()),
8847 is_max=True,
8848 )
8849
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 8850 of file z3py.py.

8850 def minimize(self, arg):
8851 """Add objective function to minimize."""
8852 return OptimizeObjective(
8853 self,
8854 Z3_optimize_minimize(self.ctx.ref(), self.optimize, arg.as_ast()),
8855 is_max=False,
8856 )
8857
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 8879 of file z3py.py.

8879 def model(self):
8880 """Return a model for the last check()."""
8881 try:
8882 return ModelRef(Z3_optimize_get_model(self.ctx.ref(), self.optimize), self.ctx)
8883 except Z3Exception:
8884 raise Z3Exception("model is not available")
8885
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 8921 of file z3py.py.

8921 def objectives(self):
8922 """returns set of objective functions"""
8923 return AstVector(Z3_optimize_get_objectives(self.ctx.ref(), self.optimize), self.ctx)
8924
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 8758 of file z3py.py.

8758 def param_descrs(self):
8759 """Return the parameter description set."""
8760 return ParamDescrsRef(Z3_optimize_get_param_descrs(self.ctx.ref(), self.optimize), self.ctx)
8761
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 8862 of file z3py.py.

8862 def pop(self):
8863 """restore to previously created backtracking point"""
8864 Z3_optimize_pop(self.ctx.ref(), self.optimize)
8865
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 8858 of file z3py.py.

8858 def push(self):
8859 """create a backtracking point for added rules, facts and assertions"""
8860 Z3_optimize_push(self.ctx.ref(), self.optimize)
8861
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 8875 of file z3py.py.

8875 def reason_unknown(self):
8876 """Return a string that describes why the last `check()` returned `unknown`."""
8877 return Z3_optimize_get_reason_unknown(self.ctx.ref(), self.optimize)
8878
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 8747 of file z3py.py.

8747 def set(self, *args, **keys):
8748 """Set a configuration option.
8749 The method `help()` return a string containing all available options.
8750 """
8751 p = args2params(args, keys, self.ctx)
8752 Z3_optimize_set_params(self.ctx.ref(), self.optimize, p.params)
8753
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 8835 of file z3py.py.

8835 def set_initial_value(self, var, value):
8836 """initialize the solver's state by setting the initial value of var to value
8837 """
8838 s = var.sort()
8839 value = s.cast(value)
8840 Z3_optimize_set_initial_value(self.ctx.ref(), self.optimize, var.ast, value.ast)
8841
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 8953 of file z3py.py.

8953 def set_on_model(self, on_model):
8954 """Register a callback that is invoked with every incremental improvement to
8955 objective values. The callback takes a model as argument.
8956 The life-time of the model is limited to the callback so the
8957 model has to be (deep) copied if it is to be used after the callback
8958 """
8959 id = len(_on_models) + 41
8960 mdl = Model(self.ctx)
8961 _on_models[id] = (on_model, mdl)
8962 self._on_models_id = id
8964 self.ctx.ref(), self.optimize, mdl.model, ctypes.c_void_p(id), _on_model_eh,
8965 )
8966
8967
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 8929 of file z3py.py.

8929 def sexpr(self):
8930 """Return a formatted string (in Lisp-like format) with all added constraints.
8931 We say the string is in s-expression format.
8932 """
8933 return Z3_optimize_to_string(self.ctx.ref(), self.optimize)
8934
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 8935 of file z3py.py.

8935 def statistics(self):
8936 """Return statistics for the last check`.
8937 """
8938 return Statistics(Z3_optimize_get_statistics(self.ctx.ref(), self.optimize), self.ctx)
8939
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 8940 of file z3py.py.

8940 def translate(self, target):
8941 """Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.
8942
8943 >>> c1 = Context()
8944 >>> c2 = Context()
8945 >>> o1 = Optimize(ctx=c1)
8946 >>> o2 = o1.translate(c2)
8947 """
8948 if z3_debug():
8949 _z3_assert(isinstance(target, Context), "argument must be a Z3 context")
8950 opt = Z3_optimize_translate(self.ctx.ref(), self.optimize, target.ref())
8951 return Optimize(opt, target)
8952
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 8886 of file z3py.py.

8886 def unsat_core(self):
8887 return AstVector(Z3_optimize_get_unsat_core(self.ctx.ref(), self.optimize), self.ctx)
8888
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 8894 of file z3py.py.

8894 def upper(self, obj):
8895 if not isinstance(obj, OptimizeObjective):
8896 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8897 return obj.upper()
8898

◆ upper_values()

upper_values ( self,
obj )

Definition at line 8904 of file z3py.py.

8904 def upper_values(self, obj):
8905 if not isinstance(obj, OptimizeObjective):
8906 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8907 return obj.upper_values()
8908

Field Documentation

◆ _on_models_id

_on_models_id = None
protected

Definition at line 8725 of file z3py.py.

◆ ctx

ctx = _get_ctx(ctx)

Definition at line 8720 of file z3py.py.

◆ optimize

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

Definition at line 8722 of file z3py.py.