Skip to content

Commit 5915743

Browse files
authored
Fix unsafe array modifcation (#377)
1 parent ea7d2a9 commit 5915743

File tree

7 files changed

+14
-10
lines changed

7 files changed

+14
-10
lines changed

src/derivatives.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -815,15 +815,15 @@ function _delete_variable_dependencies(dref::DerivativeRef)::Nothing
815815
# delete any derivative constraints associated with this derivative
816816
delete_derivative_constraints(dref)
817817
# delete associated point variables and mapping
818-
for index in _point_variable_dependencies(dref)
818+
for index in copy(_point_variable_dependencies(dref))
819819
JuMP.delete(model, dispatch_variable_ref(model, index))
820820
end
821821
# delete associated semi-infinite variables and mapping
822-
for index in _semi_infinite_variable_dependencies(dref)
822+
for index in copy(_semi_infinite_variable_dependencies(dref))
823823
JuMP.delete(model, dispatch_variable_ref(model, index))
824824
end
825825
# delete associated derivative variables and mapping
826-
for index in _derivative_dependencies(dref)
826+
for index in copy(_derivative_dependencies(dref))
827827
JuMP.delete(model, dispatch_variable_ref(model, index))
828828
end
829829
return

src/infinite_variables.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -815,15 +815,15 @@ function _delete_variable_dependencies(vref::InfiniteVariableRef)
815815
end
816816
end
817817
# delete associated point variables and mapping
818-
for index in _point_variable_dependencies(vref)
818+
for index in copy(_point_variable_dependencies(vref))
819819
JuMP.delete(model, dispatch_variable_ref(model, index))
820820
end
821821
# delete associated semi-infinite variables and mapping
822-
for index in _semi_infinite_variable_dependencies(vref)
822+
for index in copy(_semi_infinite_variable_dependencies(vref))
823823
JuMP.delete(model, dispatch_variable_ref(model, index))
824824
end
825825
# delete associated derivative variables and mapping
826-
for index in _derivative_dependencies(vref)
826+
for index in copy(_derivative_dependencies(vref))
827827
JuMP.delete(model, dispatch_variable_ref(model, index))
828828
end
829829
return

src/measures.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1441,7 +1441,7 @@ function JuMP.delete(model::InfiniteModel, mref::MeasureRef)
14411441
end
14421442
end
14431443
# delete associated derivative variables and mapping
1444-
for index in _derivative_dependencies(mref)
1444+
for index in copy(_derivative_dependencies(mref))
14451445
JuMP.delete(model, dispatch_variable_ref(model, index))
14461446
end
14471447
# Update that the variables used by it are no longer used by it

src/scalar_parameters.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1719,7 +1719,7 @@ function JuMP.delete(model::InfiniteModel, pref::IndependentParameterRef)
17191719
# delete dependence of measures on pref
17201720
_update_measures(model, gvref)
17211721
# delete any derivatives that use pref
1722-
for index in _derivative_dependencies(pref)
1722+
for index in copy(_derivative_dependencies(pref))
17231723
JuMP.delete(model, dispatch_variable_ref(model, index))
17241724
end
17251725
# update constraints in mapping to remove the parameter

src/semi_infinite_variables.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,7 @@ function _delete_variable_dependencies(vref::SemiInfiniteVariableRef)::Nothing
812812
filter!(e -> e != JuMP.index(vref), _semi_infinite_variable_dependencies(ivref))
813813
# delete associated derivative variables and mapping
814814
model = JuMP.owner_model(vref)
815-
for index in _derivative_dependencies(vref)
815+
for index in copy(_derivative_dependencies(vref))
816816
JuMP.delete(model, dispatch_variable_ref(model, index))
817817
end
818818
# remove the lookup entry

src/variable_basics.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1101,7 +1101,7 @@ function JuMP.delete(model::InfiniteModel, vref::DecisionVariableRef)
11011101
_delete_variable_dependencies(vref)
11021102
gvref = GeneralVariableRef(model, JuMP.index(vref))
11031103
# remove from measures if used
1104-
for mindex in _measure_dependencies(vref)
1104+
for mindex in copy(_measure_dependencies(vref))
11051105
mref = dispatch_variable_ref(model, mindex)
11061106
func = measure_function(mref)
11071107
data = measure_data(mref)

test/deletion.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,7 @@ end
549549
@variable(m, 0 <= x <= 1, Infinite(par), Bin)
550550
@variable(m, y == 1, Infinite(par), Int)
551551
@variable(m, x0, Point(x, 0))
552+
@variable(m, xf, Point(x, 1))
552553
var = build_variable(error, x, Dict{Int, Float64}(1 => 0.5), check = false)
553554
rv = add_variable(m, var)
554555
data = TestData(par, 0, 1)
@@ -570,6 +571,7 @@ end
570571
@test InfiniteOpt._infinite_variable_dependencies(par) == [index(y)]
571572
@test !is_valid(m, rv)
572573
@test !is_valid(m, x0)
574+
@test !is_valid(m, xf)
573575
@test !is_valid(m, d1)
574576
@test !haskey(InfiniteOpt._data_dictionary(m, InfiniteVariable), JuMP.index(x))
575577
@test !is_valid(m, con3)
@@ -604,6 +606,7 @@ end
604606
d2 = @deriv(y, par^2)
605607
d3 = @deriv(d1, par2)
606608
@variable(m, dx0, Point(d1, 0, 0))
609+
@variable(m, dxf, Point(d1, 1, 1))
607610
var = build_variable(error, d1, Dict{Int, Float64}(1 => 0.5), check = false)
608611
rv = add_variable(m, var)
609612
data = TestData(par, 0, 1)
@@ -625,6 +628,7 @@ end
625628
@test InfiniteOpt._derivative_dependencies(par) == [index(d2)]
626629
@test !is_valid(m, rv)
627630
@test !is_valid(m, dx0)
631+
@test !is_valid(m, dxf)
628632
@test !is_valid(m, d3)
629633
@test !is_valid(m, cref)
630634
@test !is_valid(m, con3)

0 commit comments

Comments
 (0)