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

Constructor & Destructor Documentation

◆ __init__()

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

Definition at line 8090 of file z3py.py.

8090 def __init__(self, optimize=None, ctx=None):
8091 self.ctx = _get_ctx(ctx)
8092 if optimize is None:
8093 self.optimize = Z3_mk_optimize(self.ctx.ref())
8094 else:
8095 self.optimize = optimize
8096 self._on_models_id = None
8097 Z3_optimize_inc_ref(self.ctx.ref(), self.optimize)
8098
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 8102 of file z3py.py.

8102 def __del__(self):
8103 if self.optimize is not None and self.ctx.ref() is not None and Z3_optimize_dec_ref is not None:
8104 Z3_optimize_dec_ref(self.ctx.ref(), self.optimize)
8105 if self._on_models_id is not None:
8106 del _on_models[self._on_models_id]
8107
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 8099 of file z3py.py.

8099 def __deepcopy__(self, memo={}):
8100 return Optimize(self.optimize, self.ctx)
8101

◆ __enter__()

__enter__ ( self)

Definition at line 8108 of file z3py.py.

8108 def __enter__(self):
8109 self.push()
8110 return self
8111

◆ __exit__()

__exit__ ( self,
* exc_info )

Definition at line 8112 of file z3py.py.

8112 def __exit__(self, *exc_info):
8113 self.pop()
8114

◆ __iadd__()

__iadd__ ( self,
fml )

Definition at line 8146 of file z3py.py.

8146 def __iadd__(self, fml):
8147 self.add(fml)
8148 return self
8149

◆ __repr__()

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

Definition at line 8293 of file z3py.py.

8293 def __repr__(self):
8294 """Return a formatted string with all added rules and constraints."""
8295 return self.sexpr()
8296

◆ add()

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

Definition at line 8142 of file z3py.py.

8142 def add(self, *args):
8143 """Assert constraints as background axioms for the optimize solver. Alias for assert_expr."""
8144 self.assert_exprs(*args)
8145

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

8179 def add_soft(self, arg, weight="1", id=None):
8180 """Add soft constraint with optional weight and optional identifier.
8181 If no weight is supplied, then the penalty for violating the soft constraint
8182 is 1.
8183 Soft constraints are grouped by identifiers. Soft constraints that are
8184 added without identifiers are grouped by default.
8185 """
8186 if _is_int(weight):
8187 weight = "%d" % weight
8188 elif isinstance(weight, float):
8189 weight = "%f" % weight
8190 if not isinstance(weight, str):
8191 raise Z3Exception("weight should be a string or an integer")
8192 if id is None:
8193 id = ""
8194 id = to_symbol(id, self.ctx)
8195
8196 def asoft(a):
8197 v = Z3_optimize_assert_soft(self.ctx.ref(), self.optimize, a.as_ast(), weight, id)
8198 return OptimizeObjective(self, v, False)
8199 if sys.version_info.major >= 3 and isinstance(arg, Iterable):
8200 return [asoft(a) for a in arg]
8201 return asoft(arg)
8202
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 8150 of file z3py.py.

8150 def assert_and_track(self, a, p):
8151 """Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.
8152
8153 If `p` is a string, it will be automatically converted into a Boolean constant.
8154
8155 >>> x = Int('x')
8156 >>> p3 = Bool('p3')
8157 >>> s = Optimize()
8158 >>> s.assert_and_track(x > 0, 'p1')
8159 >>> s.assert_and_track(x != 1, 'p2')
8160 >>> s.assert_and_track(x < 0, p3)
8161 >>> print(s.check())
8162 unsat
8163 >>> c = s.unsat_core()
8164 >>> len(c)
8165 2
8166 >>> Bool('p1') in c
8167 True
8168 >>> Bool('p2') in c
8169 False
8170 >>> p3 in c
8171 True
8172 """
8173 if isinstance(p, str):
8174 p = Bool(p, self.ctx)
8175 _z3_assert(isinstance(a, BoolRef), "Boolean expression expected")
8176 _z3_assert(isinstance(p, BoolRef) and is_const(p), "Boolean expression expected")
8177 Z3_optimize_assert_and_track(self.ctx.ref(), self.optimize, a.as_ast(), p.as_ast())
8178
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 8130 of file z3py.py.

8130 def assert_exprs(self, *args):
8131 """Assert constraints as background axioms for the optimize solver."""
8132 args = _get_args(args)
8133 s = BoolSort(self.ctx)
8134 for arg in args:
8135 if isinstance(arg, Goal) or isinstance(arg, AstVector):
8136 for f in arg:
8137 Z3_optimize_assert(self.ctx.ref(), self.optimize, f.as_ast())
8138 else:
8139 arg = s.cast(arg)
8140 Z3_optimize_assert(self.ctx.ref(), self.optimize, arg.as_ast())
8141
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 8285 of file z3py.py.

8285 def assertions(self):
8286 """Return an AST vector containing all added constraints."""
8287 return AstVector(Z3_optimize_get_assertions(self.ctx.ref(), self.optimize), self.ctx)
8288
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 8234 of file z3py.py.

8234 def check(self, *assumptions):
8235 """Check consistency and produce optimal values."""
8236 assumptions = _get_args(assumptions)
8237 num = len(assumptions)
8238 _assumptions = (Ast * num)()
8239 for i in range(num):
8240 _assumptions[i] = assumptions[i].as_ast()
8241 return CheckSatResult(Z3_optimize_check(self.ctx.ref(), self.optimize, num, _assumptions))
8242
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 8277 of file z3py.py.

8277 def from_file(self, filename):
8278 """Parse assertions and objectives from a file"""
8279 Z3_optimize_from_file(self.ctx.ref(), self.optimize, filename)
8280
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 8281 of file z3py.py.

8281 def from_string(self, s):
8282 """Parse assertions and objectives from a string"""
8283 Z3_optimize_from_string(self.ctx.ref(), self.optimize, s)
8284
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 8122 of file z3py.py.

8122 def help(self):
8123 """Display a string describing all available options."""
8124 print(Z3_optimize_get_help(self.ctx.ref(), self.optimize))
8125
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 8257 of file z3py.py.

8257 def lower(self, obj):
8258 if not isinstance(obj, OptimizeObjective):
8259 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8260 return obj.lower()
8261

◆ lower_values()

lower_values ( self,
obj )

Definition at line 8267 of file z3py.py.

8267 def lower_values(self, obj):
8268 if not isinstance(obj, OptimizeObjective):
8269 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8270 return obj.lower_values()
8271

◆ maximize()

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

Definition at line 8210 of file z3py.py.

8210 def maximize(self, arg):
8211 """Add objective function to maximize."""
8212 return OptimizeObjective(
8213 self,
8214 Z3_optimize_maximize(self.ctx.ref(), self.optimize, arg.as_ast()),
8215 is_max=True,
8216 )
8217
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 8218 of file z3py.py.

8218 def minimize(self, arg):
8219 """Add objective function to minimize."""
8220 return OptimizeObjective(
8221 self,
8222 Z3_optimize_minimize(self.ctx.ref(), self.optimize, arg.as_ast()),
8223 is_max=False,
8224 )
8225
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 8247 of file z3py.py.

8247 def model(self):
8248 """Return a model for the last check()."""
8249 try:
8250 return ModelRef(Z3_optimize_get_model(self.ctx.ref(), self.optimize), self.ctx)
8251 except Z3Exception:
8252 raise Z3Exception("model is not available")
8253
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 8289 of file z3py.py.

8289 def objectives(self):
8290 """returns set of objective functions"""
8291 return AstVector(Z3_optimize_get_objectives(self.ctx.ref(), self.optimize), self.ctx)
8292
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 8126 of file z3py.py.

8126 def param_descrs(self):
8127 """Return the parameter description set."""
8128 return ParamDescrsRef(Z3_optimize_get_param_descrs(self.ctx.ref(), self.optimize), self.ctx)
8129
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 8230 of file z3py.py.

8230 def pop(self):
8231 """restore to previously created backtracking point"""
8232 Z3_optimize_pop(self.ctx.ref(), self.optimize)
8233
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 8226 of file z3py.py.

8226 def push(self):
8227 """create a backtracking point for added rules, facts and assertions"""
8228 Z3_optimize_push(self.ctx.ref(), self.optimize)
8229
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 8243 of file z3py.py.

8243 def reason_unknown(self):
8244 """Return a string that describes why the last `check()` returned `unknown`."""
8245 return Z3_optimize_get_reason_unknown(self.ctx.ref(), self.optimize)
8246
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 8115 of file z3py.py.

8115 def set(self, *args, **keys):
8116 """Set a configuration option.
8117 The method `help()` return a string containing all available options.
8118 """
8119 p = args2params(args, keys, self.ctx)
8120 Z3_optimize_set_params(self.ctx.ref(), self.optimize, p.params)
8121
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 8203 of file z3py.py.

8203 def set_initial_value(self, var, value):
8204 """initialize the solver's state by setting the initial value of var to value
8205 """
8206 s = var.sort()
8207 value = s.cast(value)
8208 Z3_optimize_set_initial_value(self.ctx.ref(), self.optimize, var.ast, value.ast)
8209
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 8308 of file z3py.py.

8308 def set_on_model(self, on_model):
8309 """Register a callback that is invoked with every incremental improvement to
8310 objective values. The callback takes a model as argument.
8311 The life-time of the model is limited to the callback so the
8312 model has to be (deep) copied if it is to be used after the callback
8313 """
8314 id = len(_on_models) + 41
8315 mdl = Model(self.ctx)
8316 _on_models[id] = (on_model, mdl)
8317 self._on_models_id = id
8319 self.ctx.ref(), self.optimize, mdl.model, ctypes.c_void_p(id), _on_model_eh,
8320 )
8321
8322
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 8297 of file z3py.py.

8297 def sexpr(self):
8298 """Return a formatted string (in Lisp-like format) with all added constraints.
8299 We say the string is in s-expression format.
8300 """
8301 return Z3_optimize_to_string(self.ctx.ref(), self.optimize)
8302
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 8303 of file z3py.py.

8303 def statistics(self):
8304 """Return statistics for the last check`.
8305 """
8306 return Statistics(Z3_optimize_get_statistics(self.ctx.ref(), self.optimize), self.ctx)
8307
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 8254 of file z3py.py.

8254 def unsat_core(self):
8255 return AstVector(Z3_optimize_get_unsat_core(self.ctx.ref(), self.optimize), self.ctx)
8256
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 8262 of file z3py.py.

8262 def upper(self, obj):
8263 if not isinstance(obj, OptimizeObjective):
8264 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8265 return obj.upper()
8266

◆ upper_values()

upper_values ( self,
obj )

Definition at line 8272 of file z3py.py.

8272 def upper_values(self, obj):
8273 if not isinstance(obj, OptimizeObjective):
8274 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8275 return obj.upper_values()
8276

Field Documentation

◆ _on_models_id

_on_models_id = None
protected

Definition at line 8096 of file z3py.py.

◆ ctx

ctx = _get_ctx(ctx)

Definition at line 8091 of file z3py.py.

◆ optimize

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

Definition at line 8093 of file z3py.py.