92
92
# TODO : Move to `GradedUnitRanges` or `BlockArraysExtensions`.
93
93
to_block (I:: Block{1} ) = I
94
94
to_block (I:: BlockIndexRange{1} ) = Block (I)
95
+ to_block (I:: BlockIndexVector ) = Block (I)
95
96
to_block_indices (I:: Block{1} ) = Colon ()
96
97
to_block_indices (I:: BlockIndexRange{1} ) = only (I. indices)
98
+ to_block_indices (I:: BlockIndexVector ) = I. indices
97
99
98
100
function Base. view (
99
- a:: AbstractBlockSparseArray{<:Any,N} , I:: Vararg{Union{Block{1},BlockIndexRange{1}},N}
101
+ a:: AbstractBlockSparseArray{<:Any,N} ,
102
+ I:: Vararg{Union{Block{1},BlockIndexRange{1},BlockIndexVector},N} ,
100
103
) where {N}
101
104
return @views a[to_block .(I)... ][to_block_indices .(I)... ]
102
105
end
@@ -108,7 +111,7 @@ function Base.view(
108
111
end
109
112
function Base. view (
110
113
a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N}} ,
111
- I:: Vararg{Union{Block{1},BlockIndexRange{1}},N} ,
114
+ I:: Vararg{Union{Block{1},BlockIndexRange{1},BlockIndexVector },N} ,
112
115
) where {T,N}
113
116
return @views a[to_block .(I)... ][to_block_indices .(I)... ]
114
117
end
@@ -205,8 +208,21 @@ function BlockArrays.viewblock(
205
208
end
206
209
207
210
function to_blockindexrange (
208
- a:: BlockIndices {<: BlockVector{<:BlockIndex{1},<:Vector{<:BlockIndexRange{1}}} },
209
- I:: Block{1} ,
211
+ a:: BlockSlice {<: BlockVector{<:BlockIndex{1},<:Vector{<:BlockIndexRange{1}}} }, I:: Block{1}
212
+ )
213
+ # TODO : Ideally we would just use `a.blocks[I]` but that doesn't
214
+ # work right now.
215
+ return blocks (a. block)[Int (I)]
216
+ end
217
+ function to_blockindexrange (
218
+ a:: BlockIndices{<:BlockVector{<:BlockIndex{1},<:Vector{<:BlockIndexRange}}} , I:: Block{1}
219
+ )
220
+ # TODO : Ideally we would just use `a.blocks[I]` but that doesn't
221
+ # work right now.
222
+ return blocks (a. blocks)[Int (I)]
223
+ end
224
+ function to_blockindexrange (
225
+ a:: BlockIndices{<:BlockVector{<:BlockIndex{1},<:Vector{<:BlockIndexVector}}} , I:: Block{1}
210
226
)
211
227
# TODO : Ideally we would just use `a.blocks[I]` but that doesn't
212
228
# work right now.
@@ -245,47 +261,61 @@ function BlockArrays.viewblock(
245
261
return view (viewblock (a, Block .(block)... ), map (b -> only (b. indices), block)... )
246
262
end
247
263
248
- # Block slice of the result of slicing `@view a[2:5, 2:5]`.
249
- # TODO : Move this to `BlockArraysExtensions`.
250
- const BlockedSlice = BlockSlice{
251
- <: BlockVector{<:BlockIndex{1},<:Vector{<:BlockIndexRange{1}}}
252
- }
253
-
254
264
function Base. view (
255
- a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockedSlice,N}}} ,
265
+ a:: SubArray {
266
+ T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
267
+ },
256
268
block:: Union{Block{N},BlockIndexRange{N}} ,
257
269
) where {T,N}
258
270
return viewblock (a, block)
259
271
end
260
272
function Base. view (
261
- a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockedSlice,N}}} ,
262
- block:: Vararg{Union{Block{1},BlockIndexRange{1}},N} ,
273
+ a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockIndexRangeSlice,N}}} ,
274
+ block:: Union{Block{N},BlockIndexRange{N}} ,
275
+ ) where {T,N}
276
+ return viewblock (a, block)
277
+ end
278
+ function Base. view (
279
+ a:: SubArray {
280
+ T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
281
+ },
282
+ block:: Vararg{Union{Block{1},BlockIndexRange{1},BlockIndexVector},N} ,
263
283
) where {T,N}
264
284
return viewblock (a, block... )
265
285
end
266
286
function BlockArrays. viewblock (
267
- a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockedSlice,N}}} ,
287
+ a:: SubArray {
288
+ T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
289
+ },
268
290
block:: Union{Block{N},BlockIndexRange{N}} ,
269
291
) where {T,N}
270
292
return viewblock (a, to_tuple (block)... )
271
293
end
294
+
295
+ blockedslice_blocks (x:: BlockSlice ) = x. block
296
+ blockedslice_blocks (x:: BlockIndices ) = x. blocks
297
+
272
298
# TODO : Define `@interface BlockSparseArrayInterface() viewblock`.
273
299
function BlockArrays. viewblock (
274
- a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockedSlice,N}}} ,
300
+ a:: SubArray {
301
+ T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
302
+ },
275
303
I:: Vararg{Block{1},N} ,
276
304
) where {T,N}
277
305
# TODO : Use `reindex`, `to_indices`, etc.
278
306
brs = ntuple (ndims (a)) do dim
279
307
# TODO : Ideally we would use this but it outputs a Vector,
280
308
# not a range:
281
309
# return parentindices(a)[dim].block[I[dim]]
282
- return blocks (parentindices (a)[dim]. block )[Int (I[dim])]
310
+ return blocks (blockedslice_blocks ( parentindices (a)[dim]) )[Int (I[dim])]
283
311
end
284
312
return @view parent (a)[brs... ]
285
313
end
286
314
# TODO : Define `@interface BlockSparseArrayInterface() viewblock`.
287
315
function BlockArrays. viewblock (
288
- a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockedSlice,N}}} ,
316
+ a:: SubArray {
317
+ T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
318
+ },
289
319
block:: Vararg{BlockIndexRange{1},N} ,
290
320
) where {T,N}
291
321
return view (viewblock (a, Block .(block)... ), map (b -> only (b. indices), block)... )
0 commit comments