Skip to content

Commit 190997e

Browse files
authored
[FileFormats.NL] fix support for reading free constraints (#2392)
1 parent c6ca08d commit 190997e

File tree

3 files changed

+72
-8
lines changed

3 files changed

+72
-8
lines changed

src/FileFormats/NL/read.jl

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -194,13 +194,12 @@ function _to_model(data::_CacheModel; use_nlp_block::Bool)
194194
lb, ub = data.constraint_lower[i], data.constraint_upper[i]
195195
if lb == ub
196196
MOI.Nonlinear.add_constraint(nlp, expr, MOI.EqualTo(lb))
197-
elseif -Inf < lb < ub < Inf
198-
MOI.Nonlinear.add_constraint(nlp, expr, MOI.Interval(lb, ub))
199197
elseif -Inf == lb && ub < Inf
200198
MOI.Nonlinear.add_constraint(nlp, expr, MOI.LessThan(ub))
201-
else
202-
@assert -Inf < lb && ub == Inf
199+
elseif -Inf < lb && ub == Inf
203200
MOI.Nonlinear.add_constraint(nlp, expr, MOI.GreaterThan(lb))
201+
else
202+
MOI.Nonlinear.add_constraint(nlp, expr, MOI.Interval(lb, ub))
204203
end
205204
end
206205
evaluator =
@@ -217,13 +216,12 @@ function _to_model(data::_CacheModel; use_nlp_block::Bool)
217216
f = _to_scalar_nonlinear_function(expr)::MOI.ScalarNonlinearFunction
218217
if lb == ub
219218
MOI.add_constraint(model, f, MOI.EqualTo(lb))
220-
elseif -Inf < lb < ub < Inf
221-
MOI.add_constraint(model, f, MOI.Interval(lb, ub))
222219
elseif -Inf == lb && ub < Inf
223220
MOI.add_constraint(model, f, MOI.LessThan(ub))
224-
else
225-
@assert -Inf < lb && ub == Inf
221+
elseif -Inf < lb && ub == Inf
226222
MOI.add_constraint(model, f, MOI.GreaterThan(lb))
223+
else
224+
MOI.add_constraint(model, f, MOI.Interval(lb, ub))
227225
end
228226
end
229227
end
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
g3 1 1 0
2+
2 2 1 0 1 0
3+
2 1
4+
0 0
5+
2 0 0
6+
0 0 0 1
7+
0 0 0 0 0
8+
4 2
9+
0 0
10+
0 0 0 0 0
11+
C0
12+
o0
13+
v0
14+
v1
15+
C1
16+
o1
17+
v0
18+
v1
19+
O0 1
20+
n2
21+
r
22+
2 25
23+
3
24+
b
25+
3
26+
3
27+
k1
28+
1
29+
J0 2
30+
0 0
31+
1 0
32+
J1 2
33+
0 0
34+
1 0
35+
G0 2
36+
0 1
37+
1 1

test/FileFormats/NL/read.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,35 @@ function test_parse_header_integrality_both_int()
638638
return
639639
end
640640

641+
function test_hs071_free_constraint_nlexpr()
642+
model = NL.Model(; use_nlp_block = false)
643+
open(joinpath(@__DIR__, "data", "hs071_free_constraint.nl"), "r") do io
644+
return read!(io, model)
645+
end
646+
@test MOI.get(model, MOI.ListOfConstraintTypesPresent()) == [
647+
(MOI.ScalarNonlinearFunction, MOI.GreaterThan{Float64}),
648+
(MOI.ScalarNonlinearFunction, MOI.Interval{Float64}),
649+
]
650+
for (F, S) in MOI.get(model, MOI.ListOfConstraintTypesPresent())
651+
@test MOI.get(model, MOI.NumberOfConstraints{F,S}()) == 1
652+
end
653+
F, S = MOI.ScalarNonlinearFunction, MOI.Interval{Float64}
654+
ci = first(MOI.get(model, MOI.ListOfConstraintIndices{F,S}()))
655+
@test MOI.get(model, MOI.ConstraintSet(), ci) == MOI.Interval(-Inf, Inf)
656+
return
657+
end
658+
659+
function test_hs071_free_constraint()
660+
model = NL.Model()
661+
open(joinpath(@__DIR__, "data", "hs071_free_constraint.nl"), "r") do io
662+
return read!(io, model)
663+
end
664+
block = MOI.get(model, MOI.NLPBlock())
665+
@test block.constraint_bounds ==
666+
[MOI.NLPBoundsPair(25.0, Inf), MOI.NLPBoundsPair(-Inf, Inf)]
667+
return
668+
end
669+
641670
function test_no_objective()
642671
model = NL.Model()
643672
open(joinpath(@__DIR__, "data", "hs071_no_objective.nl"), "r") do io

0 commit comments

Comments
 (0)