@@ -62,6 +62,8 @@ function piecewiselinear(m::JuMP.Model, x::JuMP.Variable, pwl::UnivariatePWLFunc
62
62
JuMP. @constraint (m, sum (λ[i]* fd[i] for i in 1 : n) == z)
63
63
if method == :Logarithmic
64
64
sos2_logarthmic_formulation! (m, λ)
65
+ elseif method == :LogarithmicIB
66
+ sos2_logarthmic_IB_formulation! (m, λ)
65
67
elseif method == :CC
66
68
sos2_cc_formulation! (m, λ)
67
69
elseif method == :ZigZag
@@ -117,6 +119,25 @@ function sos2_logarthmic_formulation!(m::JuMP.Model, λ)
117
119
nothing
118
120
end
119
121
122
+ function sos2_logarthmic_IB_formulation! (m:: JuMP.Model , λ)
123
+ counter = m. ext[:PWL ]. counter
124
+ n = length (λ)- 1
125
+ k = ceil (Int,log2 (n))
126
+ y = JuMP. @variable (m, [1 : k], Bin, basename= " y_$counter " )
127
+ _H = reflected_gray_codes (k)
128
+ d = length (_H)
129
+ H = Dict (i => _H[i] for i in 1 : d)
130
+ H[0 ] = H[1 ]
131
+ H[d+ 1 ] = H[d]
132
+ for j in 1 : k
133
+ JuMP. @constraints (m, begin
134
+ sum (λ[i] for i in 1 : (n+ 1 ) if H[i- 1 ][j] == H[i][j] == 1 ) ≤ y[j]
135
+ sum (λ[i] for i in 1 : (n+ 1 ) if H[i- 1 ][j] == H[i][j] == 0 ) ≤ 1 - y[j]
136
+ end )
137
+ end
138
+ nothing
139
+ end
140
+
120
141
function sos2_zigzag_formulation! (m:: JuMP.Model , λ)
121
142
counter = m. ext[:PWL ]. counter
122
143
n = length (λ)- 1
@@ -470,21 +491,26 @@ function piecewiselinear(m::JuMP.Model, x₁::JuMP.Variable, x₂::JuMP.Variable
470
491
elseif method == :Incremental
471
492
error ()
472
493
else # formulations with SOS2 along each dimension
494
+ Tx = [sum (λ[tˣ,tʸ] for tˣ in 1 : nˣ) for tʸ in 1 : nʸ]
495
+ Ty = [sum (λ[tˣ,tʸ] for tʸ in 1 : nʸ) for tˣ in 1 : nˣ]
473
496
if method == :Logarithmic
474
- sos2_logarthmic_formulation! (m, [sum (λ[tˣ,tʸ] for tˣ in 1 : nˣ) for tʸ in 1 : nʸ])
475
- sos2_logarthmic_formulation! (m, [sum (λ[tˣ,tʸ] for tʸ in 1 : nʸ) for tˣ in 1 : nˣ])
497
+ sos2_logarthmic_formulation! (m, Tx)
498
+ sos2_logarthmic_formulation! (m, Ty)
499
+ elseif method == :LogarithmicIB
500
+ sos2_logarthmic_IB_formulation! (m, Tx)
501
+ sos2_logarthmic_IB_formulation! (m, Ty)
476
502
elseif method == :ZigZag
477
- sos2_zigzag_formulation! (m, [ sum (λ[tˣ,tʸ] for tˣ in 1 : nˣ) for tʸ in 1 : nʸ] )
478
- sos2_zigzag_formulation! (m, [ sum (λ[tˣ,tʸ] for tʸ in 1 : nʸ) for tˣ in 1 : nˣ] )
503
+ sos2_zigzag_formulation! (m, Tx )
504
+ sos2_zigzag_formulation! (m, Ty )
479
505
elseif method == :ZigZagInteger
480
- sos2_zigzag_general_integer_formulation! (m, [ sum (λ[tˣ,tʸ] for tˣ in 1 : nˣ) for tʸ in 1 : nʸ] )
481
- sos2_zigzag_general_integer_formulation! (m, [ sum (λ[tˣ,tʸ] for tʸ in 1 : nʸ) for tˣ in 1 : nˣ] )
506
+ sos2_zigzag_general_integer_formulation! (m, Tx )
507
+ sos2_zigzag_general_integer_formulation! (m, Ty )
482
508
elseif method == :GeneralizedCelaya
483
- sos2_generalized_celaya_formulation! (m, [ sum (λ[tˣ,tʸ] for tˣ in 1 : nˣ) for tʸ in 1 : nʸ] )
484
- sos2_generalized_celaya_formulation! (m, [ sum (λ[tˣ,tʸ] for tʸ in 1 : nʸ) for tˣ in 1 : nˣ] )
509
+ sos2_generalized_celaya_formulation! (m, Tx )
510
+ sos2_generalized_celaya_formulation! (m, Ty )
485
511
elseif method == :SymmetricCelaya
486
- sos2_symmetric_celaya_formulation! (m, [ sum (λ[tˣ,tʸ] for tˣ in 1 : nˣ) for tʸ in 1 : nʸ] )
487
- sos2_symmetric_celaya_formulation! (m, [ sum (λ[tˣ,tʸ] for tʸ in 1 : nʸ) for tˣ in 1 : nˣ] )
512
+ sos2_symmetric_celaya_formulation! (m, Tx )
513
+ sos2_symmetric_celaya_formulation! (m, Ty )
488
514
elseif method == :SOS2
489
515
γˣ = JuMP. @variable (m, [1 : nˣ], lowerbound= 0 , upperbound= 1 , basename= " γˣ_$counter " )
490
516
γʸ = JuMP. @variable (m, [1 : nʸ], lowerbound= 0 , upperbound= 1 , basename= " γʸ_$counter " )
0 commit comments