|
| 1 | +using Adapt: adapt |
| 2 | +using JLArrays: JLArray |
| 3 | +using SparseArraysBase: dense, sparsezeros |
| 4 | +using Test: @test, @testset |
| 5 | + |
| 6 | +elts = (Float32, ComplexF64) |
| 7 | +arrayts = (Array, JLArray) |
| 8 | +@testset "dense (arraytype=$arrayt, eltype=$elt)" for arrayt in arrayts, elt in elts |
| 9 | + dev(x) = adapt(arrayt, x) |
| 10 | + |
| 11 | + @testset "SparseArrayDOK" begin |
| 12 | + s = sparsezeros(elt, 3, 4) |
| 13 | + s[1, 2] = 2 |
| 14 | + d = dense(s) |
| 15 | + @test d isa Matrix{elt} |
| 16 | + @test d == [0 2 0 0; 0 0 0 0; 0 0 0 0] |
| 17 | + end |
| 18 | + |
| 19 | + @testset "Custom sparse array" begin |
| 20 | + struct MySparseArrayDOK{T,N,S<:AbstractVector{T}} <: AbstractArray{T,N} |
| 21 | + storedvalues::S |
| 22 | + storedindices::Dict{CartesianIndex{N},Int} |
| 23 | + size::NTuple{N,Int} |
| 24 | + end |
| 25 | + Base.size(a::MySparseArrayDOK) = a.size |
| 26 | + function Base.getindex(a::MySparseArrayDOK{<:Any,N}, I::Vararg{Int,N}) where {N} |
| 27 | + storageindex = get(a.storedindices, CartesianIndex(I), nothing) |
| 28 | + isnothing(storageindex) && return zero(eltype(a)) |
| 29 | + return a.storedvalues[storageindex] |
| 30 | + end |
| 31 | + Base.parent(a::MySparseArrayDOK) = a.storedvalues |
| 32 | + |
| 33 | + s = MySparseArrayDOK( |
| 34 | + dev(elt[2, 4]), Dict([CartesianIndex(1, 2) => 1, CartesianIndex(3, 4) => 2]), (3, 4) |
| 35 | + ) |
| 36 | + d = dense(s) |
| 37 | + @show typeof(d) |
| 38 | + @test d isa arrayt{elt,2} |
| 39 | + @test d == dev(elt[0 2 0 0; 0 0 0 0; 0 0 0 4]) |
| 40 | + end |
| 41 | +end |
0 commit comments