1
1
"""
2
- IndexedVarArray{N,T}
2
+ IndexedVarArray{V, N,T}
3
3
4
4
Structure for holding an optimization variable with a sparse structure with extra indexing
5
5
"""
6
- struct IndexedVarArray{N,T} <: AbstractSparseArray{VariableRef ,N}
6
+ struct IndexedVarArray{V <: AbstractVariableRef , N,T} <: AbstractSparseArray{V ,N}
7
7
f:: Function
8
- data:: Dictionary{T,VariableRef }
8
+ data:: Dictionary{T,V }
9
9
index_names:: NamedTuple
10
10
index_cache:: Vector{Dictionary}
11
11
end
@@ -20,7 +20,7 @@ function IndexedVarArray(
20
20
T = Tuple{eltype .(fieldtypes (Ts))... }
21
21
N = length (fieldtypes (Ts))
22
22
dict = Dictionary {T,VariableRef} ()
23
- return model[Symbol (name)] = IndexedVarArray {N,T} (
23
+ return model[Symbol (name)] = IndexedVarArray {VariableRef, N,T} (
24
24
(ix... ) -> createvar (model, name, ix; lower_bound, kw_args... ),
25
25
dict,
26
26
index_names,
@@ -43,7 +43,7 @@ function IndexedVarArray(
43
43
indices,
44
44
(createvar (model, name, k; lower_bound, kw_args... ) for k in indices),
45
45
)
46
- return model[Symbol (name)] = IndexedVarArray {N,T} (
46
+ return model[Symbol (name)] = IndexedVarArray {VariableRef, N,T} (
47
47
(ix... ) -> createvar (model, name, ix; lower_bound, kw_args... ),
48
48
dict,
49
49
index_names,
@@ -93,18 +93,18 @@ function clear_cache!(var)
93
93
end
94
94
95
95
"""
96
- insertvar!(var::IndexedVarArray{N,T}, index...; lower_bound = 0, kw_args...)
96
+ insertvar!(var::IndexedVarArray{V, N,T}, index...; lower_bound = 0, kw_args...)
97
97
98
98
Insert a new variable with the given index only after checking if keys are valid and not already defined.
99
99
"""
100
100
function insertvar! (
101
- var:: IndexedVarArray{N,T} ,
101
+ var:: IndexedVarArray{V, N,T} ,
102
102
index... ;
103
103
lower_bound = 0 ,
104
104
kw_args... ,
105
- ) where {N,T}
105
+ ) where {V, N,T}
106
106
! valid_index (var, index) && throw (BoundsError (var, index))# "Not a valid index for $(var.name): $index"g
107
- already_defined (var, index) && error (" $(var . name) : $ index already defined" )
107
+ already_defined (var, index) && error (" $index already defined for array " )
108
108
109
109
var[index] = var. f (index... )
110
110
@@ -113,17 +113,17 @@ function insertvar!(
113
113
end
114
114
115
115
"""
116
- unsafe_insertvar!(var::indexedVarArray{N,T}, index...; lower_bound = 0, kw_args...)
116
+ unsafe_insertvar!(var::indexedVarArray{V, N,T}, index...; lower_bound = 0, kw_args...)
117
117
118
118
Insert a new variable with the given index withouth checking if the index is valid or
119
119
already assigned.
120
120
"""
121
121
function unsafe_insertvar! (
122
- var:: IndexedVarArray{N,T} ,
122
+ var:: IndexedVarArray{V, N,T} ,
123
123
index... ;
124
124
lower_bound = 0 ,
125
125
kw_args... ,
126
- ) where {N,T}
126
+ ) where {V, N,T}
127
127
return var[index] = var. f (index... )
128
128
end
129
129
@@ -147,7 +147,7 @@ joinex(ex1, ex2) = :($ex1..., $ex2...)
147
147
return :(tuple ($ (exs[end ]). .. ))
148
148
end
149
149
150
- function build_cache! (cache, pat, sa:: IndexedVarArray{N,T} ) where {N,T}
150
+ function build_cache! (cache, pat, sa:: IndexedVarArray{V, N,T} ) where {V, N,T}
151
151
if isempty (cache)
152
152
for v in keys (sa)
153
153
vred = _active (v, pat)
@@ -158,7 +158,7 @@ function build_cache!(cache, pat, sa::IndexedVarArray{N,T}) where {N,T}
158
158
return cache
159
159
end
160
160
161
- function _select_cached (sa:: IndexedVarArray{N,T} , pat) where {N,T}
161
+ function _select_cached (sa:: IndexedVarArray{V, N,T} , pat) where {V, N,T}
162
162
# TODO : Benchmark to find good cutoff-value for caching
163
163
# TODO : Return same type for type stability
164
164
length (_data (sa)) < 100 && return _select_gen (keys (_data (sa)), pat)
@@ -208,26 +208,29 @@ Non-colons count as 1, colons as 0, which are binary encoded to an integer.
208
208
return :($ i)
209
209
end
210
210
211
- function _decode_nonslices (:: IndexedVarArray{N,T} , v:: Integer ) where {N,T}
211
+ function _decode_nonslices (:: IndexedVarArray{V, N,T} , v:: Integer ) where {V, N,T}
212
212
fts = fieldtypes (T)
213
213
return Tuple{
214
214
(fts[i] for (i, c) in enumerate (last (bitstring (v), N)) if c == ' 1' ). .. ,
215
215
}
216
216
end
217
217
218
218
"""
219
- _decode_nonslices(::IndexedVarArray{N,T}, ::P)
219
+ _decode_nonslices(::IndexedVarArray{V, N,T}, ::P)
220
220
221
221
Reconstruct types of a pattern from the array types and the pattern type
222
222
"""
223
- @generated function _decode_nonslices (:: IndexedVarArray{N,T} , :: P ) where {N,T,P}
223
+ @generated function _decode_nonslices (
224
+ :: IndexedVarArray{V,N,T} ,
225
+ :: P ,
226
+ ) where {V,N,T,P}
224
227
fts = fieldtypes (T)
225
228
fts2 = fieldtypes (P)
226
229
t = Tuple{(fts[i] for (i, v) in enumerate (fts2) if v != Colon). .. }
227
230
return :($ t)
228
231
end
229
232
230
- function _getcache (sa:: IndexedVarArray{N,T} , pat:: P ) where {N,T,P}
233
+ function _getcache (sa:: IndexedVarArray{V, N,T} , pat:: P ) where {V, N,T,P}
231
234
t = _get_cache_index (pat)
232
235
if isassigned (sa. index_cache, t)
233
236
return sa. index_cache[t]
@@ -247,9 +250,10 @@ function Containers.container(
247
250
iva_names = NamedTuple {tuple(names...)} (indices. prod. iterators)
248
251
T = Tuple{eltype .(indices. prod. iterators)... }
249
252
N = length (names)
250
- return IndexedVarArray {N,T} (
253
+ V = first (Base. return_types (f))
254
+ return IndexedVarArray {V,N,T} (
251
255
f,
252
- Dictionary {T,VariableRef } (),
256
+ Dictionary {T,V } (),
253
257
iva_names,
254
258
Vector {Dictionary} (undef, 2 ^ N),
255
259
)
0 commit comments