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