`LazyArray(@~ dot.(a,a))` fails with custom array type
roflmaostc opened this issue ยท 0 comments
roflmaostc commented
Hey,
I encountered issues with a custom array type. I tried to reduce it to a MWE ๐
I'm using Julia 1.6.0 and LazyArrays 0.21.3.
The dot.(a,a)
works itself, but wrapped in the LazyArray
constructors, it seems to fail. Using a common array with the same content, it works also.
Does anybody know why or can you help me fixing that?
Thanks a lot!
Felix
julia> using LinearAlgebra, LazyArrays
julia> struct Foo{T, N} <: AbstractArray{T, N}
size::NTuple{N, Int}
end
julia> Base.getindex(A::Foo{T,N}, I::Vararg{B, N}) where {T,N, B} = Tuple(I)
julia> Base.size(A::Foo) = A.size
julia> a = Foo{NTuple{1, Int}, 1}((5,))
5-element Foo{Tuple{Int64}, 1}:
(1,)
(2,)
(3,)
(4,)
(5,)
julia> dot.(a,a)
5-element Vector{Int64}:
1
4
9
16
25
julia> @time LazyArray(@~ (dot.(a,a)))
0.017648 seconds (34.23 k allocations: 2.129 MiB, 99.50% compilation time)
dot.(5-element Foo{Tuple{Int64}, 1}, 5-element Foo{Tuple{Int64}, 1}):
Error showing value of type BroadcastVector{Int64, typeof(dot), Tuple{Foo{Tuple{Int64}, 1}, Foo{Tuple{Int64}, 1}}}:
ERROR: iteration is deliberately unsupported for CartesianIndex. Use `I` rather than `I...`, or use `Tuple(I)...`
Stacktrace:
[1] error(s::String)
@ Base ./error.jl:33
[2] iterate(#unused#::CartesianIndex{1})
@ Base.IteratorsMD ./multidimensional.jl:167
[3] dot(x::CartesianIndex{1}, y::CartesianIndex{1})
@ LinearAlgebra /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/LinearAlgebra/src/generic.jl:876
[4] dot(x::Tuple{CartesianIndex{1}}, y::Tuple{CartesianIndex{1}})
@ LinearAlgebra /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/LinearAlgebra/src/generic.jl:889
[5] _broadcast_getindex_evalf
@ ./broadcast.jl:648 [inlined]
[6] _broadcast_getindex
@ ./broadcast.jl:621 [inlined]
[7] getindex
@ ./broadcast.jl:575 [inlined]
[8] getindex
@ ~/.julia/packages/LazyArrays/lAt5J/src/lazybroadcasting.jl:88 [inlined]
[9] _getindex
@ ./abstractarray.jl:1209 [inlined]
[10] getindex
@ ./abstractarray.jl:1170 [inlined]
[11] isassigned(::BroadcastVector{Int64, typeof(dot), Tuple{Foo{Tuple{Int64}, 1}, Foo{Tuple{Int64}, 1}}}, ::Int64, ::Int64)
@ Base ./abstractarray.jl:513
[12] alignment(io::IOContext{Base.TTY}, X::BroadcastVector{Int64, typeof(dot), Tuple{Foo{Tuple{Int64}, 1}, Foo{Tuple{Int64}, 1}}}, rows::UnitRange{Int64}, cols::UnitRange{Int64}, cols_if_complete::Int64, cols_otherwise::Int64, sep::Int64)
@ Base ./arrayshow.jl:67
[13] _print_matrix(io::IOContext{Base.TTY}, X::AbstractVecOrMat{T} where T, pre::String, sep::String, post::String, hdots::String, vdots::String, ddots::String, hmod::Int64, vmod::Int64, rowsA::UnitRange{Int64}, colsA::UnitRange{Int64})
@ Base ./arrayshow.jl:201
[14] #invokelatest#2
@ ./essentials.jl:708 [inlined]
[15] invokelatest
@ ./essentials.jl:706 [inlined]
[16] print_matrix(io::IOContext{Base.TTY}, X::AbstractVecOrMat{T} where T, pre::String, sep::String, post::String, hdots::String, vdots::String, ddots::String, hmod::Int64, vmod::Int64) (repeats 2 times)
@ Base ./arrayshow.jl:170
[17] print_array
@ ./arrayshow.jl:327 [inlined]
[18] show(io::IOContext{Base.TTY}, #unused#::MIME{Symbol("text/plain")}, X::BroadcastVector{Int64, typeof(dot), Tuple{Foo{Tuple{Int64}, 1}, Foo{Tuple{Int64}, 1}}})
@ Base ./arrayshow.jl:368
[19] display(d::REPL.REPLDisplay{REPL.LineEditREPL}, mime::MIME{Symbol("text/plain")}, x::BroadcastVector{Int64, typeof(dot), Tuple{Foo{Tuple{Int64}, 1}, Foo{Tuple{Int64}, 1}}})
@ OhMyREPL ~/.julia/packages/OhMyREPL/07uNa/src/output_prompt_overwrite.jl:8
[20] display(d::REPL.REPLDisplay, x::Any)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:225
[21] display(x::Any)
@ Base.Multimedia ./multimedia.jl:328
[22] #invokelatest#2
@ ./essentials.jl:708 [inlined]
[23] invokelatest
@ ./essentials.jl:706 [inlined]
[24] print_response(errio::IO, response::Any, show_value::Bool, have_color::Bool, specialdisplay::Union{Nothing, AbstractDisplay})
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:247
[25] (::REPL.var"#40#41"{REPL.LineEditREPL, Pair{Any, Bool}, Bool, Bool})(io::Any)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:231
[26] with_repl_linfo(f::Any, repl::REPL.LineEditREPL)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:462
[27] print_response(repl::REPL.AbstractREPL, response::Any, show_value::Bool, have_color::Bool)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:229
[28] (::REPL.var"#do_respond#61"{Bool, Bool, REPL.var"#72#82"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt})(s::REPL.LineEdit.MIState, buf::Any, ok::Bool)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:798
[29] #invokelatest#2
@ ./essentials.jl:708 [inlined]
[30] invokelatest
@ ./essentials.jl:706 [inlined]
[31] run_interface(terminal::REPL.Terminals.TextTerminal, m::REPL.LineEdit.ModalInterface, s::REPL.LineEdit.MIState)
@ REPL.LineEdit /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/LineEdit.jl:2441
[32] run_frontend(repl::REPL.LineEditREPL, backend::REPL.REPLBackendRef)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:1126
[33] (::REPL.var"#44#49"{REPL.LineEditREPL, REPL.REPLBackendRef})()
@ REPL ./task.jl:406
julia> b = [(1,), (2,), (3,), (4,), (5,)]
5-element Vector{Tuple{Int64}}:
(1,)
(2,)
(3,)
(4,)
(5,)
julia> a == b
true
julia> @time LazyArray(@~ (dot.(b,b)))
0.027901 seconds (60.52 k allocations: 3.896 MiB, 99.12% compilation time)
dot.(5-element Vector{Tuple{Int64}}, 5-element Vector{Tuple{Int64}}):
1
4
9
16
25
julia> @time LazyArray(@~ sum.(a) .* 1)
0.033343 seconds (132.34 k allocations: 8.729 MiB, 98.92% compilation time)
(sum.(5-element Foo{Tuple{Int64}, 1})) .* (Int64):
Error showing value of type BroadcastVector{Int64, typeof(*), Tuple{BroadcastVector{Int64, typeof(sum), Tuple{Foo{Tuple{Int64}, 1}}}, Int64}}:
ERROR: MethodError: no method matching +(::CartesianIndex{1})
Closest candidates are:
+(::CartesianIndex{N}, ::CartesianIndex{N}) where N at multidimensional.jl:114
+(::Any, ::Any, ::Any, ::Any...) at operators.jl:560
+(::T, ::T) where T<:Union{Int128, Int16, Int32, Int64, Int8, UInt128, UInt16, UInt32, UInt64, UInt8} at int.jl:87
...
Stacktrace:
[1] sum(x::Tuple{CartesianIndex{1}})
@ Base ./tuple.jl:474
[2] _broadcast_getindex_evalf
@ ./broadcast.jl:648 [inlined]
[3] _broadcast_getindex
@ ./broadcast.jl:621 [inlined]
[4] _getindex
@ ./broadcast.jl:644 [inlined]
[5] _broadcast_getindex
@ ./broadcast.jl:620 [inlined]
[6] getindex
@ ./broadcast.jl:575 [inlined]
[7] getindex
@ ~/.julia/packages/LazyArrays/lAt5J/src/lazybroadcasting.jl:88 [inlined]
[8] _getindex
@ ./abstractarray.jl:1209 [inlined]
[9] getindex
@ ./abstractarray.jl:1170 [inlined]
[10] isassigned(::BroadcastVector{Int64, typeof(*), Tuple{BroadcastVector{Int64, typeof(sum), Tuple{Foo{Tuple{Int64}, 1}}}, Int64}}, ::Int64, ::Int64)
@ Base ./abstractarray.jl:513
[11] alignment(io::IOContext{Base.TTY}, X::BroadcastVector{Int64, typeof(*), Tuple{BroadcastVector{Int64, typeof(sum), Tuple{Foo{Tuple{Int64}, 1}}}, Int64}}, rows::UnitRange{Int64}, cols::UnitRange{Int64}, cols_if_complete::Int64, cols_otherwise::Int64, sep::Int64)
@ Base ./arrayshow.jl:67
[12] _print_matrix(io::IOContext{Base.TTY}, X::AbstractVecOrMat{T} where T, pre::String, sep::String, post::String, hdots::String, vdots::String, ddots::String, hmod::Int64, vmod::Int64, rowsA::UnitRange{Int64}, colsA::UnitRange{Int64})
@ Base ./arrayshow.jl:201
[13] #invokelatest#2
@ ./essentials.jl:708 [inlined]
[14] invokelatest
@ ./essentials.jl:706 [inlined]
[15] print_matrix (repeats 2 times)
@ ./arrayshow.jl:170 [inlined]
[16] print_array
@ ./arrayshow.jl:327 [inlined]
[17] show(io::IOContext{Base.TTY}, #unused#::MIME{Symbol("text/plain")}, X::BroadcastVector{Int64, typeof(*), Tuple{BroadcastVector{Int64, typeof(sum), Tuple{Foo{Tuple{Int64}, 1}}}, Int64}})
@ Base ./arrayshow.jl:368
[18] display(d::REPL.REPLDisplay{REPL.LineEditREPL}, mime::MIME{Symbol("text/plain")}, x::BroadcastVector{Int64, typeof(*), Tuple{BroadcastVector{Int64, typeof(sum), Tuple{Foo{Tuple{Int64}, 1}}}, Int64}})
@ OhMyREPL ~/.julia/packages/OhMyREPL/07uNa/src/output_prompt_overwrite.jl:8
[19] display(d::REPL.REPLDisplay, x::Any)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:225
[20] display(x::Any)
@ Base.Multimedia ./multimedia.jl:328
[21] #invokelatest#2
@ ./essentials.jl:708 [inlined]
[22] invokelatest
@ ./essentials.jl:706 [inlined]
[23] print_response(errio::IO, response::Any, show_value::Bool, have_color::Bool, specialdisplay::Union{Nothing, AbstractDisplay})
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:247
[24] (::REPL.var"#40#41"{REPL.LineEditREPL, Pair{Any, Bool}, Bool, Bool})(io::Any)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:231
[25] with_repl_linfo(f::Any, repl::REPL.LineEditREPL)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:462
[26] print_response(repl::REPL.AbstractREPL, response::Any, show_value::Bool, have_color::Bool)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:229
[27] (::REPL.var"#do_respond#61"{Bool, Bool, REPL.var"#72#82"{REPL.LineEditREPL, REPL.REPLHistoryProvider}, REPL.LineEditREPL, REPL.LineEdit.Prompt})(s::REPL.LineEdit.MIState, buf::Any, ok::Bool)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:798
[28] #invokelatest#2
@ ./essentials.jl:708 [inlined]
[29] invokelatest
@ ./essentials.jl:706 [inlined]
[30] run_interface(terminal::REPL.Terminals.TextTerminal, m::REPL.LineEdit.ModalInterface, s::REPL.LineEdit.MIState)
@ REPL.LineEdit /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/LineEdit.jl:2441
[31] run_frontend(repl::REPL.LineEditREPL, backend::REPL.REPLBackendRef)
@ REPL /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/REPL/src/REPL.jl:1126
[32] (::REPL.var"#44#49"{REPL.LineEditREPL, REPL.REPLBackendRef})()
@ REPL ./task.jl:406
julia> @time LazyArray(@~ sum.(b) .* 1)
0.000017 seconds (8 allocations: 224 bytes)
(sum.(5-element Vector{Tuple{Int64}})) .* (Int64):
1
2
3
4
5