11# simple wrapper to give indices a custom wrapping behaviour
2- struct SparseArray{T,N} <: AbstractArray{T,N}
3- data:: Dict{CartesianIndex{N},T}
4- dims:: NTuple{N,Int64}
5- function SparseArray {T,N} (:: UndefInitializer , dims:: Dims{N} ) where {T,N}
6- return new {T,N} (Dict {CartesianIndex{N},T} (), dims)
2+ struct SparseArray{T, N} <: AbstractArray{T, N}
3+ data:: Dict{CartesianIndex{N}, T}
4+ dims:: NTuple{N, Int64}
5+ function SparseArray {T, N} (:: UndefInitializer , dims:: Dims{N} ) where {T, N}
6+ return new {T, N} (Dict {CartesianIndex{N}, T} (), dims)
77 end
8- function SparseArray (a:: SparseArray{T,N} ) where {T,N}
9- return new {T,N} (copy (a. data), a. dims)
8+ function SparseArray (a:: SparseArray{T, N} ) where {T, N}
9+ return new {T, N} (copy (a. data), a. dims)
1010 end
11- function SparseArray {T,N} (a:: Dict{CartesianIndex{N},T} ,
12- dims:: NTuple{N,Int64} ) where {T,N}
13- return new {T,N} (a, dims)
11+ function SparseArray {T, N} (
12+ a:: Dict{CartesianIndex{N}, T} , dims:: NTuple{N, Int64}
13+ ) where {T, N}
14+ return new {T, N} (a, dims)
1415 end
1516end
16- function SparseArray {T} (:: UndefInitializer , dims:: Dims{N} ) where {T,N}
17- return SparseArray {T,N} (undef, dims)
17+ function SparseArray {T} (:: UndefInitializer , dims:: Dims{N} ) where {T, N}
18+ return SparseArray {T, N} (undef, dims)
1819end
1920SparseArray {T} (:: UndefInitializer , dims... ) where {T} = SparseArray {T} (undef, dims)
2021function SparseArray {T} (a:: UniformScaling , dims:: Dims{2} ) where {T}
@@ -36,16 +37,17 @@ _zero!(x::SparseArray) = (empty!(x.data); return x)
3637_sizehint! (x:: SparseArray , n) = sizehint! (x. data, n)
3738
3839# elementary getindex and setindex!
39- @inline function Base. getindex (a:: SparseArray{T,N} , I:: CartesianIndex{N} ) where {T,N}
40+ @inline function Base. getindex (a:: SparseArray{T, N} , I:: CartesianIndex{N} ) where {T, N}
4041 @boundscheck checkbounds (a, I)
4142 return get (a. data, I, zero (T))
4243end
43- Base. @propagate_inbounds function Base. getindex (a:: SparseArray{T,N} ,
44- I:: Vararg{Int,N} ) where {T,N}
44+ Base. @propagate_inbounds function Base. getindex (
45+ a:: SparseArray{T, N} , I:: Vararg{Int, N}
46+ ) where {T, N}
4547 return getindex (a, CartesianIndex (I))
4648end
4749
48- @inline function Base. setindex! (a:: SparseArray{T,N} , v, I:: CartesianIndex{N} ) where {T,N}
50+ @inline function Base. setindex! (a:: SparseArray{T, N} , v, I:: CartesianIndex{N} ) where {T, N}
4951 @boundscheck checkbounds (a, I)
5052 if ! iszero (v)
5153 a. data[I] = v
5456 end
5557 return v
5658end
57- Base. @propagate_inbounds function Base. setindex! (a:: SparseArray{T,N} ,
58- v, I:: Vararg{Int,N} ) where {T,N}
59+ Base. @propagate_inbounds function Base. setindex! (
60+ a:: SparseArray{T, N} ,
61+ v, I:: Vararg{Int, N}
62+ ) where {T, N}
5963 return setindex! (a, v, CartesianIndex (I))
6064end
6165
62- @inline function increaseindex! (a:: SparseArray{T,N} , v, I:: CartesianIndex{N} ) where {T,N}
66+ @inline function increaseindex! (a:: SparseArray{T, N} , v, I:: CartesianIndex{N} ) where {T, N}
6367 @boundscheck checkbounds (a, I)
6468 iszero (v) && return
6569 h = a. data
100104_findfirstvalue (v, r) = findfirst (== (v), r)
101105
102106# slicing should produce SparseArray
103- function Base. _unsafe_getindex (:: IndexCartesian , a:: SparseArray{T,N} ,
104- I:: Vararg{Union{Int,AbstractVector{Int}},N} ) where {T,N}
107+ function Base. _unsafe_getindex (
108+ :: IndexCartesian , a:: SparseArray{T, N} , I:: Vararg{Union{Int, AbstractVector{Int}}, N}
109+ ) where {T, N}
105110 @boundscheck checkbounds (a, I... )
106111 indices = Base. to_indices (a, I)
107112 b = SparseArray {T} (undef, length .(Base. index_shape (indices... )))
@@ -114,36 +119,36 @@ function Base._unsafe_getindex(::IndexCartesian, a::SparseArray{T,N},
114119 return b
115120end
116121
117- Base. Array (a:: SparseArray{T,N} ) where {T,N} = Array {T,N} (a)
118- function Base. Array {T,N} (a:: SparseArray ) where {T,N}
122+ Base. Array (a:: SparseArray{T, N} ) where {T, N} = Array {T, N} (a)
123+ function Base. Array {T, N} (a:: SparseArray ) where {T, N}
119124 d = fill (zero (T), size (a))
120125 for (I, v) in a. data
121126 d[I] = v
122127 end
123128 return d
124129end
125130
126- SparseArray (a:: AbstractArray{T,N} ) where {T,N} = SparseArray {T,N} (a)
127- SparseArray {T} (a:: AbstractArray{<:Any,N} ) where {T,N} = SparseArray {T,N} (a)
128- function SparseArray {T,N} (a:: AbstractArray{<:Any,N} ) where {T,N}
129- d = SparseArray {T,N} (undef, size (a))
131+ SparseArray (a:: AbstractArray{T, N} ) where {T, N} = SparseArray {T, N} (a)
132+ SparseArray {T} (a:: AbstractArray{<:Any, N} ) where {T, N} = SparseArray {T, N} (a)
133+ function SparseArray {T, N} (a:: AbstractArray{<:Any, N} ) where {T, N}
134+ d = SparseArray {T, N} (undef, size (a))
130135 for I in CartesianIndices (a)
131136 iszero (a[I]) && continue
132137 d[I] = a[I]
133138 end
134139 return d
135140end
136- Base. convert (:: Type{S} , a:: S ) where {S<: SparseArray } = a
141+ Base. convert (:: Type{S} , a:: S ) where {S <: SparseArray } = a
137142Base. convert (S:: Type{<:SparseArray} , a:: AbstractArray ) = S (a)
138143
139- function SparseArray (A:: Adjoint{T,<:SparseArray{T,2}} ) where {T}
144+ function SparseArray (A:: Adjoint{T, <:SparseArray{T, 2}} ) where {T}
140145 B = SparseArray {T} (undef, size (A))
141146 for (I, v) in parent (A). data
142147 B[I[2 ], I[1 ]] = conj (v)
143148 end
144149 return B
145150end
146- function SparseArray (A:: Transpose{T,<:SparseArray{T,2}} ) where {T}
151+ function SparseArray (A:: Transpose{T, <:SparseArray{T, 2}} ) where {T}
147152 B = SparseArray {T} (undef, size (A))
148153 for (I, v) in parent (A). data
149154 B[I[2 ], I[1 ]] = v
@@ -166,16 +171,18 @@ function Base.copy!(dst::SparseArray, src::SparseArray)
166171 return dst
167172end
168173
169- function Base. similar (:: SparseArray , :: Type{S} , dims:: Dims{N} ) where {S,N}
174+ function Base. similar (:: SparseArray , :: Type{S} , dims:: Dims{N} ) where {S, N}
170175 return SparseArray {S} (undef, dims)
171176end
172177
173178# show and friends
174179function Base. show (io:: IO , :: MIME"text/plain" , x:: SparseArray )
175180 xnnz = nonzero_length (x)
176- print (io, join (size (x), " ×" ), " " , typeof (x), " with " , xnnz, " stored " ,
177- xnnz == 1 ? " entry" : " entries" )
178- if xnnz != 0
181+ print (
182+ io, join (size (x), " ×" ), " " , typeof (x), " with " , xnnz, " stored " ,
183+ xnnz == 1 ? " entry" : " entries"
184+ )
185+ return if xnnz != 0
179186 println (io, " :" )
180187 show (IOContext (io, :typeinfo => eltype (x)), x)
181188 end
@@ -202,4 +209,5 @@ function Base.show(io::IOContext, x::SparseArray)
202209 println (io, " " , join (" " .^ pads, " " ), " \u 22ee" )
203210 end
204211 end
212+ return
205213end
0 commit comments