Skip to content

Commit d5937eb

Browse files
committed
fix bugs to make more robust
1 parent 6a858da commit d5937eb

File tree

3 files changed

+28
-13
lines changed

3 files changed

+28
-13
lines changed

src/constraint.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ function check_constraint!(m::Model, constr_j::Tuple, constr_list::Vector)
3030
map(constr_jk -> check_constraint!(m, constr_jk, constr_list), constr_j)
3131
end
3232
function check_constraint!(m::Model, constr_j::AbstractArray, constr_list::Vector)
33+
map(constr_jk -> check_constraint!(m, constr_jk, constr_list), constr_j)
34+
end
35+
function check_constraint!(m::Model, constr_j::AbstractArray{<:ConstraintRef}, constr_list::Vector)
3336
push!(constr_list, check_constraint!(m, constr_j))
3437
end
3538
function check_constraint!(m::Model, constr_j::ConstraintRef, constr_list::Vector)
@@ -45,7 +48,7 @@ function check_constraint!(m::Model, constr::ConstraintRef)
4548
end
4649
return new_constr
4750
end
48-
function check_constraint!(m::Model, constr::AbstractArray)
51+
function check_constraint!(m::Model, constr::AbstractArray{<:ConstraintRef})
4952
@assert all(is_valid.(m, constr)) "$constr is not a valid constraint."
5053
if !any(is_interval.(constr)) && !any(is_equalto.(constr))
5154
new_constr = constr

src/reformulate.jl

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,15 @@ function reformulate_disjunction(m::Model, disj...; bin_var, reformulation, para
1717
if reformulation == :hull
1818
disaggregate_variables(m, disj, bin_var)
1919
end
20-
_reformulate_disjunction(disj, bin_var, reformulation, param)
21-
for item in filter(is_constraint, disj)
22-
if item isa ConstraintRef
23-
push!(m.ext[bin_var], item)
24-
else
25-
append!(m.ext[bin_var], item)
26-
end
27-
end
28-
# NOTE: Next line files when a disjunct has a single ConstraintRef since iterate is not defined for this type
29-
# push!(m.ext[bin_var], Iterators.flatten(filter(is_constraint, disj))...)
20+
reformulate_disjunction(m, disj, bin_var, reformulation, param)
3021
end
31-
function _reformulate_disjunction(disj, bin_var, reformulation, param)
22+
function reformulate_disjunction(m::Model, disj, bin_var, reformulation, param)
3223
for (i,constr) in enumerate(disj)
3324
reformulate_constraint(constr, bin_var, reformulation, param, i)
3425
end
26+
update_constraint_list!(disj, m.ext[bin_var])
27+
# NOTE: Next line files when a disjunct has a single ConstraintRef since iterate is not defined for this type
28+
# push!(m.ext[bin_var], Iterators.flatten(filter(is_constraint, disj))...)
3529
end
3630

3731
"""

src/utils.jl

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,4 +206,22 @@ Check if a constraint or tuple of constraints is valid.
206206
is_constraint(constr::ConstraintRef) = is_valid(constr.model,constr)
207207
is_constraint(constr::AbstractArray) = all(is_constraint.(constr))
208208
is_constraint(constr::Tuple) = all(is_constraint.(constr))
209-
is_constraint(constr::Nothing) = false
209+
is_constraint(constr::Nothing) = false
210+
211+
"""
212+
update_constraint_list!(disj, list::Vector)
213+
214+
Update constraint list (for disjunction constraints stored in .ext Dict)
215+
"""
216+
function update_constraint_list!(disj, list::Vector)
217+
disj_constraints = filter(is_constraint, disj)
218+
for item in disj_constraints
219+
update_constraint_list!(item, list)
220+
end
221+
end
222+
function update_constraint_list!(item::AbstractArray{<:ConstraintRef}, list::Vector)
223+
for idx in eachindex(item)
224+
update_constraint_list!(item[idx], list)
225+
end
226+
end
227+
update_constraint_list!(item::ConstraintRef, list::Vector) = push!(list, item)

0 commit comments

Comments
 (0)