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

Error in LinearAlgebra.copy_oftype on addition of symmetric KeyedArray and UniformScaling #133

Open
mjp98 opened this issue Nov 16, 2022 · 2 comments · May be fixed by #134
Open

Error in LinearAlgebra.copy_oftype on addition of symmetric KeyedArray and UniformScaling #133

mjp98 opened this issue Nov 16, 2022 · 2 comments · May be fixed by #134

Comments

@mjp98
Copy link
Contributor

mjp98 commented Nov 16, 2022

In Julia 1.8.2

julia> using AxisKeys, LinearAlgebra

julia> A = Symmetric(rand(2,2))
2×2 Symmetric{Float64, Matrix{Float64}}:
 0.358751  0.612696
 0.612696  0.236462

julia> K = KeyedArray(A, ([:a,:b], [:c, :d]))
2-dimensional KeyedArray(...) with keys:
   2-element Vector{Symbol}
   2-element Vector{Symbol}
And data, 2×2 Symmetric{Float64, Matrix{Float64}}:
        (:c)       (:d)
  (:a)   0.358751   0.612696
  (:b)   0.612696   0.236462

julia> K + I
ERROR: ArgumentError: Cannot set a non-diagonal index in a symmetric matrix
Stacktrace:
 [1] setindex!
   @ /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/LinearAlgebra/src/symmetric.jl:227 [inlined]
 [2] setindex!
   @ ~/.julia/dev/AxisKeys.jl/src/struct.jl:132 [inlined]
 [3] copyto_unaliased!(deststyle::IndexCartesian, dest::KeyedArray{Float64, 2, Symmetric{Float64, Matrix{Float64}}, Tuple{Vector{Symbol}, Vector{Symbol}}}, srcstyle::IndexCartesian, src::KeyedArray{Float64, 2, Symmetric{Float64, Matrix{Float64}}, Tuple{Vector{Symbol}, Vector{Symbol}}})
   @ Base ./abstractarray.jl:1052
 [4] copyto!
   @ ./abstractarray.jl:1018 [inlined]
 [5] copy_oftype(A::KeyedArray{Float64, 2, Symmetric{Float64, Matrix{Float64}}, Tuple{Vector{Symbol}, Vector{Symbol}}}, #unused#::Type{Float64})
   @ LinearAlgebra /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/LinearAlgebra/src/LinearAlgebra.jl:377
 [6] +(A::KeyedArray{Float64, 2, Symmetric{Float64, Matrix{Float64}}, Tuple{Vector{Symbol}, Vector{Symbol}}}, J::UniformScaling{Bool})
   @ LinearAlgebra /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:216
 [7] top-level scope
   @ REPL[15]:1

It seems like LinearAlgebra.copyto_oftype should be extended for KeyedArray, deferring to LinearAlgebra.copyto_oftype for the underlying data. e.g. this seems to be sufficient

function LinearAlgebra.copy_oftype(A::KeyedArray, ::Type{T}) where {T}
    return KeyedArray(LinearAlgebra.copy_oftype(A.data, T), axiskeys(A))
end

julia> K + I
2-dimensional KeyedArray(...) with keys:
   2-element Vector{Symbol}
   2-element Vector{Symbol}
And data, 2×2 Symmetric{Float64, Matrix{Float64}}:
        (:c)       (:d)
  (:a)   1.35875    0.612696
  (:b)   0.612696   1.23646
@mcabbott
Copy link
Owner

On Julia nightly, this doesn't seem to solve the error:

julia> function LinearAlgebra.copy_oftype(A::KeyedArray, ::Type{T}) where {T}
           return KeyedArray(LinearAlgebra.copy_oftype(A.data, T), axiskeys(A))
       end

julia> K + I
ERROR: ArgumentError: Cannot set a non-diagonal index in a symmetric matrix
Stacktrace:
 [1] setindex!
   @ ~/.julia/dev/julia/usr/share/julia/stdlib/v1.9/LinearAlgebra/src/symmetric.jl:227 [inlined]
 [2] setindex!
   @ ~/.julia/packages/AxisKeys/DiXQB/src/struct.jl:132 [inlined]
 [3] copyto_unaliased!(deststyle::IndexCartesian, dest::KeyedArray{Float64, 2, Symmetric{Float64, Matrix{Float64}}, Tuple{Vector{Symbol}, Vector{Symbol}}}, srcstyle::IndexCartesian, src::KeyedArray{Float64, 2, Symmetric{Float64, Matrix{Float64}}, Tuple{Vector{Symbol}, Vector{Symbol}}})
   @ Base ./abstractarray.jl:1105
 [4] copyto!
   @ ./abstractarray.jl:1071 [inlined]
 [5] copymutable_oftype(A::KeyedArray{Float64, 2, Symmetric{Float64, Matrix{Float64}}, Tuple{Vector{Symbol}, Vector{Symbol}}}, #unused#::Type{Float64})
   @ LinearAlgebra ~/.julia/dev/julia/usr/share/julia/stdlib/v1.9/LinearAlgebra/src/LinearAlgebra.jl:402
 [6] +(A::KeyedArray{Float64, 2, Symmetric{Float64, Matrix{Float64}}, Tuple{Vector{Symbol}, Vector{Symbol}}}, J::UniformScaling{Bool})
   @ LinearAlgebra ~/.julia/dev/julia/usr/share/julia/stdlib/v1.9/LinearAlgebra/src/uniformscaling.jl:216

@mjp98
Copy link
Contributor Author

mjp98 commented Nov 16, 2022

Sorry I think the issue is actually with copyto!, which seems to be called in each failure

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.

2 participants