Skip to content

Commit a8afb3e

Browse files
authored
Parametrize safe/unsafe inserts (#42)
* Parametrize safe/unsafe inserts * Fix formatting --------- Co-authored-by: Lars Hellemo <[email protected]>
1 parent df6c78c commit a8afb3e

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

src/SparseVariables.jl

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export SparseArray
1414
export IndexedVarArray
1515
export insertvar!
1616
export unsafe_insertvar!
17+
export SafeInsert, UnsafeInsert
1718

1819
@setup_workload begin
1920
# Putting some things in `setup` can reduce the size of the

src/indexedarray.jl

+19-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ struct IndexedVarArray{V<:AbstractVariableRef,N,T} <: AbstractSparseArray{V,N}
1010
index_cache::Vector{Dictionary}
1111
end
1212

13+
struct SafeInsert end
14+
struct UnsafeInsert end
15+
1316
_data(sa::IndexedVarArray) = sa.data
1417

1518
already_defined(var, index) = haskey(_data(var), index)
@@ -37,23 +40,36 @@ end
3740
Insert a new variable with the given index only after checking if keys are valid and not already defined.
3841
"""
3942
function insertvar!(var::IndexedVarArray{V,N,T}, index...) where {V,N,T}
43+
return insertvar!(var, SafeInsert(), index...)
44+
end
45+
function insertvar!(
46+
var::IndexedVarArray{V,N,T},
47+
::SafeInsert = SafeInsert(),
48+
index...,
49+
) where {V,N,T}
4050
!valid_index(var, index) && throw(BoundsError(var, index))# "Not a valid index for $(var.name): $index"g
4151
already_defined(var, index) && error("$index already defined for array")
42-
4352
var[index] = var.f(index...)
44-
4553
clear_cache!(var)
4654
return var[index]
4755
end
4856

57+
function insertvar!(
58+
var::IndexedVarArray{V,N,T},
59+
::UnsafeInsert,
60+
index...,
61+
) where {V,N,T}
62+
return var[index] = var.f(index...)
63+
end
64+
4965
"""
5066
unsafe_insertvar!(var::indexedVarArray{V,N,T}, index...)
5167
5268
Insert a new variable with the given index withouth checking if the index is valid or
5369
already assigned.
5470
"""
5571
function unsafe_insertvar!(var::IndexedVarArray{V,N,T}, index...) where {V,N,T}
56-
return var[index] = var.f(index...)
72+
return insertvar!(var, UnsafeInsert(), index...)
5773
end
5874

5975
joinex(ex1, ex2) = :($ex1..., $ex2...)

test/runtests.jl

+3
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,9 @@ end
273273
unsafe_insertvar!(x, 2, 102)
274274
@test length(x) == 2
275275

276+
insertvar!(x, UnsafeInsert(), 2, 103)
277+
@test length(x) == 3
278+
276279
# When no names are provided
277280
@variable(m, y[1:3, 100:102] >= 0, container = IndexedVarArray)
278281
@test length(y) == 0

0 commit comments

Comments
 (0)