@@ -128,7 +128,9 @@ local_options(optimizer::SemOptimizerNLopt) = optimizer.local_options
128128equality_constraints (optimizer:: SemOptimizerNLopt ) = optimizer. equality_constraints
129129inequality_constraints (optimizer:: SemOptimizerNLopt ) = optimizer. inequality_constraints
130130
131- struct NLoptResult
131+ # wrapper for the NLopt optimization result
132+ struct NLoptResult <: SEM.SemOptimizerResult{SemOptimizerNLopt}
133+ optimizer:: SemOptimizerNLopt
132134 result:: Any
133135 problem:: Any
134136end
@@ -137,27 +139,15 @@ SEM.algorithm_name(res::NLoptResult) = res.problem.algorithm
137139SEM. n_iterations (res:: NLoptResult ) = res. problem. numevals
138140SEM. convergence (res:: NLoptResult ) = res. result[3 ]
139141
140- # construct SemFit from fitted NLopt object
141- function SemFit_NLopt (optimization_result, model:: AbstractSem , start_val, optim, opt)
142- return SemFit (
143- optimization_result[1 ],
144- optimization_result[2 ],
145- start_val,
146- model,
147- optim,
148- NLoptResult (optimization_result, opt),
149- )
150- end
151-
152142# fit method
153143function SEM. fit (
154144 optim:: SemOptimizerNLopt ,
155145 model:: AbstractSem ,
156146 start_params:: AbstractVector ;
157147 kwargs... ,
158148)
159- opt = construct_NLopt (optim. algorithm, optim. options, nparams (model))
160- opt . min_objective =
149+ problem = NLopt_problem (optim. algorithm, optim. options, nparams (model))
150+ problem . min_objective =
161151 (par, G) -> SEM. evaluate! (
162152 zero (eltype (par)),
163153 ! isnothing (G) && ! isempty (G) ? G : nothing ,
@@ -166,36 +156,42 @@ function SEM.fit(
166156 par,
167157 )
168158 for (f, tol) in optim. inequality_constraints
169- inequality_constraint! (opt , f, tol)
159+ inequality_constraint! (problem , f, tol)
170160 end
171161 for (f, tol) in optim. equality_constraints
172- equality_constraint! (opt , f, tol)
162+ equality_constraint! (problem , f, tol)
173163 end
174164
175165 if ! isnothing (optim. local_algorithm)
176- opt_local =
177- construct_NLopt (optim. local_algorithm, optim. local_options, nparams (model))
178- opt. local_optimizer = opt_local
166+ problem. local_optimizer =
167+ NLopt_problem (optim. local_algorithm, optim. local_options, nparams (model))
179168 end
180169
181170 # fit
182- result = NLopt. optimize (opt , start_params)
171+ result = NLopt. optimize (problem , start_params)
183172
184- return SemFit_NLopt (result, model, start_params, optim, opt)
173+ return SemFit (
174+ result[1 ], # minimum
175+ result[2 ], # optimal params
176+ start_val,
177+ model,
178+ NLoptResult (optim, result, problem),
179+ )
185180end
186181
187182# ###########################################################################################
188183# ## additional functions
189184# ###########################################################################################
190185
191- function construct_NLopt (algorithm, options, npar)
192- opt = Opt (algorithm, npar)
186+ # construct NLopt.jl problem
187+ function NLopt_problem (algorithm, options, npar)
188+ problem = Opt (algorithm, npar)
193189
194190 for (key, val) in pairs (options)
195- setproperty! (opt , key, val)
191+ setproperty! (problem , key, val)
196192 end
197193
198- return opt
194+ return problem
199195end
200196
201197# ###########################################################################################
0 commit comments