Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Slicing with infinite range tries to evaluate entire matrix #120

Open
DanielVandH opened this issue Aug 22, 2024 · 1 comment
Open

Slicing with infinite range tries to evaluate entire matrix #120

DanielVandH opened this issue Aug 22, 2024 · 1 comment

Comments

@DanielVandH
Copy link
Member

DanielVandH commented Aug 22, 2024

I don't know what repo this issue should actually belong to, but see:

julia> using SemiclassicalOrthogonalPolynomials

julia> P = SemiclassicalJacobi(2.0, -1/2, -1.0, -1/2);

julia> P0 = SemiclassicalJacobi(2.0, -1/2, 0.0, -1/2);

julia> R = P0 \ P
(ℵ₀×ℵ₀ LinearAlgebra.UpperTriangular{Float64, LinearAlgebra.Diagonal{Float64, FillArrays.Ones{Float64, 1, Tuple{InfiniteArrays.OneToInf{Int64}}}}} with indices OneToInf()×OneToInf()) * (ℵ₀×ℵ₀ LazyBandedMatrices.Bidiagonal{Float64, LazyArrays.ApplyArray{Float64, 1, typeof(vcat), Tuple{Float64, SubArray{Float64, 1, LazyBandedMatrices.Bidiagonal{Float64, LazyArrays.BroadcastVector{Float64, typeof(-), Tuple{LazyArrays.BroadcastVector{Float64, typeof(*), Tuple{Float64, LazyArrays.Accumulate{Float64, 1, typeof(*), Vector{Float64}, AbstractVector{Float64}}}}}}, LazyArrays.BroadcastVector{Float64, typeof(-), Tuple{LazyArrays.BroadcastVector{Float64, typeof(-), Tuple{LazyArrays.BroadcastVector{Float64, typeof(*), Tuple{LazyArrays.BroadcastVector{Float64, typeof(*), Tuple{Float64, LazyArrays.Accumulate{Float64, 1, typeof(*), Vector{Float64}, AbstractVector{Float64}}}}, OrthogonalPolynomialRatio{Float64, SemiclassicalJacobi{Float64}}}}}}}}}, Tuple{InfiniteLinearAlgebra.InfBandCartesianIndices}, false}}}, SubArray{Float64, 1, LazyBandedMatrices.Bidiagonal{Float64, LazyArrays.BroadcastVector{Float64, typeof(-), Tuple{LazyArrays.BroadcastVector{Float64, typeof(*), Tuple{Float64, LazyArrays.Accumulate{Float64, 1, typeof(*), Vector{Float64}, AbstractVector{Float64}}}}}}, LazyArrays.BroadcastVector{Float64, typeof(-), Tuple{LazyArrays.BroadcastVector{Float64, typeof(-), Tuple{LazyArrays.BroadcastVector{Float64, typeof(*), Tuple{LazyArrays.BroadcastVector{Float64, typeof(*), Tuple{Float64, LazyArrays.Accumulate{Float64, 1, typeof(*), Vector{Float64}, AbstractVector{Float64}}}}, OrthogonalPolynomialRatio{Float64, SemiclassicalJacobi{Float64}}}}}}}}}, Tuple{InfiniteLinearAlgebra.InfBandCartesianIndices}, false}} with indices OneToInf()×OneToInf()) with indices OneToInf()×OneToInf():
 1.0   0.63662                                           
     -0.307758   0.461696                        
               -0.351058   0.437497              
                         -0.36663    0.426727    
                                   -0.374557   0.420662
                                             -0.379357  
                                               
                                               
                                               
                                               
                                                       
                                               
                                               
                                                           

julia> R[2:3, 2:3] # ok
2×2 Matrix{Float64}:
 -0.307758   0.461696
  0.0       -0.351058

julia> R[2:end, 2:end]
ERROR: InterruptException:
Stacktrace:
   [1] checkindex(::Type{Bool}, inds::InfiniteArrays.OneToInf{Int64}, i::Int64)
     @ Base .\abstractarray.jl:761
   [2] checkbounds
     @ .\abstractarray.jl:687 [inlined]
   [3] _vec_resizedata!(B::LazyArrays.Accumulate{Float64, 1, typeof(*), Vector{Float64}, AbstractVector{Float64}}, n::Int64)
     @ LazyArrays C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\cache.jl:232
   [4] resizedata!
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\cache.jl:251 [inlined]
   [5] resizedata!
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\cache.jl:219 [inlined]
   [6] getindex(A::LazyArrays.Accumulate{Float64, 1, typeof(*), Vector{…}, AbstractVector{…}}, I::CartesianIndex{1})
     @ LazyArrays C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\cache.jl:206
   [7] _broadcast_getindex
     @ .\broadcast.jl:662 [inlined]
   [8] _getindex
     @ .\broadcast.jl:705 [inlined]
   [9] _broadcast_getindex
     @ .\broadcast.jl:681 [inlined]
  [10] _getindex
     @ .\broadcast.jl:705 [inlined]
  [11] _broadcast_getindex(bc::Base.Broadcast.Broadcasted{…}, I::Int64)
     @ Base.Broadcast .\broadcast.jl:681
  [12] getindex
     @ .\broadcast.jl:636 [inlined]
  [13] getindex
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\lazybroadcasting.jl:93 [inlined]
  [14] getindex
     @ .\subarray.jl:290 [inlined]
  [15] _broadcast_getindex
     @ .\broadcast.jl:675 [inlined]
  [16] _getindex(args::Tuple{Base.Broadcast.Extruded{…}, Base.Broadcast.Extruded{…}}, I::Int64)
     @ Base.Broadcast .\broadcast.jl:705
  [17] _broadcast_getindex(bc::Base.Broadcast.Broadcasted{Nothing, Tuple{…}, typeof(*), Tuple{…}}, I::Int64)
     @ Base.Broadcast .\broadcast.jl:681
  [18] getindex
     @ .\broadcast.jl:636 [inlined]
  [19] macro expansion
     @ .\broadcast.jl:1004 [inlined]
  [20] macro expansion
     @ .\simdloop.jl:77 [inlined]
  [21] copyto!
     @ .\broadcast.jl:1003 [inlined]
  [22] copyto!
     @ .\broadcast.jl:956 [inlined]
  [23] copy
     @ .\broadcast.jl:928 [inlined]
  [24] materialize
     @ .\broadcast.jl:903 [inlined]
  [25] broadcast(::typeof(*), ::SubArray{Float64, 1, LazyArrays.BroadcastVector{…}, Tuple{…}, false}, ::Vector{Float64})
     @ Base.Broadcast .\broadcast.jl:841
  [26] layout_broadcasted(::LazyArrays.BroadcastLayout{…}, ::LazyArrays.PaddedColumns{…}, ::typeof(*), A::LazyArrays.BroadcastVector{…}, B::LazyArrays.ApplyArray{…})
     @ LazyArrays C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\padded.jl:328
  [27] layout_broadcasted(op::Function, A::LazyArrays.BroadcastVector{…}, B::LazyArrays.ApplyArray{…})
     @ LazyArrays C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\cache.jl:370
  [28] broadcasted
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\lazyconcat.jl:556 [inlined]
  [29] broadcasted
     @ .\broadcast.jl:1347 [inlined]
  [30] copy(M::ArrayLayouts.Lmul{…})
     @ ArrayLayouts C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\diagonal.jl:19
  [31] copy
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\padded.jl:508 [inlined]
  [32] materialize
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\mul.jl:137 [inlined]
  [33] mul
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\mul.jl:138 [inlined]
  [34] *
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\mul.jl:179 [inlined]
  [35] _tail_simplify
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\linalg\mul.jl:352 [inlined]
  [36] _most_simplify
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\linalg\mul.jl:351 [inlined]
  [37] _simplify(::typeof(*), ::LinearAlgebra.Diagonal{…}, ::ClassicalOrthogonalPolynomials.Clenshaw{…}, ::SubArray{…})
     @ LazyArrays C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\linalg\mul.jl:349
  [38] simplify
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\linalg\mul.jl:345 [inlined]
  [39] simplify
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\linalg\mul.jl:355 [inlined]
  [40] copy
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\linalg\mul.jl:360 [inlined]
  [41] copy
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\ext\LazyArraysBandedMatricesExt.jl:638 [inlined]
  [42] materialize
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\mul.jl:137 [inlined]
  [43] mul
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\mul.jl:138 [inlined]
  [44] dot(x::SubArray{…}, A::LazyArrays.ApplyArray{…}, y::SubArray{…})
     @ ArrayLayouts C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\mul.jl:474
  [45] dot
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\mul.jl:475 [inlined]
  [46] lanczos!(Ns::UnitRange{…}, X::LazyBandedMatrices.SymTridiagonal{…}, W::LazyArrays.ApplyArray{…}, γ::LazyArrays.CachedArray{…}, β::LazyArrays.CachedArray{…}, R::LinearAlgebra.UpperTriangular{…})
     @ ClassicalOrthogonalPolynomials C:\Users\danjv\.julia\packages\ClassicalOrthogonalPolynomials\3YYrU\src\lanczos.jl:13
  [47] resizedata!(L::ClassicalOrthogonalPolynomials.LanczosData{Float64}, N::Int64)
     @ ClassicalOrthogonalPolynomials C:\Users\danjv\.julia\packages\ClassicalOrthogonalPolynomials\3YYrU\src\lanczos.jl:62
  [48] resizedata!
     @ C:\Users\danjv\.julia\packages\ClassicalOrthogonalPolynomials\3YYrU\src\lanczos.jl:132 [inlined]
  [49] _lanczos_getindex
     @ C:\Users\danjv\.julia\packages\ClassicalOrthogonalPolynomials\3YYrU\src\lanczos.jl:137 [inlined]
  [50] getindex
     @ C:\Users\danjv\.julia\packages\ClassicalOrthogonalPolynomials\3YYrU\src\lanczos.jl:145 [inlined]
  [51] getindex
     @ .\subarray.jl:290 [inlined]
  [52] _broadcast_getindex
     @ .\broadcast.jl:675 [inlined]
  [53] _getindex (repeats 4 times)
     @ .\broadcast.jl:705 [inlined]
  [54] _broadcast_getindex
     @ .\broadcast.jl:681 [inlined]
--- the last 2 lines are repeated 1 more time ---
  [57] _getindex
     @ .\broadcast.jl:706 [inlined]
  [58] _broadcast_getindex
     @ .\broadcast.jl:681 [inlined]
  [59] getindex
     @ .\broadcast.jl:636 [inlined]
  [60] macro expansion
     @ .\broadcast.jl:1004 [inlined]
  [61] macro expansion
     @ .\simdloop.jl:77 [inlined]
  [62] copyto!
     @ .\broadcast.jl:1003 [inlined]
  [63] copyto!
     @ .\broadcast.jl:956 [inlined]
  [64] materialize!
     @ .\broadcast.jl:914 [inlined]
  [65] materialize!(dest::SubArray{…}, bc::Base.Broadcast.Broadcasted{…})
     @ Base.Broadcast .\broadcast.jl:911
  [66] copyto!_layout(::ArrayLayouts.DenseColumnMajor, ::LazyArrays.BroadcastLayout{…}, dest::SubArray{…}, bc::SubArray{…})
     @ LazyArrays C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\lazybroadcasting.jl:24
  [67] copyto!_layout
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\ArrayLayouts.jl:267 [inlined]
  [68] copyto!(dest::SubArray{…}, src::SubArray{…})
     @ ArrayLayouts C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\ArrayLayouts.jl:276
  [69] vcat_copyto!(::SubArray{Float64, 1, Vector{…}, Tuple{…}, true}, ::FillArrays.Fill{Float64, 1, Tuple{…}}, ::Vararg{Any})
     @ LazyArrays C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\lazyconcat.jl:257
  [70] copyto!_layout
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\lazyconcat.jl:226 [inlined]
  [71] copyto!_layout
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\ArrayLayouts.jl:267 [inlined]
  [72] copyto!(dest::SubArray{…}, src::SubArray{…})
     @ ArrayLayouts C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\ArrayLayouts.jl:276
  [73] cache_filldata!(K::LazyArrays.Accumulate{Float64, 1, typeof(*), Vector{…}, AbstractVector{…}}, inds::UnitRange{Int64})
     @ LazyArrays C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\lazyoperations.jl:442
  [74] _vec_resizedata!(B::LazyArrays.Accumulate{Float64, 1, typeof(*), Vector{Float64}, AbstractVector{Float64}}, n::Int64)
     @ LazyArrays C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\cache.jl:243
  [75] resizedata!
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\cache.jl:251 [inlined]
  [76] resizedata!
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\cache.jl:219 [inlined]
  [77] getindex(A::LazyArrays.Accumulate{Float64, 1, typeof(*), Vector{…}, AbstractVector{…}}, I::CartesianIndex{1})
     @ LazyArrays C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\cache.jl:206
  [78] _broadcast_getindex
     @ .\broadcast.jl:662 [inlined]
  [79] _getindex
     @ .\broadcast.jl:706 [inlined]
  [80] _getindex
     @ .\broadcast.jl:705 [inlined]
  [81] _broadcast_getindex
     @ .\broadcast.jl:681 [inlined]
  [82] _getindex
     @ .\broadcast.jl:706 [inlined]
  [83] _broadcast_getindex
     @ .\broadcast.jl:681 [inlined]
  [84] getindex(bc::Base.Broadcast.Broadcasted{LazyArrays.LazyArrayStyle{…}, Tuple{…}, typeof(-), Tuple{…}}, I::Int64)
     @ Base.Broadcast .\broadcast.jl:636
  [85] getindex
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\lazybroadcasting.jl:93 [inlined]
  [86] getindex(A::LazyBandedMatrices.Bidiagonal{…}, i::Int64, j::Int64)
     @ LazyBandedMatrices C:\Users\danjv\.julia\packages\LazyBandedMatrices\dXFwo\src\bidiag.jl:116
  [87] _getindex
     @ .\abstractarray.jl:1341 [inlined]
  [88] getindex
     @ .\abstractarray.jl:1291 [inlined]
  [89] getindex
     @ .\subarray.jl:290 [inlined]
  [90] getindex(A::LazyBandedMatrices.Bidiagonal{Float64, LazyArrays.ApplyArray{…}, SubArray{…}}, i::Int64, j::Int64)
     @ LazyBandedMatrices C:\Users\danjv\.julia\packages\LazyBandedMatrices\dXFwo\src\bidiag.jl:118
  [91] getindex
     @ .\subarray.jl:290 [inlined]
  [92] macro expansion
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\muladd.jl:167 [inlined]
  [93] macro expansion
     @ .\simdloop.jl:77 [inlined]
  [94] _default_blasmul_loop!
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\muladd.jl:166 [inlined]
  [95] default_blasmul!::Bool, A::SubArray{…}, B::SubArray{…}, β::Bool, C::LazyArrays.CachedArray{…})
     @ ArrayLayouts C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\muladd.jl:192
  [96] materialize!(M::ArrayLayouts.MulAdd{…})
     @ ArrayLayouts C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\muladd.jl:264
  [97] muladd!::Bool, A::SubArray{…}, B::SubArray{…}, β::Bool, C::LazyArrays.CachedArray{…}; kw::@Kwargs{})
     @ ArrayLayouts C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\muladd.jl:75
  [98] mul!(dest::LazyArrays.CachedArray{…}, A::SubArray{…}, B::SubArray{…}, α::Bool, β::Bool)
     @ ArrayLayouts C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\mul.jl:144
  [99] mul!(C::LazyArrays.CachedArray{…}, A::SubArray{…}, B::SubArray{…}, α::Bool, β::Bool)
     @ ArrayLayouts C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\mul.jl:393
 [100] mul!
     @ C:\Users\danjv\.julia\juliaup\julia-1.10.4+0.x64.w64.mingw32\share\julia\stdlib\v1.10\LinearAlgebra\src\matmul.jl:237 [inlined]
 [101] *(A::SubArray{…}, B::SubArray{…})
     @ LinearAlgebra C:\Users\danjv\.julia\juliaup\julia-1.10.4+0.x64.w64.mingw32\share\julia\stdlib\v1.10\LinearAlgebra\src\matmul.jl:106
 [102] sub_materialize
     @ C:\Users\danjv\.julia\packages\LazyArrays\6UPSU\src\linalg\mul.jl:261 [inlined]
 [103] sub_materialize
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\ArrayLayouts.jl:132 [inlined]
 [104] layout_getindex
     @ C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\ArrayLayouts.jl:138 [inlined]
 [105] getindex(A::LazyArrays.ApplyArray{…}, kr::InfiniteArrays.InfUnitRange{…}, jr::InfiniteArrays.InfUnitRange{…})
     @ ArrayLayouts C:\Users\danjv\.julia\packages\ArrayLayouts\31idh\src\ArrayLayouts.jl:153
Some type information was truncated. Use `show(err)` to see complete types.

The [2:end, 2:end] slice is trying to evaluating all the entries. Should this work properly? It's handled fine for for e.g.

julia> P = SemiclassicalJacobi(2.0, -1/2, 1.0, -1/2);

julia> P0 = SemiclassicalJacobi(2.0, -1/2, 2.0, -1/2);

julia> R = P0 \ P;

julia> R[2:end, 2:end]
ℵ₀×ℵ₀ view(::LinearAlgebra.UpperTriangular{Float64, LazyArrays.BroadcastMatrix{Float64, typeof(/), Tuple{InfiniteLinearAlgebra.AdaptiveCholeskyFactors{Float64, BandedMatrices.BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}, LazyBandedMatrices.SymTridiagonal{Float64, LazyArrays.BroadcastVector{Float64, typeof(-), Tuple{Bool, ClassicalOrthogonalPolynomials.LanczosJacobiBand{Float64}}}, LazyArrays.BroadcastVector{Float64, typeof(-), Tuple{ClassicalOrthogonalPolynomials.LanczosJacobiBand{Float64}}}}}, Float64}}}, 2:∞, 2:∞) with eltype Float64 with indices OneToInf()×OneToInf():
 0.769448  -0.399213   0.0        0.0        0.0       
 0.0        0.701621  -0.445969   0.0        0.0
 0.0        0.0        0.667749  -0.471919   0.0
 0.0        0.0        0.0        0.647324  -0.488489
 0.0        0.0        0.0        0.0        0.633644
 0.0        0.0        0.0        0.0        0.0       
 0.0        0.0        0.0        0.0        0.0
 0.0        0.0        0.0        0.0        0.0
 0.0        0.0        0.0        0.0        0.0
 0.0        0.0        0.0        0.0        0.0
 0.0        0.0        0.0        0.0        0.0       
 0.0        0.0        0.0        0.0        0.0
 0.0        0.0        0.0        0.0        0.0
                                                      

The difference in this case is that, for the latter example,

julia> MemoryLayout(R)
TriangularLayout{'U', 'N', LazyArrays.LazyLayout}()

but for the first example

julia> MemoryLayout(R)
LazyArrays.ApplyLayout{typeof(*)}()

(And their types are different.) Any idea what the issue is here? I can get around this using @view for now but seems like a weird issue that it's not automatically creating the view for this infinite range as I'd expect when not using b=-1 anywhere.

@TSGut
Copy link
Member

TSGut commented Aug 23, 2024

Looking at the output for the case that works it's probably just overloading views anyway somewhere in InfiniteArrays or InfiniteLinearAlgebra. You could use Debugger to find where that happens and add a line to that package for appropriate form ApplyLayouts as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants