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

Constructor & Destructor Documentation

◆ __init__()

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

Definition at line 8158 of file z3py.py.

8158 def __init__(self, optimize=None, ctx=None):
8159 self.ctx = _get_ctx(ctx)
8160 if optimize is None:
8161 self.optimize = Z3_mk_optimize(self.ctx.ref())
8162 else:
8163 self.optimize = optimize
8164 self._on_models_id = None
8165 Z3_optimize_inc_ref(self.ctx.ref(), self.optimize)
8166
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 8170 of file z3py.py.

8170 def __del__(self):
8171 if self.optimize is not None and self.ctx.ref() is not None and Z3_optimize_dec_ref is not None:
8172 Z3_optimize_dec_ref(self.ctx.ref(), self.optimize)
8173 if self._on_models_id is not None:
8174 del _on_models[self._on_models_id]
8175
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 8167 of file z3py.py.

8167 def __deepcopy__(self, memo={}):
8168 return Optimize(self.optimize, self.ctx)
8169

◆ __enter__()

__enter__ ( self)

Definition at line 8176 of file z3py.py.

8176 def __enter__(self):
8177 self.push()
8178 return self
8179

◆ __exit__()

__exit__ ( self,
* exc_info )

Definition at line 8180 of file z3py.py.

8180 def __exit__(self, *exc_info):
8181 self.pop()
8182

◆ __iadd__()

__iadd__ ( self,
fml )

Definition at line 8214 of file z3py.py.

8214 def __iadd__(self, fml):
8215 self.add(fml)
8216 return self
8217

◆ __repr__()

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

Definition at line 8361 of file z3py.py.

8361 def __repr__(self):
8362 """Return a formatted string with all added rules and constraints."""
8363 return self.sexpr()
8364

◆ add()

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

Definition at line 8210 of file z3py.py.

8210 def add(self, *args):
8211 """Assert constraints as background axioms for the optimize solver. Alias for assert_expr."""
8212 self.assert_exprs(*args)
8213

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

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

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

8198 def assert_exprs(self, *args):
8199 """Assert constraints as background axioms for the optimize solver."""
8200 args = _get_args(args)
8201 s = BoolSort(self.ctx)
8202 for arg in args:
8203 if isinstance(arg, Goal) or isinstance(arg, AstVector):
8204 for f in arg:
8205 Z3_optimize_assert(self.ctx.ref(), self.optimize, f.as_ast())
8206 else:
8207 arg = s.cast(arg)
8208 Z3_optimize_assert(self.ctx.ref(), self.optimize, arg.as_ast())
8209
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 8353 of file z3py.py.

8353 def assertions(self):
8354 """Return an AST vector containing all added constraints."""
8355 return AstVector(Z3_optimize_get_assertions(self.ctx.ref(), self.optimize), self.ctx)
8356
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 8302 of file z3py.py.

8302 def check(self, *assumptions):
8303 """Check consistency and produce optimal values."""
8304 assumptions = _get_args(assumptions)
8305 num = len(assumptions)
8306 _assumptions = (Ast * num)()
8307 for i in range(num):
8308 _assumptions[i] = assumptions[i].as_ast()
8309 return CheckSatResult(Z3_optimize_check(self.ctx.ref(), self.optimize, num, _assumptions))
8310
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 8345 of file z3py.py.

8345 def from_file(self, filename):
8346 """Parse assertions and objectives from a file"""
8347 Z3_optimize_from_file(self.ctx.ref(), self.optimize, filename)
8348
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 8349 of file z3py.py.

8349 def from_string(self, s):
8350 """Parse assertions and objectives from a string"""
8351 Z3_optimize_from_string(self.ctx.ref(), self.optimize, s)
8352
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 8190 of file z3py.py.

8190 def help(self):
8191 """Display a string describing all available options."""
8192 print(Z3_optimize_get_help(self.ctx.ref(), self.optimize))
8193
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 8325 of file z3py.py.

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

◆ lower_values()

lower_values ( self,
obj )

Definition at line 8335 of file z3py.py.

8335 def lower_values(self, obj):
8336 if not isinstance(obj, OptimizeObjective):
8337 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8338 return obj.lower_values()
8339

◆ maximize()

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

Definition at line 8278 of file z3py.py.

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

8286 def minimize(self, arg):
8287 """Add objective function to minimize."""
8288 return OptimizeObjective(
8289 self,
8290 Z3_optimize_minimize(self.ctx.ref(), self.optimize, arg.as_ast()),
8291 is_max=False,
8292 )
8293
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 8315 of file z3py.py.

8315 def model(self):
8316 """Return a model for the last check()."""
8317 try:
8318 return ModelRef(Z3_optimize_get_model(self.ctx.ref(), self.optimize), self.ctx)
8319 except Z3Exception:
8320 raise Z3Exception("model is not available")
8321
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 8357 of file z3py.py.

8357 def objectives(self):
8358 """returns set of objective functions"""
8359 return AstVector(Z3_optimize_get_objectives(self.ctx.ref(), self.optimize), self.ctx)
8360
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 8194 of file z3py.py.

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

8298 def pop(self):
8299 """restore to previously created backtracking point"""
8300 Z3_optimize_pop(self.ctx.ref(), self.optimize)
8301
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 8294 of file z3py.py.

8294 def push(self):
8295 """create a backtracking point for added rules, facts and assertions"""
8296 Z3_optimize_push(self.ctx.ref(), self.optimize)
8297
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 8311 of file z3py.py.

8311 def reason_unknown(self):
8312 """Return a string that describes why the last `check()` returned `unknown`."""
8313 return Z3_optimize_get_reason_unknown(self.ctx.ref(), self.optimize)
8314
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 8183 of file z3py.py.

8183 def set(self, *args, **keys):
8184 """Set a configuration option.
8185 The method `help()` return a string containing all available options.
8186 """
8187 p = args2params(args, keys, self.ctx)
8188 Z3_optimize_set_params(self.ctx.ref(), self.optimize, p.params)
8189
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 8271 of file z3py.py.

8271 def set_initial_value(self, var, value):
8272 """initialize the solver's state by setting the initial value of var to value
8273 """
8274 s = var.sort()
8275 value = s.cast(value)
8276 Z3_optimize_set_initial_value(self.ctx.ref(), self.optimize, var.ast, value.ast)
8277
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 8376 of file z3py.py.

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

8365 def sexpr(self):
8366 """Return a formatted string (in Lisp-like format) with all added constraints.
8367 We say the string is in s-expression format.
8368 """
8369 return Z3_optimize_to_string(self.ctx.ref(), self.optimize)
8370
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 8371 of file z3py.py.

8371 def statistics(self):
8372 """Return statistics for the last check`.
8373 """
8374 return Statistics(Z3_optimize_get_statistics(self.ctx.ref(), self.optimize), self.ctx)
8375
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 8322 of file z3py.py.

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

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

◆ upper_values()

upper_values ( self,
obj )

Definition at line 8340 of file z3py.py.

8340 def upper_values(self, obj):
8341 if not isinstance(obj, OptimizeObjective):
8342 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8343 return obj.upper_values()
8344

Field Documentation

◆ _on_models_id

_on_models_id = None
protected

Definition at line 8164 of file z3py.py.

◆ ctx

ctx = _get_ctx(ctx)

Definition at line 8159 of file z3py.py.

◆ optimize

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

Definition at line 8161 of file z3py.py.