diff --git a/Project.toml b/Project.toml index f3d633beb..47ee0d086 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "KernelFunctions" uuid = "ec8451be-7e33-11e9-00cf-bbf324bd1392" -version = "0.10.36" +version = "0.10.37" [deps] ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" diff --git a/src/basekernels/matern.jl b/src/basekernels/matern.jl index a1ae4dfcc..dcc35f6be 100644 --- a/src/basekernels/matern.jl +++ b/src/basekernels/matern.jl @@ -17,6 +17,10 @@ By default, ``d`` is the Euclidean metric ``d(x, x') = \\|x - x'\\|_2``. A Gaussian process with a Matérn kernel is ``\\lceil \\nu \\rceil - 1``-times differentiable in the mean-square sense. +!!! note + + Differentiation with respect to the order ν is not currently supported. + See also: [`Matern12Kernel`](@ref), [`Matern32Kernel`](@ref), [`Matern52Kernel`](@ref) """ struct MaternKernel{Tν<:Real,M} <: SimpleKernel @@ -33,8 +37,11 @@ MaternKernel(; nu::Real=1.5, ν::Real=nu, metric=Euclidean()) = MaternKernel(ν, @functor MaternKernel -@inline function kappa(κ::MaternKernel, d::Real) - result = _matern(only(κ.ν), d) +@inline _get_ν(k::MaternKernel) = only(k.ν) +ChainRulesCore.@non_differentiable _get_ν(k) # work-around; should be "NotImplemented" rather than NoTangent + +@inline function kappa(k::MaternKernel, d::Real) + result = _matern(_get_ν(k), d) return ifelse(iszero(d), one(result), result) end diff --git a/src/matrix/kernelkroneckermat.jl b/src/matrix/kernelkroneckermat.jl index d83463efa..113d0f53d 100644 --- a/src/matrix/kernelkroneckermat.jl +++ b/src/matrix/kernelkroneckermat.jl @@ -14,7 +14,7 @@ where `D` is given by `dims`. !!! warning - Require `Kronecker.jl` and for `iskroncompatible(κ)` to return `true`. + Requires `Kronecker.jl` and for `iskroncompatible(κ)` to return `true`. """ function kernelkronmat(κ::Kernel, X::AbstractVector{<:Real}, dims::Int) checkkroncompatible(κ) diff --git a/test/basekernels/matern.jl b/test/basekernels/matern.jl index 5a83de55b..025cb141b 100644 --- a/test/basekernels/matern.jl +++ b/test/basekernels/matern.jl @@ -4,18 +4,15 @@ v1 = rand(rng, 3) v2 = rand(rng, 3) @testset "MaternKernel" begin - ν = 2.0 + ν = 2.1 k = MaternKernel(; ν=ν) matern(x, ν) = 2^(1 - ν) / gamma(ν) * (sqrt(2ν) * x)^ν * besselk(ν, sqrt(2ν) * x) @test MaternKernel(; nu=ν).ν == [ν] @test kappa(k, x) ≈ matern(x, ν) @test kappa(k, 0.0) == 1.0 - @test kappa(MaternKernel(; ν=ν), x) == kappa(k, x) @test metric(MaternKernel()) == Euclidean() @test metric(MaternKernel(; ν=2.0)) == Euclidean() @test repr(k) == "Matern Kernel (ν = $(ν), metric = Euclidean(0.0))" - # test_ADs(x->MaternKernel(nu=first(x)),[ν]) - @test_broken "All fails (because of logabsgamma for ForwardDiff and ReverseDiff and because of nu for Zygote)" k2 = MaternKernel(; ν=ν, metric=WeightedEuclidean(ones(3))) @test metric(k2) isa WeightedEuclidean @@ -23,6 +20,8 @@ # Standardised tests. TestUtils.test_interface(k, Float64) + test_ADs(() -> MaternKernel(; nu=ν)) + test_params(k, ([ν],)) end @testset "Matern32Kernel" begin