|
1 | | -SemOptimizer(args...; engine::Symbol = :Optim, kwargs...) = |
2 | | - SemOptimizer{engine}(args...; kwargs...) |
3 | | - |
4 | | -# fallback optimizer constructor |
5 | | -function SemOptimizer{E}(args...; kwargs...) where {E} |
6 | | - if E == :NLOpt |
| 1 | +# throw unsupported engine error |
| 2 | +function throw_engine_error(E) |
| 3 | + if typeof(E) !== Symbol |
| 4 | + throw(ArgumentError("engine argument must be a Symbol.")) |
| 5 | + elseif E == :NLopt |
7 | 6 | error("$E optimizer requires \"using NLopt\".") |
8 | 7 | elseif E == :Proximal |
9 | 8 | error("$E optimizer requires \"using ProximalAlgorithms\".") |
10 | 9 | else |
11 | | - error("$E optimizer is not supported.") |
| 10 | + error("$E optimizer engine is not supported.") |
12 | 11 | end |
13 | 12 | end |
14 | 13 |
|
| 14 | +# return the type implementing SemOptimizer{engine} |
| 15 | +# the method should be overridden in the extension |
| 16 | +sem_optimizer_subtype(engine::Symbol) = sem_optimizer_subtype(Val(engine)) |
| 17 | + |
| 18 | +# fallback method for unsupported engines |
| 19 | +sem_optimizer_subtype(::Val{E}) where {E} = throw_engine_error(E) |
| 20 | + |
| 21 | +# default constructor that dispatches to the engine-specific type |
| 22 | +SemOptimizer(::Val{E}, args...; kwargs...) where {E} = |
| 23 | + sem_optimizer_subtype(E)(args...; kwargs...) |
| 24 | + |
| 25 | +SemOptimizer{E}(args...; kwargs...) where {E} = SemOptimizer(Val(E), args...; kwargs...) |
| 26 | + |
| 27 | +SemOptimizer(args...; engine::Symbol = :Optim, kwargs...) = |
| 28 | + SemOptimizer(Val(engine), args...; kwargs...) |
| 29 | + |
15 | 30 | """ |
16 | 31 | optimizer_engine(::Type{<:SemOptimizer}) |
17 | 32 | optimizer_engine(::SemOptimizer) |
|
0 commit comments