JuliaLang / julia

The Julia Programming Language
https://julialang.org/
MIT License
45.55k stars 5.47k forks source link

Method ambiguity error message suggests defining `kwcall` instead of the actual function #49555

Open jishnub opened 1 year ago

jishnub commented 1 year ago

On Julia v1.9.0-rc2 and v"1.10.0-DEV.1127"

julia> using LinearAlgebra, BandedMatrices

julia> A = Symmetric(BandedMatrix(0=>Float64[1:4;], 1=>ones(3), -1=>ones(3)))
4×4 Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}}:
 1.0  1.0   ⋅    ⋅ 
 1.0  2.0  1.0   ⋅ 
  ⋅   1.0  3.0  1.0
  ⋅    ⋅   1.0  4.0

julia> lu(A)
ERROR: MethodError: kwcall(::NamedTuple{(:check,), Tuple{Bool}}, ::typeof(lu!), ::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}}, ::RowMaximum) is ambiguous.

Candidates:
  kwcall(::Any, ::typeof(lu!), A::Union{Hermitian{T, S}, Symmetric{T, S}} where S, pivot::Union{NoPivot, RowMaximum, RowNonZero}) where T
    @ LinearAlgebra ~/packages/julias/julia-1.9/share/julia/stdlib/v1.9/LinearAlgebra/src/lu.jl:85
  kwcall(::Any, ::typeof(lu!), A::Union{Hermitian{var"#s3010", var"#s3011"}, Hermitian{Complex{var"#s3010"}, var"#s3011"}, Symmetric{var"#s3010", var"#s3011"}} where {var"#s3010"<:Real, var"#s3011"<:(ArrayLayouts.LayoutMatrix)}, args...)
    @ ArrayLayouts ~/.julia/packages/ArrayLayouts/0nSKy/src/factorizations.jl:419
  kwcall(::Any, ::typeof(lu!), A::AbstractMatrix, pivot::Union{NoPivot, RowMaximum, RowNonZero})
    @ LinearAlgebra ~/packages/julias/julia-1.9/share/julia/stdlib/v1.9/LinearAlgebra/src/lu.jl:131

Possible fix, define
  kwcall(::Any, ::typeof(lu!), ::Union{Hermitian{T, <:ArrayLayouts.LayoutMatrix}, Hermitian{Complex{var"#s3010"}, <:ArrayLayouts.LayoutMatrix}, Symmetric{var"#s3010", <:ArrayLayouts.LayoutMatrix}}, ::Union{NoPivot, RowMaximum, RowNonZero}) where {T<:Real, var"#s3010"<:Real}

Stacktrace:
  [1] lu(A::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}}, pivot::RowMaximum; check::Bool)
    @ LinearAlgebra ~/packages/julias/julia-1.9/share/julia/stdlib/v1.9/LinearAlgebra/src/lu.jl:299
  [2] lu(A::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}}, pivot::RowMaximum)
    @ LinearAlgebra ~/packages/julias/julia-1.9/share/julia/stdlib/v1.9/LinearAlgebra/src/lu.jl:298
  [3] _lu(layout::ArrayLayouts.SymmetricLayout{BandedMatrices.BandedColumns{ArrayLayouts.DenseColumnMajor}}, axes::Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}, A::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}}, pivot::RowMaximum; kwds::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ ArrayLayouts ~/.julia/packages/ArrayLayouts/0nSKy/src/factorizations.jl:308
  [4] _lu(layout::ArrayLayouts.SymmetricLayout{BandedMatrices.BandedColumns{ArrayLayouts.DenseColumnMajor}}, axes::Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}, A::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}}, pivot::RowMaximum)
    @ ArrayLayouts ~/.julia/packages/ArrayLayouts/0nSKy/src/factorizations.jl:308
  [5] lu(A::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}}, pivot::RowMaximum; kwds::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ ArrayLayouts ~/.julia/packages/ArrayLayouts/0nSKy/src/factorizations.jl:417
  [6] lu(A::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}}, pivot::RowMaximum)
    @ ArrayLayouts ~/.julia/packages/ArrayLayouts/0nSKy/src/factorizations.jl:417
  [7] lu(A::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}})
    @ LinearAlgebra ~/packages/julias/julia-1.9/share/julia/stdlib/v1.9/LinearAlgebra/src/lu.jl:298
  [8] _lu(layout::ArrayLayouts.SymmetricLayout{BandedMatrices.BandedColumns{ArrayLayouts.DenseColumnMajor}}, axes::Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}, A::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}}; kwds::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ ArrayLayouts ~/.julia/packages/ArrayLayouts/0nSKy/src/factorizations.jl:307
  [9] _lu(layout::ArrayLayouts.SymmetricLayout{BandedMatrices.BandedColumns{ArrayLayouts.DenseColumnMajor}}, axes::Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}, A::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}})
    @ ArrayLayouts ~/.julia/packages/ArrayLayouts/0nSKy/src/factorizations.jl:307
 [10] lu(A::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}}; kwds::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ ArrayLayouts ~/.julia/packages/ArrayLayouts/0nSKy/src/factorizations.jl:418
 [11] lu(A::Symmetric{Float64, BandedMatrix{Float64, Matrix{Float64}, Base.OneTo{Int64}}})
    @ ArrayLayouts ~/.julia/packages/ArrayLayouts/0nSKy/src/factorizations.jl:418
 [12] top-level scope
    @ REPL[47]:1

This is perplexing, as it's almost certainly not what one should define.

Ideally, this should be displayed in a manner that one may copy-paste to define the method.

vtjnash commented 8 months ago

Since OP now prints

julia> lu(A)
ERROR: Overload _lu!(::ArrayLayouts.SymmetricLayout{BandedMatrices.BandedColumns{ArrayLayouts.DenseColumnMajor}}, axes, A)

an updated MWE is

julia> A(::Int, ::Any; x=3) = 1
A (generic function with 1 method)

julia> A(::Any, ::Int; x=3) = 2
A (generic function with 2 methods)

julia> A(1,1;x=3)
ERROR: MethodError: kwcall(::@NamedTuple{x::Int64}, ::typeof(A), ::Int64, ::Int64) is ambiguous.

Candidates:
  kwcall(::NamedTuple, ::typeof(A), ::Any, ::Int64)
    @ Main REPL[1]:1
  kwcall(::NamedTuple, ::typeof(A), ::Int64, ::Any)
    @ Main REPL[1]:1

Possible fix, define
  kwcall(::NamedTuple, ::typeof(A), ::Int64, ::Int64)

Stacktrace:
 [1] top-level scope
   @ REPL[3]:1