@@ -20,12 +20,33 @@ using DerivableInterfaces: @derive
2020using ArrayLayouts: ArrayLayouts
2121using LinearAlgebra: LinearAlgebra
2222
23- # DerivableInterfaces `Base.getindex`, `Base.setindex!`, etc.
24- # TODO : Define `AbstractMatrixOps` and overload for
25- # `AnyAbstractSparseMatrix` and `AnyAbstractSparseVector`,
26- # which is where matrix multiplication and factorizations
27- # should go.
28- @derive AnyAbstractSparseArray AbstractArrayOps
23+ @derive (T= AnyAbstractSparseArray,) begin
24+ Base. getindex (:: T , :: Any... )
25+ Base. getindex (:: T , :: Int... )
26+ Base. setindex! (:: T , :: Any , :: Any... )
27+ Base. setindex! (:: T , :: Any , :: Int... )
28+ Base. similar (:: T , :: Type , :: Tuple{Vararg{Int}} )
29+ Base. similar (:: T , :: Type , :: Tuple{Base.OneTo,Vararg{Base.OneTo}} )
30+ Base. copy (:: T )
31+ Base. copy! (:: AbstractArray , :: T )
32+ Base. copyto! (:: AbstractArray , :: T )
33+ Base. map (:: Any , :: T... )
34+ Base. map! (:: Any , :: AbstractArray , :: T... )
35+ Base. mapreduce (:: Any , :: Any , :: T... ; kwargs... )
36+ Base. reduce (:: Any , :: T... ; kwargs... )
37+ Base. all (:: Function , :: T )
38+ Base. all (:: T )
39+ Base. iszero (:: T )
40+ Base. real (:: T )
41+ Base. fill! (:: T , :: Any )
42+ DerivableInterfaces. zero! (:: T )
43+ Base. zero (:: T )
44+ Base. permutedims! (:: Any , :: T , :: Any )
45+ Broadcast. BroadcastStyle (:: Type{<:T} )
46+ Base. copyto! (:: T , :: Broadcast.Broadcasted{Broadcast.DefaultArrayStyle{0}} )
47+ ArrayLayouts. MemoryLayout (:: Type{<:T} )
48+ LinearAlgebra. mul! (:: AbstractMatrix , :: T , :: T , :: Number , :: Number )
49+ end
2950
3051using DerivableInterfaces. Concatenate: concatenate
3152# We overload `Base._cat` instead of `Base.cat` since it
@@ -75,27 +96,30 @@ from the input indices.
7596This constructor does not take ownership of the supplied storage, and will result in an
7697independent container.
7798"""
78- sparse (:: Union{AbstractDict,AbstractDictionary} , dims... ; kwargs ... )
99+ sparse (:: Union{AbstractDict,AbstractDictionary} , dims... )
79100
80101const AbstractDictOrDictionary = Union{AbstractDict,AbstractDictionary}
81102# checked constructor from data: use `setindex!` to validate/convert input
82- function sparse (storage:: AbstractDictOrDictionary , dims :: Dims ; kwargs ... )
83- A = SparseArrayDOK {valtype(storage)} (undef, dims; kwargs ... )
103+ function sparse (storage:: AbstractDictOrDictionary , unstored :: AbstractArray )
104+ A = SparseArrayDOK ( Unstored (unstored) )
84105 for (i, v) in pairs (storage)
85106 A[i] = v
86107 end
87108 return A
88109end
89- function sparse (storage:: AbstractDictOrDictionary , dims:: Int... ; kwargs... )
90- return sparse (storage, dims; kwargs... )
110+ function sparse (storage:: AbstractDictOrDictionary , ax:: Tuple )
111+ return sparse (storage, Zeros {valtype(storage)} (ax))
112+ end
113+ function sparse (storage:: AbstractDictOrDictionary , dims:: Int... )
114+ return sparse (storage, dims)
91115end
92116# Determine the size automatically.
93- function sparse (storage:: AbstractDictOrDictionary ; kwargs ... )
117+ function sparse (storage:: AbstractDictOrDictionary )
94118 dims = ntuple (Returns (0 ), length (keytype (storage)))
95119 for I in keys (storage)
96120 dims = map (max, dims, Tuple (I))
97121 end
98- return sparse (storage, dims; kwargs ... )
122+ return sparse (storage, dims)
99123end
100124
101125using Random: Random, AbstractRNG, default_rng
@@ -107,12 +131,18 @@ Create an empty size `dims` sparse array.
107131The optional `T` argument specifies the element type, which defaults to `Float64`.
108132""" sparsezeros
109133
110- function sparsezeros (:: Type{T} , dims:: Dims ; kwargs... ) where {T}
111- return SparseArrayDOK {T} (undef, dims; kwargs... )
134+ function sparsezeros (:: Type{T} , unstored:: AbstractArray{<:Any,N} ) where {T,N}
135+ return SparseArrayDOK {T,N} (Unstored (unstored))
136+ end
137+ function sparsezeros (unstored:: AbstractArray{T,N} ) where {T,N}
138+ return SparseArrayDOK {T,N} (Unstored (unstored))
139+ end
140+ function sparsezeros (:: Type{T} , dims:: Dims ) where {T}
141+ return sparsezeros (T, Zeros {T} (dims))
112142end
113- sparsezeros (:: Type{T} , dims:: Int... ; kwargs ... ) where {T} = sparsezeros (T, dims; kwargs ... )
114- sparsezeros (dims:: Dims ; kwargs ... ) = sparsezeros (Float64, dims; kwargs ... )
115- sparsezeros (dims:: Int... ; kwargs ... ) = sparsezeros (Float64, dims; kwargs ... )
143+ sparsezeros (:: Type{T} , dims:: Int... ) where {T} = sparsezeros (T, dims)
144+ sparsezeros (dims:: Dims ) = sparsezeros (Float64, dims)
145+ sparsezeros (dims:: Int... ) = sparsezeros (Float64, dims)
116146
117147@doc """
118148 sparserand([rng], [T::Type], dims; density::Real=0.5, randfun::Function=rand) -> A::SparseArrayDOK{T}
0 commit comments