Example I: Stopping in the flow
We present here a typical iterative algorithm to illustrate how to use Stopping.
function rand_solver(stp :: AbstractStopping, x0 :: AbstractVector)
x = x0
#First, call start! to check optimality and set an initial configuration
OK = update_and_start!(stp, x = x)
while !OK
#Run some computations and update the iterate
d = rand(length(x))
x += d
#Update the State and call the Stopping with stop!
OK = update_and_stop!(stp, x = x, d = d)
end
return stp
end
This example shows the most basic features of Stopping. It does many checks for you. In this innocent-looking algorithm, the call to update_and_start!
and update_and_stop!
will verifies unboundedness of x
, the time spent in the algorithm, the number of iterations (= number of call to stop!
), and the domain of x
(in case some of its components become NaN
for instance).
FAQ: How can I disable some checks done by Stopping?
The native instances of AbstractStopping
available in Stopping.jl all contain an attribute stop_remote
. This is a remote control for Stopping's checks.
typeof(stp.stop_remote) <: StopRemoteControl #stop_remote is an instance of StopRemoteControl
This attributes contains boolean values for each check done by Stopping, see
fieldnames(stp.stop_remote) #get all the attributes of the remote control
For instance, we can remove the unboundedness and domain check done on x
by setting:
stp.stop_remote = StopRemoteControl(unbounded_and_domain_x_check = false)