Skip to content

Commit 781b464

Browse files
authored
Work-around removal of LD_LBFGS_NOCEDAL in [email protected] (#251)
1 parent bdaa35d commit 781b464

File tree

3 files changed

+207
-92
lines changed

3 files changed

+207
-92
lines changed

Diff for: src/NLopt.jl

+106-45
Original file line numberDiff line numberDiff line change
@@ -8,56 +8,117 @@ module NLopt
88
using CEnum: @cenum
99
using NLopt_jll: libnlopt
1010

11+
# [email protected] removed the LD_LBFGS_NOCEDAL enum.
12+
# See https://github.com/stevengj/nlopt/issues/584 for details.
13+
function _is_version_newer_than_2_9()
14+
major, minor, bugfix = Ref{Cint}(), Ref{Cint}(), Ref{Cint}()
15+
@ccall libnlopt.nlopt_version(
16+
major::Ptr{Cint},
17+
minor::Ptr{Cint},
18+
bugfix::Ptr{Cint},
19+
)::Cvoid
20+
return (major[] > 2) || (major[] == 2 && minor[] >= 9)
21+
end
22+
1123
include("libnlopt.jl")
1224

1325
############################################################################
1426
# Mirrors of NLopt's C enum constants:
1527

16-
@enum Algorithm::Cint begin
17-
GN_DIRECT = 0
18-
GN_DIRECT_L = 1
19-
GN_DIRECT_L_RAND = 2
20-
GN_DIRECT_NOSCAL = 3
21-
GN_DIRECT_L_NOSCAL = 4
22-
GN_DIRECT_L_RAND_NOSCAL = 5
23-
GN_ORIG_DIRECT = 6
24-
GN_ORIG_DIRECT_L = 7
25-
GD_STOGO = 8
26-
GD_STOGO_RAND = 9
27-
LD_LBFGS_NOCEDAL = 10
28-
LD_LBFGS = 11
29-
LN_PRAXIS = 12
30-
LD_VAR1 = 13
31-
LD_VAR2 = 14
32-
LD_TNEWTON = 15
33-
LD_TNEWTON_RESTART = 16
34-
LD_TNEWTON_PRECOND = 17
35-
LD_TNEWTON_PRECOND_RESTART = 18
36-
GN_CRS2_LM = 19
37-
GN_MLSL = 20
38-
GD_MLSL = 21
39-
GN_MLSL_LDS = 22
40-
GD_MLSL_LDS = 23
41-
LD_MMA = 24
42-
LN_COBYLA = 25
43-
LN_NEWUOA = 26
44-
LN_NEWUOA_BOUND = 27
45-
LN_NELDERMEAD = 28
46-
LN_SBPLX = 29
47-
LN_AUGLAG = 30
48-
LD_AUGLAG = 31
49-
LN_AUGLAG_EQ = 32
50-
LD_AUGLAG_EQ = 33
51-
LN_BOBYQA = 34
52-
GN_ISRES = 35
53-
AUGLAG = 36
54-
AUGLAG_EQ = 37
55-
G_MLSL = 38
56-
G_MLSL_LDS = 39
57-
LD_SLSQP = 40
58-
LD_CCSAQ = 41
59-
GN_ESCH = 42
60-
GN_AGS = 43
28+
@static if _is_version_newer_than_2_9()
29+
@enum Algorithm::Cint begin
30+
GN_DIRECT = 0
31+
GN_DIRECT_L
32+
GN_DIRECT_L_RAND
33+
GN_DIRECT_NOSCAL
34+
GN_DIRECT_L_NOSCAL
35+
GN_DIRECT_L_RAND_NOSCAL
36+
GN_ORIG_DIRECT
37+
GN_ORIG_DIRECT_L
38+
GD_STOGO
39+
GD_STOGO_RAND
40+
# LD_LBFGS_NOCEDAL
41+
LD_LBFGS
42+
LN_PRAXIS
43+
LD_VAR1
44+
LD_VAR2
45+
LD_TNEWTON
46+
LD_TNEWTON_RESTART
47+
LD_TNEWTON_PRECOND
48+
LD_TNEWTON_PRECOND_RESTART
49+
GN_CRS2_LM
50+
GN_MLSL
51+
GD_MLSL
52+
GN_MLSL_LDS
53+
GD_MLSL_LDS
54+
LD_MMA
55+
LN_COBYLA
56+
LN_NEWUOA
57+
LN_NEWUOA_BOUND
58+
LN_NELDERMEAD
59+
LN_SBPLX
60+
LN_AUGLAG
61+
LD_AUGLAG
62+
LN_AUGLAG_EQ
63+
LD_AUGLAG_EQ
64+
LN_BOBYQA
65+
GN_ISRES
66+
AUGLAG
67+
AUGLAG_EQ
68+
G_MLSL
69+
G_MLSL_LDS
70+
LD_SLSQP
71+
LD_CCSAQ
72+
GN_ESCH
73+
GN_AGS
74+
end
75+
else
76+
@enum Algorithm::Cint begin
77+
GN_DIRECT = 0
78+
GN_DIRECT_L
79+
GN_DIRECT_L_RAND
80+
GN_DIRECT_NOSCAL
81+
GN_DIRECT_L_NOSCAL
82+
GN_DIRECT_L_RAND_NOSCAL
83+
GN_ORIG_DIRECT
84+
GN_ORIG_DIRECT_L
85+
GD_STOGO
86+
GD_STOGO_RAND
87+
LD_LBFGS_NOCEDAL
88+
LD_LBFGS
89+
LN_PRAXIS
90+
LD_VAR1
91+
LD_VAR2
92+
LD_TNEWTON
93+
LD_TNEWTON_RESTART
94+
LD_TNEWTON_PRECOND
95+
LD_TNEWTON_PRECOND_RESTART
96+
GN_CRS2_LM
97+
GN_MLSL
98+
GD_MLSL
99+
GN_MLSL_LDS
100+
GD_MLSL_LDS
101+
LD_MMA
102+
LN_COBYLA
103+
LN_NEWUOA
104+
LN_NEWUOA_BOUND
105+
LN_NELDERMEAD
106+
LN_SBPLX
107+
LN_AUGLAG
108+
LD_AUGLAG
109+
LN_AUGLAG_EQ
110+
LD_AUGLAG_EQ
111+
LN_BOBYQA
112+
GN_ISRES
113+
AUGLAG
114+
AUGLAG_EQ
115+
G_MLSL
116+
G_MLSL_LDS
117+
LD_SLSQP
118+
LD_CCSAQ
119+
GN_ESCH
120+
GN_AGS
121+
end
61122
end
62123

63124
Base.convert(::Type{nlopt_algorithm}, a::Algorithm) = nlopt_algorithm(Int(a))

Diff for: src/libnlopt.jl

+96-46
Original file line numberDiff line numberDiff line change
@@ -16,52 +16,102 @@ const nlopt_mfunc = Ptr{Cvoid}
1616
# typedef void ( * nlopt_precond ) ( unsigned n , const double * x , const double * v , double * vpre , void * data )
1717
const nlopt_precond = Ptr{Cvoid}
1818

19-
@cenum nlopt_algorithm::UInt32 begin
20-
NLOPT_GN_DIRECT = 0
21-
NLOPT_GN_DIRECT_L = 1
22-
NLOPT_GN_DIRECT_L_RAND = 2
23-
NLOPT_GN_DIRECT_NOSCAL = 3
24-
NLOPT_GN_DIRECT_L_NOSCAL = 4
25-
NLOPT_GN_DIRECT_L_RAND_NOSCAL = 5
26-
NLOPT_GN_ORIG_DIRECT = 6
27-
NLOPT_GN_ORIG_DIRECT_L = 7
28-
NLOPT_GD_STOGO = 8
29-
NLOPT_GD_STOGO_RAND = 9
30-
NLOPT_LD_LBFGS_NOCEDAL = 10
31-
NLOPT_LD_LBFGS = 11
32-
NLOPT_LN_PRAXIS = 12
33-
NLOPT_LD_VAR1 = 13
34-
NLOPT_LD_VAR2 = 14
35-
NLOPT_LD_TNEWTON = 15
36-
NLOPT_LD_TNEWTON_RESTART = 16
37-
NLOPT_LD_TNEWTON_PRECOND = 17
38-
NLOPT_LD_TNEWTON_PRECOND_RESTART = 18
39-
NLOPT_GN_CRS2_LM = 19
40-
NLOPT_GN_MLSL = 20
41-
NLOPT_GD_MLSL = 21
42-
NLOPT_GN_MLSL_LDS = 22
43-
NLOPT_GD_MLSL_LDS = 23
44-
NLOPT_LD_MMA = 24
45-
NLOPT_LN_COBYLA = 25
46-
NLOPT_LN_NEWUOA = 26
47-
NLOPT_LN_NEWUOA_BOUND = 27
48-
NLOPT_LN_NELDERMEAD = 28
49-
NLOPT_LN_SBPLX = 29
50-
NLOPT_LN_AUGLAG = 30
51-
NLOPT_LD_AUGLAG = 31
52-
NLOPT_LN_AUGLAG_EQ = 32
53-
NLOPT_LD_AUGLAG_EQ = 33
54-
NLOPT_LN_BOBYQA = 34
55-
NLOPT_GN_ISRES = 35
56-
NLOPT_AUGLAG = 36
57-
NLOPT_AUGLAG_EQ = 37
58-
NLOPT_G_MLSL = 38
59-
NLOPT_G_MLSL_LDS = 39
60-
NLOPT_LD_SLSQP = 40
61-
NLOPT_LD_CCSAQ = 41
62-
NLOPT_GN_ESCH = 42
63-
NLOPT_GN_AGS = 43
64-
NLOPT_NUM_ALGORITHMS = 44
19+
@static if _is_version_newer_than_2_9()
20+
@cenum nlopt_algorithm::UInt32 begin
21+
NLOPT_GN_DIRECT = 0
22+
NLOPT_GN_DIRECT_L
23+
NLOPT_GN_DIRECT_L_RAND
24+
NLOPT_GN_DIRECT_NOSCAL
25+
NLOPT_GN_DIRECT_L_NOSCAL
26+
NLOPT_GN_DIRECT_L_RAND_NOSCAL
27+
NLOPT_GN_ORIG_DIRECT
28+
NLOPT_GN_ORIG_DIRECT_L
29+
NLOPT_GD_STOGO
30+
NLOPT_GD_STOGO_RAND
31+
# NLOPT_LD_LBFGS_NOCEDAL = 10
32+
NLOPT_LD_LBFGS
33+
NLOPT_LN_PRAXIS
34+
NLOPT_LD_VAR1
35+
NLOPT_LD_VAR2
36+
NLOPT_LD_TNEWTON
37+
NLOPT_LD_TNEWTON_RESTART
38+
NLOPT_LD_TNEWTON_PRECOND
39+
NLOPT_LD_TNEWTON_PRECOND_RESTART
40+
NLOPT_GN_CRS2_LM
41+
NLOPT_GN_MLSL
42+
NLOPT_GD_MLSL
43+
NLOPT_GN_MLSL_LDS
44+
NLOPT_GD_MLSL_LDS
45+
NLOPT_LD_MMA
46+
NLOPT_LN_COBYLA
47+
NLOPT_LN_NEWUOA
48+
NLOPT_LN_NEWUOA_BOUND
49+
NLOPT_LN_NELDERMEAD
50+
NLOPT_LN_SBPLX
51+
NLOPT_LN_AUGLAG
52+
NLOPT_LD_AUGLAG
53+
NLOPT_LN_AUGLAG_EQ
54+
NLOPT_LD_AUGLAG_EQ
55+
NLOPT_LN_BOBYQA
56+
NLOPT_GN_ISRES
57+
NLOPT_AUGLAG
58+
NLOPT_AUGLAG_EQ
59+
NLOPT_G_MLSL
60+
NLOPT_G_MLSL_LDS
61+
NLOPT_LD_SLSQP
62+
NLOPT_LD_CCSAQ
63+
NLOPT_GN_ESCH
64+
NLOPT_GN_AGS
65+
NLOPT_NUM_ALGORITHMS
66+
end
67+
else
68+
@cenum nlopt_algorithm::UInt32 begin
69+
NLOPT_GN_DIRECT = 0
70+
NLOPT_GN_DIRECT_L
71+
NLOPT_GN_DIRECT_L_RAND
72+
NLOPT_GN_DIRECT_NOSCAL
73+
NLOPT_GN_DIRECT_L_NOSCAL
74+
NLOPT_GN_DIRECT_L_RAND_NOSCAL
75+
NLOPT_GN_ORIG_DIRECT
76+
NLOPT_GN_ORIG_DIRECT_L
77+
NLOPT_GD_STOGO
78+
NLOPT_GD_STOGO_RAND
79+
NLOPT_LD_LBFGS_NOCEDAL # This one exists
80+
NLOPT_LD_LBFGS
81+
NLOPT_LN_PRAXIS
82+
NLOPT_LD_VAR1
83+
NLOPT_LD_VAR2
84+
NLOPT_LD_TNEWTON
85+
NLOPT_LD_TNEWTON_RESTART
86+
NLOPT_LD_TNEWTON_PRECOND
87+
NLOPT_LD_TNEWTON_PRECOND_RESTART
88+
NLOPT_GN_CRS2_LM
89+
NLOPT_GN_MLSL
90+
NLOPT_GD_MLSL
91+
NLOPT_GN_MLSL_LDS
92+
NLOPT_GD_MLSL_LDS
93+
NLOPT_LD_MMA
94+
NLOPT_LN_COBYLA
95+
NLOPT_LN_NEWUOA
96+
NLOPT_LN_NEWUOA_BOUND
97+
NLOPT_LN_NELDERMEAD
98+
NLOPT_LN_SBPLX
99+
NLOPT_LN_AUGLAG
100+
NLOPT_LD_AUGLAG
101+
NLOPT_LN_AUGLAG_EQ
102+
NLOPT_LD_AUGLAG_EQ
103+
NLOPT_LN_BOBYQA
104+
NLOPT_GN_ISRES
105+
NLOPT_AUGLAG
106+
NLOPT_AUGLAG_EQ
107+
NLOPT_G_MLSL
108+
NLOPT_G_MLSL_LDS
109+
NLOPT_LD_SLSQP
110+
NLOPT_LD_CCSAQ
111+
NLOPT_GN_ESCH
112+
NLOPT_GN_AGS
113+
NLOPT_NUM_ALGORITHMS
114+
end
65115
end
66116

67117
function nlopt_algorithm_name(a)

Diff for: test/C_API.jl

+5-1
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,11 @@ function test_algorithm_name()
567567
sol = "Limited-memory BFGS (L-BFGS) (local, derivative-based)"
568568
@test algorithm_name(algorithm) == sol
569569
@test algorithm_name(:LD_LBFGS) == sol
570-
@test algorithm_name(11) == sol
570+
if NLopt._is_version_newer_than_2_9()
571+
@test algorithm_name(10) == sol
572+
else
573+
@test algorithm_name(11) == sol
574+
end
571575
opt = Opt(:LD_LBFGS, 2)
572576
@test algorithm_name(opt) == sol
573577
sprint(show, algorithm_name(:LD_LBFGS))

0 commit comments

Comments
 (0)