@@ -304,60 +304,26 @@ function _write_rows(
304
304
return
305
305
end
306
306
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
-
334
307
function write_rows (io:: IO , model:: Model )
335
308
println (io, " ROWS" )
336
309
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" )
361
327
return
362
328
end
363
329
@@ -488,29 +454,60 @@ function write_columns(io::IO, model::Model, flip_obj, var_to_column)
488
454
# Build constraint coefficients
489
455
# The functions and sets are given explicitly so that this function is
490
456
# 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,
505
471
IndicatorLessThanTrue{Float64},
472
+ var_to_column,
473
+ coefficients,
474
+ indicators,
475
+ )
476
+ _collect_indicator (
477
+ model,
506
478
IndicatorLessThanFalse{Float64},
479
+ var_to_column,
480
+ coefficients,
481
+ indicators,
482
+ )
483
+ _collect_indicator (
484
+ model,
507
485
IndicatorGreaterThanTrue{Float64},
486
+ var_to_column,
487
+ coefficients,
488
+ indicators,
489
+ )
490
+ _collect_indicator (
491
+ model,
508
492
IndicatorGreaterThanFalse{Float64},
493
+ var_to_column,
494
+ coefficients,
495
+ indicators,
496
+ )
497
+ _collect_indicator (
498
+ model,
509
499
IndicatorEqualToTrue{Float64},
500
+ var_to_column,
501
+ coefficients,
502
+ indicators,
503
+ )
504
+ _collect_indicator (
505
+ model,
510
506
IndicatorEqualToFalse{Float64},
507
+ var_to_column,
508
+ coefficients,
509
+ indicators,
511
510
)
512
- _collect_indicator (model, S, var_to_column, coefficients, indicators)
513
- end
514
511
# Build objective
515
512
constant =
516
513
_extract_terms_objective (model, var_to_column, coefficients, flip_obj)
@@ -597,30 +594,23 @@ end
597
594
598
595
function write_rhs (io:: IO , model:: Model , obj_const)
599
596
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})
624
614
# Objective constants are added to the RHS as a negative offset.
625
615
# https://www.ibm.com/docs/en/icos/20.1.0?topic=standard-records-in-mps-format
626
616
if ! iszero (obj_const)
@@ -768,15 +758,11 @@ function write_bounds(io::IO, model::Model, var_to_column)
768
758
options = get_options (model)
769
759
println (io, " BOUNDS" )
770
760
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)
780
766
for (variable, column) in var_to_column
781
767
var_name = _var_name (model, variable, column, options. generic_names)
782
768
lower, upper, vtype = bounds[column]
0 commit comments