Skip to content

Commit c7c6566

Browse files
streamline engine error throwing
1 parent 24506c8 commit c7c6566

1 file changed

Lines changed: 25 additions & 15 deletions

File tree

src/optimizer/abstract.jl

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
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

4345
SemOptimizer{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
"""
6273
optimizer_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

Comments
 (0)