Skip to content

Commit 2117364

Browse files
committed
Add accessor functions
1 parent d6a6d75 commit 2117364

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
lines changed

docs/src/user/minimization.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,3 +219,22 @@ line search errors if `initial_x` is a stationary point. Notice, that this is on
219219
a first order check. If `initial_x` is any type of stationary point, `g_converged`
220220
will be true. This includes local minima, saddle points, and local maxima. If `iterations` is `0`
221221
and `g_converged` is `true`, the user needs to keep this point in mind.
222+
223+
## Iterator interface
224+
For multivariable optimizations, iterator interface is provided through `Optim.optimizing`
225+
function. Using this interface, `optimize(args...; kwargs...)` is equivalent to
226+
227+
```jl
228+
let istate
229+
for istate′ in Optim.optimizing(args...; kwargs...)
230+
istate = istate′
231+
end
232+
Optim.OptimizationResults(istate)
233+
end
234+
```
235+
236+
The iterator returned by `Optim.optimizing` yields an iterator state for each iteration
237+
step.
238+
239+
Functions that can be called on the result object (e.g. `minimizer`, `iterations`; see
240+
[Complete list of functions](@ref)) can be used on the iteration state `istate`.

src/multivariate/optimize/optimize.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,3 +200,25 @@ function optimizing(d::D, initial_x::Tx, method::M,
200200
end
201201
return OptimIterator(d, initial_x, method, options, state)
202202
end
203+
204+
# Derive `IteratorState` accessors from `MultivariateOptimizationResults` accessors.
205+
for f in [
206+
:(Base.summary)
207+
:minimizer
208+
:minimum
209+
:iterations
210+
:iteration_limit_reached
211+
:trace
212+
:x_trace
213+
:f_trace
214+
:f_calls
215+
:converged
216+
:g_norm_trace
217+
:g_calls
218+
:x_converged
219+
:f_converged
220+
:g_converged
221+
:initial_state
222+
]
223+
@eval $f(istate::IteratorState) = $f(OptimizationResults(istate))
224+
end

test/general/api.jl

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,29 @@
146146
@test haskey(Optim.trace(res_extended_nm)[1].metadata,"step_type")
147147

148148
local istate
149-
for istate′ in Optim.optimizing(f, initial_x, BFGS())
149+
for istate′ in Optim.optimizing(f, initial_x, BFGS(),
150+
Optim.Options(extended_trace = true,
151+
store_trace = true))
150152
istate = istate′
153+
break
151154
end
155+
# (smoke) tests for accessor functions:
156+
@test summary(istate) == "BFGS"
157+
@test Optim.minimizer(istate) == initial_x
158+
@test Optim.minimum(istate) == f(initial_x)
159+
@test Optim.iterations(istate) == 0
160+
@test Optim.iteration_limit_reached(istate) == false
161+
@test Optim.trace(istate) isa Vector{<:Optim.OptimizationState}
162+
@test Optim.x_trace(istate) == [initial_x]
163+
@test Optim.f_trace(istate) == [f(initial_x)]
164+
@test Optim.f_calls(istate) == 1
165+
@test Optim.converged(istate) == false
166+
@test Optim.g_norm_trace(istate) [215.6] rtol=1e-6
167+
@test Optim.g_calls(istate) == 1
168+
@test Optim.x_converged(istate) == false
169+
@test Optim.f_converged(istate) == false
170+
@test Optim.g_converged(istate) == false
171+
@test Optim.initial_state(istate) == initial_x
152172
@test Optim.OptimizationResults(istate) isa Optim.MultivariateOptimizationResults
153173
end
154174

0 commit comments

Comments
 (0)