Skip to content

Commit e1bfb33

Browse files
committed
speed up by using filter! and disag. vars. Dict
1 parent f1be88a commit e1bfb33

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

src/hull.jl

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ function hull_reformulation!(constr::ConstraintRef{<:AbstractModel, MOI.Constrai
1616
m = constr.model
1717
i = args[2] #get disjunct index
1818
bin_var_ref = m[bin_var][i]
19-
#replace each variable with its disaggregated version
20-
for var_ref in get_constraint_variables(constr)
19+
#replace each variable with its disaggregated version (skip disaggregated vars)
20+
for var_ref in filter!(!in(values(m.ext[:disaggregated_variables])), get_constraint_variables(constr))#setdiff(get_constraint_variables(constr), values(m.ext[:disaggregated_variables]))
2121
is_binary(var_ref) && continue #NOTE: binaries from nested disjunctions are not disaggregated and don't need to be swapped out
22-
var_ref in values(m.ext[:disaggregated_variables]) && continue #disaggregated variables are not touched
22+
# var_ref in values(m.ext[:disaggregated_variables]) && continue #disaggregated variables are not touched
2323
#get disaggregated variable reference
2424
var_name_i = name_disaggregated_variable(var_ref, bin_var, i)
25-
var_i_ref = variable_by_name(m, var_name_i)
25+
var_i_ref = m.ext[:disaggregated_variables][var_name_i] #NOTE: currently containerized variables are disaggregated individually, which makes this work and does not require using variable_by_name(m, var_name_i)
2626
#check var_ref is present in the constraint
2727
coeff = normalized_coefficient(constr, var_ref)
2828
iszero(coeff) && continue #if not present, skip
@@ -83,15 +83,15 @@ function disaggregate_variables(m::Model, disj, bin_var)
8383
#reformulate variables
8484
obj_dict = object_dictionary(m)
8585
bounds_dict = :variable_bounds_dict in keys(obj_dict) ? obj_dict[:variable_bounds_dict] : Dict() #NOTE: should pass as an keyword argument
86-
for var in var_refs
87-
is_binary(var) && continue #NOTE: don't disaggregate binary variables from nested disjunctions
88-
var in values(m.ext[:disaggregated_variables]) && continue #skip already disaggregated variables
86+
for var in filter!(!in(values(m.ext[:disaggregated_variables])), var_refs) #skip already disaggregated variables
87+
is_binary(var) && continue #NOTE: don't disaggregate binary variables (comes up when nesting disjunctions)
88+
# var in values(m.ext[:disaggregated_variables]) && continue #skip already disaggregated variables
8989
#define UB and LB
9090
LB, UB = get_bounds(var, bounds_dict)
9191
#disaggregate variable and add bounding constraints
9292
sum_vars = AffExpr(0) #initialize sum of disaggregated variables
9393
for i in eachindex(disj)
94-
var_name_i_str = name_disaggregated_variable(var,bin_var,i)
94+
var_name_i_str = name_disaggregated_variable(var, bin_var, i)
9595
var_name_i = Symbol(var_name_i_str)
9696
#create disaggregated variable
9797
var_i = add_disaggregated_variable(m, var, LB, UB, var_name_i_str)
@@ -128,6 +128,9 @@ Disaggregate a variable block stored in an Array or DenseAxisArray.
128128
add_disaggregated_variable(m::Model, var::Containers.SparseAxisArray, LB, UB, base_name)
129129
130130
Disaggregate a variable block stored in a SparseAxisArray.
131+
132+
NOTE: Because of the way variables are currently disaggregated (a list is made of all associated VariableRefs in the disjunction),
133+
only the first function is used (not the containered ones).
131134
"""
132135
function add_disaggregated_variable(m::Model, var::VariableRef, LB, UB, base_name)
133136
@variable(
@@ -139,6 +142,9 @@ function add_disaggregated_variable(m::Model, var::VariableRef, LB, UB, base_nam
139142
base_name = base_name
140143
)
141144
end
145+
#################################################################################################
146+
# NOT USED CURRENTLY
147+
#################################################################################################
142148
function add_disaggregated_variable(m::Model, var::AbstractArray{VariableRef}, LB, UB, base_name)
143149
idxs = Iterators.product(axes(var)...)
144150
var_i_array = [
@@ -153,7 +159,8 @@ function add_disaggregated_variable(m::Model, var::Containers.SparseAxisArray, L
153159
idx => add_disaggregated_variable(m, var[idx], LB[idx], UB[idx], "$base_name[$(join(idx,","))]")
154160
for idx in idxs
155161
)
156-
return Containers.SparseAxisArray(var_i_dict)
162+
return containerize(var, var_i_dict)
157163
end
158164
containerize(var::Array, arr) = arr
159-
containerize(var::Containers.DenseAxisArray, arr) = Containers.DenseAxisArray(arr, axes(var)...)
165+
containerize(var::Containers.DenseAxisArray, arr) = Containers.DenseAxisArray(arr, axes(var)...)
166+
containerize(var::Containers.SparseAxisArray, arr::Dict) = Containers.SparseAxisArray(var)

0 commit comments

Comments
 (0)