Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name = "KernelFunctions"
uuid = "ec8451be-7e33-11e9-00cf-bbf324bd1392"
version = "0.10.53"
version = "0.10.54"

[deps]
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
Expand Down Expand Up @@ -35,4 +35,4 @@ SpecialFunctions = "0.8, 0.9, 0.10, 1, 2"
StatsBase = "0.32, 0.33"
TensorCore = "0.1"
ZygoteRules = "0.2"
julia = "1.3"
julia = "1.6"
4 changes: 2 additions & 2 deletions src/basekernels/constant.jl
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@ See also: [`ZeroKernel`](@ref)
struct ConstantKernel{Tc<:Real} <: SimpleKernel
c::Vector{Tc}

function ConstantKernel(; c::Real=1.0)
@check_args(ConstantKernel, c, c >= zero(c), "c ≥ 0")
function ConstantKernel(; c::Real=1.0, check_args::Bool=true)
check_args && @check_args(ConstantKernel, c, c >= zero(c), "c ≥ 0")
return new{typeof(c)}([c])
end
end
Expand Down
10 changes: 6 additions & 4 deletions src/basekernels/exponential.jl
Original file line number Diff line number Diff line change
Expand Up @@ -125,14 +125,16 @@ struct GammaExponentialKernel{Tγ<:Real,M} <: SimpleKernel
γ::Vector{Tγ}
metric::M

function GammaExponentialKernel(γ::Real, metric)
@check_args(GammaExponentialKernel, γ, zero(γ) < γ ≤ 2, "γ ∈ (0, 2]")
function GammaExponentialKernel(γ::Real, metric; check_args::Bool=true)
check_args && @check_args(GammaExponentialKernel, γ, zero(γ) < γ ≤ 2, "γ ∈ (0, 2]")
return new{typeof(γ),typeof(metric)}([γ], metric)
end
end

function GammaExponentialKernel(; gamma::Real=1.0, γ::Real=gamma, metric=Euclidean())
return GammaExponentialKernel(γ, metric)
function GammaExponentialKernel(;
gamma::Real=1.0, γ::Real=gamma, metric=Euclidean(), check_args::Bool=true
)
return GammaExponentialKernel(γ, metric; check_args)
end

@functor GammaExponentialKernel
Expand Down
6 changes: 3 additions & 3 deletions src/basekernels/fbm.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ k(x, x'; h) = \\frac{\\|x\\|_2^{2h} + \\|x'\\|_2^{2h} - \\|x - x'\\|^{2h}}{2}.
"""
struct FBMKernel{T<:Real} <: Kernel
h::Vector{T}
function FBMKernel(h::Real)
@check_args(FBMKernel, h, zero(h) ≤ h ≤ one(h), "h ∈ [0, 1]")
function FBMKernel(h::Real; check_args::Bool=true)
check_args && @check_args(FBMKernel, h, zero(h) ≤ h ≤ one(h), "h ∈ [0, 1]")
return new{typeof(h)}([h])
end
end

FBMKernel(; h::Real=0.5) = FBMKernel(h)
FBMKernel(; h::Real=0.5, check_args::Bool=true) = FBMKernel(h; check_args)

@functor FBMKernel

Expand Down
8 changes: 5 additions & 3 deletions src/basekernels/matern.jl
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,15 @@ struct MaternKernel{Tν<:Real,M} <: SimpleKernel
ν::Vector{Tν}
metric::M

function MaternKernel(ν::Real, metric)
@check_args(MaternKernel, ν, ν > zero(ν), "ν > 0")
function MaternKernel(ν::Real, metric; check_args::Bool=true)
check_args && @check_args(MaternKernel, ν, ν > zero(ν), "ν > 0")
return new{typeof(ν),typeof(metric)}([ν], metric)
end
end

MaternKernel(; nu::Real=1.5, ν::Real=nu, metric=Euclidean()) = MaternKernel(ν, metric)
function MaternKernel(; nu::Real=1.5, ν::Real=nu, metric=Euclidean(), check_args::Bool=true)
return MaternKernel(ν, metric; check_args)
end

@functor MaternKernel

Expand Down
11 changes: 8 additions & 3 deletions src/basekernels/periodic.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,11 @@ k(x, x'; r) = \\exp\\bigg(- \\frac{1}{2} \\sum_{i=1}^d \\bigg(\\frac{\\sin\\big(
"""
struct PeriodicKernel{T} <: SimpleKernel
r::Vector{T}
function PeriodicKernel(; r::AbstractVector{<:Real}=ones(Float64, 1))
@check_args(PeriodicKernel, r, all(ri > zero(ri) for ri in r), "r > 0")
function PeriodicKernel(;
r::AbstractVector{<:Real}=ones(Float64, 1), check_args::Bool=true
)
check_args &&
@check_args(PeriodicKernel, r, all(ri > zero(ri) for ri in r), "r > 0")
return new{eltype(r)}(r)
end
end
Expand All @@ -28,7 +31,9 @@ PeriodicKernel(dims::Int) = PeriodicKernel(Float64, dims)

Create a [`PeriodicKernel`](@ref) with parameter `r=ones(T, dims)`.
"""
PeriodicKernel(T::DataType, dims::Int=1) = PeriodicKernel(; r=ones(T, dims))
function PeriodicKernel(T::DataType, dims::Int=1)
return PeriodicKernel(; r=ones(T, dims), check_args=false)
end

@functor PeriodicKernel

Expand Down
19 changes: 11 additions & 8 deletions src/basekernels/polynomial.jl
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ See also: [`PolynomialKernel`](@ref)
struct LinearKernel{Tc<:Real} <: SimpleKernel
c::Vector{Tc}

function LinearKernel(c::Real)
@check_args(LinearKernel, c, c >= zero(c), "c ≥ 0")
function LinearKernel(c::Real; check_args::Bool=true)
check_args && @check_args(LinearKernel, c, c >= zero(c), "c ≥ 0")
return new{typeof(c)}([c])
end
end

LinearKernel(; c::Real=0.0) = LinearKernel(c)
LinearKernel(; c::Real=0.0, check_args::Bool=true) = LinearKernel(c; check_args)

@functor LinearKernel

Expand Down Expand Up @@ -69,15 +69,18 @@ struct PolynomialKernel{Tc<:Real} <: SimpleKernel
degree::Int
c::Vector{Tc}

function PolynomialKernel{Tc}(degree::Int, c::Vector{Tc}) where {Tc}
@check_args(PolynomialKernel, degree, degree >= one(degree), "degree ≥ 1")
@check_args(PolynomialKernel, c, only(c) >= zero(Tc), "c ≥ 0")
function PolynomialKernel{Tc}(
degree::Int, c::Vector{Tc}; check_args::Bool=true
) where {Tc}
check_args &&
@check_args(PolynomialKernel, degree, degree >= one(degree), "degree ≥ 1")
check_args && @check_args(PolynomialKernel, c, only(c) >= zero(Tc), "c ≥ 0")
return new{Tc}(degree, c)
end
end

function PolynomialKernel(; degree::Int=2, c::Real=0.0)
return PolynomialKernel{typeof(c)}(degree, [c])
function PolynomialKernel(; degree::Int=2, c::Real=0.0, check_args::Bool=true)
return PolynomialKernel{typeof(c)}(degree, [c]; check_args)
end

# The degree of the polynomial kernel is a fixed discrete parameter
Expand Down
27 changes: 18 additions & 9 deletions src/basekernels/rational.jl
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,16 @@ struct RationalKernel{Tα<:Real,M} <: SimpleKernel
α::Vector{Tα}
metric::M

function RationalKernel(α::Real, metric)
@check_args(RationalKernel, α, α > zero(α), "α > 0")
function RationalKernel(α::Real, metric; check_args::Bool=true)
check_args && @check_args(RationalKernel, α, α > zero(α), "α > 0")
return new{typeof(α),typeof(metric)}([α], metric)
end
end

function RationalKernel(; alpha::Real=2.0, α::Real=alpha, metric=Euclidean())
return RationalKernel(α, metric)
function RationalKernel(;
alpha::Real=2.0, α::Real=alpha, metric=Euclidean(), check_args::Bool=true
)
return RationalKernel(α, metric; check_args)
end

@functor RationalKernel
Expand Down Expand Up @@ -83,8 +85,10 @@ struct RationalQuadraticKernel{Tα<:Real,M} <: SimpleKernel
α::Vector{Tα}
metric::M

function RationalQuadraticKernel(; alpha::Real=2.0, α::Real=alpha, metric=Euclidean())
@check_args(RationalQuadraticKernel, α, α > zero(α), "α > 0")
function RationalQuadraticKernel(;
alpha::Real=2.0, α::Real=alpha, metric=Euclidean(), check_args::Bool=true
)
check_args && @check_args(RationalQuadraticKernel, α, α > zero(α), "α > 0")
return new{typeof(α),typeof(metric)}([α], metric)
end
end
Expand Down Expand Up @@ -172,10 +176,15 @@ struct GammaRationalKernel{Tα<:Real,Tγ<:Real,M} <: SimpleKernel
metric::M

function GammaRationalKernel(;
alpha::Real=2.0, gamma::Real=1.0, α::Real=alpha, γ::Real=gamma, metric=Euclidean()
alpha::Real=2.0,
gamma::Real=1.0,
α::Real=alpha,
γ::Real=gamma,
metric=Euclidean(),
check_args::Bool=true,
)
@check_args(GammaRationalKernel, α, α > zero(α), "α > 0")
@check_args(GammaRationalKernel, γ, zero(γ) < γ ≤ 2, "γ ∈ (0, 2]")
check_args && @check_args(GammaRationalKernel, α, α > zero(α), "α > 0")
check_args && @check_args(GammaRationalKernel, γ, zero(γ) < γ ≤ 2, "γ ∈ (0, 2]")
return new{typeof(α),typeof(γ),typeof(metric)}([α], [γ], metric)
end
end
Expand Down
5 changes: 3 additions & 2 deletions src/basekernels/wiener.jl
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ The [`WhiteKernel`](@ref) is recovered for ``i = -1``.
[^SDH]: Schober, Duvenaud & Hennig (2014). Probabilistic ODE Solvers with Runge-Kutta Means.
"""
struct WienerKernel{I} <: Kernel
function WienerKernel{I}() where {I}
@check_args(WienerKernel, I, I ∈ (-1, 0, 1, 2, 3), "I ∈ {-1, 0, 1, 2, 3}")
function WienerKernel{I}(; check_args::Bool=true) where {I}
check_args &&
@check_args(WienerKernel, I, I ∈ (-1, 0, 1, 2, 3), "I ∈ {-1, 0, 1, 2, 3}")
if I == -1
return WhiteKernel()
end
Expand Down
6 changes: 4 additions & 2 deletions src/kernels/scaledkernel.jl
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ struct ScaledKernel{Tk<:Kernel,Tσ²<:Real} <: Kernel
σ²::Vector{Tσ²}
end

function ScaledKernel(kernel::Tk, σ²::Tσ²=1.0) where {Tk<:Kernel,Tσ²<:Real}
@check_args(ScaledKernel, σ², σ² > zero(Tσ²), "σ² > 0")
function ScaledKernel(
kernel::Tk, σ²::Tσ²=1.0; check_args::Bool=true
) where {Tk<:Kernel,Tσ²<:Real}
check_args && @check_args(ScaledKernel, σ², σ² > zero(Tσ²), "σ² > 0")
return ScaledKernel{Tk,Tσ²}(kernel, [σ²])
end

Expand Down
18 changes: 8 additions & 10 deletions src/mokernels/independent.jl
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,14 @@ function kernelmatrix(
return _kernelmatrix_kron_helper(MOI, Kfeatures, Koutputs)
end

if VERSION >= v"1.6"
function kernelmatrix!(
K::AbstractMatrix, k::IndependentMOKernel, x::MOI, y::MOI
) where {MOI<:IsotopicMOInputsUnion}
x.out_dim == y.out_dim ||
throw(DimensionMismatch("`x` and `y` must have the same `out_dim`"))
Kfeatures = kernelmatrix(k.kernel, x.x, y.x)
Koutputs = _mo_output_covariance(k, x.out_dim)
return _kernelmatrix_kron_helper!(K, MOI, Kfeatures, Koutputs)
end
function kernelmatrix!(
K::AbstractMatrix, k::IndependentMOKernel, x::MOI, y::MOI
) where {MOI<:IsotopicMOInputsUnion}
x.out_dim == y.out_dim ||
throw(DimensionMismatch("`x` and `y` must have the same `out_dim`"))
Kfeatures = kernelmatrix(k.kernel, x.x, y.x)
Koutputs = _mo_output_covariance(k, x.out_dim)
return _kernelmatrix_kron_helper!(K, MOI, Kfeatures, Koutputs)
end

function Base.show(io::IO, k::IndependentMOKernel)
Expand Down
34 changes: 18 additions & 16 deletions src/mokernels/intrinsiccoregion.jl
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ struct IntrinsicCoregionMOKernel{K<:Kernel,T<:AbstractMatrix} <: MOKernel
kernel::K
B::T

function IntrinsicCoregionMOKernel{K,T}(kernel::K, B::T) where {K,T}
@check_args(
function IntrinsicCoregionMOKernel{K,T}(
kernel::K, B::T; check_args::Bool=true
) where {K,T}
check_args && @check_args(
IntrinsicCoregionMOKernel,
B,
eigmin(B) >= 0,
Expand All @@ -30,12 +32,14 @@ struct IntrinsicCoregionMOKernel{K<:Kernel,T<:AbstractMatrix} <: MOKernel
end
end

function IntrinsicCoregionMOKernel(; kernel::Kernel, B::AbstractMatrix)
return IntrinsicCoregionMOKernel{typeof(kernel),typeof(B)}(kernel, B)
function IntrinsicCoregionMOKernel(;
kernel::Kernel, B::AbstractMatrix; check_args::Bool=true
)
return IntrinsicCoregionMOKernel{typeof(kernel),typeof(B)}(kernel, B; check_args)
end

function IntrinsicCoregionMOKernel(kernel::Kernel, B::AbstractMatrix)
return IntrinsicCoregionMOKernel{typeof(kernel),typeof(B)}(kernel, B)
function IntrinsicCoregionMOKernel(kernel::Kernel, B::AbstractMatrix; check_args::Bool=true)
return IntrinsicCoregionMOKernel{typeof(kernel),typeof(B)}(kernel, B; check_args)
end

function (k::IntrinsicCoregionMOKernel)((x, px)::Tuple{Any,Int}, (y, py)::Tuple{Any,Int})
Expand All @@ -57,16 +61,14 @@ function kernelmatrix(
return _kernelmatrix_kron_helper(MOI, Kfeatures, Koutputs)
end

if VERSION >= v"1.6"
function kernelmatrix!(
K::AbstractMatrix, k::IntrinsicCoregionMOKernel, x::MOI, y::MOI
) where {MOI<:IsotopicMOInputsUnion}
x.out_dim == y.out_dim ||
throw(DimensionMismatch("`x` and `y` must have the same `out_dim`"))
Kfeatures = kernelmatrix(k.kernel, x.x, y.x)
Koutputs = _mo_output_covariance(k, x.out_dim)
return _kernelmatrix_kron_helper!(K, MOI, Kfeatures, Koutputs)
end
function kernelmatrix!(
K::AbstractMatrix, k::IntrinsicCoregionMOKernel, x::MOI, y::MOI
) where {MOI<:IsotopicMOInputsUnion}
x.out_dim == y.out_dim ||
throw(DimensionMismatch("`x` and `y` must have the same `out_dim`"))
Kfeatures = kernelmatrix(k.kernel, x.x, y.x)
Koutputs = _mo_output_covariance(k, x.out_dim)
return _kernelmatrix_kron_helper!(K, MOI, Kfeatures, Koutputs)
end

function Base.show(io::IO, k::IntrinsicCoregionMOKernel)
Expand Down
20 changes: 9 additions & 11 deletions src/mokernels/mokernel.jl
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,14 @@ function _kernelmatrix_kron_helper(::Type{<:MOInputIsotopicByOutputs}, Kfeatures
return kron(Koutputs, Kfeatures)
end

if VERSION >= v"1.6"
function _kernelmatrix_kron_helper!(
K, ::Type{<:MOInputIsotopicByFeatures}, Kfeatures, Koutputs
)
return kron!(K, Kfeatures, Koutputs)
end
function _kernelmatrix_kron_helper!(
K, ::Type{<:MOInputIsotopicByFeatures}, Kfeatures, Koutputs
)
return kron!(K, Kfeatures, Koutputs)
end

function _kernelmatrix_kron_helper!(
K, ::Type{<:MOInputIsotopicByOutputs}, Kfeatures, Koutputs
)
return kron!(K, Koutputs, Kfeatures)
end
function _kernelmatrix_kron_helper!(
K, ::Type{<:MOInputIsotopicByOutputs}, Kfeatures, Koutputs
)
return kron!(K, Koutputs, Kfeatures)
end
8 changes: 2 additions & 6 deletions test/chainrules.jl
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,7 @@
compare_gradient(:Zygote, [x, y]) do xy
KernelFunctions.Sinus(r)(xy[1], xy[2])
end
if VERSION < v"1.6"
@test_broken "Chain rule of SqMahalanobis is broken in Julia pre-1.6"
else
compare_gradient(:Zygote, [Q, x, y]) do Qxy
SqMahalanobis(Qxy[1])(Qxy[2], Qxy[3])
end
compare_gradient(:Zygote, [Q, x, y]) do Qxy
SqMahalanobis(Qxy[1])(Qxy[2], Qxy[3])
end
end