Skip to content

[BUG] view!(::BlockSparseArray{Float64, 0}) is broken #148

Description

@ogauthe
using Test:  @test
using BlockArrays: blockedrange
using TensorAlgebra: contract
using BlockSparseArrays: BlockSparseArray

g0 = blockedrange([2])
v = BlockSparseArray{Float64}(undef, g0)
a = BlockSparseArray{Float64}(undef);
b = contract((), v, (1,), v, (1,));

@test typeof(a) === typeof(b)
@test sprint(show, MIME("text/plain"), a) == "-blocked 0-dimensional BlockSparseArray{Float64, 0, Array{Float64, 0}, …, Tuple{}}:\n0.0"
display(b)
-blocked 0-dimensional BlockSparseArray{Float64, 0, Array{Float64, 0}, …, Tuple{}}:
ERROR: MethodError: view!(::BlockSparseArray{Float64, 0, Array{Float64, 0}, SparseArraysBase.SparseArrayDOK{Array{Float64, 0}, 0, BlockSparseArrays.GetUnstoredBlock{Tuple{}}}, Tuple{}}) is ambiguous.

Candidates:
  view!(a::AbstractArray{<:Any, N}, index::Vararg{BlockArrays.BlockIndexRange{1, R, I} where {R<:Tuple{AbstractUnitRange{<:Integer}}, I<:Tuple{Integer}}, N}) where N
    @ BlockSparseArrays ~/.julia/packages/BlockSparseArrays/IRP80/src/BlockArraysExtensions/BlockArraysExtensions.jl:572
  view!(a::AbstractArray{<:Any, N}, index::Vararg{Block{1}, N}) where N
    @ BlockSparseArrays ~/.julia/packages/BlockSparseArrays/IRP80/src/BlockArraysExtensions/BlockArraysExtensions.jl:560

Possible fix, define
  view!(::AbstractArray{<:Any, 0})

Stacktrace:
  [1] view!(a::BlockSparseArray{Float64, 0, Array{Float64, 0}, SparseArraysBase.SparseArrayDOK{Array{Float64, 0}, 0, BlockSparseArrays.GetUnstoredBlock{Tuple{}}}, Tuple{}}, index::Block{0, Int64})
    @ BlockSparseArrays ~/.julia/packages/BlockSparseArrays/IRP80/src/BlockArraysExtensions/BlockArraysExtensions.jl:558
  [2] (::BlockSparseArrays.var"#81#82"{Base.Fix1{typeof(Adapt.adapt), Type{…}}, BlockSparseArray{Float64, 0, Array{…}, SparseArraysBase.SparseArrayDOK{…}, Tuple{}}})(B::Block{0, Int64})
    @ BlockSparseArrays ~/.julia/packages/BlockSparseArrays/IRP80/src/blocksparsearrayinterface/map.jl:157
  [3] iterate
    @ ./generator.jl:48 [inlined]
  [4] _collect
    @ ./array.jl:811 [inlined]
  [5] collect_similar
    @ ./array.jl:720 [inlined]
  [6] map
    @ ./abstractarray.jl:3371 [inlined]
  [7] map_stored_blocks(f::Base.Fix1{typeof(Adapt.adapt), Type{Array}}, a::BlockSparseArray{Float64, 0, Array{Float64, 0}, SparseArraysBase.SparseArrayDOK{Array{…}, 0, BlockSparseArrays.GetUnstoredBlock{…}}, Tuple{}})
    @ BlockSparseArrays ~/.julia/packages/BlockSparseArrays/IRP80/src/blocksparsearrayinterface/map.jl:157
  [8] adapt_structure
    @ ~/.julia/packages/BlockSparseArrays/IRP80/src/abstractblocksparsearray/adapt.jl:2 [inlined]
  [9] adapt
    @ ~/.julia/packages/Adapt/0LkKU/src/Adapt.jl:40 [inlined]
 [10] print_array(io::IOContext{Base.TTY}, a::BlockSparseArray{Float64, 0, Array{Float64, 0}, SparseArraysBase.SparseArrayDOK{Array{Float64, 0}, 0, BlockSparseArrays.GetUnstoredBlock{Tuple{}}}, Tuple{}})
    @ BlockSparseArrays ~/.julia/packages/BlockSparseArrays/IRP80/src/abstractblocksparsearray/wrappedabstractblocksparsearray.jl:396
 [11] show(io::IOContext{Base.TTY}, ::MIME{Symbol("text/plain")}, X::BlockSparseArray{Float64, 0, Array{Float64, 0}, SparseArraysBase.SparseArrayDOK{Array{Float64, 0}, 0, BlockSparseArrays.GetUnstoredBlock{Tuple{}}}, Tuple{}})
    @ Base ./arrayshow.jl:399
 [12] (::OhMyREPL.var"#7#8"{REPL.REPLDisplay{REPL.LineEditREPL}, MIME{Symbol("text/plain")}, Base.RefValue{Any}})(io::IOContext{Base.TTY})
    @ OhMyREPL ~/.julia/packages/OhMyREPL/PCbqB/src/output_prompt_overwrite.jl:23
 [13] with_repl_linfo(f::Any, repl::REPL.LineEditREPL)
    @ REPL ~/.julia/juliaup/julia-1.11.5+0.x64.linux.gnu/share/julia/stdlib/v1.11/REPL/src/REPL.jl:678
 [14] display
    @ ~/.julia/packages/OhMyREPL/PCbqB/src/output_prompt_overwrite.jl:6 [inlined]
 [15] display
    @ ~/.julia/juliaup/julia-1.11.5+0.x64.linux.gnu/share/julia/stdlib/v1.11/REPL/src/REPL.jl:399 [inlined]
 [16] display(x::Any)
    @ Base.Multimedia ./multimedia.jl:340
 [17] top-level scope
    @ REPL[28]:1
Some type information was truncated. Use `show(err)` to see complete types.

The problem comes from view!, and indeed view!(x, Block()) and view!(x) crash for both a and b. However it is unclear to me why show has a different code path for a and b.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions