Skip to content

Commit 615937f

Browse files
author
Alexey Stukalov
committed
optimizer.md: rename to SemOptimizerMyopt
1 parent 59a3ed8 commit 615937f

1 file changed

Lines changed: 29 additions & 18 deletions

File tree

docs/src/developer/optimizer.md

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,74 @@
11
# Custom optimizer types
22

3-
The optimizer part of a model connects it to the optimization backend.
4-
Let's say we want to implement a new optimizer as `SemOptimizerName`. The first part of the implementation is very similar to loss functions, so we just show the implementation of `SemOptimizerOptim` here as a reference:
3+
The optimizer part of a model connects it to the optimization backend.
4+
Let's say we want to implement a new optimizer as `SemOptimizerMyopt`.
5+
The first part of the implementation is very similar to loss functions,
6+
so we just show the implementation of `SemOptimizerOptim` here as a reference:
57

68
```julia
79
############################################################################################
810
### Types and Constructor
911
############################################################################################
10-
mutable struct SemOptimizerName{A, B} <: SemOptimizer{:Name}
12+
struct SemOptimizerMyopt{A, B} <: SemOptimizer{:Myopt}
1113
algorithm::A
1214
options::B
1315
end
1416

15-
SemOptimizer{:Name}(args...; kwargs...) = SemOptimizerName(args...; kwargs...)
17+
SemOptimizer(Val{:Myopt}, args...; kwargs...) = SemOptimizerMyopt(args...; kwargs...)
1618

17-
SemOptimizerName(;
19+
SemOptimizer_impltype(::Val{:Myopt}) = SemOptimizerMyopt
20+
21+
SemOptimizerMyopt(;
1822
algorithm = LBFGS(),
1923
options = Optim.Options(; f_reltol = 1e-10, x_abstol = 1.5e-8),
2024
kwargs...,
21-
) = SemOptimizerName(algorithm, options)
25+
) = SemOptimizerMyopt(algorithm, options)
26+
27+
struct MyOptResult{O <: SemOptimizerMyopt} <: SEM.SemOptimizerResult{O}
28+
optimizer::O
29+
...
30+
end
2231

2332
############################################################################################
2433
### Recommended methods
2534
############################################################################################
2635

27-
update_observed(optimizer::SemOptimizerName, observed::SemObserved; kwargs...) = optimizer
36+
update_observed(optimizer::SemOptimizerMyopt, observed::SemObserved; kwargs...) = optimizer
2837

2938
############################################################################################
3039
### additional methods
3140
############################################################################################
3241

33-
options(optimizer::SemOptimizerName) = optimizer.options
42+
options(optimizer::SemOptimizerMyopt) = optimizer.options
3443
```
3544

36-
Note that your optimizer is a subtype of `SemOptimizer{:Name}`, where you can choose a `:Name` that can later be used as a keyword argument to `fit(engine = :Name)`.
37-
Similarly, `SemOptimizer{:Name}(args...; kwargs...) = SemOptimizerName(args...; kwargs...)` should be defined as well as a constructor that uses only keyword arguments:
45+
Note that your optimizer is a subtype of `SemOptimizer{:Myopt}`,
46+
where you can choose a `:Myopt` that can later be used as a keyword argument to `fit(engine = :Myopt)`.
47+
Similarly, `SemOptimizer{:Myopt}(args...; kwargs...) = SemOptimizerMyopt(args...; kwargs...)`
48+
should be defined as well as a constructor that uses only keyword arguments:
3849

3950
```julia
40-
SemOptimizerName(;
51+
SemOptimizerMyopt(;
4152
algorithm = LBFGS(),
4253
options = Optim.Options(; f_reltol = 1e-10, x_abstol = 1.5e-8),
4354
kwargs...,
44-
) = SemOptimizerName(algorithm, options)
55+
) = SemOptimizerMyopt(algorithm, options)
4556
```
4657
A method for `update_observed` and additional methods might be usefull, but are not necessary.
4758

4859
Now comes the substantive part: We need to provide a method for `fit`:
4960

5061
```julia
5162
function fit(
52-
optim::SemOptimizerName,
63+
optim::SemOptimizerMyopt,
5364
model::AbstractSem,
5465
start_params::AbstractVector;
5566
kwargs...,
5667
)
57-
optimization_result = ...
58-
5968
...
6069

70+
optimization_result = MyoptResult(optim, ...)
71+
6172
return SemFit(minimum, minimizer, start_params, model, optimization_result)
6273
end
6374
```
@@ -67,7 +78,7 @@ The method has to return a `SemFit` object that consists of the minimum of the o
6778
In addition, you might want to provide methods to access properties of your optimization result:
6879

6980
```julia
70-
algorithm_name(res::MyOptimizationResult) = ...
71-
n_iterations(res::MyOptimizationResult) = ...
72-
convergence(res::MyOptimizationResult) = ...
81+
algorithm_name(res::MyOptResult) = ...
82+
n_iterations(res::MyOptResult) = ...
83+
convergence(res::MyOptResult) = ...
7384
```

0 commit comments

Comments
 (0)