1- using SparseArraysBase: SparseArraysBase, SparseArrayDOK, Zero, getindex_zero_function
1+ using SparseArraysBase: SparseArraysBase, SparseArrayDOK, default_getunstoredindex # # , Zero, getindex_zero_function
22
3- struct DiagonalArray{T,N,Diag<: AbstractVector{T} ,Zero } <: AbstractDiagonalArray{T,N}
3+ struct DiagonalArray{T,N,Diag<: AbstractVector{T} ,F } <: AbstractDiagonalArray{T,N}
44 diag:: Diag
55 dims:: NTuple{N,Int}
6- zero :: Zero
6+ getunstoredindex :: F
77end
88
99function DiagonalArray {T,N} (
10- diag:: AbstractVector{T} , d:: Tuple{Vararg{Int,N}} , zero= Zero ()
10+ diag:: AbstractVector{T} ,
11+ d:: Tuple{Vararg{Int,N}} ,
12+ getunstoredindex= default_getunstoredindex,
1113) where {T,N}
12- return DiagonalArray {T,N,typeof(diag),typeof(zero )} (diag, d, zero )
14+ return DiagonalArray {T,N,typeof(diag),typeof(getunstoredindex )} (diag, d, getunstoredindex )
1315end
1416
1517function DiagonalArray {T,N} (
16- diag:: AbstractVector , d:: Tuple{Vararg{Int,N}} , zero = Zero ()
18+ diag:: AbstractVector , d:: Tuple{Vararg{Int,N}} , getunstoredindex = default_getunstoredindex
1719) where {T,N}
18- return DiagonalArray {T,N} (T .(diag), d, zero )
20+ return DiagonalArray {T,N} (T .(diag), d, getunstoredindex )
1921end
2022
2123function DiagonalArray {T,N} (diag:: AbstractVector , d:: Vararg{Int,N} ) where {T,N}
2224 return DiagonalArray {T,N} (diag, d)
2325end
2426
2527function DiagonalArray {T} (
26- diag:: AbstractVector , d:: Tuple{Vararg{Int,N}} , zero = Zero ()
28+ diag:: AbstractVector , d:: Tuple{Vararg{Int,N}} , getunstoredindex = default_getunstoredindex
2729) where {T,N}
28- return DiagonalArray {T,N} (diag, d, zero )
30+ return DiagonalArray {T,N} (diag, d, getunstoredindex )
2931end
3032
3133function DiagonalArray {T} (diag:: AbstractVector , d:: Vararg{Int,N} ) where {T,N}
5153
5254# undef
5355function DiagonalArray {T,N} (
54- :: UndefInitializer , d:: Tuple{Vararg{Int,N}} , zero = Zero ()
56+ :: UndefInitializer , d:: Tuple{Vararg{Int,N}} , getunstoredindex = default_getunstoredindex
5557) where {T,N}
56- return DiagonalArray {T,N} (Vector {T} (undef, minimum (d)), d, zero )
58+ return DiagonalArray {T,N} (Vector {T} (undef, minimum (d)), d, getunstoredindex )
5759end
5860
5961function DiagonalArray {T,N} (:: UndefInitializer , d:: Vararg{Int,N} ) where {T,N}
6062 return DiagonalArray {T,N} (undef, d)
6163end
6264
6365function DiagonalArray {T} (
64- :: UndefInitializer , d:: Tuple{Vararg{Int,N}} , zero = Zero ()
66+ :: UndefInitializer , d:: Tuple{Vararg{Int,N}} , getunstoredindex = default_getunstoredindex
6567) where {T,N}
66- return DiagonalArray {T,N} (undef, d, zero )
68+ return DiagonalArray {T,N} (undef, d, getunstoredindex )
6769end
6870
6971# Axes version
7072function DiagonalArray {T} (
71- :: UndefInitializer , axes:: Tuple{Vararg{AbstractUnitRange,N}} , zero= Zero ()
73+ :: UndefInitializer ,
74+ axes:: Tuple{Vararg{AbstractUnitRange,N}} ,
75+ getunstoredindex= default_getunstoredindex,
7276) where {T,N}
7377 @assert all (isone, first .(axes))
74- return DiagonalArray {T,N} (undef, length .(axes), zero )
78+ return DiagonalArray {T,N} (undef, length .(axes), getunstoredindex )
7579end
7680
7781function DiagonalArray {T} (:: UndefInitializer , d:: Vararg{Int,N} ) where {T,N}
@@ -83,23 +87,26 @@ Base.size(a::DiagonalArray) = a.dims
8387
8488function Base. similar (a:: DiagonalArray , elt:: Type , dims:: Tuple{Vararg{Int}} )
8589 # TODO : Preserve zero element function.
86- return DiagonalArray {elt} (undef, dims, getindex_zero_function (a) )
90+ return DiagonalArray {elt} (undef, dims, a . getunstoredindex )
8791end
8892
93+ # DiagonalArrays interface.
94+ diagview (a:: DiagonalArray ) = a. diag
95+
8996# Minimal `SparseArraysBase` interface
90- SparseArraysBase. sparse_storage (a:: DiagonalArray ) = a. diag
97+ # # SparseArraysBase.sparse_storage(a::DiagonalArray) = a.diag
9198
9299# `SparseArraysBase`
93100# Defines similar when the output can't be `DiagonalArray`,
94101# such as in `reshape`.
95102# TODO : Put into `DiagonalArraysSparseArraysBaseExt`?
96103# TODO : Special case 2D to output `SparseMatrixCSC`?
97- function SparseArraysBase. sparse_similar (
98- a:: DiagonalArray , elt:: Type , dims:: Tuple{Vararg{Int}}
99- )
100- return SparseArrayDOK {elt} (undef, dims, getindex_zero_function (a))
101- end
102-
103- function SparseArraysBase. getindex_zero_function (a:: DiagonalArray )
104- return a. zero
105- end
104+ # # function SparseArraysBase.sparse_similar(
105+ # # a::DiagonalArray, elt::Type, dims::Tuple{Vararg{Int}}
106+ # # )
107+ # # return SparseArrayDOK{elt}(undef, dims, getindex_zero_function(a))
108+ # # end
109+
110+ # # function SparseArraysBase.getindex_zero_function(a::DiagonalArray)
111+ # # return a.zero
112+ # # end
0 commit comments