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

Tridiagonal and UniformScaling are missing compatible operations #562

Closed
ChrisRackauckas opened this issue Sep 1, 2018 · 4 comments · Fixed by JuliaLang/julia#35196
Closed

Comments

@ChrisRackauckas
Copy link
Member

λ = 2
using LinearAlgebra # from the standard library, no install required
A = Tridiagonal(2:5,1:5,1:4)
A - λ*I
setindex! not defined for UnitRange{Int64}

Stacktrace:
 [1] error(::String, ::Type) at ./error.jl:42
 [2] error_if_canonical_setindex(::IndexLinear, ::UnitRange{Int64}, ::Int64) at ./abstractarray.jl:1006
 [3] setindex! at ./abstractarray.jl:997 [inlined]
 [4] setindex!(::Tridiagonal{Int64,UnitRange{Int64}}, ::Int64, ::Int64, ::Int64) at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.0/LinearAlgebra/src/tridiag.jl:581
 [5] +(::Tridiagonal{Int64,UnitRange{Int64}}, ::UniformScaling{Int64}) at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.0/LinearAlgebra/src/uniformscaling.jl:117
 [6] -(::Tridiagonal{Int64,UnitRange{Int64}}, ::UniformScaling{Int64}) at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.0/LinearAlgebra/src/uniformscaling.jl:96
 [7] top-level scope at In[48]:4
@mcognetta
Copy link
Contributor

This seems to be due to the UnitRange rather than the structured matrix type.

julia> A = Tridiagonal(2:5,1:5,1:4)
5×5 Tridiagonal{Int64,UnitRange{Int64}}:
 1  1  ⋅  ⋅  ⋅
 2  2  2  ⋅  ⋅
 ⋅  3  3  3  ⋅
 ⋅  ⋅  4  4  4
 ⋅  ⋅  ⋅  5  5

julia> A-λ*I
ERROR: setindex! not defined for UnitRange{Int64}
Stacktrace:
 [1] error(::String, ::Type) at ./error.jl:42
 [2] error_if_canonical_setindex(::IndexLinear, ::UnitRange{Int64}, ::Int64) at ./abstractarray.jl:1006
 [3] setindex! at ./abstractarray.jl:997 [inlined]
 [4] setindex!(::Tridiagonal{Int64,UnitRange{Int64}}, ::Int64, ::Int64, ::Int64) at /home/mc/github/julia-dev/usr/share/julia/stdlib/v1.1/LinearAlgebra/src/tridiag.jl:581
 [5] +(::Tridiagonal{Int64,UnitRange{Int64}}, ::UniformScaling{Int64}) at /home/mc/github/julia-dev/usr/share/julia/stdlib/v1.1/LinearAlgebra/src/uniformscaling.jl:117
 [6] -(::Tridiagonal{Int64,UnitRange{Int64}}, ::UniformScaling{Int64}) at /home/mc/github/julia-dev/usr/share/julia/stdlib/v1.1/LinearAlgebra/src/uniformscaling.jl:96
 [7] top-level scope at none:0

julia> B = Bidiagonal(1:5, 1:4, :U)
5×5 Bidiagonal{Int64,UnitRange{Int64}}:
 1  1  ⋅  ⋅  ⋅
 ⋅  2  2  ⋅  ⋅
 ⋅  ⋅  3  3  ⋅
 ⋅  ⋅  ⋅  4  4
 ⋅  ⋅  ⋅  ⋅  5

julia> B-λ*I
ERROR: setindex! not defined for UnitRange{Int64}
Stacktrace:
 [1] error(::String, ::Type) at ./error.jl:42
 [2] error_if_canonical_setindex(::IndexLinear, ::UnitRange{Int64}, ::Int64) at ./abstractarray.jl:1006
 [3] setindex! at ./abstractarray.jl:997 [inlined]
 [4] setindex!(::Bidiagonal{Int64,UnitRange{Int64}}, ::Int64, ::Int64, ::Int64) at /home/mc/github/julia-dev/usr/share/julia/stdlib/v1.1/LinearAlgebra/src/bidiag.jl:125
 [5] +(::Bidiagonal{Int64,UnitRange{Int64}}, ::UniformScaling{Int64}) at /home/mc/github/julia-dev/usr/share/julia/stdlib/v1.1/LinearAlgebra/src/uniformscaling.jl:117
 [6] -(::Bidiagonal{Int64,UnitRange{Int64}}, ::UniformScaling{Int64}) at /home/mc/github/julia-dev/usr/share/julia/stdlib/v1.1/LinearAlgebra/src/uniformscaling.jl:96
 [7] top-level scope at none:0

julia> C = Bidiagonal(rand(5), rand(4), :U)
5×5 Bidiagonal{Float64,Array{Float64,1}}:
 0.687357  0.687688   ⋅         ⋅         ⋅      
  ⋅        0.52413   0.717214   ⋅         ⋅      
  ⋅         ⋅        0.875585  0.287643   ⋅      
  ⋅         ⋅         ⋅        0.67056   0.907939
  ⋅         ⋅         ⋅         ⋅        0.126001

julia> C-λ*I
5×5 Bidiagonal{Float64,Array{Float64,1}}:
 -1.31264   0.687688    ⋅          ⋅          ⋅      
   ⋅       -1.47587    0.717214    ⋅          ⋅      
   ⋅         ⋅        -1.12442    0.287643    ⋅      
   ⋅         ⋅          ⋅        -1.32944    0.907939
   ⋅         ⋅          ⋅          ⋅        -1.874

julia> D = Tridiagonal(rand(5,5))
5×5 Tridiagonal{Float64,Array{Float64,1}}:
 0.533607   0.98904    ⋅         ⋅         ⋅      
 0.0336893  0.952063  0.993883   ⋅         ⋅      
  ⋅         0.464622  0.406044  0.876364   ⋅      
  ⋅          ⋅        0.600339  0.8533    0.293575
  ⋅          ⋅         ⋅        0.205733  0.784922

julia> D-λ*I
5×5 Tridiagonal{Float64,Array{Float64,1}}:
 -1.46639     0.98904     ⋅          ⋅          ⋅      
  0.0336893  -1.04794    0.993883    ⋅          ⋅      
   ⋅          0.464622  -1.59396    0.876364    ⋅      
   ⋅           ⋅         0.600339  -1.1467     0.293575
   ⋅           ⋅          ⋅         0.205733  -1.21508

The fix is probably to promote UnitRange similarly to the following:

julia> D = Tridiagonal(rand(5,5))
5×5 Tridiagonal{Float64,Array{Float64,1}}:
 0.933716   0.971155   ⋅         ⋅         ⋅       
 0.0402409  0.811677  0.665386   ⋅         ⋅       
  ⋅         0.113584  0.272957  0.340441   ⋅       
  ⋅          ⋅        0.950946  0.877905  0.541269 
  ⋅          ⋅         ⋅        0.960005  0.0502889

julia> E = Tridiagonal(2:5,1:5,1:4)
5×5 Tridiagonal{Int64,UnitRange{Int64}}:
 1  1  ⋅  ⋅  ⋅
 2  2  2  ⋅  ⋅
 ⋅  3  3  3  ⋅
 ⋅  ⋅  4  4  4
 ⋅  ⋅  ⋅  5  5

julia> E+E
5×5 Tridiagonal{Int64,StepRange{Int64,Int64}}:
 2  2  ⋅   ⋅   ⋅
 4  4  4   ⋅   ⋅
 ⋅  6  6   6   ⋅
 ⋅  ⋅  8   8   8
 ⋅  ⋅  ⋅  10  10

julia> D+E
5×5 Tridiagonal{Float64,Array{Float64,1}}:
 1.93372  1.97115   ⋅        ⋅        ⋅     
 2.04024  2.81168  2.66539   ⋅        ⋅     
  ⋅       3.11358  3.27296  3.34044   ⋅     
  ⋅        ⋅       4.95095  4.8779   4.54127
  ⋅        ⋅        ⋅       5.96     5.05029

But it will have to be hardcoded (maybe?) since UniformScaling has no internal container type.

@ranocha
Copy link
Member

ranocha commented Mar 21, 2020

Shall this be closed? The issue seems to be fixed on newer versions of Julia.

julia> versioninfo()
Julia Version 1.4.0-rc2.0
Commit b99ed72c95 (2020-02-24 16:51 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-8.0.1 (ORCJIT, skylake)
Environment:
  JULIA_NUM_THREADS = 2

julia> λ = 2
2

julia> using LinearAlgebra # from the standard library, no install required

julia> A = Tridiagonal(2:5,1:5,1:4)
5×5 Tridiagonal{Int64,UnitRange{Int64}}:
 1  1      
 2  2  2    
   3  3  3  
     4  4  4
       5  5

julia> A - λ*I
5×5 Tridiagonal{Int64,UnitRange{Int64}}:
 -1  1      
  2  0  2    
    3  1  3  
      4  2  4
        5  3

@ChrisRackauckas
Copy link
Member Author

It would probably be good to close with a test.

@ranocha
Copy link
Member

ranocha commented Mar 21, 2020

Okay. I'll do that.

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

Successfully merging a pull request may close this issue.

4 participants