@@ -20,12 +20,33 @@ using DerivableInterfaces: @derive
20
20
using ArrayLayouts: ArrayLayouts
21
21
using LinearAlgebra: LinearAlgebra
22
22
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
29
50
30
51
using DerivableInterfaces. Concatenate: concatenate
31
52
# We overload `Base._cat` instead of `Base.cat` since it
@@ -75,27 +96,30 @@ from the input indices.
75
96
This constructor does not take ownership of the supplied storage, and will result in an
76
97
independent container.
77
98
"""
78
- sparse (:: Union{AbstractDict,AbstractDictionary} , dims... ; kwargs ... )
99
+ sparse (:: Union{AbstractDict,AbstractDictionary} , dims... )
79
100
80
101
const AbstractDictOrDictionary = Union{AbstractDict,AbstractDictionary}
81
102
# 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) )
84
105
for (i, v) in pairs (storage)
85
106
A[i] = v
86
107
end
87
108
return A
88
109
end
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)
91
115
end
92
116
# Determine the size automatically.
93
- function sparse (storage:: AbstractDictOrDictionary ; kwargs ... )
117
+ function sparse (storage:: AbstractDictOrDictionary )
94
118
dims = ntuple (Returns (0 ), length (keytype (storage)))
95
119
for I in keys (storage)
96
120
dims = map (max, dims, Tuple (I))
97
121
end
98
- return sparse (storage, dims; kwargs ... )
122
+ return sparse (storage, dims)
99
123
end
100
124
101
125
using Random: Random, AbstractRNG, default_rng
@@ -107,12 +131,18 @@ Create an empty size `dims` sparse array.
107
131
The optional `T` argument specifies the element type, which defaults to `Float64`.
108
132
""" sparsezeros
109
133
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))
112
142
end
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)
116
146
117
147
@doc """
118
148
sparserand([rng], [T::Type], dims; density::Real=0.5, randfun::Function=rand) -> A::SparseArrayDOK{T}
0 commit comments