@@ -19,7 +19,14 @@ struct SolFileResults <: MOI.ModelLike
1919end
2020
2121"""
22- SolFileResults(filename::String, model::Model)
22+ SolFileResults(
23+ filename::String,
24+ model::Model;
25+ suffix_lower_bound_duals::Vector{String} =
26+ ["ipopt_zL_out", "lower_bound_duals"],
27+ suffix_uuper_bound_duals::Vector{String} =
28+ ["ipopt_zU_out", "upper_bound_duals"],
29+ )
2330
2431Parse the `.sol` file `filename` created by solving `model` and return a
2532`SolFileResults` struct.
@@ -28,8 +35,8 @@ The returned struct supports the `MOI.get` API for querying result attributes
2835such as [`MOI.TerminationStatus`](@ref), [`MOI.VariablePrimal`](@ref), and
2936[`MOI.ConstraintDual`](@ref).
3037"""
31- function SolFileResults (filename:: String , model:: Model )
32- return open (io -> SolFileResults (io, model), filename, " r" )
38+ function SolFileResults (filename:: String , model:: Model ; kwargs ... )
39+ return open (io -> SolFileResults (io, model; kwargs ... ), filename, " r" )
3340end
3441
3542"""
@@ -46,7 +53,8 @@ All other attributes are un-set.
4653"""
4754function SolFileResults (
4855 raw_status:: String ,
49- termination_status:: MOI.TerminationStatusCode ,
56+ termination_status:: MOI.TerminationStatusCode ;
57+ kwargs... ,
5058)
5159 return SolFileResults (
5260 nothing ,
261269
262270_readline (io:: IO , T) = parse (T, _readline (io))
263271
264- function SolFileResults (io:: IO , model:: Model )
272+ function SolFileResults (
273+ io:: IO ,
274+ model:: Model ;
275+ suffix_lower_bound_duals:: Vector{String} = [
276+ " ipopt_zL_out" ,
277+ " lower_bound_duals" ,
278+ ],
279+ suffix_upper_bound_duals:: Vector{String} = [
280+ " ipopt_zU_out" ,
281+ " upper_bound_duals" ,
282+ ],
283+ )
265284 # This function is based on a Julia translation of readsol.c, available at
266285 # https://github.com/ampl/asl/blob/64919f75fa7a438f4b41bce892dcbe2ae38343ee/src/solvers/readsol.c
267286 # and under the following license:
@@ -345,21 +364,17 @@ function SolFileResults(io::IO, model::Model)
345364 items = split (line, " " )
346365 n_suffix = parse (Int, items[3 ])
347366 suffix = _readline (io)
348- if ! (suffix == " ipopt_zU_out" || suffix == " ipopt_zL_out" )
349- for _ in 1 : n_suffix
350- _ = readline (io)
351- end
352- continue
353- end
354367 for i in 1 : n_suffix
355- items = split (_readline (io), " " )
356- x = model. order[parse (Int, items[1 ])+ 1 ]
357- dual = parse (Float64, items[2 ])
358- if suffix == " ipopt_zU_out"
359- zU_out[x] = dual
368+ if suffix in suffix_upper_bound_duals
369+ items = split (_readline (io), " " )
370+ x = model. order[parse (Int, items[1 ])+ 1 ]
371+ zU_out[x] = parse (Float64, items[2 ])
372+ elseif suffix in suffix_lower_bound_duals
373+ items = split (_readline (io), " " )
374+ x = model. order[parse (Int, items[1 ])+ 1 ]
375+ zL_out[x] = parse (Float64, items[2 ])
360376 else
361- @assert suffix == " ipopt_zL_out"
362- zL_out[x] = dual
377+ _ = _readline (io)
363378 end
364379 end
365380 end
0 commit comments