1- optimizer_engine (:: Type{<:SemOptimizer{E}} ) where {E} = E
2- optimizer_engine (:: SemOptimizer{E} ) where {E} = E
1+ const optimizer_engine_packages = Dict (
2+ :NLopt => " NLopt" ,
3+ :Proximal => " ProximalAlgorithms"
4+ )
5+
6+ function throw_engine_error (E)
7+ if typeof (E) != = Symbol
8+ throw (ArgumentError (" engine argument must be a Symbol." ))
9+ elseif haskey (optimizer_engine_packages, E)
10+ error (" optimizer \" :$E \" requires \" using $(optimizer_engine_packages[E]) \" ." )
11+ else
12+ error (" optimizer engine \" :$E \" is not supported." )
13+ end
14+ end
315
416"""
517 SemOptimizer(args...; engine::Symbol = :Optim, kwargs...)
@@ -28,20 +40,19 @@ SemOptimizer(args...; engine::Symbol = :Optim, kwargs...) =
2840 SemOptimizer {engine} (args... ; kwargs... )
2941
3042# fallback optimizer constructor when the engine E is not supported
31- function SemOptimizer (:: Val{E} , args... ; kwargs... ) where {E}
32- if typeof (E) != = Symbol
33- throw (ArgumentError (" engine argument must be a Symbol." ))
34- elseif E == :NLOpt
35- error (" $E optimizer requires \" using NLopt\" ." )
36- elseif E == :Proximal
37- error (" $E optimizer requires \" using ProximalAlgorithms\" ." )
38- else
39- error (" $E optimizer engine is not supported." )
40- end
41- end
43+ SemOptimizer (:: Val{E} , args... ; kwargs... ) where {E} = throw_engine_error (E)
4244
4345SemOptimizer {E} (args... ; kwargs... ) where {E} = SemOptimizer (Val (E), args... ; kwargs... )
4446
47+ """
48+ (1) optimizer_engine(::Type{<:SemOptimizer{E}})
49+ (2) optimizer_engine(::SemOptimizer{E})
50+
51+ Returns `E`; the engine of a `SemOptimizer` object or a subtype of `SemOptimizer`.
52+ """
53+ optimizer_engine (:: Type{<:SemOptimizer{E}} ) where {E} = E
54+ optimizer_engine (:: SemOptimizer{E} ) where {E} = E
55+
4556"""
4657 optimizer_engines()
4758
@@ -61,8 +72,7 @@ For a list of available engines, call `optimizer_engines`.
6172"""
6273optimizer_engine_doc (engine) = optimizer_engine_doc (Val (engine))
6374
64- optimizer_engine_doc (engine:: Val ) =
65- throw (ArgumentError (" Unknown engine. Did you forget to load the necessary packages?" ))
75+ optimizer_engine_doc (:: Val{E} ) where {E} = throw_engine_error (E)
6676
6777"""
6878 fit([optim::SemOptimizer], model::AbstractSem;
0 commit comments