Skip to content

Commit d364d1d

Browse files
authored
[FileFormats.MPS] fix parsing of OBJSENSE (#2016)
1 parent 2708cb2 commit d364d1d

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

src/FileFormats/MPS/MPS.jl

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,7 +1050,7 @@ function Headers(s::AbstractString)
10501050
if (x == 'I' || x == 'i') && uppercase(s) == "INDICATORS"
10511051
return HEADER_INDICATORS
10521052
end
1053-
elseif N == 12
1053+
elseif N == 8 || N == 12
10541054
if (x == 'O' || x == 'o') && startswith(uppercase(s), "OBJSENSE")
10551055
return HEADER_OBJSENSE
10561056
end
@@ -1092,10 +1092,13 @@ function Base.read!(io::IO, model::Model)
10921092
h = Headers(line)
10931093
if h == HEADER_OBJSENSE
10941094
items = line_to_items(line)
1095-
@assert length(items) == 2
1096-
sense = uppercase(items[2])
1097-
@assert sense == "MAX" || sense == "MIN"
1098-
data.is_minimization = sense == "MIN"
1095+
if length(items) == 2
1096+
sense = uppercase(items[2])
1097+
@assert sense == "MAX" || sense == "MIN"
1098+
data.is_minimization = sense == "MIN"
1099+
else
1100+
header = HEADER_OBJSENSE
1101+
end
10991102
continue
11001103
elseif h == HEADER_QCMATRIX || h == HEADER_QSECTION
11011104
items = line_to_items(line)
@@ -1114,6 +1117,11 @@ function Base.read!(io::IO, model::Model)
11141117
items = line_to_items(line)
11151118
if header == HEADER_NAME
11161119
parse_name_line(data, items)
1120+
elseif header == HEADER_OBJSENSE
1121+
@assert length(items) == 1
1122+
sense = uppercase(items[1])
1123+
@assert sense == "MAX" || sense == "MIN"
1124+
data.is_minimization = sense == "MIN"
11171125
elseif header == HEADER_ROWS
11181126
multi_obj = parse_rows_line(data, items)
11191127
if multi_obj !== nothing

test/FileFormats/MPS/MPS.jl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,43 @@ function test_vector_supports_constraint()
953953
return
954954
end
955955

956+
function test_objsense_next_line()
957+
for (sense, enum) in [("MIN", MOI.MIN_SENSE), ("MAX", MOI.MAX_SENSE)]
958+
io = IOBuffer()
959+
write(
960+
io,
961+
"""
962+
NAME model
963+
OBJSENSE
964+
$sense
965+
ROWS
966+
N Obj
967+
""",
968+
)
969+
seekstart(io)
970+
model = MPS.Model()
971+
Base.read!(io, model)
972+
@test MOI.get(model, MOI.ObjectiveSense()) == enum
973+
end
974+
for (sense, enum) in [("MIN", MOI.MIN_SENSE), ("MAX", MOI.MAX_SENSE)]
975+
io = IOBuffer()
976+
write(
977+
io,
978+
"""
979+
NAME model
980+
OBJSENSE $sense
981+
ROWS
982+
N Obj
983+
""",
984+
)
985+
seekstart(io)
986+
model = MPS.Model()
987+
Base.read!(io, model)
988+
@test MOI.get(model, MOI.ObjectiveSense()) == enum
989+
end
990+
return
991+
end
992+
956993
function runtests()
957994
for name in names(@__MODULE__, all = true)
958995
if startswith("$(name)", "test_")

0 commit comments

Comments
 (0)