Skip to content

Commit 4d0f337

Browse files
committed
fix bug in how m.ext is updated
1 parent 098c8d3 commit 4d0f337

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

src/reformulate.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ function reformulate_disjunction(m::Model, disj, bin_var, reformulation, param)
2626
for (i,constr) in enumerate(disj)
2727
reformulate_constraint(constr, bin_var, reformulation, param, i)
2828
end
29-
update_constraint_list!(disj, m.ext[bin_var])
29+
if reformulation == :big_m
30+
update_constraint_list!(disj, m.ext[bin_var])
31+
elseif reformulation == :hull
32+
update_constraint_list2!(disj, m.ext[bin_var])
33+
end
3034
end
3135

3236
"""

src/utils.jl

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ end
160160

161161
function name_disaggregated_variable(var_ref, bin_var, i)
162162
var_name = name(var_ref)
163-
var_name_i = "$(var_name)_$(bin_var)$i"
163+
var_name_i = "$(var_name)_$(bin_var)[$i]"
164164

165165
return var_name_i
166166
end
@@ -213,7 +213,8 @@ is_constraint(constr::Nothing) = false
213213
"""
214214
update_constraint_list!(disj, list::Vector)
215215
216-
Update constraint list (for disjunction constraints stored in .ext Dict)
216+
Update constraint list (for disjunction constraints stored in .ext Dict) for big-M reformulations.
217+
NOTE: for big-M reformulations, nonlinear constraints are added separately to the .ext Dict with `add_reformulated_constraint`.
217218
"""
218219
function update_constraint_list!(disj, list::Vector)
219220
disj_constraints = filter(!isnothing, disj) #remove any empty disjuncts
@@ -226,4 +227,27 @@ function update_constraint_list!(item::AbstractArray{<:ConstraintRef}, list::Vec
226227
update_constraint_list!(item[idx], list)
227228
end
228229
end
229-
update_constraint_list!(item::ConstraintRef, list::Vector) = push!(list, item)
230+
update_constraint_list!(item::ConstraintRef, list::Vector) = push!(list, item)
231+
update_constraint_list!(item::NonlinearConstraintRef, list::Vector) = nothing
232+
233+
"""
234+
update_constraint_list2!(disj, list::Vector)
235+
236+
Update constraint list (for disjunction constraints stored in .ext Dict) for hull reformulations.
237+
NOTE: for big-M reformulations, nonlinear/quadratic constraints are added separately to the .ext Dict with `add_reformulated_constraint`.
238+
"""
239+
function update_constraint_list2!(disj, list::Vector)
240+
disj_constraints = filter(!isnothing, disj) #remove any empty disjuncts
241+
for item in disj_constraints
242+
update_constraint_list2!(item, list)
243+
end
244+
end
245+
function update_constraint_list2!(item::AbstractArray{<:ConstraintRef}, list::Vector)
246+
for idx in eachindex(item)
247+
update_constraint_list2!(item[idx], list)
248+
end
249+
end
250+
function update_constraint_list2!(item::ConstraintRef{<:AbstractModel, MOI.ConstraintIndex{MOI.ScalarAffineFunction{T},V}}, list::Vector) where {T,V}
251+
push!(list, item)
252+
end
253+
update_constraint_list2!(item::ConstraintRef, list::Vector) = nothing

0 commit comments

Comments
 (0)