-
Notifications
You must be signed in to change notification settings - Fork 0
/
checkpointing.jl
58 lines (43 loc) · 2.08 KB
/
checkpointing.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# In this tutorial, we present the use of Stopping to checkpointing.
# When using an optimizer for high-scale problems, the resolution process
# might be extremly long. In order to analyze the progress of the algorithm or save ongoing results,
# an idea is to introduce checkpointing, i.e. we save the output result in the file
# every `n`-steps. Using `Stopping` this operation is now very simple.
using ADNLPModels, FileIO, JLD2, LinearAlgebra, NLPModels, Printf, Random, Stopping
# In this tutorial, we will use the steepest descent method with a fixed stepsize.
function fixed_step_steepest_descent(stp :: NLPStopping; t = 1e-5)
xk = stp.current_state.x
OK = update_and_start!(stp, gx = grad(stp.pb, xk))
@printf "%2s %7s\n" "k" "||∇f(x)||"
@printf "%2d %7.1e\n" stp.meta.nb_of_stop norm(stp.current_state.current_score)
while !OK
xk -= t * stp.current_state.gx
OK = update_and_stop!(stp, x = xk, gx = grad(stp.pb, xk))
@printf "%2d %7.1e\n" stp.meta.nb_of_stop norm(stp.current_state.current_score)
end
return stp
end
# We now generate a regularized least squares problem using `ADNLPModels.jl`.
Random.seed!(1234)
m, n = 10_000, 10
A = rand(m, n)
b = A * ones(n)
f(x, A, b, λ) = norm(A * x - b)^2 + λ * norm(x)^2
pb = ADNLPModel(x -> f(x, A, b, 1e-2), zeros(n))
# The final step is now to initialize the `Stopping` and specify user-defined structures
# to store the parameter `n_save` set to 50 so that every 50 iterations the current
# stopping is saved using the package `JLD2.jl`.
save_check(stp, b) = begin
if stp.meta.nb_of_stop % stp.stopping_user_struct[:n_save] == 0
@save "checkpoint_stopping_$(stp.meta.nb_of_stop).jld2" stp
end
end
n_save = 50
stp = NLPStopping(pb, user_struct = Dict(:n_save => n_save),
user_check_func! = save_check, max_iter = 99)
# Let's go
fixed_step_steepest_descent(stp)
# The algorithm has now generated two files `checkpoint_stopping_0.jld2` and `checkpoint_stopping_50.jld2` that
# can be analyzed.
stp0 = load("checkpoint_stopping_0.jld2")["stp"]
stp50 = load("checkpoint_stopping_50.jld2")["stp"]