From b298b8a265b9f3767f4a8b9ab7b71aad0c2789f7 Mon Sep 17 00:00:00 2001 From: Eliott Van Dieren Date: Mon, 13 Oct 2025 10:21:20 +0200 Subject: [PATCH 1/2] Adding Matern72Kernel object, tests and docs --- docs/src/kernels.md | 1 + src/KernelFunctions.jl | 2 +- src/basekernels/matern.jl | 35 ++++++++++++++++++++++++++++++++++- test/basekernels/matern.jl | 25 +++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 2 deletions(-) diff --git a/docs/src/kernels.md b/docs/src/kernels.md index 8f19091c6..6e91d20f7 100644 --- a/docs/src/kernels.md +++ b/docs/src/kernels.md @@ -61,6 +61,7 @@ MaternKernel Matern12Kernel Matern32Kernel Matern52Kernel +Matern72Kernel ``` ### Neural Network Kernel diff --git a/src/KernelFunctions.jl b/src/KernelFunctions.jl index 80711b4ec..8d5679d9a 100644 --- a/src/KernelFunctions.jl +++ b/src/KernelFunctions.jl @@ -10,7 +10,7 @@ export SqExponentialKernel, RBFKernel, GaussianKernel, SEKernel export LaplacianKernel, ExponentialKernel, GammaExponentialKernel export ExponentiatedKernel export FBMKernel -export MaternKernel, Matern12Kernel, Matern32Kernel, Matern52Kernel +export MaternKernel, Matern12Kernel, Matern32Kernel, Matern52Kernel, Matern72Kernel export LinearKernel, PolynomialKernel export RationalKernel, RationalQuadraticKernel, GammaRationalKernel export PiecewisePolynomialKernel diff --git a/src/basekernels/matern.jl b/src/basekernels/matern.jl index c009bf596..f0bb5a718 100644 --- a/src/basekernels/matern.jl +++ b/src/basekernels/matern.jl @@ -21,7 +21,7 @@ differentiable in the mean-square sense. Differentiation with respect to the order ν is not currently supported. -See also: [`Matern12Kernel`](@ref), [`Matern32Kernel`](@ref), [`Matern52Kernel`](@ref) +See also: [`Matern12Kernel`](@ref), [`Matern32Kernel`](@ref), [`Matern52Kernel`](@ref), [`Matern72Kernel`](@ref) """ struct MaternKernel{Tν<:Real,M} <: SimpleKernel ν::Vector{Tν} @@ -118,3 +118,36 @@ metric(k::Matern52Kernel) = k.metric function Base.show(io::IO, k::Matern52Kernel) return print(io, "Matern 5/2 Kernel (metric = ", k.metric, ")") end + +""" + Matern72Kernel(; metric=Euclidean()) + +Matérn kernel of order ``7/2`` with respect to the `metric`. + +# Definition + +For inputs ``x, x'`` and metric ``d(\\cdot, \\cdot)``, the Matérn kernel of order ``7/2`` is +given by +```math +k(x, x') = \\bigg(1 + \\sqrt{7} d(x, x') + \\frac{14}{5} d(x, x')^2 + + \\frac{7\\sqrt{7}}{15} d(x, x')^3\\bigg)\\exp\\big(- \\sqrt{7} d(x, x') \\big). +``` +By default, ``d`` is the Euclidean metric ``d(x, x') = \\|x - x'\\|_2``. + +See also: [`MaternKernel`](@ref) +""" +struct Matern72Kernel{M} <: SimpleKernel + metric::M +end + +Matern72Kernel(; metric=Euclidean()) = Matern72Kernel(metric) + +function kappa(::Matern72Kernel, d::Real) + return (1 + sqrt(7) * d + 14 / 5 * d^2 + 7 * sqrt(7) / 15 * d^3) * exp(-sqrt(7) * d) +end + +metric(k::Matern72Kernel) = k.metric + +function Base.show(io::IO, k::Matern72Kernel) + return print(io, "Matern 7/2 Kernel (metric = ", k.metric, ")") +end diff --git a/test/basekernels/matern.jl b/test/basekernels/matern.jl index e0be7054d..2167b0d9d 100644 --- a/test/basekernels/matern.jl +++ b/test/basekernels/matern.jl @@ -82,9 +82,34 @@ test_ADs(Matern52Kernel) test_interface_ad_perf(_ -> Matern52Kernel(), nothing, StableRNG(123456)) end + @testset "Matern72Kernel" begin + k = Matern72Kernel() + @test kappa(k, x) ≈ + (1 + sqrt(7) * x + 14 / 5 * x^2 + 7 * sqrt(7) / 15 * x^3) * exp(-sqrt(7) * x) + @test k(v1, v2) ≈ + ( + 1 + + sqrt(7) * norm(v1 - v2) + + 14 / 5 * norm(v1 - v2)^2 + + 7 * sqrt(7) / 15 * norm(v1 - v2)^3 + ) * exp(-sqrt(7) * norm(v1 - v2)) + @test kappa(Matern72Kernel(), x) == kappa(k, x) + @test metric(Matern72Kernel()) == Euclidean() + @test repr(k) == "Matern 7/2 Kernel (metric = Euclidean(0.0))" + + k2 = Matern72Kernel(; metric=WeightedEuclidean(ones(3))) + @test metric(k2) isa WeightedEuclidean + @test k2(v1, v2) ≈ k(v1, v2) + + # Standardised tests. + TestUtils.test_interface(k, Float64) + test_ADs(Matern72Kernel) + test_interface_ad_perf(_ -> Matern72Kernel(), nothing, StableRNG(123456)) + end @testset "Coherence Materns" begin @test kappa(MaternKernel(; ν=0.5), x) ≈ kappa(ExponentialKernel(), x) @test kappa(MaternKernel(; ν=1.5), x) ≈ kappa(Matern32Kernel(), x) @test kappa(MaternKernel(; ν=2.5), x) ≈ kappa(Matern52Kernel(), x) + @test kappa(MaternKernel(; ν=3.5), x) ≈ kappa(Matern72Kernel(), x) end end From 56883368eb7ca8efb56a0a4839f219c63ac2097c Mon Sep 17 00:00:00 2001 From: Eliott Van Dieren Date: Tue, 14 Oct 2025 09:05:52 +0200 Subject: [PATCH 2/2] Bump patch version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 2b5d92709..71f9bf182 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "KernelFunctions" uuid = "ec8451be-7e33-11e9-00cf-bbf324bd1392" -version = "0.10.65" +version = "0.10.66" [deps] ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"