Skip to content

Commit f78cd87

Browse files
authored
[BlockSparseArrays] Use new SparseArrayDOK type in BlockSparseArrays (#1272)
1 parent 1da01b4 commit f78cd87

File tree

12 files changed

+77
-90
lines changed

12 files changed

+77
-90
lines changed

src/DiagonalArrays.jl

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
module DiagonalArrays
2-
include("defaults.jl")
3-
include("diaginterface.jl")
4-
include("diagindex.jl")
5-
include("diagindices.jl")
6-
include("diagonalarray.jl")
7-
include("sparsearrayinterface.jl")
8-
include("diagonalarraydiaginterface.jl")
9-
include("diagonalmatrix.jl")
10-
include("diagonalvector.jl")
2+
include("diaginterface/defaults.jl")
3+
include("diaginterface/diaginterface.jl")
4+
include("diaginterface/diagindex.jl")
5+
include("diaginterface/diagindices.jl")
6+
include("abstractdiagonalarray/abstractdiagonalarray.jl")
7+
include("abstractdiagonalarray/sparsearrayinterface.jl")
8+
include("abstractdiagonalarray/diagonalarraydiaginterface.jl")
9+
include("diagonalarray/diagonalarray.jl")
10+
include("diagonalarray/diagonalmatrix.jl")
11+
include("diagonalarray/diagonalvector.jl")
1112
end
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
using ..SparseArrayInterface: AbstractSparseArray
2+
3+
abstract type AbstractDiagonalArray{T,N} <: AbstractSparseArray{T,N} end

src/diagonalarraydiaginterface.jl renamed to src/abstractdiagonalarray/diagonalarraydiaginterface.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@ using ..SparseArrayInterface: SparseArrayInterface, StorageIndex, StorageIndices
22

33
SparseArrayInterface.StorageIndex(i::DiagIndex) = StorageIndex(index(i))
44

5-
function Base.getindex(a::DiagonalArray, i::DiagIndex)
5+
function Base.getindex(a::AbstractDiagonalArray, i::DiagIndex)
66
return a[StorageIndex(i)]
77
end
88

9-
function Base.setindex!(a::DiagonalArray, value, i::DiagIndex)
9+
function Base.setindex!(a::AbstractDiagonalArray, value, i::DiagIndex)
1010
a[StorageIndex(i)] = value
1111
return a
1212
end
1313

1414
SparseArrayInterface.StorageIndices(i::DiagIndices) = StorageIndices(indices(i))
1515

16-
function Base.getindex(a::DiagonalArray, i::DiagIndices)
16+
function Base.getindex(a::AbstractDiagonalArray, i::DiagIndices)
1717
return a[StorageIndices(i)]
1818
end
1919

20-
function Base.setindex!(a::DiagonalArray, value, i::DiagIndices)
20+
function Base.setindex!(a::AbstractDiagonalArray, value, i::DiagIndices)
2121
a[StorageIndices(i)] = value
2222
return a
2323
end
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using Compat: Returns, allequal
2+
using ..SparseArrayInterface: SparseArrayInterface
3+
4+
# `SparseArrayInterface` interface
5+
function SparseArrayInterface.index_to_storage_index(
6+
a::AbstractDiagonalArray{<:Any,N}, I::CartesianIndex{N}
7+
) where {N}
8+
!allequal(Tuple(I)) && return nothing
9+
return first(Tuple(I))
10+
end
11+
12+
function SparseArrayInterface.storage_index_to_index(a::AbstractDiagonalArray, I)
13+
return CartesianIndex(ntuple(Returns(I), ndims(a)))
14+
end
15+
16+
## # 1-dimensional case can be `AbstractDiagonalArray`.
17+
## function SparseArrayInterface.sparse_similar(
18+
## a::AbstractDiagonalArray, elt::Type, dims::Tuple{Int}
19+
## )
20+
## # TODO: Handle preserving zero element function.
21+
## return similar(a, elt, dims)
22+
## end
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

src/diagonalarray.jl renamed to src/diagonalarray/diagonalarray.jl

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
using ..SparseArrayInterface: Zero
1+
using ..SparseArrayInterface: Zero, getindex_zero_function
2+
# TODO: Put into `DiagonalArraysSparseArrayDOKsExt`?
3+
using ..SparseArrayDOKs: SparseArrayDOKs, SparseArrayDOK
24

3-
struct DiagonalArray{T,N,Diag<:AbstractVector{T},Zero} <: AbstractArray{T,N}
5+
struct DiagonalArray{T,N,Diag<:AbstractVector{T},Zero} <: AbstractDiagonalArray{T,N}
46
diag::Diag
57
dims::NTuple{N,Int}
68
zero::Zero
@@ -50,18 +52,48 @@ function DiagonalArray{<:Any,N}(diag::AbstractVector{T}) where {T,N}
5052
end
5153

5254
# undef
53-
function DiagonalArray{T,N}(::UndefInitializer, d::Tuple{Vararg{Int,N}}) where {T,N}
54-
return DiagonalArray{T,N}(Vector{T}(undef, minimum(d)), d)
55+
function DiagonalArray{T,N}(
56+
::UndefInitializer, d::Tuple{Vararg{Int,N}}, zero=Zero()
57+
) where {T,N}
58+
return DiagonalArray{T,N}(Vector{T}(undef, minimum(d)), d, zero)
5559
end
5660

5761
function DiagonalArray{T,N}(::UndefInitializer, d::Vararg{Int,N}) where {T,N}
5862
return DiagonalArray{T,N}(undef, d)
5963
end
6064

61-
function DiagonalArray{T}(::UndefInitializer, d::Tuple{Vararg{Int,N}}) where {T,N}
62-
return DiagonalArray{T,N}(undef, d)
65+
function DiagonalArray{T}(
66+
::UndefInitializer, d::Tuple{Vararg{Int,N}}, zero=Zero()
67+
) where {T,N}
68+
return DiagonalArray{T,N}(undef, d, zero)
6369
end
6470

6571
function DiagonalArray{T}(::UndefInitializer, d::Vararg{Int,N}) where {T,N}
6672
return DiagonalArray{T,N}(undef, d)
6773
end
74+
75+
# Minimal `AbstractArray` interface
76+
Base.size(a::DiagonalArray) = a.dims
77+
78+
function Base.similar(a::DiagonalArray, elt::Type, dims::Tuple{Vararg{Int}})
79+
# TODO: Preserve zero element function.
80+
return DiagonalArray{elt}(undef, dims, getindex_zero_function(a))
81+
end
82+
83+
# Minimal `SparseArrayInterface` interface
84+
SparseArrayInterface.sparse_storage(a::DiagonalArray) = a.diag
85+
86+
# `SparseArrayInterface`
87+
# Defines similar when the output can't be `DiagonalArray`,
88+
# such as in `reshape`.
89+
# TODO: Put into `DiagonalArraysSparseArrayDOKsExt`?
90+
# TODO: Special case 2D to output `SparseMatrixCSC`?
91+
function SparseArrayInterface.sparse_similar(
92+
a::DiagonalArray, elt::Type, dims::Tuple{Vararg{Int}}
93+
)
94+
return SparseArrayDOK{elt}(undef, dims, getindex_zero_function(a))
95+
end
96+
97+
function SparseArrayInterface.getindex_zero_function(a::DiagonalArray)
98+
return a.zero
99+
end
File renamed without changes.

0 commit comments

Comments
 (0)