AppInterface.update
AppInterface.update |
Purpose
Sends a progress update notification for a single metric from the model to the Xpress Insight system.
Synopsis
update(self, metric: xpressinsight.Metric, value: Union[float, int, xpressinsight.ObjSense]) -> None
Arguments
metric
|
The type of metric to update.
|
value
|
The value of the metric to update.
|
Example
Notify Insight that the current best solution value is 51.9.
>>> insight.update(Metric.OBJVAL, 51.9)
Automatic updating of metrics during optimization can be achieved by calling the update function from within a suitable solver callback:
>>> def on_gap_notify(prob, app): ... ... num_sol = prob.attributes.mipsols ... app.insight.update(xi.Metric.NUMSOLS, num_sol) ... ... if num_sol == 0: ... # Can only occur when mipabsgapnotifybound is used. ... # Don't call gapnotify again. ... return None, None, None, None ... ... objective = prob.attributes.mipobjval ... best_bound = prob.attributes.bestbound ... ... if best_bound != 0 or objective != 0: ... gap = abs(objective - best_bound) / \ ... max(abs(best_bound), abs(objective)) ... else: ... gap = 0 ... ... app.insight.update(xi.Metric.OBJVAL, objective) ... app.insight.update(xi.Metric.GAP, gap) ... ... if gap > 1e-6: ... new_rel_gap_notify_target = gap - 1e-6 ... else: ... # Don't call gapnotify again. ... new_rel_gap_notify_target = -1 ... ... return new_rel_gap_notify_target, None, None, None
The above callback can then be attached via the Xpress Python API:
>>> prob = xp.problem() ... ... # TODO: Define the optimization problem ... ... # Optionally reset progress and set the objective sense ... self.insight.reset_progress() ... self.insight.update(xi.Metric.OBJSENSE, prob.attributes.objsense) ... ... prob.controls.miprelgapnotify = 1e20 ... prob.addcbgapnotify(on_gap_notify, self, 0) ... ... prob.solve()
Further information
This function allows the model to report back progress to the system where it is accessible by a client for display.
Related topics