@@ -77,6 +77,22 @@ function test_aggregate_variable()
77
77
@test refcons[1 ]. set == MOI. EqualTo (0. )
78
78
end
79
79
80
+ function test_disaggregate_expression_var ()
81
+ model = GDPModel ()
82
+ @variable (model, 10 <= x <= 100 )
83
+ @variable (model, z, Logical)
84
+ DP. _reformulate_logical_variables (model)
85
+ bvrefs = DP. _indicator_to_binary (model)
86
+
87
+ vrefs = Set ([x])
88
+ method = DP. _Hull (Hull (1e-3 , Dict (x => (0. , 100. ))), vrefs)
89
+ DP. _disaggregate_variables (model, z, vrefs, method)
90
+
91
+ refexpr = DP. _disaggregate_expression (model, x, bvrefs[z], method)
92
+ x_z = variable_by_name (model, " x_z" )
93
+ @test refexpr == x_z
94
+ end
95
+
80
96
function test_disaggregate_expression_var_binary ()
81
97
model = GDPModel ()
82
98
@variable (model, x, Bin)
@@ -93,7 +109,7 @@ function test_disaggregate_expression_var_binary()
93
109
@test refexpr == x
94
110
end
95
111
96
- function test_disaggregate_expression_var ()
112
+ function test_disaggregate_expression_affine ()
97
113
model = GDPModel ()
98
114
@variable (model, 10 <= x <= 100 )
99
115
@variable (model, z, Logical)
@@ -104,26 +120,28 @@ function test_disaggregate_expression_var()
104
120
method = DP. _Hull (Hull (1e-3 , Dict (x => (0. , 100. ))), vrefs)
105
121
DP. _disaggregate_variables (model, z, vrefs, method)
106
122
107
- refexpr = DP. _disaggregate_expression (model, x , bvrefs[z], method)
123
+ refexpr = DP. _disaggregate_expression (model, 2 x + 1 , bvrefs[z], method)
108
124
x_z = variable_by_name (model, " x_z" )
109
- @test refexpr == x_z
125
+ zbin = variable_by_name (model, " z" )
126
+ @test refexpr == 2 x_z + 1 zbin
110
127
end
111
128
112
- function test_disaggregate_expression_affine ()
129
+ function test_disaggregate_expression_affine_mip ()
113
130
model = GDPModel ()
114
131
@variable (model, 10 <= x <= 100 )
132
+ @variable (model, y, Bin)
115
133
@variable (model, z, Logical)
116
134
DP. _reformulate_logical_variables (model)
117
135
bvrefs = DP. _indicator_to_binary (model)
118
136
119
- vrefs = Set ([x])
120
- method = DP. _Hull (Hull (1e-3 , Dict (x => (0. , 100. ))), vrefs)
137
+ vrefs = Set ([x, y ])
138
+ method = DP. _Hull (Hull (1e-3 , Dict (x => (0. , 100. ), y => ( 0. , 1. ) )), vrefs)
121
139
DP. _disaggregate_variables (model, z, vrefs, method)
122
140
123
- refexpr = DP. _disaggregate_expression (model, 2 x + 1 , bvrefs[z], method)
141
+ refexpr = DP. _disaggregate_expression (model, 2 x + y + 1 , bvrefs[z], method)
124
142
x_z = variable_by_name (model, " x_z" )
125
143
zbin = variable_by_name (model, " z" )
126
- @test refexpr == 2 x_z + 1 zbin
144
+ @test refexpr == 2 x_z + y + 1 zbin
127
145
end
128
146
129
147
function test_disaggregate_expression_quadratic ()
@@ -176,7 +194,10 @@ function test_disaggregate_nl_expression_var_binary()
176
194
DP. _disaggregate_variables (model, z, vrefs, method)
177
195
178
196
refexpr = DP. _disaggregate_nl_expression (model, x, bvrefs[z], method)
179
- @test refexpr == x
197
+ ϵ = method. value
198
+ @test refexpr. head == :/
199
+ @test x in refexpr. args
200
+ @test (1 - ϵ)* bvrefs[z]+ ϵ in refexpr. args
180
201
end
181
202
182
203
function test_disaggregate_nl_expression_var ()
@@ -222,6 +243,33 @@ function test_disaggregate_nl_expression_aff()
222
243
@test (1 - ϵ)* zbin+ ϵ in arg2. args
223
244
end
224
245
246
+ function test_disaggregate_nl_expression_aff_mip ()
247
+ model = GDPModel ()
248
+ @variable (model, 10 <= x <= 100 )
249
+ @variable (model, y, Bin)
250
+ @variable (model, z, Logical)
251
+ DP. _reformulate_logical_variables (model)
252
+ bvrefs = DP. _indicator_to_binary (model)
253
+
254
+ vrefs = Set ([x,y])
255
+ method = DP. _Hull (Hull (1e-3 , Dict (x => (0. , 100. ), y => (0. , 1. ))), vrefs)
256
+ DP. _disaggregate_variables (model, z, vrefs, method)
257
+
258
+ refexpr = DP. _disaggregate_nl_expression (model, 2 x + y + 1 , bvrefs[z], method)
259
+ flatten! (refexpr)
260
+ x_z = variable_by_name (model, " x_z" )
261
+ zbin = variable_by_name (model, " z" )
262
+ ϵ = method. value
263
+ @test refexpr. head == :+
264
+ @test 1 in refexpr. args
265
+ args2 = setdiff (refexpr. args, [1 ])
266
+ for arg in args2
267
+ @test arg. head == :/
268
+ @test 2 x_z in arg. args || 1 y in arg. args
269
+ @test (1 - ϵ)* zbin+ ϵ in arg. args
270
+ end
271
+ end
272
+
225
273
function test_disaggregate_nl_expression_quad ()
226
274
model = GDPModel ()
227
275
@variable (model, 10 <= x <= 100 )
@@ -596,14 +644,16 @@ end
596
644
test_query_variable_bounds_error2 ()
597
645
test_disaggregate_variables ()
598
646
test_aggregate_variable ()
599
- test_disaggregate_expression_var_binary ()
600
647
test_disaggregate_expression_var ()
648
+ test_disaggregate_expression_var_binary ()
601
649
test_disaggregate_expression_affine ()
650
+ test_disaggregate_expression_affine_mip ()
602
651
test_disaggregate_expression_quadratic ()
603
652
test_disaggregate_nl_expression_c ()
604
- test_disaggregate_nl_expression_var_binary ()
605
653
test_disaggregate_nl_expression_var ()
654
+ test_disaggregate_nl_expression_var_binary ()
606
655
test_disaggregate_nl_expression_aff ()
656
+ test_disaggregate_nl_expression_aff_mip ()
607
657
test_disaggregate_nl_expression_quad ()
608
658
test_disaggregate_nl_expession ()
609
659
for s in (MOI. LessThan, MOI. GreaterThan, MOI. EqualTo)
0 commit comments