@@ -304,60 +304,26 @@ function _write_rows(
304304 return
305305end
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-
334307function 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
362328end
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
598595function 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