Skip to content

Commit 3f64195

Browse files
authored
[FileFormats.MPS] remove unroll macro (#2632)
1 parent 817b89d commit 3f64195

File tree

1 file changed

+86
-100
lines changed

1 file changed

+86
-100
lines changed

src/FileFormats/MPS/MPS.jl

Lines changed: 86 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -304,60 +304,26 @@ function _write_rows(
304304
return
305305
end
306306

307-
_code_replace(x, ::Any) = x
308-
309-
_code_replace(x::Symbol, ret::Pair) = ifelse(first(ret) == x, last(ret), x)
310-
311-
function _code_replace(x::Expr, ret::Pair)
312-
for i in 1:length(x.args)
313-
x.args[i] = _code_replace(x.args[i], ret)
314-
end
315-
return x
316-
end
317-
318-
macro _unroll(input)
319-
@assert Meta.isexpr(input, :for)
320-
head, body = input.args
321-
ret = quote end
322-
for arg in head.args[2].args
323-
push!(ret.args, _code_replace(copy(body), head.args[1] => arg))
324-
end
325-
return esc(ret)
326-
end
327-
328-
_sense(::Type{MOI.LessThan{Float64}}) = "L"
329-
_sense(::Type{MOI.GreaterThan{Float64}}) = "G"
330-
_sense(::Type{MOI.EqualTo{Float64}}) = "E"
331-
_sense(::Type{MOI.Interval{Float64}}) = "L"
332-
_sense(::Type{MOI.Indicator{A,S}}) where {A,S} = _sense(S)
333-
334307
function write_rows(io::IO, model::Model)
335308
println(io, "ROWS")
336309
println(io, Card(f1 = "N", f2 = "OBJ"))
337-
@_unroll for S in (
338-
MOI.LessThan{Float64},
339-
MOI.GreaterThan{Float64},
340-
MOI.EqualTo{Float64},
341-
MOI.Interval{Float64},
342-
)
343-
@_unroll for F in (
344-
MOI.ScalarAffineFunction{Float64},
345-
MOI.ScalarQuadraticFunction{Float64},
346-
)
347-
_write_rows(io, model, F, S, _sense(S))
348-
end
349-
end
350-
F = MOI.VectorAffineFunction{Float64}
351-
@_unroll for S in (
352-
IndicatorLessThanTrue{Float64},
353-
IndicatorLessThanFalse{Float64},
354-
IndicatorGreaterThanTrue{Float64},
355-
IndicatorGreaterThanFalse{Float64},
356-
IndicatorEqualToTrue{Float64},
357-
IndicatorEqualToFalse{Float64},
358-
)
359-
_write_rows(io, model, F, S, _sense(S))
360-
end
310+
SAF = MOI.ScalarAffineFunction{Float64}
311+
SQF = MOI.ScalarQuadraticFunction{Float64}
312+
_write_rows(io, model, SAF, MOI.LessThan{Float64}, "L")
313+
_write_rows(io, model, SQF, MOI.LessThan{Float64}, "L")
314+
_write_rows(io, model, SAF, MOI.GreaterThan{Float64}, "G")
315+
_write_rows(io, model, SQF, MOI.GreaterThan{Float64}, "G")
316+
_write_rows(io, model, SAF, MOI.EqualTo{Float64}, "E")
317+
_write_rows(io, model, SQF, MOI.EqualTo{Float64}, "E")
318+
_write_rows(io, model, SAF, MOI.Interval{Float64}, "L")
319+
_write_rows(io, model, SQF, MOI.Interval{Float64}, "L")
320+
VAF = MOI.VectorAffineFunction{Float64}
321+
_write_rows(io, model, VAF, IndicatorLessThanTrue{Float64}, "L")
322+
_write_rows(io, model, VAF, IndicatorLessThanFalse{Float64}, "L")
323+
_write_rows(io, model, VAF, IndicatorGreaterThanTrue{Float64}, "G")
324+
_write_rows(io, model, VAF, IndicatorGreaterThanFalse{Float64}, "G")
325+
_write_rows(io, model, VAF, IndicatorEqualToTrue{Float64}, "E")
326+
_write_rows(io, model, VAF, IndicatorEqualToFalse{Float64}, "E")
361327
return
362328
end
363329

@@ -488,29 +454,60 @@ function write_columns(io::IO, model::Model, flip_obj, var_to_column)
488454
# Build constraint coefficients
489455
# The functions and sets are given explicitly so that this function is
490456
# type-stable.
491-
@_unroll for S in (
492-
MOI.LessThan{Float64},
493-
MOI.GreaterThan{Float64},
494-
MOI.EqualTo{Float64},
495-
MOI.Interval{Float64},
496-
)
497-
@_unroll for F in (
498-
MOI.ScalarAffineFunction{Float64},
499-
MOI.ScalarQuadraticFunction{Float64},
500-
)
501-
_collect_coefficients(model, F, S, var_to_column, coefficients)
502-
end
503-
end
504-
@_unroll for S in (
457+
SAF = MOI.ScalarAffineFunction{Float64}
458+
SQF = MOI.ScalarQuadraticFunction{Float64}
459+
LT, GT = MOI.LessThan{Float64}, MOI.GreaterThan{Float64}
460+
ET, IT = MOI.EqualTo{Float64}, MOI.Interval{Float64}
461+
_collect_coefficients(model, SAF, LT, var_to_column, coefficients)
462+
_collect_coefficients(model, SQF, LT, var_to_column, coefficients)
463+
_collect_coefficients(model, SAF, GT, var_to_column, coefficients)
464+
_collect_coefficients(model, SQF, GT, var_to_column, coefficients)
465+
_collect_coefficients(model, SAF, ET, var_to_column, coefficients)
466+
_collect_coefficients(model, SQF, ET, var_to_column, coefficients)
467+
_collect_coefficients(model, SAF, IT, var_to_column, coefficients)
468+
_collect_coefficients(model, SQF, IT, var_to_column, coefficients)
469+
_collect_indicator(
470+
model,
505471
IndicatorLessThanTrue{Float64},
472+
var_to_column,
473+
coefficients,
474+
indicators,
475+
)
476+
_collect_indicator(
477+
model,
506478
IndicatorLessThanFalse{Float64},
479+
var_to_column,
480+
coefficients,
481+
indicators,
482+
)
483+
_collect_indicator(
484+
model,
507485
IndicatorGreaterThanTrue{Float64},
486+
var_to_column,
487+
coefficients,
488+
indicators,
489+
)
490+
_collect_indicator(
491+
model,
508492
IndicatorGreaterThanFalse{Float64},
493+
var_to_column,
494+
coefficients,
495+
indicators,
496+
)
497+
_collect_indicator(
498+
model,
509499
IndicatorEqualToTrue{Float64},
500+
var_to_column,
501+
coefficients,
502+
indicators,
503+
)
504+
_collect_indicator(
505+
model,
510506
IndicatorEqualToFalse{Float64},
507+
var_to_column,
508+
coefficients,
509+
indicators,
511510
)
512-
_collect_indicator(model, S, var_to_column, coefficients, indicators)
513-
end
514511
# Build objective
515512
constant =
516513
_extract_terms_objective(model, var_to_column, coefficients, flip_obj)
@@ -597,30 +594,23 @@ end
597594

598595
function write_rhs(io::IO, model::Model, obj_const)
599596
println(io, "RHS")
600-
@_unroll for S in (
601-
MOI.LessThan{Float64},
602-
MOI.GreaterThan{Float64},
603-
MOI.EqualTo{Float64},
604-
MOI.Interval{Float64},
605-
)
606-
@_unroll for F in (
607-
MOI.ScalarAffineFunction{Float64},
608-
MOI.ScalarQuadraticFunction{Float64},
609-
)
610-
_write_rhs(io, model, F, S)
611-
end
612-
end
613-
F = MOI.VectorAffineFunction{Float64}
614-
@_unroll for S in (
615-
IndicatorLessThanTrue{Float64},
616-
IndicatorLessThanFalse{Float64},
617-
IndicatorGreaterThanTrue{Float64},
618-
IndicatorGreaterThanFalse{Float64},
619-
IndicatorEqualToTrue{Float64},
620-
IndicatorEqualToFalse{Float64},
621-
)
622-
_write_rhs(io, model, F, S)
623-
end
597+
SAF = MOI.ScalarAffineFunction{Float64}
598+
SQF = MOI.ScalarQuadraticFunction{Float64}
599+
_write_rhs(io, model, SAF, MOI.LessThan{Float64})
600+
_write_rhs(io, model, SQF, MOI.LessThan{Float64})
601+
_write_rhs(io, model, SAF, MOI.GreaterThan{Float64})
602+
_write_rhs(io, model, SQF, MOI.GreaterThan{Float64})
603+
_write_rhs(io, model, SAF, MOI.EqualTo{Float64})
604+
_write_rhs(io, model, SQF, MOI.EqualTo{Float64})
605+
_write_rhs(io, model, SAF, MOI.Interval{Float64})
606+
_write_rhs(io, model, SQF, MOI.Interval{Float64})
607+
VAF = MOI.VectorAffineFunction{Float64}
608+
_write_rhs(io, model, VAF, IndicatorLessThanTrue{Float64})
609+
_write_rhs(io, model, VAF, IndicatorLessThanFalse{Float64})
610+
_write_rhs(io, model, VAF, IndicatorGreaterThanTrue{Float64})
611+
_write_rhs(io, model, VAF, IndicatorGreaterThanFalse{Float64})
612+
_write_rhs(io, model, VAF, IndicatorEqualToTrue{Float64})
613+
_write_rhs(io, model, VAF, IndicatorEqualToFalse{Float64})
624614
# Objective constants are added to the RHS as a negative offset.
625615
# https://www.ibm.com/docs/en/icos/20.1.0?topic=standard-records-in-mps-format
626616
if !iszero(obj_const)
@@ -768,15 +758,11 @@ function write_bounds(io::IO, model::Model, var_to_column)
768758
options = get_options(model)
769759
println(io, "BOUNDS")
770760
bounds = [(-Inf, Inf, VTYPE_CONTINUOUS) for _ in 1:length(var_to_column)]
771-
@_unroll for S in (
772-
MOI.LessThan{Float64},
773-
MOI.GreaterThan{Float64},
774-
MOI.EqualTo{Float64},
775-
MOI.Interval{Float64},
776-
MOI.ZeroOne,
777-
)
778-
_collect_bounds(bounds, model, S, var_to_column)
779-
end
761+
_collect_bounds(bounds, model, MOI.LessThan{Float64}, var_to_column)
762+
_collect_bounds(bounds, model, MOI.GreaterThan{Float64}, var_to_column)
763+
_collect_bounds(bounds, model, MOI.EqualTo{Float64}, var_to_column)
764+
_collect_bounds(bounds, model, MOI.Interval{Float64}, var_to_column)
765+
_collect_bounds(bounds, model, MOI.ZeroOne, var_to_column)
780766
for (variable, column) in var_to_column
781767
var_name = _var_name(model, variable, column, options.generic_names)
782768
lower, upper, vtype = bounds[column]

0 commit comments

Comments
 (0)