From 9653d8cc690fe8e237fad3d1901d6a02376eb9fc Mon Sep 17 00:00:00 2001 From: steffen Date: Sun, 9 Jun 2024 17:52:25 +0100 Subject: [PATCH 01/21] Start on new abstraction --- src/KernelSpectralDensities.jl | 3 --- src/base.jl | 37 +++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/KernelSpectralDensities.jl b/src/KernelSpectralDensities.jl index 6bed9c4..92c5e7f 100644 --- a/src/KernelSpectralDensities.jl +++ b/src/KernelSpectralDensities.jl @@ -12,9 +12,6 @@ export SpectralDensity export ShiftedRFF, DoubleRFF export ApproximateGPSample -# write tests to verify spectral density via fourier transforms -# also add SpectralKernel (which can then be learned?) - include("base.jl") include("expkernels.jl") include("features.jl") diff --git a/src/base.jl b/src/base.jl index 2901802..98a7441 100644 --- a/src/base.jl +++ b/src/base.jl @@ -45,14 +45,45 @@ julia> S(zeros(2)) 6.283185307179585 ``` """ -struct SpectralDensity{K<:KernelFunctions.Kernel} <: AbstractSpectralDensity +struct SpectralDensity{K<:KernelFunctions.Kernel,D<:Distribution} <: AbstractSpectralDensity kernel::K - dim::Int + # dim::Int + d::D function SpectralDensity(kernel::KernelFunctions.Kernel, dim::Int) if dim < 1 throw(ArgumentError("Dimension must be greater than 0")) end - return new{typeof(kernel)}(kernel, dim) + + sk, l = _deconstruct_kernel(kernel) + if dim == 1 + d = _spectral_distribution(sk, l) + else + d = _spectral_distribution(sk, l, dim) + end + return new{typeof(kernel),typeof(d)}(kernel, d) end end + +function _spectral_distribution(ker::KernelFunctions.Kernel, l) + return throw(MethodError(_spectral_distribution, (ker,))) +end + +function _spectral_distribution(ker::KernelFunctions.Kernel, l, d::Int=1) + return throw(MethodError(_spectral_distribution, (ker, d))) +end + +# ToDo: This could perhaps go into a separate file +# I could add `dim` here, and directly return l in the "right shape"? +# This would be either a vector or number (which would be great) +function _deconstruct_kernel(ker::SimpleKernel) + return ker, 1.0 +end + +function _deconstruct_kernel(ker::TransformedKernel{<:SimpleKernel,<:ScaleTransform}) + return ker.kernel, 1 / ker.transform.s +end + +function _deconstruct_kernel(ker::TransformedKernel) + return throw(MethodError(_deconstruct_kernel, (ker,))) +end From d37b782030c95ce02d296212df3e04b8f76dd312 Mon Sep 17 00:00:00 2001 From: steffen Date: Mon, 10 Jun 2024 14:09:24 +0100 Subject: [PATCH 02/21] Start rewrite test files for easier spot testing, add matern file --- test/expkernels.jl | 19 +++++++++++++++---- test/matern.jl | 45 +++++++++++++++++++++++++++++++++++++++++++++ test/runtests.jl | 2 ++ test/test_utils.jl | 25 +++++++++++++++++-------- 4 files changed, 79 insertions(+), 12 deletions(-) create mode 100644 test/matern.jl diff --git a/test/expkernels.jl b/test/expkernels.jl index c136de1..344931c 100644 --- a/test/expkernels.jl +++ b/test/expkernels.jl @@ -1,3 +1,14 @@ +include("test_utils.jl") + +if !isdefined(Base, :RUN_TESTS) || !RUN_TESTS + using CairoMakie + show_plot = true +else + show_plot = false +end + +ker = Matern32Kernel() + @testset "SquaredExponential Kernel" begin ker = SqExponentialKernel() @testset "1D" begin @@ -5,7 +16,7 @@ w_interval = [-2.0, 2.0] t_interval = [0.0, 4.0] - f = test_spectral_density(ker, w_interval, t_interval) + test_spectral_density(ker, w_interval, t_interval; show_plot) end @testset "Scaled" begin @@ -13,7 +24,7 @@ w_interval = [-2.0, 2.0] t_interval = [0.0, 4.0] - f = test_spectral_density(ker, w_interval, t_interval) + f = test_spectral_density(ker, w_interval, t_interval; show_plot) end end @@ -22,7 +33,7 @@ w_interval = [-2.0, 2.0] x_interval = [-2.0, 2.0] - f = test_2Dspectral_density(ker, w_interval, x_interval) + f = test_2Dspectral_density(ker, w_interval, x_interval; show_plot) end @testset "Scaled" begin @@ -30,7 +41,7 @@ w_interval = [-2.0, 2.0] x_interval = [-2.0, 2.0] - f = test_2Dspectral_density(ker, w_interval, x_interval) + f = test_2Dspectral_density(ker, w_interval, x_interval; show_plot) end end end diff --git a/test/matern.jl b/test/matern.jl new file mode 100644 index 0000000..c9e459a --- /dev/null +++ b/test/matern.jl @@ -0,0 +1,45 @@ +include("test_utils.jl") + +if !isdefined(Base, :RUN_TESTS) || !RUN_TESTS + using CairoMakie + show_plot = true +else + show_plot = false +end + +@testset "Matern32" begin + ker = Matern32Kernel() + @testset "1D" begin + @testset "Pure" begin + w_interval = [-1.5, 1.5] + t_interval = [0.0, 4.0] + + test_spectral_density(ker, w_interval, t_interval; show_plot) + end + + @testset "Scaled" begin + ker = with_lengthscale(ker, 0.7) + w_interval = [-2.0, 2.0] + t_interval = [0.0, 4.0] + + test_spectral_density(ker, w_interval, t_interval; show_plot) + end + end + + @testset "2D" begin + @testset "Pure" begin + w_interval = [-2.0, 2.0] + x_interval = [-2.0, 2.0] + + test_2Dspectral_density(ker, w_interval, x_interval; show_plot) + end + + @testset "Scaled" begin + ker = with_lengthscale(SqExponentialKernel(), 0.7) + w_interval = [-2.0, 2.0] + x_interval = [-2.0, 2.0] + + f = test_2Dspectral_density(ker, w_interval, x_interval; show_plot) + end + end +end diff --git a/test/runtests.jl b/test/runtests.jl index ddc2eee..9749ae6 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -5,6 +5,8 @@ using FastGaussQuadrature using StatsBase using StableRNGs +const RUN_TESTS = true + @info "Packages Loaded" include("test_utils.jl") diff --git a/test/test_utils.jl b/test/test_utils.jl index 72bfb4c..ec925c2 100644 --- a/test/test_utils.jl +++ b/test/test_utils.jl @@ -1,4 +1,11 @@ -function test_spectral_density(ker::Kernel, w_interval, t_interval, plot::Bool=false) +using KernelSpectralDensities +using Test +using LinearAlgebra +using FastGaussQuadrature +using StatsBase +using StableRNGs + +function test_spectral_density(ker::Kernel, w_interval, t_interval; show_plot::Bool=false) rng = StableRNG(123) S = SpectralDensity(ker, 1) k(t) = ker(0, t) @@ -12,10 +19,11 @@ function test_spectral_density(ker::Kernel, w_interval, t_interval, plot::Bool=f ks(t) = c * sum(S.(wv) .* cos.(2 * π * wv * t) .* weights) - @test norm(k.(τv) .- ks.(τv)) < 1e-5 + @test norm(k.(τv) .- ks.(τv)) < 5e-3 w_samples = rand(rng, S, Int(1e6)) - h = fit(Histogram, w_samples; nbins=100) + w_bins = range(w_interval...; length=100) + h = fit(Histogram, w_samples, w_bins) h = normalize(h; mode=:pdf) midpoints = (h.edges[1][1:(end - 1)] .+ h.edges[1][2:end]) ./ 2 @@ -27,7 +35,7 @@ function test_spectral_density(ker::Kernel, w_interval, t_interval, plot::Bool=f @test norm(k.(τv) .- kss.(τv)) < 0.1 - if plot + if show_plot f = Figure() ax = Axis(f[1, 1]) lines!(ax, τv, k.(τv); label="kernel") @@ -45,11 +53,11 @@ function test_spectral_density(ker::Kernel, w_interval, t_interval, plot::Bool=f alpha=0.5, label="samples", ) - f + display(f) end end -function test_2Dspectral_density(ker::Kernel, w_interval, x_interval; plot::Bool=false) +function test_2Dspectral_density(ker::Kernel, w_interval, x_interval; show_plot::Bool=false) rng = StableRNG(12345) S = SpectralDensity(ker, 2) k(x) = ker([0, 0], x) @@ -82,7 +90,8 @@ function test_2Dspectral_density(ker::Kernel, w_interval, x_interval; plot::Bool # w_tmp = (w_tmp[1, :], w_tmp[2, :]) w_tmp = (w_samples[1, :], w_samples[2, :]) - h = fit(Histogram, w_tmp; nbins=200) + w_bins = range(w_interval...; length=100) + h = fit(Histogram, w_tmp, (w_bins, w_bins)) h = normalize(h; mode=:pdf) midpoints1 = (h.edges[1][1:(end - 1)] .+ h.edges[1][2:end]) ./ 2 midpoints2 = (h.edges[2][1:(end - 1)] .+ h.edges[2][2:end]) ./ 2 @@ -147,6 +156,6 @@ function test_2Dspectral_density(ker::Kernel, w_interval, x_interval; plot::Bool ) axislegend(ax2) - f + display(f) end end From 96525e8795a4aaa31270241b47d6eb5bb860e802 Mon Sep 17 00:00:00 2001 From: steffen Date: Mon, 10 Jun 2024 14:10:00 +0100 Subject: [PATCH 03/21] Add matern kernel, rewrite things in terms of distributions --- src/KernelSpectralDensities.jl | 3 ++- src/base.jl | 19 +++++++++++++++---- src/matern.jl | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 src/matern.jl diff --git a/src/KernelSpectralDensities.jl b/src/KernelSpectralDensities.jl index 92c5e7f..a6ae4a4 100644 --- a/src/KernelSpectralDensities.jl +++ b/src/KernelSpectralDensities.jl @@ -13,7 +13,8 @@ export ShiftedRFF, DoubleRFF export ApproximateGPSample include("base.jl") -include("expkernels.jl") +# include("expkernels.jl") +include("matern.jl") include("features.jl") include("approx_prior.jl") diff --git a/src/base.jl b/src/base.jl index 98a7441..aefa998 100644 --- a/src/base.jl +++ b/src/base.jl @@ -65,23 +65,34 @@ struct SpectralDensity{K<:KernelFunctions.Kernel,D<:Distribution} <: AbstractSpe end end +function (S::SpectralDensity)(w) + return pdf(S.d, w) +end + +function rand(rng::AbstractRNG, S::SpectralDensity, n::Int...) + return rand(rng, S.d, n...) +end + function _spectral_distribution(ker::KernelFunctions.Kernel, l) return throw(MethodError(_spectral_distribution, (ker,))) end -function _spectral_distribution(ker::KernelFunctions.Kernel, l, d::Int=1) +function _spectral_distribution(ker::KernelFunctions.Kernel, l, d::Int) return throw(MethodError(_spectral_distribution, (ker, d))) end # ToDo: This could perhaps go into a separate file # I could add `dim` here, and directly return l in the "right shape"? # This would be either a vector or number (which would be great) -function _deconstruct_kernel(ker::SimpleKernel) +function _deconstruct_kernel(ker::KernelFunctions.SimpleKernel) return ker, 1.0 end -function _deconstruct_kernel(ker::TransformedKernel{<:SimpleKernel,<:ScaleTransform}) - return ker.kernel, 1 / ker.transform.s +function _deconstruct_kernel( + ker::TransformedKernel{<:KernelFunctions.SimpleKernel,<:ScaleTransform} +) + l = inv(only(ker.transform.s)) + return ker.kernel, l end function _deconstruct_kernel(ker::TransformedKernel) diff --git a/src/matern.jl b/src/matern.jl new file mode 100644 index 0000000..9847729 --- /dev/null +++ b/src/matern.jl @@ -0,0 +1,16 @@ + +################################################### +## Matern Kernels + +MaternKernels = Union{MaternKernel,Matern32Kernel,Matern52Kernel} + +_matern_order(k::MaternKernel) = only(k.ν) +_matern_order(::Matern32Kernel) = 3 / 2 +_matern_order(::Matern52Kernel) = 5 / 2 + +# rewrite everything as returning a distribution (kind of as originally planned) +# should be able to abstract/ generalize a lot of the special casing +function _spectral_distribution(kernel::MaternKernels, l) + ν = _matern_order(kernel) + return inv(2 * π * l) * TDist(2 * ν) +end \ No newline at end of file From d10623bbcd431c63ff148c3646c6a6bf16c725f5 Mon Sep 17 00:00:00 2001 From: steffen Date: Wed, 12 Jun 2024 23:22:46 +0100 Subject: [PATCH 04/21] Start implementing MvTDist --- Project.toml | 1 + src/matern.jl | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 84446d5..ec6bc76 100644 --- a/Project.toml +++ b/Project.toml @@ -8,6 +8,7 @@ KernelFunctions = "ec8451be-7e33-11e9-00cf-bbf324bd1392" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" +SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" [compat] julia = "1.6" diff --git a/src/matern.jl b/src/matern.jl index 9847729..75a5950 100644 --- a/src/matern.jl +++ b/src/matern.jl @@ -10,7 +10,63 @@ _matern_order(::Matern52Kernel) = 5 / 2 # rewrite everything as returning a distribution (kind of as originally planned) # should be able to abstract/ generalize a lot of the special casing -function _spectral_distribution(kernel::MaternKernels, l) +function _spectral_distribution(kernel::MaternKernels, l::Real) ν = _matern_order(kernel) return inv(2 * π * l) * TDist(2 * ν) +end + +function _spectral_distribution(kernel::MaternKernels, l::AbstractVector) + ν = _matern_order(kernel) + Dv = fill(TDist(2 * ν), length(l)) + return Product(inv.(2 * π * l) .* Dv) +end + +# for "compatibility" with Distributions.jl, I think I only want a constructor for +# the non-scaled version (i.e. MvTDist(), which sets mean to zero and Σ to eye) +# then set the others via + / * operations +struct MvTDist{T<:Real,Cov<:AbstractMatrix,Mean<:AbstractVector} <: + Distributions.ContinuousMultivariateDistribution + μ::Mean + Σ::Cov + ν::Int +end + +import Base: length, eltype#, mean, var, cov + +Base.length(d::MvTDist) = length(d.μ) + +Base.eltype(::Type{<:MvTDist{T}}) where {T} = T + +sampler(d::MvTDist) = d + +Distributions._rand!(::AbstractRNG, d::MvTDist, x::AbstractArray) = d + +# need to add SpecialFunctions.jl for loggamma +function Distributions._logpdf(d::MvTDist, x::AbstractArray) + p = length(d) + + t1 = loggamma((d.ν + p) / 2) - loggamma(d.ν / 2) + -p / 2 * (log(d.ν) + logπ) + -1 / 2 * logdet(d.Σ) + + # log1p term not correct yet. Maybe use quadratic form from Kernelfunctions? + # also missing mu + t2 = -(d.ν + p) / 2 * log1p(sum(x .* (d.Σ \ x)) / d.ν) + + return t1 + 1 +end + +mean(d::MvTDist) = d.μ + +# suspect this is the diagonal +function var(d::MvTDist) + return diag(cov(d)) +end + +function cov(d::MvTDist) + if d.ν > 2 + return diag(d.Σ / (d.ν - 2)) + else + ArgumentError("Variance is undefined for ν <= 2") + end end \ No newline at end of file From 0509ba5d971c6f6c17c63d1bb2d454bb732aca9b Mon Sep 17 00:00:00 2001 From: steffen Date: Wed, 12 Jun 2024 23:23:29 +0100 Subject: [PATCH 05/21] Forgot main file --- src/KernelSpectralDensities.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/KernelSpectralDensities.jl b/src/KernelSpectralDensities.jl index a6ae4a4..0aac97a 100644 --- a/src/KernelSpectralDensities.jl +++ b/src/KernelSpectralDensities.jl @@ -4,6 +4,7 @@ using Reexport @reexport using KernelFunctions using Distributions using LinearAlgebra +using SpecialFunctions import Base: rand using Random From 2b9f636351842de537fb08c484d547b5876f5b4d Mon Sep 17 00:00:00 2001 From: steffen Date: Wed, 12 Jun 2024 23:24:12 +0100 Subject: [PATCH 06/21] Move dimension handing to base functions --- src/base.jl | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/base.jl b/src/base.jl index aefa998..daa9575 100644 --- a/src/base.jl +++ b/src/base.jl @@ -55,11 +55,11 @@ struct SpectralDensity{K<:KernelFunctions.Kernel,D<:Distribution} <: AbstractSpe throw(ArgumentError("Dimension must be greater than 0")) end - sk, l = _deconstruct_kernel(kernel) + sk, l = _deconstruct_kernel(kernel, dim) if dim == 1 d = _spectral_distribution(sk, l) else - d = _spectral_distribution(sk, l, dim) + d = _spectral_distribution(sk, l) end return new{typeof(kernel),typeof(d)}(kernel, d) end @@ -73,28 +73,30 @@ function rand(rng::AbstractRNG, S::SpectralDensity, n::Int...) return rand(rng, S.d, n...) end -function _spectral_distribution(ker::KernelFunctions.Kernel, l) - return throw(MethodError(_spectral_distribution, (ker,))) -end - -function _spectral_distribution(ker::KernelFunctions.Kernel, l, d::Int) - return throw(MethodError(_spectral_distribution, (ker, d))) -end - # ToDo: This could perhaps go into a separate file -# I could add `dim` here, and directly return l in the "right shape"? -# This would be either a vector or number (which would be great) -function _deconstruct_kernel(ker::KernelFunctions.SimpleKernel) - return ker, 1.0 +function _deconstruct_kernel(ker::KernelFunctions.SimpleKernel, dim::Int) + if dim == 1 + l = 1.0 + else + l = ones(dim) + end + return ker, l end function _deconstruct_kernel( - ker::TransformedKernel{<:KernelFunctions.SimpleKernel,<:ScaleTransform} + ker::TransformedKernel{<:KernelFunctions.SimpleKernel,<:ScaleTransform}, dim::Int ) l = inv(only(ker.transform.s)) + if dim > 1 + l = ones(dim) * l + end return ker.kernel, l end function _deconstruct_kernel(ker::TransformedKernel) return throw(MethodError(_deconstruct_kernel, (ker,))) end + +function _spectral_distribution(ker::KernelFunctions.Kernel, l) + return throw(MethodError(_spectral_distribution, (ker,))) +end \ No newline at end of file From 233c7f980aa656c5929c5aa0363a5e72f1486dec Mon Sep 17 00:00:00 2001 From: steffen Date: Fri, 14 Jun 2024 21:58:50 +0100 Subject: [PATCH 07/21] More steps towards MvTDist --- src/matern.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/matern.jl b/src/matern.jl index 75a5950..8e1aaa4 100644 --- a/src/matern.jl +++ b/src/matern.jl @@ -37,7 +37,7 @@ Base.length(d::MvTDist) = length(d.μ) Base.eltype(::Type{<:MvTDist{T}}) where {T} = T -sampler(d::MvTDist) = d +# sampler(d::MvTDist) = d Distributions._rand!(::AbstractRNG, d::MvTDist, x::AbstractArray) = d @@ -51,9 +51,9 @@ function Distributions._logpdf(d::MvTDist, x::AbstractArray) # log1p term not correct yet. Maybe use quadratic form from Kernelfunctions? # also missing mu - t2 = -(d.ν + p) / 2 * log1p(sum(x .* (d.Σ \ x)) / d.ν) + t2 = -(d.ν + p) / 2 * log1p(dot((x - d.μ), d.Σ, (x - d.μ)) / d.ν) - return t1 + 1 + return t1 + t2 end mean(d::MvTDist) = d.μ From 153b521b617625bb92074d79067857a20c8bb12f Mon Sep 17 00:00:00 2001 From: steffen Date: Sat, 15 Jun 2024 13:20:51 +0100 Subject: [PATCH 08/21] Use undocumented MvTDist --- src/matern.jl | 56 ++++----------------------------------------------- 1 file changed, 4 insertions(+), 52 deletions(-) diff --git a/src/matern.jl b/src/matern.jl index 8e1aaa4..1c0024f 100644 --- a/src/matern.jl +++ b/src/matern.jl @@ -17,56 +17,8 @@ end function _spectral_distribution(kernel::MaternKernels, l::AbstractVector) ν = _matern_order(kernel) - Dv = fill(TDist(2 * ν), length(l)) - return Product(inv.(2 * π * l) .* Dv) + n = length(l) + l = inv.(2 * π * l) .^ 2 + D = Distributions.MvTDist(2 * ν, zeros(n), diagm(l)) + return D end - -# for "compatibility" with Distributions.jl, I think I only want a constructor for -# the non-scaled version (i.e. MvTDist(), which sets mean to zero and Σ to eye) -# then set the others via + / * operations -struct MvTDist{T<:Real,Cov<:AbstractMatrix,Mean<:AbstractVector} <: - Distributions.ContinuousMultivariateDistribution - μ::Mean - Σ::Cov - ν::Int -end - -import Base: length, eltype#, mean, var, cov - -Base.length(d::MvTDist) = length(d.μ) - -Base.eltype(::Type{<:MvTDist{T}}) where {T} = T - -# sampler(d::MvTDist) = d - -Distributions._rand!(::AbstractRNG, d::MvTDist, x::AbstractArray) = d - -# need to add SpecialFunctions.jl for loggamma -function Distributions._logpdf(d::MvTDist, x::AbstractArray) - p = length(d) - - t1 = loggamma((d.ν + p) / 2) - loggamma(d.ν / 2) - -p / 2 * (log(d.ν) + logπ) - -1 / 2 * logdet(d.Σ) - - # log1p term not correct yet. Maybe use quadratic form from Kernelfunctions? - # also missing mu - t2 = -(d.ν + p) / 2 * log1p(dot((x - d.μ), d.Σ, (x - d.μ)) / d.ν) - - return t1 + t2 -end - -mean(d::MvTDist) = d.μ - -# suspect this is the diagonal -function var(d::MvTDist) - return diag(cov(d)) -end - -function cov(d::MvTDist) - if d.ν > 2 - return diag(d.Σ / (d.ν - 2)) - else - ArgumentError("Variance is undefined for ν <= 2") - end -end \ No newline at end of file From f190e6b95d2398e24b6e9cbb8bbb974d88cf18a7 Mon Sep 17 00:00:00 2001 From: steffen Date: Sat, 15 Jun 2024 13:24:24 +0100 Subject: [PATCH 09/21] Improve tests --- test/matern.jl | 77 +++++++++++++++++++++++++++++++++++++++++++--- test/test_utils.jl | 10 ++++-- 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/test/matern.jl b/test/matern.jl index c9e459a..42cfc40 100644 --- a/test/matern.jl +++ b/test/matern.jl @@ -18,9 +18,10 @@ end end @testset "Scaled" begin + ker = Matern32Kernel() ker = with_lengthscale(ker, 0.7) w_interval = [-2.0, 2.0] - t_interval = [0.0, 4.0] + t_interval = [0.0, 3.5] test_spectral_density(ker, w_interval, t_interval; show_plot) end @@ -28,18 +29,84 @@ end @testset "2D" begin @testset "Pure" begin - w_interval = [-2.0, 2.0] - x_interval = [-2.0, 2.0] + ker = Matern32Kernel() + w_interval = [-1.5, 1.5] + x_interval = [-3.0, 3.0] test_2Dspectral_density(ker, w_interval, x_interval; show_plot) end @testset "Scaled" begin - ker = with_lengthscale(SqExponentialKernel(), 0.7) + ker = Matern32Kernel() + ker = with_lengthscale(ker, 0.6) w_interval = [-2.0, 2.0] - x_interval = [-2.0, 2.0] + x_interval = [-3.5, 3.5] f = test_2Dspectral_density(ker, w_interval, x_interval; show_plot) end end end + +@testset "Matern52" begin + ker = Matern52Kernel() + @testset "1D" begin + @testset "Pure" begin + ker = Matern52Kernel() + w_interval = [-1.0, 1.0] + t_interval = [0.0, 4.0] + + test_spectral_density(ker, w_interval, t_interval; show_plot) + end + + @testset "Scaled" begin + ker = Matern52Kernel() + ker = with_lengthscale(ker, 0.7) + w_interval = [-1.5, 1.5] + t_interval = [0.0, 3.5] + + test_spectral_density(ker, w_interval, t_interval; show_plot) + end + end + + @testset "2D" begin + @testset "Pure" begin + ker = Matern52Kernel() + w_interval = [-1.1, 1.1] + x_interval = [-3.0, 3.0] + + test_2Dspectral_density(ker, w_interval, x_interval; show_plot) + end + end +end + +@testset "Matern12" begin + ker = MaternKernel(; ν=0.5) + @testset "1D" begin + @testset "Pure" begin + ker = MaternKernel(; ν=0.5) + w_interval = [-3.0, 3.0] + t_interval = [0.2, 6.0] + + test_spectral_density(ker, w_interval, t_interval; show_plot) + end + + @testset "Scaled" begin + ker = MaternKernel(; ν=0.5) + ker = with_lengthscale(ker, 0.7) + w_interval = [-2.5, 2.5] + t_interval = [0.0, 3.5] + + test_spectral_density(ker, w_interval, t_interval; show_plot) + end + end + + @testset "2D" begin + @testset "Pure" begin + ker = Matern52Kernel() + w_interval = [-1.1, 1.1] + x_interval = [-3.0, 3.0] + + test_2Dspectral_density(ker, w_interval, x_interval; show_plot) + end + end +end \ No newline at end of file diff --git a/test/test_utils.jl b/test/test_utils.jl index ec925c2..3c5022e 100644 --- a/test/test_utils.jl +++ b/test/test_utils.jl @@ -69,7 +69,7 @@ function test_2Dspectral_density(ker::Kernel, w_interval, x_interval; show_plot: ## recover kernel from density # Gauss quadrature - wv, weights = gausslegendre(200) + wv, weights = gausslegendre(250) wv = (wv .+ 1) ./ 2 * (w_interval[2] - w_interval[1]) .+ w_interval[1] weights = [w_i * w_j for w_i in weights, w_j in weights] Wv = [[w_i, w_j] for w_i in wv, w_j in wv] @@ -78,7 +78,7 @@ function test_2Dspectral_density(ker::Kernel, w_interval, x_interval; show_plot: ks(t) = c^2 * sum(S.(Wv[:]) .* cos.(2 * π * dot.(Wv[:], [t])) .* weights[:]) Ks = [ks(X_i) for X_i in X] - @test norm(K .- Ks) < 0.01 + @test norm(K .- Ks) < 0.015 ## check sampling # w = range(w_interval..., length=80) @@ -108,7 +108,7 @@ function test_2Dspectral_density(ker::Kernel, w_interval, x_interval; show_plot: #ToDo: better would probably be to test if error decreases with more samples @test norm(K .- Kss) < 0.3 - if plot + if show_plot f = Figure(; size=(900, 1000)) ax = Axis3(f[1, 1]) contour3d!( @@ -118,6 +118,7 @@ function test_2Dspectral_density(ker::Kernel, w_interval, x_interval; show_plot: S.(midpoints); levels=11, color=:orangered3, + linewidth=2.5, label="spectral density", ) contour3d!( @@ -127,6 +128,7 @@ function test_2Dspectral_density(ker::Kernel, w_interval, x_interval; show_plot: h.weights; levels=11, color=:midnightblue, + linewidth=2.5, linestyle=:dash, label="samples", ) @@ -141,6 +143,7 @@ function test_2Dspectral_density(ker::Kernel, w_interval, x_interval; show_plot: Ks; levels=11, color=:midnightblue, + linewidth=2.5, linestyle=:dash, label="spectral approx", ) @@ -151,6 +154,7 @@ function test_2Dspectral_density(ker::Kernel, w_interval, x_interval; show_plot: Kss; levels=11, color=:darkgreen, + linewidth=2.5, linestyle=:dashdot, label="spectral approx (sample)", ) From 3e6ba69942111fc32cab5f3bd302b86fbe6e98e1 Mon Sep 17 00:00:00 2001 From: steffen Date: Sat, 15 Jun 2024 13:50:49 +0100 Subject: [PATCH 10/21] Fix tests for matern kernel --- test/matern.jl | 49 +++++++++++++++++++++++++++++++--------------- test/test_utils.jl | 13 ++++++------ 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/test/matern.jl b/test/matern.jl index 42cfc40..8cc2183 100644 --- a/test/matern.jl +++ b/test/matern.jl @@ -11,14 +11,14 @@ end ker = Matern32Kernel() @testset "1D" begin @testset "Pure" begin - w_interval = [-1.5, 1.5] + w_interval = 1.5 t_interval = [0.0, 4.0] test_spectral_density(ker, w_interval, t_interval; show_plot) end @testset "Scaled" begin - ker = Matern32Kernel() + # ker = Matern32Kernel() ker = with_lengthscale(ker, 0.7) w_interval = [-2.0, 2.0] t_interval = [0.0, 3.5] @@ -29,7 +29,7 @@ end @testset "2D" begin @testset "Pure" begin - ker = Matern32Kernel() + # ker = Matern32Kernel() w_interval = [-1.5, 1.5] x_interval = [-3.0, 3.0] @@ -37,7 +37,7 @@ end end @testset "Scaled" begin - ker = Matern32Kernel() + # ker = Matern32Kernel() ker = with_lengthscale(ker, 0.6) w_interval = [-2.0, 2.0] x_interval = [-3.5, 3.5] @@ -51,15 +51,15 @@ end ker = Matern52Kernel() @testset "1D" begin @testset "Pure" begin - ker = Matern52Kernel() - w_interval = [-1.0, 1.0] + # ker = Matern52Kernel() + w_interval = 1.0 t_interval = [0.0, 4.0] test_spectral_density(ker, w_interval, t_interval; show_plot) end @testset "Scaled" begin - ker = Matern52Kernel() + # ker = Matern52Kernel() ker = with_lengthscale(ker, 0.7) w_interval = [-1.5, 1.5] t_interval = [0.0, 3.5] @@ -70,30 +70,39 @@ end @testset "2D" begin @testset "Pure" begin - ker = Matern52Kernel() + # ker = Matern52Kernel() w_interval = [-1.1, 1.1] x_interval = [-3.0, 3.0] test_2Dspectral_density(ker, w_interval, x_interval; show_plot) end + + @testset "Scaled" begin + # ker = Matern52Kernel() + ker = with_lengthscale(ker, 0.6) + w_interval = [-2.0, 2.0] + x_interval = [-3.5, 3.5] + + f = test_2Dspectral_density(ker, w_interval, x_interval; show_plot) + end end end -@testset "Matern12" begin - ker = MaternKernel(; ν=0.5) +@testset "Matern72" begin + ker = MaternKernel(; ν=7 / 2) @testset "1D" begin @testset "Pure" begin - ker = MaternKernel(; ν=0.5) - w_interval = [-3.0, 3.0] - t_interval = [0.2, 6.0] + # ker = MaternKernel(; ν=7 / 2) + w_interval = 1.0 + t_interval = [0.0, 6.0] test_spectral_density(ker, w_interval, t_interval; show_plot) end @testset "Scaled" begin - ker = MaternKernel(; ν=0.5) + # ker = MaternKernel(; ν=7 / 2) ker = with_lengthscale(ker, 0.7) - w_interval = [-2.5, 2.5] + w_interval = 1.2 t_interval = [0.0, 3.5] test_spectral_density(ker, w_interval, t_interval; show_plot) @@ -102,11 +111,19 @@ end @testset "2D" begin @testset "Pure" begin - ker = Matern52Kernel() + # ker = MaternKernel(; ν=7 / 2) w_interval = [-1.1, 1.1] x_interval = [-3.0, 3.0] test_2Dspectral_density(ker, w_interval, x_interval; show_plot) end end + @testset "Scaled" begin + # ker = MaternKernel(; ν=7 / 2) + ker = with_lengthscale(ker, 0.6) + w_interval = [-2.0, 2.0] + x_interval = [-3.5, 3.5] + + f = test_2Dspectral_density(ker, w_interval, x_interval; show_plot) + end end \ No newline at end of file diff --git a/test/test_utils.jl b/test/test_utils.jl index 3c5022e..4d106da 100644 --- a/test/test_utils.jl +++ b/test/test_utils.jl @@ -5,7 +5,7 @@ using FastGaussQuadrature using StatsBase using StableRNGs -function test_spectral_density(ker::Kernel, w_interval, t_interval; show_plot::Bool=false) +function test_spectral_density(ker::Kernel, w_max, t_interval; show_plot::Bool=false) rng = StableRNG(123) S = SpectralDensity(ker, 1) k(t) = ker(0, t) @@ -14,15 +14,15 @@ function test_spectral_density(ker::Kernel, w_interval, t_interval; show_plot::B τv = range(t_interval...; length=50) wv, weights = gausslegendre(400) - wv = (wv .+ 1) ./ 2 * (w_interval[2] - w_interval[1]) .+ w_interval[1] - c = (w_interval[2] - w_interval[1]) / 2 + wv = (wv .+ 1) ./ 2 * w_max + c = w_max / 2 - ks(t) = c * sum(S.(wv) .* cos.(2 * π * wv * t) .* weights) + ks(t) = 2 * c * sum(S.(wv) .* cos.(2 * π * wv * t) .* weights) @test norm(k.(τv) .- ks.(τv)) < 5e-3 w_samples = rand(rng, S, Int(1e6)) - w_bins = range(w_interval...; length=100) + w_bins = range(-w_max, w_max; length=100) h = fit(Histogram, w_samples, w_bins) h = normalize(h; mode=:pdf) @@ -43,7 +43,8 @@ function test_spectral_density(ker::Kernel, w_interval, t_interval; show_plot::B axislegend() ax2 = Axis(f[1, 2]) - lines!(ax2, wv, S.(wv); label="spectral density") + pwv = vcat(-reverse(wv), wv) + lines!(ax2, pwv, S.(pwv); label="spectral density") barplot!( ax2, midpoints, From 97bf060c451295605660bd261facb5b1f3c1992c Mon Sep 17 00:00:00 2001 From: steffen Date: Sat, 15 Jun 2024 14:10:02 +0100 Subject: [PATCH 11/21] Remove SpecialFunctions again --- Project.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Project.toml b/Project.toml index ec6bc76..84446d5 100644 --- a/Project.toml +++ b/Project.toml @@ -8,7 +8,6 @@ KernelFunctions = "ec8451be-7e33-11e9-00cf-bbf324bd1392" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" -SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" [compat] julia = "1.6" From 6205abdc297c6d33eb7fbedae5d8a3e3a3edd241 Mon Sep 17 00:00:00 2001 From: steffen Date: Sat, 15 Jun 2024 14:10:25 +0100 Subject: [PATCH 12/21] Adjust squared exponential to new format --- src/KernelSpectralDensities.jl | 3 +-- src/expkernels.jl | 38 +++++----------------------------- test/expkernels.jl | 14 +++++++------ 3 files changed, 14 insertions(+), 41 deletions(-) diff --git a/src/KernelSpectralDensities.jl b/src/KernelSpectralDensities.jl index 0aac97a..06bbaa4 100644 --- a/src/KernelSpectralDensities.jl +++ b/src/KernelSpectralDensities.jl @@ -4,7 +4,6 @@ using Reexport @reexport using KernelFunctions using Distributions using LinearAlgebra -using SpecialFunctions import Base: rand using Random @@ -14,7 +13,7 @@ export ShiftedRFF, DoubleRFF export ApproximateGPSample include("base.jl") -# include("expkernels.jl") +include("expkernels.jl") include("matern.jl") include("features.jl") include("approx_prior.jl") diff --git a/src/expkernels.jl b/src/expkernels.jl index 09b277c..9a6ad92 100644 --- a/src/expkernels.jl +++ b/src/expkernels.jl @@ -3,40 +3,12 @@ ## Squared ExponentialKernel # ToDo: Not sure about distances? Do all work? -(S::SpectralDensity{<:SqExponentialKernel})(w) = _sqexp(w, 1) -function (S::SpectralDensity{<:TransformedKernel{<:SqExponentialKernel,<:ScaleTransform}})( - w -) - l = 1 / only(S.kernel.transform.s) - return _sqexp(w, l^2) +function _spectral_distribution(ker::SqExponentialKernel, l::Real) + return inv(2 * π * l) * Normal() end -_sqexp(w::Real, l2::Real) = sqrt(2 * l2 * π) * exp(-2 * l2 * π^2 * w^2) -function _sqexp(w::AbstractVector{<:Real}, l2::Real) - d = length(w) - return sqrt(2 * l2 * π)^d * exp(-2 * l2 * π^2 * dot(w, w)) -end - -function rand(rng::AbstractRNG, S::SpectralDensity{<:SqExponentialKernel}, n::Int...) - return _sqexprand(rng, S.dim, 1, n...) -end - -function rand( - rng::AbstractRNG, - S::SpectralDensity{<:TransformedKernel{<:SqExponentialKernel,<:ScaleTransform}}, - n::Int..., -) - l = 1 / only(S.kernel.transform.s) - return _sqexprand(rng, S.dim, l, n...) -end - -function _sqexprand(rng::AbstractRNG, d::Int, l::Real, n::Int...) - σ = 1 / (2 * l * π) - if d == 1 - return rand(rng, Normal(0, σ), n...) - elseif d > 1 - σv = ones(d) * abs2(σ) - return rand(rng, MvNormal(Diagonal(σv)), n...) - end +function _spectral_distribution(ker::SqExponentialKernel, l::AbstractVector) + σv = abs2.(inv.(2 * π * l)) + return MvNormal(Diagonal(σv)) end diff --git a/test/expkernels.jl b/test/expkernels.jl index 344931c..0195a1f 100644 --- a/test/expkernels.jl +++ b/test/expkernels.jl @@ -7,21 +7,21 @@ else show_plot = false end -ker = Matern32Kernel() - @testset "SquaredExponential Kernel" begin ker = SqExponentialKernel() @testset "1D" begin @testset "Pure" begin - w_interval = [-2.0, 2.0] + ker = SqExponentialKernel() + w_interval = 2.0 t_interval = [0.0, 4.0] test_spectral_density(ker, w_interval, t_interval; show_plot) end @testset "Scaled" begin - ker = with_lengthscale(SqExponentialKernel(), 0.7) - w_interval = [-2.0, 2.0] + ker = SqExponentialKernel() + ker = with_lengthscale(ker, 0.7) + w_interval = 2.0 t_interval = [0.0, 4.0] f = test_spectral_density(ker, w_interval, t_interval; show_plot) @@ -30,6 +30,7 @@ ker = Matern32Kernel() @testset "2D" begin @testset "Pure" begin + ker = SqExponentialKernel() w_interval = [-2.0, 2.0] x_interval = [-2.0, 2.0] @@ -37,7 +38,8 @@ ker = Matern32Kernel() end @testset "Scaled" begin - ker = with_lengthscale(SqExponentialKernel(), 0.7) + ker = SqExponentialKernel() + ker = with_lengthscale(ker, 0.7) w_interval = [-2.0, 2.0] x_interval = [-2.0, 2.0] From c6ba085816d16cdf516c97bcca75214f5c0989d1 Mon Sep 17 00:00:00 2001 From: steffen Date: Sat, 15 Jun 2024 14:21:58 +0100 Subject: [PATCH 13/21] Some cleanup --- src/base.jl | 4 ++-- src/expkernels.jl | 1 - test/expkernels.jl | 8 ++++---- test/runtests.jl | 4 ++-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/base.jl b/src/base.jl index daa9575..3dcafb7 100644 --- a/src/base.jl +++ b/src/base.jl @@ -37,12 +37,12 @@ julia> k = SqExponentialKernel(); julia> S = SpectralDensity(k, 1); julia> S(0.0) -2.5066282746310002 +2.5066282746310007 julia> S = SpectralDensity(k, 2); julia> S(zeros(2)) -6.283185307179585 +6.2831853071795845 ``` """ struct SpectralDensity{K<:KernelFunctions.Kernel,D<:Distribution} <: AbstractSpectralDensity diff --git a/src/expkernels.jl b/src/expkernels.jl index 9a6ad92..c78aa20 100644 --- a/src/expkernels.jl +++ b/src/expkernels.jl @@ -3,7 +3,6 @@ ## Squared ExponentialKernel # ToDo: Not sure about distances? Do all work? - function _spectral_distribution(ker::SqExponentialKernel, l::Real) return inv(2 * π * l) * Normal() end diff --git a/test/expkernels.jl b/test/expkernels.jl index 0195a1f..9bcf055 100644 --- a/test/expkernels.jl +++ b/test/expkernels.jl @@ -11,7 +11,7 @@ end ker = SqExponentialKernel() @testset "1D" begin @testset "Pure" begin - ker = SqExponentialKernel() + # ker = SqExponentialKernel() w_interval = 2.0 t_interval = [0.0, 4.0] @@ -19,7 +19,7 @@ end end @testset "Scaled" begin - ker = SqExponentialKernel() + # ker = SqExponentialKernel() ker = with_lengthscale(ker, 0.7) w_interval = 2.0 t_interval = [0.0, 4.0] @@ -30,7 +30,7 @@ end @testset "2D" begin @testset "Pure" begin - ker = SqExponentialKernel() + # ker = SqExponentialKernel() w_interval = [-2.0, 2.0] x_interval = [-2.0, 2.0] @@ -38,7 +38,7 @@ end end @testset "Scaled" begin - ker = SqExponentialKernel() + # ker = SqExponentialKernel() ker = with_lengthscale(ker, 0.7) w_interval = [-2.0, 2.0] x_interval = [-2.0, 2.0] diff --git a/test/runtests.jl b/test/runtests.jl index 9749ae6..7ed3dff 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -9,14 +9,14 @@ const RUN_TESTS = true @info "Packages Loaded" -include("test_utils.jl") - @testset "Base" begin include("base.jl") end @testset "SpectralDensities" begin include("expkernels.jl") + + include("matern.jl") end @testset "Feature functions" begin From 42fd8f31c18e9bb97da78758c18dea8c66324374 Mon Sep 17 00:00:00 2001 From: steffen Date: Sat, 15 Jun 2024 14:36:45 +0100 Subject: [PATCH 14/21] Add compat entries --- Project.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 84446d5..52c87a9 100644 --- a/Project.toml +++ b/Project.toml @@ -10,7 +10,10 @@ Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" [compat] -julia = "1.6" +julia = "1.8" +Distributions = "0.25.108" +KernelFunctions = "0.10.63" +Reexport = "1.2.2" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" From 312c8825606487698b323ebbc560f4fa140f4996 Mon Sep 17 00:00:00 2001 From: steffen Date: Sun, 16 Jun 2024 09:06:00 +0100 Subject: [PATCH 15/21] Fix base tests --- src/base.jl | 11 ++++------- test/base.jl | 8 +++++--- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/base.jl b/src/base.jl index 3dcafb7..18c39cd 100644 --- a/src/base.jl +++ b/src/base.jl @@ -56,11 +56,8 @@ struct SpectralDensity{K<:KernelFunctions.Kernel,D<:Distribution} <: AbstractSpe end sk, l = _deconstruct_kernel(kernel, dim) - if dim == 1 - d = _spectral_distribution(sk, l) - else - d = _spectral_distribution(sk, l) - end + d = _spectral_distribution(sk, l) + return new{typeof(kernel),typeof(d)}(kernel, d) end end @@ -93,8 +90,8 @@ function _deconstruct_kernel( return ker.kernel, l end -function _deconstruct_kernel(ker::TransformedKernel) - return throw(MethodError(_deconstruct_kernel, (ker,))) +function _deconstruct_kernel(ker::TransformedKernel, dim::Int) + return throw(MethodError(_deconstruct_kernel, (ker, dim))) end function _spectral_distribution(ker::KernelFunctions.Kernel, l) diff --git a/test/base.jl b/test/base.jl index e120726..a63de88 100644 --- a/test/base.jl +++ b/test/base.jl @@ -2,11 +2,13 @@ using KernelSpectralDensities using Test @testset "Fallback" begin - ker = ZeroKernel() + ker = ConstantKernel() + + @test_throws MethodError SpectralDensity(ker, 1) - S = SpectralDensity(ker, 1) + kert = ker ∘ SelectTransform(1.0) - @test_throws ErrorException S(1.0) + @test_throws MethodError SpectralDensity(kert, 1) end @testset "Dimension check" begin From 595946a9a30e2556ecdb4092ae5c35be3ffabb32 Mon Sep 17 00:00:00 2001 From: steffen Date: Sun, 16 Jun 2024 09:44:21 +0100 Subject: [PATCH 16/21] Fix test script --- test/expkernels.jl | 2 +- test/matern.jl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/expkernels.jl b/test/expkernels.jl index 9bcf055..c05c0c1 100644 --- a/test/expkernels.jl +++ b/test/expkernels.jl @@ -1,6 +1,6 @@ include("test_utils.jl") -if !isdefined(Base, :RUN_TESTS) || !RUN_TESTS +if (!@isdefined RUN_TESTS) || !RUN_TESTS using CairoMakie show_plot = true else diff --git a/test/matern.jl b/test/matern.jl index 8cc2183..2554b11 100644 --- a/test/matern.jl +++ b/test/matern.jl @@ -1,6 +1,6 @@ include("test_utils.jl") -if !isdefined(Base, :RUN_TESTS) || !RUN_TESTS +if !isdefined(Base, :RUN_TESTS) && !RUN_TESTS using CairoMakie show_plot = true else From d15cd3392dcc4d28fe22d30cbff3cf3f9fe58feb Mon Sep 17 00:00:00 2001 From: steffen Date: Sun, 16 Jun 2024 09:58:40 +0100 Subject: [PATCH 17/21] Small fix --- test/matern.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/matern.jl b/test/matern.jl index 2554b11..c03b7f5 100644 --- a/test/matern.jl +++ b/test/matern.jl @@ -1,6 +1,6 @@ include("test_utils.jl") -if !isdefined(Base, :RUN_TESTS) && !RUN_TESTS +if (!@isdefined RUN_TESTS) || !RUN_TESTS using CairoMakie show_plot = true else @@ -20,7 +20,7 @@ end @testset "Scaled" begin # ker = Matern32Kernel() ker = with_lengthscale(ker, 0.7) - w_interval = [-2.0, 2.0] + w_interval = 2.0 t_interval = [0.0, 3.5] test_spectral_density(ker, w_interval, t_interval; show_plot) @@ -29,7 +29,7 @@ end @testset "2D" begin @testset "Pure" begin - # ker = Matern32Kernel() + ker = Matern32Kernel() w_interval = [-1.5, 1.5] x_interval = [-3.0, 3.0] @@ -61,7 +61,7 @@ end @testset "Scaled" begin # ker = Matern52Kernel() ker = with_lengthscale(ker, 0.7) - w_interval = [-1.5, 1.5] + w_interval = 1.5 t_interval = [0.0, 3.5] test_spectral_density(ker, w_interval, t_interval; show_plot) From bab49d4ae3dcd395daa251eafe83958f73977c5b Mon Sep 17 00:00:00 2001 From: steffen Date: Sun, 16 Jun 2024 12:05:51 +0100 Subject: [PATCH 18/21] More test fixes --- test/expkernels.jl | 11 +++++------ test/matern.jl | 27 +++++++++++++-------------- test/runtests.jl | 2 ++ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/test/expkernels.jl b/test/expkernels.jl index c05c0c1..f1b7428 100644 --- a/test/expkernels.jl +++ b/test/expkernels.jl @@ -1,8 +1,7 @@ -include("test_utils.jl") - if (!@isdefined RUN_TESTS) || !RUN_TESTS using CairoMakie show_plot = true + include("test_utils.jl") else show_plot = false end @@ -20,11 +19,11 @@ end @testset "Scaled" begin # ker = SqExponentialKernel() - ker = with_lengthscale(ker, 0.7) + kert = with_lengthscale(ker, 0.7) w_interval = 2.0 t_interval = [0.0, 4.0] - f = test_spectral_density(ker, w_interval, t_interval; show_plot) + f = test_spectral_density(kert, w_interval, t_interval; show_plot) end end @@ -39,11 +38,11 @@ end @testset "Scaled" begin # ker = SqExponentialKernel() - ker = with_lengthscale(ker, 0.7) + kert = with_lengthscale(ker, 0.7) w_interval = [-2.0, 2.0] x_interval = [-2.0, 2.0] - f = test_2Dspectral_density(ker, w_interval, x_interval; show_plot) + f = test_2Dspectral_density(kert, w_interval, x_interval; show_plot) end end end diff --git a/test/matern.jl b/test/matern.jl index c03b7f5..591bbc6 100644 --- a/test/matern.jl +++ b/test/matern.jl @@ -1,8 +1,7 @@ -include("test_utils.jl") - if (!@isdefined RUN_TESTS) || !RUN_TESTS using CairoMakie show_plot = true + include("test_utils.jl") else show_plot = false end @@ -19,11 +18,11 @@ end @testset "Scaled" begin # ker = Matern32Kernel() - ker = with_lengthscale(ker, 0.7) + kert = with_lengthscale(ker, 0.7) w_interval = 2.0 t_interval = [0.0, 3.5] - test_spectral_density(ker, w_interval, t_interval; show_plot) + test_spectral_density(kert, w_interval, t_interval; show_plot) end end @@ -38,11 +37,11 @@ end @testset "Scaled" begin # ker = Matern32Kernel() - ker = with_lengthscale(ker, 0.6) + kert = with_lengthscale(ker, 0.6) w_interval = [-2.0, 2.0] x_interval = [-3.5, 3.5] - f = test_2Dspectral_density(ker, w_interval, x_interval; show_plot) + f = test_2Dspectral_density(kert, w_interval, x_interval; show_plot) end end end @@ -60,11 +59,11 @@ end @testset "Scaled" begin # ker = Matern52Kernel() - ker = with_lengthscale(ker, 0.7) + kert = with_lengthscale(ker, 0.7) w_interval = 1.5 t_interval = [0.0, 3.5] - test_spectral_density(ker, w_interval, t_interval; show_plot) + test_spectral_density(kert, w_interval, t_interval; show_plot) end end @@ -79,11 +78,11 @@ end @testset "Scaled" begin # ker = Matern52Kernel() - ker = with_lengthscale(ker, 0.6) + kert = with_lengthscale(ker, 0.6) w_interval = [-2.0, 2.0] x_interval = [-3.5, 3.5] - f = test_2Dspectral_density(ker, w_interval, x_interval; show_plot) + f = test_2Dspectral_density(kert, w_interval, x_interval; show_plot) end end end @@ -101,11 +100,11 @@ end @testset "Scaled" begin # ker = MaternKernel(; ν=7 / 2) - ker = with_lengthscale(ker, 0.7) + kert = with_lengthscale(ker, 0.7) w_interval = 1.2 t_interval = [0.0, 3.5] - test_spectral_density(ker, w_interval, t_interval; show_plot) + test_spectral_density(kert, w_interval, t_interval; show_plot) end end @@ -120,10 +119,10 @@ end end @testset "Scaled" begin # ker = MaternKernel(; ν=7 / 2) - ker = with_lengthscale(ker, 0.6) + kert = with_lengthscale(ker, 0.6) w_interval = [-2.0, 2.0] x_interval = [-3.5, 3.5] - f = test_2Dspectral_density(ker, w_interval, x_interval; show_plot) + f = test_2Dspectral_density(kert, w_interval, x_interval; show_plot) end end \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl index 7ed3dff..62edaf1 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -9,6 +9,8 @@ const RUN_TESTS = true @info "Packages Loaded" +include("test_utils.jl") + @testset "Base" begin include("base.jl") end From b054218c4002f2f20bc17b0297d7b8784a5e6ac9 Mon Sep 17 00:00:00 2001 From: steffen Date: Sun, 16 Jun 2024 12:22:14 +0100 Subject: [PATCH 19/21] Remove obsolte fallback --- examples/approx-prior-sample.jl | 1 + examples/densities.jl | 1 + examples/feature-functions.jl | 1 + src/base.jl | 2 -- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 examples/approx-prior-sample.jl create mode 100644 examples/densities.jl create mode 100644 examples/feature-functions.jl diff --git a/examples/approx-prior-sample.jl b/examples/approx-prior-sample.jl new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/approx-prior-sample.jl @@ -0,0 +1 @@ + diff --git a/examples/densities.jl b/examples/densities.jl new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/densities.jl @@ -0,0 +1 @@ + diff --git a/examples/feature-functions.jl b/examples/feature-functions.jl new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/feature-functions.jl @@ -0,0 +1 @@ + diff --git a/src/base.jl b/src/base.jl index 18c39cd..9500072 100644 --- a/src/base.jl +++ b/src/base.jl @@ -1,8 +1,6 @@ abstract type AbstractSpectralDensity end -(S::AbstractSpectralDensity)(w) = error("Not implemented") - """ rand(S::AbstractSpectralDensity, [n::Int]) From febeb21253a043e6836ca6fedac5cbc7a06b3b0f Mon Sep 17 00:00:00 2001 From: Steffen Ridderbusch Date: Wed, 12 Feb 2025 15:59:48 +0000 Subject: [PATCH 20/21] Bump project version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 52c87a9..b712118 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "KernelSpectralDensities" uuid = "027d52a2-76e5-4228-9bfe-bc7e0f5a8348" -version = "0.1.0" +version = "0.2.0" [deps] Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" From fc82c8b76995863331b081698d2819d368447fc9 Mon Sep 17 00:00:00 2001 From: Steffen Ridderbusch Date: Wed, 12 Feb 2025 16:06:18 +0000 Subject: [PATCH 21/21] Add preview and cleanup job --- .github/workflows/DocsPreviewCleanup.yml | 33 ++++++++++++++++++++++++ docs/make.jl | 4 ++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/DocsPreviewCleanup.yml diff --git a/.github/workflows/DocsPreviewCleanup.yml b/.github/workflows/DocsPreviewCleanup.yml new file mode 100644 index 0000000..36f8569 --- /dev/null +++ b/.github/workflows/DocsPreviewCleanup.yml @@ -0,0 +1,33 @@ +name: Doc Preview Cleanup + +on: + pull_request: + types: [closed] + +# Ensure that only one "Doc Preview Cleanup" workflow is force pushing at a time +concurrency: + group: doc-preview-cleanup + cancel-in-progress: false + +jobs: + doc-preview-cleanup: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout gh-pages branch + uses: actions/checkout@v4 + with: + ref: gh-pages + - name: Delete preview and history + push changes + run: | + if [ -d "${preview_dir}" ]; then + git config user.name "Documenter.jl" + git config user.email "documenter@juliadocs.github.io" + git rm -rf "${preview_dir}" + git commit -m "delete preview" + git branch gh-pages-new $(echo "delete history" | git commit-tree HEAD^{tree}) + git push --force origin gh-pages-new:gh-pages + fi + env: + preview_dir: previews/PR${{ github.event.number }} \ No newline at end of file diff --git a/docs/make.jl b/docs/make.jl index 5c6cf09..688243e 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -24,5 +24,7 @@ makedocs(; ) deploydocs(; - repo="github.com/JuliaGaussianProcesses/KernelSpectralDensities.jl", devbranch="main" + repo="github.com/JuliaGaussianProcesses/KernelSpectralDensities.jl", + devbranch="main", + push_preview = true )