JuliaGaussianProcesses / KernelFunctions.jl

Julia package for kernel functions for machine learning
https://juliagaussianprocesses.github.io/KernelFunctions.jl/stable/
MIT License
267 stars 32 forks source link

Ambiguities #481

Closed willtebbutt closed 1 year ago

willtebbutt commented 1 year ago

We actually have quite a lot of method ambiguities:

julia> using KernelFunctions, Test

julia> Test.detect_ambiguities(KernelFunctions)
20-element Vector{Tuple{Method, Method}}:
 (pairwise(d::Distances.PreMetric, x::AbstractVector{<:Real}, y::AbstractVector{<:Real}) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/distances/pairwise.jl:19, pairwise(d::Distances.PreMetric, x::ColVecs, y::AbstractVector) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/utils.jl:107)
 (pairwise(d::Distances.PreMetric, x::AbstractVector{<:Real}, y::AbstractVector{<:Real}) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/distances/pairwise.jl:19, pairwise(d::Distances.PreMetric, x::AbstractVector, y::RowVecs) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/utils.jl:175)
 (frule(::ChainRulesCore.RuleConfig, args...) in ChainRulesCore at /Users/willtebbutt/.julia/packages/ChainRulesCore/C73ay/src/rules.jl:64, frule(::Any, d::Distances.Euclidean, x::AbstractVector, y::AbstractVector) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/chainrules.jl:4)
 (+(k::Kernel, ks::KernelSum) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:16, +(ks::KernelSum{<:AbstractVector{<:Kernel}}, k::Kernel) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:20)
 (tensor(k::Kernel, ks::KernelTensorProduct{<:AbstractVector{<:Kernel}}) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:17, tensor(ks::KernelTensorProduct, k::Kernel) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:19)
 (tensor(k1::KernelTensorProduct, k2::KernelTensorProduct) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:9, tensor(k::Kernel, ks::KernelTensorProduct{<:AbstractVector{<:Kernel}}) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:17)
 (map(f::Tf, A::SparseArrays.SparseVector) where Tf in SparseArrays.HigherOrderFns at /Users/willtebbutt/.julia/juliaup/julia-1.8.2+0.x64/share/julia/stdlib/v1.8/SparseArrays/src/higherorderfns.jl:147, map(t::Transform, x::AbstractVector) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/transform/transform.jl:11)
 (tensor(k::Kernel, ks::KernelTensorProduct) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:16, tensor(ks::KernelTensorProduct{<:AbstractVector{<:Kernel}}, k::Kernel) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:20)
 (*(k::Kernel, ks::KernelProduct) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:16, *(ks::KernelProduct{<:AbstractVector{<:Kernel}}, k::Kernel) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:20)
 (*(k1::KernelProduct, k2::KernelProduct) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:9, *(ks::KernelProduct{<:AbstractVector{<:Kernel}}, k::Kernel) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:20)
 (tensor(k1::KernelTensorProduct, k2::KernelTensorProduct) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:9, tensor(ks::KernelTensorProduct{<:AbstractVector{<:Kernel}}, k::Kernel) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:20)
 (+(k1::KernelSum, k2::KernelSum) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:9, +(k::Kernel, ks::KernelSum{<:AbstractVector{<:Kernel}}) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:17)
 (+(k1::KernelSum, k2::KernelSum) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:9, +(ks::KernelSum{<:AbstractVector{<:Kernel}}, k::Kernel) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:20)
 (+(k::Kernel, ks::KernelSum{<:AbstractVector{<:Kernel}}) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:17, +(ks::KernelSum, k::Kernel) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:19)
 (*(k1::KernelProduct, k2::KernelProduct) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:9, *(k::Kernel, ks::KernelProduct{<:AbstractVector{<:Kernel}}) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:17)
 (pairwise(d::Distances.PreMetric, x::AbstractVector{<:Real}, y::AbstractVector{<:Real}) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/distances/pairwise.jl:19, pairwise(d::Distances.PreMetric, x::AbstractVector, y::ColVecs) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/utils.jl:104)
 (∘(t::Transform, tc::ChainTransform) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/transform/chaintransform.jl:37, ∘(tc::ChainTransform, t::Transform) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/transform/chaintransform.jl:38)
 (pairwise(d::Distances.PreMetric, x::AbstractVector{<:Real}, y::AbstractVector{<:Real}) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/distances/pairwise.jl:19, pairwise(d::Distances.PreMetric, x::RowVecs, y::AbstractVector) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/utils.jl:178)
 (*(k::Kernel, ks::KernelProduct{<:AbstractVector{<:Kernel}}) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:17, *(ks::KernelProduct, k::Kernel) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/kernels/overloads.jl:19)
 (map(f::Tf, A::Union{SparseArrays.AbstractSparseMatrixCSC, SparseArrays.SparseVector}, Bs::Vararg{Union{SparseArrays.AbstractSparseMatrixCSC, SparseArrays.SparseVector}, N}) where {Tf, N} in SparseArrays.HigherOrderFns at /Users/willtebbutt/.julia/juliaup/julia-1.8.2+0.x64/share/julia/stdlib/v1.8/SparseArrays/src/higherorderfns.jl:151, map(t::Transform, x::AbstractVector) in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/transform/transform.jl:11)

We should probably resolve these, and add a test to prevent new ones creeping in.

willtebbutt commented 1 year ago

Similarly:

julia> Test.detect_unbound_args(KernelFunctions)
[1] _evaluate(d::KernelFunctions.Sinus, a::AbstractVector, b::AbstractVector) where T in KernelFunctions at /Users/willtebbutt/.julia/packages/KernelFunctions/02rTu/src/distances/sinus.jl:14