@@ -118,31 +118,32 @@ SEM.update_observed(optimizer::SemOptimizerNLopt, observed::SemObserved; kwargs.
118118# ## additional methods
119119# ###########################################################################################
120120
121- SEM. algorithm (optimizer:: SemOptimizerNLopt ) = optimizer. algorithm
122121local_algorithm (optimizer:: SemOptimizerNLopt ) = optimizer. local_algorithm
123122SEM. options (optimizer:: SemOptimizerNLopt ) = optimizer. options
124123local_options (optimizer:: SemOptimizerNLopt ) = optimizer. local_options
125124equality_constraints (optimizer:: SemOptimizerNLopt ) = optimizer. equality_constraints
126125inequality_constraints (optimizer:: SemOptimizerNLopt ) = optimizer. inequality_constraints
127126
128- struct NLoptResult
127+ # wrapper for the NLopt optimization result
128+ struct NLoptResult <: SEM.SemOptimizerResult{SemOptimizerNLopt}
129+ optimizer:: SemOptimizerNLopt
129130 result:: Any
130131 problem:: Any
131132end
132133
133- SEM. optimizer (res:: NLoptResult ) = res. problem. algorithm
134+ SEM. algorithm_name (res:: NLoptResult ) = res. problem. algorithm
134135SEM. n_iterations (res:: NLoptResult ) = res. problem. numevals
135136SEM. convergence (res:: NLoptResult ) = res. result[3 ]
136137
137- # construct SemFit from fitted NLopt object
138- function SemFit_NLopt (optimization_result, model :: AbstractSem , start_val, opt )
139- return SemFit (
140- optimization_result[ 1 ],
141- optimization_result[ 2 ],
142- start_val,
143- model,
144- NLoptResult (optimization_result, opt),
145- )
138+ # construct NLopt.jl problem
139+ function NLopt_problem (algorithm, options, npar )
140+ problem = Opt (algorithm, npar)
141+
142+ for (key, val) in pairs (options)
143+ setproperty! (problem, key, val)
144+ end
145+
146+ return problem
146147end
147148
148149# fit method
@@ -152,8 +153,8 @@ function SEM.fit(
152153 start_params:: AbstractVector ;
153154 kwargs... ,
154155)
155- opt = construct_NLopt (optim. algorithm, optim. options, nparams (model))
156- opt . min_objective =
156+ problem = NLopt_problem (optim. algorithm, optim. options, nparams (model))
157+ problem . min_objective =
157158 (par, G) -> SEM. evaluate! (
158159 zero (eltype (par)),
159160 ! isnothing (G) && ! isempty (G) ? G : nothing ,
@@ -162,36 +163,27 @@ function SEM.fit(
162163 par,
163164 )
164165 for (f, tol) in optim. inequality_constraints
165- inequality_constraint! (opt , f, tol)
166+ inequality_constraint! (problem , f, tol)
166167 end
167168 for (f, tol) in optim. equality_constraints
168- equality_constraint! (opt , f, tol)
169+ equality_constraint! (problem , f, tol)
169170 end
170171
171172 if ! isnothing (optim. local_algorithm)
172- opt_local =
173- construct_NLopt (optim. local_algorithm, optim. local_options, nparams (model))
174- opt. local_optimizer = opt_local
173+ problem. local_optimizer =
174+ NLopt_problem (optim. local_algorithm, optim. local_options, nparams (model))
175175 end
176176
177177 # fit
178- result = NLopt. optimize (opt , start_params)
178+ result = NLopt. optimize (problem , start_params)
179179
180- return SemFit_NLopt (result, model, start_params, opt)
181- end
182-
183- # ###########################################################################################
184- # ## additional functions
185- # ###########################################################################################
186-
187- function construct_NLopt (algorithm, options, npar)
188- opt = Opt (algorithm, npar)
189-
190- for (key, val) in pairs (options)
191- setproperty! (opt, key, val)
192- end
193-
194- return opt
180+ return SemFit (
181+ result[1 ], # minimum
182+ result[2 ], # optimal params
183+ start_val,
184+ model,
185+ NLoptResult (optim, result, problem),
186+ )
195187end
196188
197189# ###########################################################################################
0 commit comments