Skip to content

Commit d125f25

Browse files
Merge pull request #493 from SciML/nloptup
[WIP] Fix incorrect tests and add constraints support in OptimizationNLopt
2 parents 88fc980 + eabd230 commit d125f25

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

lib/OptimizationNLopt/src/OptimizationNLopt.jl

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ function __map_optimizer_args!(prob::OptimizationProblem, opt::NLopt.Opt;
5252
end
5353

5454
if prob.ub !== nothing
55-
NLopt.upper_bounds!(opt, prob.ub)
55+
opt.upper_bounds = prob.ub
5656
end
5757

5858
if prob.lb !== nothing
59-
NLopt.lower_bounds!(opt, prob.lb)
59+
opt.lower_bounds = prob.lb
6060
end
6161

6262
if !(isnothing(maxiters))
@@ -83,6 +83,7 @@ function __nlopt_status_to_ReturnCode(status::Symbol)
8383
NLopt.STOPVAL_REACHED,
8484
NLopt.FTOL_REACHED,
8585
NLopt.XTOL_REACHED,
86+
NLopt.ROUNDOFF_LIMITED,
8687
])
8788
return ReturnCode.Success
8889
elseif status == Symbol(NLopt.MAXEVAL_REACHED)
@@ -93,7 +94,6 @@ function __nlopt_status_to_ReturnCode(status::Symbol)
9394
NLopt.OUT_OF_MEMORY,
9495
NLopt.INVALID_ARGS,
9596
NLopt.FAILURE,
96-
NLopt.ROUNDOFF_LIMITED,
9797
NLopt.FORCED_STOP,
9898
])
9999
return ReturnCode.Failure
@@ -160,6 +160,13 @@ function SciMLBase.__solve(prob::OptimizationProblem,
160160
t1 = time()
161161

162162
retcode = __nlopt_status_to_ReturnCode(ret)
163+
164+
if retcode == ReturnCode.Failure
165+
@warn "NLopt failed to converge: $(ret)"
166+
minx = fill(NaN, length(prob.u0))
167+
minf = NaN
168+
end
169+
163170
SciMLBase.build_solution(SciMLBase.DefaultOptimizationCache(prob.f, prob.p), opt, minx,
164171
minf; original = opt_setup, retcode = retcode,
165172
solve_time = t1 - t0)

lib/OptimizationNLopt/test/runtests.jl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,27 @@ using Test
1818
sol = solve(prob, NLopt.Opt(:LN_BOBYQA, 2))
1919
@test 10 * sol.objective < l1
2020

21+
prob = OptimizationProblem(optprob, x0, _p, lb = [-1.0, -1.0], ub = [0.8, 0.8])
22+
2123
sol = solve(prob, NLopt.Opt(:LD_LBFGS, 2))
2224
@test 10 * sol.objective < l1
2325

24-
prob = OptimizationProblem(optprob, x0, lb = [-1.0, -1.0], ub = [0.8, 0.8])
26+
2527
sol = solve(prob, NLopt.Opt(:LD_LBFGS, 2))
2628
@test 10 * sol.objective < l1
2729

2830
sol = solve(prob, NLopt.Opt(:G_MLSL_LDS, 2), local_method = NLopt.Opt(:LD_LBFGS, 2),
2931
maxiters = 10000)
3032
@test 10 * sol.objective < l1
3133

32-
prob = OptimizationProblem(optprob, x0)
34+
prob = OptimizationProblem(optprob, x0, _p)
3335
sol = solve(prob, NLopt.LN_BOBYQA())
3436
@test 10 * sol.objective < l1
3537

3638
sol = solve(prob, NLopt.LD_LBFGS())
3739
@test 10 * sol.objective < l1
3840

39-
prob = OptimizationProblem(optprob, x0, lb = [-1.0, -1.0], ub = [0.8, 0.8])
41+
prob = OptimizationProblem(optprob, x0, _p, lb = [-1.0, -1.0], ub = [0.8, 0.8])
4042
sol = solve(prob, NLopt.LD_LBFGS())
4143
@test 10 * sol.objective < l1
4244

0 commit comments

Comments
 (0)