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

Public Member Functions

 __init__ (self, optimize=None, ctx=None)
 __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)
 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 8052 of file z3py.py.

Constructor & Destructor Documentation

◆ __init__()

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

Definition at line 8055 of file z3py.py.

8055 def __init__(self, optimize=None, ctx=None):
8056 self.ctx = _get_ctx(ctx)
8057 if optimize is None:
8058 self.optimize = Z3_mk_optimize(self.ctx.ref())
8059 else:
8060 self.optimize = optimize
8061 self._on_models_id = None
8062 Z3_optimize_inc_ref(self.ctx.ref(), self.optimize)
8063
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 8067 of file z3py.py.

8067 def __del__(self):
8068 if self.optimize is not None and self.ctx.ref() is not None and Z3_optimize_dec_ref is not None:
8069 Z3_optimize_dec_ref(self.ctx.ref(), self.optimize)
8070 if self._on_models_id is not None:
8071 del _on_models[self._on_models_id]
8072
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

◆ __deepcopy__()

__deepcopy__ ( self,
memo = {} )

Definition at line 8064 of file z3py.py.

8064 def __deepcopy__(self, memo={}):
8065 return Optimize(self.optimize, self.ctx)
8066

◆ __enter__()

__enter__ ( self)

Definition at line 8073 of file z3py.py.

8073 def __enter__(self):
8074 self.push()
8075 return self
8076

◆ __exit__()

__exit__ ( self,
* exc_info )

Definition at line 8077 of file z3py.py.

8077 def __exit__(self, *exc_info):
8078 self.pop()
8079

◆ __iadd__()

__iadd__ ( self,
fml )

Definition at line 8111 of file z3py.py.

8111 def __iadd__(self, fml):
8112 self.add(fml)
8113 return self
8114

◆ __repr__()

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

Definition at line 8258 of file z3py.py.

8258 def __repr__(self):
8259 """Return a formatted string with all added rules and constraints."""
8260 return self.sexpr()
8261

◆ add()

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

Definition at line 8107 of file z3py.py.

8107 def add(self, *args):
8108 """Assert constraints as background axioms for the optimize solver. Alias for assert_expr."""
8109 self.assert_exprs(*args)
8110

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

8144 def add_soft(self, arg, weight="1", id=None):
8145 """Add soft constraint with optional weight and optional identifier.
8146 If no weight is supplied, then the penalty for violating the soft constraint
8147 is 1.
8148 Soft constraints are grouped by identifiers. Soft constraints that are
8149 added without identifiers are grouped by default.
8150 """
8151 if _is_int(weight):
8152 weight = "%d" % weight
8153 elif isinstance(weight, float):
8154 weight = "%f" % weight
8155 if not isinstance(weight, str):
8156 raise Z3Exception("weight should be a string or an integer")
8157 if id is None:
8158 id = ""
8159 id = to_symbol(id, self.ctx)
8160
8161 def asoft(a):
8162 v = Z3_optimize_assert_soft(self.ctx.ref(), self.optimize, a.as_ast(), weight, id)
8163 return OptimizeObjective(self, v, False)
8164 if sys.version_info.major >= 3 and isinstance(arg, Iterable):
8165 return [asoft(a) for a in arg]
8166 return asoft(arg)
8167
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 8115 of file z3py.py.

8115 def assert_and_track(self, a, p):
8116 """Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.
8117
8118 If `p` is a string, it will be automatically converted into a Boolean constant.
8119
8120 >>> x = Int('x')
8121 >>> p3 = Bool('p3')
8122 >>> s = Optimize()
8123 >>> s.assert_and_track(x > 0, 'p1')
8124 >>> s.assert_and_track(x != 1, 'p2')
8125 >>> s.assert_and_track(x < 0, p3)
8126 >>> print(s.check())
8127 unsat
8128 >>> c = s.unsat_core()
8129 >>> len(c)
8130 2
8131 >>> Bool('p1') in c
8132 True
8133 >>> Bool('p2') in c
8134 False
8135 >>> p3 in c
8136 True
8137 """
8138 if isinstance(p, str):
8139 p = Bool(p, self.ctx)
8140 _z3_assert(isinstance(a, BoolRef), "Boolean expression expected")
8141 _z3_assert(isinstance(p, BoolRef) and is_const(p), "Boolean expression expected")
8142 Z3_optimize_assert_and_track(self.ctx.ref(), self.optimize, a.as_ast(), p.as_ast())
8143
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 8095 of file z3py.py.

8095 def assert_exprs(self, *args):
8096 """Assert constraints as background axioms for the optimize solver."""
8097 args = _get_args(args)
8098 s = BoolSort(self.ctx)
8099 for arg in args:
8100 if isinstance(arg, Goal) or isinstance(arg, AstVector):
8101 for f in arg:
8102 Z3_optimize_assert(self.ctx.ref(), self.optimize, f.as_ast())
8103 else:
8104 arg = s.cast(arg)
8105 Z3_optimize_assert(self.ctx.ref(), self.optimize, arg.as_ast())
8106
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 8250 of file z3py.py.

8250 def assertions(self):
8251 """Return an AST vector containing all added constraints."""
8252 return AstVector(Z3_optimize_get_assertions(self.ctx.ref(), self.optimize), self.ctx)
8253
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 8199 of file z3py.py.

8199 def check(self, *assumptions):
8200 """Check consistency and produce optimal values."""
8201 assumptions = _get_args(assumptions)
8202 num = len(assumptions)
8203 _assumptions = (Ast * num)()
8204 for i in range(num):
8205 _assumptions[i] = assumptions[i].as_ast()
8206 return CheckSatResult(Z3_optimize_check(self.ctx.ref(), self.optimize, num, _assumptions))
8207
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 8242 of file z3py.py.

8242 def from_file(self, filename):
8243 """Parse assertions and objectives from a file"""
8244 Z3_optimize_from_file(self.ctx.ref(), self.optimize, filename)
8245
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 8246 of file z3py.py.

8246 def from_string(self, s):
8247 """Parse assertions and objectives from a string"""
8248 Z3_optimize_from_string(self.ctx.ref(), self.optimize, s)
8249
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 8087 of file z3py.py.

8087 def help(self):
8088 """Display a string describing all available options."""
8089 print(Z3_optimize_get_help(self.ctx.ref(), self.optimize))
8090
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 8222 of file z3py.py.

8222 def lower(self, obj):
8223 if not isinstance(obj, OptimizeObjective):
8224 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8225 return obj.lower()
8226

◆ lower_values()

lower_values ( self,
obj )

Definition at line 8232 of file z3py.py.

8232 def lower_values(self, obj):
8233 if not isinstance(obj, OptimizeObjective):
8234 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8235 return obj.lower_values()
8236

◆ maximize()

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

Definition at line 8175 of file z3py.py.

8175 def maximize(self, arg):
8176 """Add objective function to maximize."""
8177 return OptimizeObjective(
8178 self,
8179 Z3_optimize_maximize(self.ctx.ref(), self.optimize, arg.as_ast()),
8180 is_max=True,
8181 )
8182
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 8183 of file z3py.py.

8183 def minimize(self, arg):
8184 """Add objective function to minimize."""
8185 return OptimizeObjective(
8186 self,
8187 Z3_optimize_minimize(self.ctx.ref(), self.optimize, arg.as_ast()),
8188 is_max=False,
8189 )
8190
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 8212 of file z3py.py.

8212 def model(self):
8213 """Return a model for the last check()."""
8214 try:
8215 return ModelRef(Z3_optimize_get_model(self.ctx.ref(), self.optimize), self.ctx)
8216 except Z3Exception:
8217 raise Z3Exception("model is not available")
8218
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 8254 of file z3py.py.

8254 def objectives(self):
8255 """returns set of objective functions"""
8256 return AstVector(Z3_optimize_get_objectives(self.ctx.ref(), self.optimize), self.ctx)
8257
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 8091 of file z3py.py.

8091 def param_descrs(self):
8092 """Return the parameter description set."""
8093 return ParamDescrsRef(Z3_optimize_get_param_descrs(self.ctx.ref(), self.optimize), self.ctx)
8094
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 8195 of file z3py.py.

8195 def pop(self):
8196 """restore to previously created backtracking point"""
8197 Z3_optimize_pop(self.ctx.ref(), self.optimize)
8198
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 8191 of file z3py.py.

8191 def push(self):
8192 """create a backtracking point for added rules, facts and assertions"""
8193 Z3_optimize_push(self.ctx.ref(), self.optimize)
8194
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 8208 of file z3py.py.

8208 def reason_unknown(self):
8209 """Return a string that describes why the last `check()` returned `unknown`."""
8210 return Z3_optimize_get_reason_unknown(self.ctx.ref(), self.optimize)
8211
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 8080 of file z3py.py.

8080 def set(self, *args, **keys):
8081 """Set a configuration option.
8082 The method `help()` return a string containing all available options.
8083 """
8084 p = args2params(args, keys, self.ctx)
8085 Z3_optimize_set_params(self.ctx.ref(), self.optimize, p.params)
8086
void Z3_API Z3_optimize_set_params(Z3_context c, Z3_optimize o, Z3_params p)
Set parameters on optimization context.

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

8168 def set_initial_value(self, var, value):
8169 """initialize the solver's state by setting the initial value of var to value
8170 """
8171 s = var.sort()
8172 value = s.cast(value)
8173 Z3_optimize_set_initial_value(self.ctx.ref(), self.optimize, var.ast, value.ast)
8174
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 8273 of file z3py.py.

8273 def set_on_model(self, on_model):
8274 """Register a callback that is invoked with every incremental improvement to
8275 objective values. The callback takes a model as argument.
8276 The life-time of the model is limited to the callback so the
8277 model has to be (deep) copied if it is to be used after the callback
8278 """
8279 id = len(_on_models) + 41
8280 mdl = Model(self.ctx)
8281 _on_models[id] = (on_model, mdl)
8282 self._on_models_id = id
8284 self.ctx.ref(), self.optimize, mdl.model, ctypes.c_void_p(id), _on_model_eh,
8285 )
8286
8287
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 8262 of file z3py.py.

8262 def sexpr(self):
8263 """Return a formatted string (in Lisp-like format) with all added constraints.
8264 We say the string is in s-expression format.
8265 """
8266 return Z3_optimize_to_string(self.ctx.ref(), self.optimize)
8267
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 8268 of file z3py.py.

8268 def statistics(self):
8269 """Return statistics for the last check`.
8270 """
8271 return Statistics(Z3_optimize_get_statistics(self.ctx.ref(), self.optimize), self.ctx)
8272
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.

◆ unsat_core()

unsat_core ( self)

Definition at line 8219 of file z3py.py.

8219 def unsat_core(self):
8220 return AstVector(Z3_optimize_get_unsat_core(self.ctx.ref(), self.optimize), self.ctx)
8221
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 8227 of file z3py.py.

8227 def upper(self, obj):
8228 if not isinstance(obj, OptimizeObjective):
8229 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8230 return obj.upper()
8231

◆ upper_values()

upper_values ( self,
obj )

Definition at line 8237 of file z3py.py.

8237 def upper_values(self, obj):
8238 if not isinstance(obj, OptimizeObjective):
8239 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8240 return obj.upper_values()
8241

Field Documentation

◆ _on_models_id

_on_models_id = None
protected

Definition at line 8061 of file z3py.py.

◆ ctx

ctx = _get_ctx(ctx)

Definition at line 8056 of file z3py.py.

◆ optimize

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

Definition at line 8058 of file z3py.py.