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

Constructor & Destructor Documentation

◆ __init__()

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

Definition at line 8150 of file z3py.py.

8150 def __init__(self, optimize=None, ctx=None):
8151 self.ctx = _get_ctx(ctx)
8152 if optimize is None:
8153 self.optimize = Z3_mk_optimize(self.ctx.ref())
8154 else:
8155 self.optimize = optimize
8156 self._on_models_id = None
8157 Z3_optimize_inc_ref(self.ctx.ref(), self.optimize)
8158
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 8162 of file z3py.py.

8162 def __del__(self):
8163 if self.optimize is not None and self.ctx.ref() is not None and Z3_optimize_dec_ref is not None:
8164 Z3_optimize_dec_ref(self.ctx.ref(), self.optimize)
8165 if self._on_models_id is not None:
8166 del _on_models[self._on_models_id]
8167
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 8159 of file z3py.py.

8159 def __deepcopy__(self, memo={}):
8160 return Optimize(self.optimize, self.ctx)
8161

◆ __enter__()

__enter__ ( self)

Definition at line 8168 of file z3py.py.

8168 def __enter__(self):
8169 self.push()
8170 return self
8171

◆ __exit__()

__exit__ ( self,
* exc_info )

Definition at line 8172 of file z3py.py.

8172 def __exit__(self, *exc_info):
8173 self.pop()
8174

◆ __iadd__()

__iadd__ ( self,
fml )

Definition at line 8206 of file z3py.py.

8206 def __iadd__(self, fml):
8207 self.add(fml)
8208 return self
8209

◆ __repr__()

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

Definition at line 8353 of file z3py.py.

8353 def __repr__(self):
8354 """Return a formatted string with all added rules and constraints."""
8355 return self.sexpr()
8356

◆ add()

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

Definition at line 8202 of file z3py.py.

8202 def add(self, *args):
8203 """Assert constraints as background axioms for the optimize solver. Alias for assert_expr."""
8204 self.assert_exprs(*args)
8205

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

8239 def add_soft(self, arg, weight="1", id=None):
8240 """Add soft constraint with optional weight and optional identifier.
8241 If no weight is supplied, then the penalty for violating the soft constraint
8242 is 1.
8243 Soft constraints are grouped by identifiers. Soft constraints that are
8244 added without identifiers are grouped by default.
8245 """
8246 if _is_int(weight):
8247 weight = "%d" % weight
8248 elif isinstance(weight, float):
8249 weight = "%f" % weight
8250 if not isinstance(weight, str):
8251 raise Z3Exception("weight should be a string or an integer")
8252 if id is None:
8253 id = ""
8254 id = to_symbol(id, self.ctx)
8255
8256 def asoft(a):
8257 v = Z3_optimize_assert_soft(self.ctx.ref(), self.optimize, a.as_ast(), weight, id)
8258 return OptimizeObjective(self, v, False)
8259 if sys.version_info.major >= 3 and isinstance(arg, Iterable):
8260 return [asoft(a) for a in arg]
8261 return asoft(arg)
8262
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 8210 of file z3py.py.

8210 def assert_and_track(self, a, p):
8211 """Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.
8212
8213 If `p` is a string, it will be automatically converted into a Boolean constant.
8214
8215 >>> x = Int('x')
8216 >>> p3 = Bool('p3')
8217 >>> s = Optimize()
8218 >>> s.assert_and_track(x > 0, 'p1')
8219 >>> s.assert_and_track(x != 1, 'p2')
8220 >>> s.assert_and_track(x < 0, p3)
8221 >>> print(s.check())
8222 unsat
8223 >>> c = s.unsat_core()
8224 >>> len(c)
8225 2
8226 >>> Bool('p1') in c
8227 True
8228 >>> Bool('p2') in c
8229 False
8230 >>> p3 in c
8231 True
8232 """
8233 if isinstance(p, str):
8234 p = Bool(p, self.ctx)
8235 _z3_assert(isinstance(a, BoolRef), "Boolean expression expected")
8236 _z3_assert(isinstance(p, BoolRef) and is_const(p), "Boolean expression expected")
8237 Z3_optimize_assert_and_track(self.ctx.ref(), self.optimize, a.as_ast(), p.as_ast())
8238
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 8190 of file z3py.py.

8190 def assert_exprs(self, *args):
8191 """Assert constraints as background axioms for the optimize solver."""
8192 args = _get_args(args)
8193 s = BoolSort(self.ctx)
8194 for arg in args:
8195 if isinstance(arg, Goal) or isinstance(arg, AstVector):
8196 for f in arg:
8197 Z3_optimize_assert(self.ctx.ref(), self.optimize, f.as_ast())
8198 else:
8199 arg = s.cast(arg)
8200 Z3_optimize_assert(self.ctx.ref(), self.optimize, arg.as_ast())
8201
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 8345 of file z3py.py.

8345 def assertions(self):
8346 """Return an AST vector containing all added constraints."""
8347 return AstVector(Z3_optimize_get_assertions(self.ctx.ref(), self.optimize), self.ctx)
8348
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 8294 of file z3py.py.

8294 def check(self, *assumptions):
8295 """Check consistency and produce optimal values."""
8296 assumptions = _get_args(assumptions)
8297 num = len(assumptions)
8298 _assumptions = (Ast * num)()
8299 for i in range(num):
8300 _assumptions[i] = assumptions[i].as_ast()
8301 return CheckSatResult(Z3_optimize_check(self.ctx.ref(), self.optimize, num, _assumptions))
8302
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 8337 of file z3py.py.

8337 def from_file(self, filename):
8338 """Parse assertions and objectives from a file"""
8339 Z3_optimize_from_file(self.ctx.ref(), self.optimize, filename)
8340
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 8341 of file z3py.py.

8341 def from_string(self, s):
8342 """Parse assertions and objectives from a string"""
8343 Z3_optimize_from_string(self.ctx.ref(), self.optimize, s)
8344
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 8182 of file z3py.py.

8182 def help(self):
8183 """Display a string describing all available options."""
8184 print(Z3_optimize_get_help(self.ctx.ref(), self.optimize))
8185
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 8317 of file z3py.py.

8317 def lower(self, obj):
8318 if not isinstance(obj, OptimizeObjective):
8319 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8320 return obj.lower()
8321

◆ lower_values()

lower_values ( self,
obj )

Definition at line 8327 of file z3py.py.

8327 def lower_values(self, obj):
8328 if not isinstance(obj, OptimizeObjective):
8329 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8330 return obj.lower_values()
8331

◆ maximize()

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

Definition at line 8270 of file z3py.py.

8270 def maximize(self, arg):
8271 """Add objective function to maximize."""
8272 return OptimizeObjective(
8273 self,
8274 Z3_optimize_maximize(self.ctx.ref(), self.optimize, arg.as_ast()),
8275 is_max=True,
8276 )
8277
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 8278 of file z3py.py.

8278 def minimize(self, arg):
8279 """Add objective function to minimize."""
8280 return OptimizeObjective(
8281 self,
8282 Z3_optimize_minimize(self.ctx.ref(), self.optimize, arg.as_ast()),
8283 is_max=False,
8284 )
8285
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 8307 of file z3py.py.

8307 def model(self):
8308 """Return a model for the last check()."""
8309 try:
8310 return ModelRef(Z3_optimize_get_model(self.ctx.ref(), self.optimize), self.ctx)
8311 except Z3Exception:
8312 raise Z3Exception("model is not available")
8313
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 8349 of file z3py.py.

8349 def objectives(self):
8350 """returns set of objective functions"""
8351 return AstVector(Z3_optimize_get_objectives(self.ctx.ref(), self.optimize), self.ctx)
8352
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 8186 of file z3py.py.

8186 def param_descrs(self):
8187 """Return the parameter description set."""
8188 return ParamDescrsRef(Z3_optimize_get_param_descrs(self.ctx.ref(), self.optimize), self.ctx)
8189
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 8290 of file z3py.py.

8290 def pop(self):
8291 """restore to previously created backtracking point"""
8292 Z3_optimize_pop(self.ctx.ref(), self.optimize)
8293
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 8286 of file z3py.py.

8286 def push(self):
8287 """create a backtracking point for added rules, facts and assertions"""
8288 Z3_optimize_push(self.ctx.ref(), self.optimize)
8289
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 8303 of file z3py.py.

8303 def reason_unknown(self):
8304 """Return a string that describes why the last `check()` returned `unknown`."""
8305 return Z3_optimize_get_reason_unknown(self.ctx.ref(), self.optimize)
8306
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 8175 of file z3py.py.

8175 def set(self, *args, **keys):
8176 """Set a configuration option.
8177 The method `help()` return a string containing all available options.
8178 """
8179 p = args2params(args, keys, self.ctx)
8180 Z3_optimize_set_params(self.ctx.ref(), self.optimize, p.params)
8181
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 8263 of file z3py.py.

8263 def set_initial_value(self, var, value):
8264 """initialize the solver's state by setting the initial value of var to value
8265 """
8266 s = var.sort()
8267 value = s.cast(value)
8268 Z3_optimize_set_initial_value(self.ctx.ref(), self.optimize, var.ast, value.ast)
8269
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 8368 of file z3py.py.

8368 def set_on_model(self, on_model):
8369 """Register a callback that is invoked with every incremental improvement to
8370 objective values. The callback takes a model as argument.
8371 The life-time of the model is limited to the callback so the
8372 model has to be (deep) copied if it is to be used after the callback
8373 """
8374 id = len(_on_models) + 41
8375 mdl = Model(self.ctx)
8376 _on_models[id] = (on_model, mdl)
8377 self._on_models_id = id
8379 self.ctx.ref(), self.optimize, mdl.model, ctypes.c_void_p(id), _on_model_eh,
8380 )
8381
8382
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 8357 of file z3py.py.

8357 def sexpr(self):
8358 """Return a formatted string (in Lisp-like format) with all added constraints.
8359 We say the string is in s-expression format.
8360 """
8361 return Z3_optimize_to_string(self.ctx.ref(), self.optimize)
8362
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 8363 of file z3py.py.

8363 def statistics(self):
8364 """Return statistics for the last check`.
8365 """
8366 return Statistics(Z3_optimize_get_statistics(self.ctx.ref(), self.optimize), self.ctx)
8367
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 8314 of file z3py.py.

8314 def unsat_core(self):
8315 return AstVector(Z3_optimize_get_unsat_core(self.ctx.ref(), self.optimize), self.ctx)
8316
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 8322 of file z3py.py.

8322 def upper(self, obj):
8323 if not isinstance(obj, OptimizeObjective):
8324 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8325 return obj.upper()
8326

◆ upper_values()

upper_values ( self,
obj )

Definition at line 8332 of file z3py.py.

8332 def upper_values(self, obj):
8333 if not isinstance(obj, OptimizeObjective):
8334 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8335 return obj.upper_values()
8336

Field Documentation

◆ _on_models_id

_on_models_id = None
protected

Definition at line 8156 of file z3py.py.

◆ ctx

ctx = _get_ctx(ctx)

Definition at line 8151 of file z3py.py.

◆ optimize

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

Definition at line 8153 of file z3py.py.