How to Stop 2

The Stopping structure eases the implementation of algorithms and the stopping criterion. We illustrate here the features of Stopping when the algorithm is used a subStopping.

The Julia file corresponding to this tutorial can be found here.

using Test, Stopping

Assume we want to solve "pb" starting from "x0" and solving at each step of the algorithm the subproblem "subpb". We can use this additional info to improve the stopping criterion.

x0 = ones(2)
pb = nothing
subpb = nothing
subsubpb = nothing

Initialize a Stopping for the main pb

main_stop = GenericStopping(pb, x0)

We can then, initialize another stopping to the subproblem, and providing the main_stop as a keyword argument:

sub_stop = GenericStopping(subpb, x0, main_stp = main_stop, tol_check = (atol, rtol, opt0) -> atol)

Note that by default main_stp is void

@test main_stop.main_stp == nothing

The only difference appears in the event of a call to stop!, which now also check the time and resources of the main_pb.

OK = start!(sub_stop)
@test OK == false #no reason to stop just yet.

Assume time is exhausted for the main_stop

main_stop.meta.start_time = 0.0 #force a timing failure in the main problem
stop!(sub_stop)

@test status(sub_stop, list = true) == [:ResourcesOfMainProblemExhausted]
@test sub_stop.meta.tired == false
@test sub_stop.meta.main_pb == true

The same applies if there is now a third subproblem

reinit!(main_stop)
reinit!(sub_stop)
subsub_stop = GenericStopping(subsubpb, x0, main_stp = sub_stop, tol_check = (atol, rtol, opt0) -> atol)
main_stop.meta.start_time = 0.0 #force a timing failure in the main problem
stop!(subsub_stop)

@test status(subsub_stop, list = true) == [:ResourcesOfMainProblemExhausted]
@test subsub_stop.meta.tired   == false
@test subsub_stop.meta.main_pb == true
@test status(sub_stop, list = true) == [:ResourcesOfMainProblemExhausted]
@test sub_stop.meta.tired   == false
@test sub_stop.meta.main_pb == true
@test status(main_stop, list = true) == [:Tired]
@test main_stop.meta.tired   == true
@test main_stop.meta.main_pb == false