Skip to content

Commit b589653

Browse files
committed
Remove T parameter from Kernel
1 parent 278ae6e commit b589653

12 files changed

+106
-159
lines changed

src/KernelFunctions.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ const defaultobs = 2
2727
Abstract type defining a slice-wise transformation on an input matrix
2828
"""
2929
abstract type Transform end
30-
abstract type Kernel{T,Tr<:Transform} end
30+
abstract type Kernel{Tr<:Transform} end
3131

3232
include("utils.jl")
3333
include("distances/dotproduct.jl")
3434
include("distances/delta.jl")
3535
include("transform/transform.jl")
36-
kernels = ["exponential","matern","polynomial","constant","rationalquad","exponentiated"]
37-
for k in kernels
36+
37+
for k in ["exponential","matern","polynomial","constant","rationalquad","exponentiated"]
3838
include(joinpath("kernels",k*".jl"))
3939
end
4040
include("matrix/kernelmatrix.jl")

src/generic.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ end
2323
## Constructors for kernels without parameters
2424
for kernel in [:ExponentialKernel,:SqExponentialKernel,:Matern32Kernel,:Matern52Kernel,:ExponentiatedKernel]
2525
@eval begin
26-
$kernel::T=1.0) where {T<:Real} = $kernel{T,ScaleTransform{T}}(ScaleTransform(ρ))
27-
$kernel::AbstractVector{T}) where {T<:Real} = $kernel{T,ARDTransform{T,length(ρ)}}(ARDTransform(ρ))
28-
$kernel(t::Tr) where {Tr<:Transform} = $kernel{eltype(t),Tr}(t)
26+
$kernel::Real=1.0) = $kernel(ScaleTransform(ρ))
27+
$kernel::AbstractVector{<:Real}) = $kernel(ARDTransform(ρ))
2928
end
3029
end

src/kernels/constant.jl

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ ZeroKernel([tr=IdentityTransform()])
33
44
Create a kernel always returning zero
55
"""
6-
struct ZeroKernel{T,Tr} <: Kernel{T,Tr}
6+
struct ZeroKernel{T,Tr} <: Kernel{Tr}
77
transform::Tr
88

99
function ZeroKernel{T,Tr}(t::Tr) where {T,Tr<:Transform}
@@ -15,7 +15,7 @@ function ZeroKernel(t::Tr=IdentityTransform()) where {Tr<:Transform}
1515
ZeroKernel{eltype(Tr),Tr}(t)
1616
end
1717

18-
@inline kappa::ZeroKernel,d::T) where {T<:Real} = zero(T)
18+
@inline kappa::ZeroKernel, d::T) where {T<:Real} = zero(T)
1919

2020
metric(::ZeroKernel) = Delta()
2121

@@ -27,7 +27,7 @@ metric(::ZeroKernel) = Delta()
2727
```
2828
Kernel function working as an equivalent to add white noise.
2929
"""
30-
struct WhiteKernel{T,Tr} <: Kernel{T,Tr}
30+
struct WhiteKernel{T,Tr} <: Kernel{Tr}
3131
transform::Tr
3232

3333
function WhiteKernel{T,Tr}(t::Tr) where {T,Tr<:Transform}
@@ -50,26 +50,18 @@ metric(::WhiteKernel) = Delta()
5050
```
5151
Kernel function always returning a constant value `c`
5252
"""
53-
struct ConstantKernel{T,Tr,Tc<:Real} <: Kernel{T,Tr}
53+
struct ConstantKernel{Tr, Tc<:Real} <: Kernel{Tr}
5454
transform::Tr
5555
c::Tc
56-
57-
function ConstantKernel{T,Tr,Tc}(t::Tr,c::Tc) where {T,Tr<:Transform,Tc<:Real}
58-
new{T,Tr,Tc}(t,c)
59-
end
6056
end
6157

6258
params(k::ConstantKernel) = (params(k.transform),k.c)
6359
opt_params(k::ConstantKernel) = (opt_params(k.transform),k.c)
6460

65-
function ConstantKernel(c::Tc=1.0) where {Tc<:Real}
66-
ConstantKernel{Float64,IdentityTransform,Tc}(IdentityTransform(),c)
67-
end
61+
ConstantKernel(c::Real=1.0) = ConstantKernel(IdentityTransform(),c)
6862

69-
function ConstantKernel(t::Tr,c::Tc=1.0) where {Tr<:Transform,Tc<:Real}
70-
ConstantKernel{eltype(Tr),Tr,Tc}(t,c)
71-
end
63+
ConstantKernel(t::Tr,c::Tc=1.0) where {Tr<:Transform,Tc<:Real} = ConstantKernel{Tr,Tc}(t,c)
7264

7365
@inline kappa::ConstantKernel,x::Real) = κ.c
7466

75-
metric(::ConstantKernel) = Delta()
67+
metric(::ConstantKernel) = Delta()

src/kernels/exponential.jl

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,8 @@ The squared exponential kernel is an isotropic Mercer kernel given by the formul
88
See also [`ExponentialKernel`](@ref) for a
99
related form of the kernel or [`GammaExponentialKernel`](@ref) for a generalization.
1010
"""
11-
struct SqExponentialKernel{T,Tr} <: Kernel{T,Tr}
11+
struct SqExponentialKernel{Tr} <: Kernel{Tr}
1212
transform::Tr
13-
14-
function SqExponentialKernel{T,Tr}(transform::Tr) where {T,Tr<:Transform}
15-
return new{T,Tr}(transform)
16-
end
1713
end
1814

1915
@inline kappa::SqExponentialKernel, d²::Real) = exp(-d²)
@@ -32,12 +28,8 @@ The exponential kernel is an isotropic Mercer kernel given by the formula:
3228
κ(x,y) = exp(-ρ‖x-y‖)
3329
```
3430
"""
35-
struct ExponentialKernel{T,Tr} <: Kernel{T,Tr}
31+
struct ExponentialKernel{Tr} <: Kernel{Tr}
3632
transform::Tr
37-
38-
function ExponentialKernel{T,Tr}(transform::Tr) where {T,Tr<:Transform}
39-
return new{T,Tr}(transform)
40-
end
4133
end
4234

4335
@inline kappa::ExponentialKernel, d::Real) = exp(-d)
@@ -48,37 +40,34 @@ metric(::ExponentialKernel) = Euclidean()
4840
const LaplacianKernel = ExponentialKernel
4941

5042
"""
51-
`GammaExponentialKernel([ρ=1.0,[gamma=2.0]])`
43+
`GammaExponentialKernel([ρ=1.0,=2.0]])`
5244
The γ-exponential kernel is an isotropic Mercer kernel given by the formula:
5345
```
5446
κ(x,y) = exp(-ρ^(2γ)‖x-y‖^(2γ))
5547
```
5648
"""
57-
struct GammaExponentialKernel{T,Tr,Tᵧ<:Real} <: Kernel{T,Tr}
49+
struct GammaExponentialKernel{Tr,<:Real} <: Kernel{Tr}
5850
transform::Tr
59-
γ::T
60-
61-
function GammaExponentialKernel{T,Tr,Tᵧ}(transform::Tr::Tᵧ) where {T,Tr<:Transform,Tᵧ<:Real}
62-
return new{T,Tr,Tᵧ}(transform,γ)
51+
γ::Tγ
52+
function GammaExponentialKernel{Tr,Tγ}(t::Tr, γ::Tγ) where {Tr<:Transform,Tγ<:Real}
53+
@check_args(GammaExponentialKernel, γ, γ >= zero(Tγ), "γ > 0")
54+
return new{Tr, Tγ}(t, γ)
6355
end
6456
end
6557

6658
params(k::GammaExponentialKernel) = (params(transform),γ)
6759
opt_params(k::GammaExponentialKernel) = (opt_params(transform),γ)
6860

69-
function GammaExponentialKernel::T₁=1.0,gamma::T₂=2.0) where {T₁<:Real,T₂<:Real}
70-
@check_args(GammaExponentialKernel, gamma, gamma >= zero(T₂), "gamma > 0")
71-
GammaExponentialKernel{T₁,ScaleTransform{T₁},T₂}(ScaleTransform(ρ),gamma)
61+
function GammaExponentialKernel::Real=1.0, γ::Real=2.0)
62+
GammaExponentialKernel(ScaleTransform(ρ), γ)
7263
end
7364

74-
function GammaExponentialKernel::AbstractVector{T₁},gamma::T₂=2.0) where {T₁<:Real,T₂<:Real}
75-
@check_args(GammaExponentialKernel, gamma, gamma >= zero(T₂), "gamma > 0")
76-
GammaExponentialKernel{T₁,ARDTransform{T₁,length(ρ)},T₂}(ARDTransform(ρ),gamma)
65+
function GammaExponentialKernel::AbstractVector{<:Real}, γ::Real=2.0)
66+
GammaExponentialKernel(ARDTransform(ρ), γ)
7767
end
7868

79-
function GammaExponentialKernel(t::Tr,gamma::T₁=2.0) where {Tr<:Transform,T₁<:Real}
80-
@check_args(GammaExponentialKernel, gamma, gamma >= zero(T₁), "gamma > 0")
81-
GammaExponentialKernel{eltype(Tr),Tr,T₁}(t,gamma)
69+
function GammaExponentialKernel(t::Tr, γ::Tγ=2.0) where {Tr<:Transform, Tγ<:Real}
70+
GammaExponentialKernel{Tr, Tγ}(t, γ)
8271
end
8372

8473
@inline kappa::GammaExponentialKernel, d²::Real) = exp(-^κ.γ)

src/kernels/exponentiated.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ The exponentiated kernel is a Mercer kernel given by:
55
κ(x,y) = exp(ρ²xᵀy)
66
```
77
"""
8-
struct ExponentiatedKernel{T,Tr} <: Kernel{T,Tr}
8+
struct ExponentiatedKernel{Tr} <: Kernel{Tr}
99
transform::Tr
1010

11-
function ExponentiatedKernel{T,Tr}(transform::Tr) where {T,Tr<:Transform}
12-
return new{T,Tr}(transform)
13-
end
11+
# function ExponentiatedKernel{T,Tr}(transform::Tr) where {T,Tr<:Transform}
12+
# return new{T,Tr}(transform)
13+
# end
1414
end
1515
@inline kappa::ExponentiatedKernel, xᵀy::T) where {T<:Real} = exp(xᵀy)
1616

17-
metric(::ExponentiatedKernel) = DotProduct()
17+
metric(::ExponentiatedKernel) = DotProduct()

src/kernels/kernelproduct.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ kernelmatrix(k,X) == kernelmatrix(k1,X).*kernelmatrix(k2,X)
1010
kernelmatrix(k,X) == kernelmatrix(k1*k2,X)
1111
```
1212
"""
13-
struct KernelProduct{T,Tr} <: Kernel{T,Tr}
13+
struct KernelProduct{Tr} <: Kernel{Tr}
1414
kernels::Vector{Kernel}
1515
end
1616

src/kernels/kernelsum.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,18 @@ kernelmatrix(k,X) == kernelmatrix(k1+k2,X)
1111
kweighted = 0.5*k1 + 2.0*k2
1212
```
1313
"""
14-
struct KernelSum{T,Tr} <: Kernel{T,Tr}
14+
struct KernelSum{Tr} <: Kernel{Tr}
1515
kernels::Vector{Kernel}
1616
weights::Vector{Real}
17-
function KernelSum{T,Tr}(kernels::AbstractVector{<:Kernel},weights::AbstractVector{<:Real}) where {T,Tr}
18-
new{T,Tr}(kernels,weights)
17+
function KernelSum{Tr}(kernels::AbstractVector{<:Kernel},weights::AbstractVector{<:Real}) where {Tr}
18+
new{Tr}(kernels,weights)
1919
end
2020
end
2121

2222
function KernelSum(kernels::AbstractVector{<:Kernel}; weights::AbstractVector{<:Real}=ones(Float64,length(kernels)))
2323
@assert length(kernels)==length(weights) "Weights and kernel vector should be of the same length"
2424
@assert all(weights.>=0) "All weights should be positive"
25-
KernelSum{eltype(kernels),Transform}(kernels,weights)
25+
KernelSum{Transform}(kernels,weights)
2626
end
2727

2828
params(k::KernelSum) = (k.weights,params.(k.kernels))

src/kernels/matern.jl

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,20 @@ The matern kernel is an isotropic Mercer kernel given by the formula:
66
```
77
For `ν=n+1/2, n=0,1,2,...` it can be simplified and you should instead use [`ExponentialKernel`](@ref) for `n=0`, [`Matern32Kernel`](@ref), for `n=1`, [`Matern52Kernel`](@ref) for `n=2` and [`SqExponentialKernel`](@ref) for `n=∞`.
88
"""
9-
struct MaternKernel{T,Tr,<:Real} <: Kernel{T,Tr}
9+
struct MaternKernel{Tr<:Transform, <:Real} <: Kernel{Tr}
1010
transform::Tr
1111
ν::Tν
12-
13-
function MaternKernel{T,Tr,Tν}(transform::Tr::Tν) where {T,Tr<:Transform,Tν<:Real}
14-
return new{T,Tr,Tν}(transform,ν)
12+
function MaternKernel{Tr, Tν}(t::Tr, ν::Tν) where {Tr, Tν}
13+
@check_args(MaternKernel, ν, ν > zero(Tν), "ν > 0")
14+
return new{Tr, Tν}(t, ν)
1515
end
1616
end
1717

18-
function MaternKernel::T₁=1.0::T₂=1.5) where {T₁<:Real,T₂<:Real}
19-
@check_args(MaternKernel, ν, ν > zero(T₂), "ν > 0")
20-
MaternKernel{T₁,ScaleTransform{T₁},T₂}(ScaleTransform(ρ),ν)
21-
end
18+
MaternKernel::Real=1.0, ν::Real=1.5) = MaternKernel(ScaleTransform(ρ), ν)
2219

23-
function MaternKernel::AbstractVector{T₁}::T₂=1.5) where {T₁<:Real,T₂<:Real}
24-
@check_args(MaternKernel, ν, ν > zero(T₂), "ν > 0")
25-
MaternKernel{T₁,ARDTransform{T₁,length(ρ)},T₂}(ARDTransform(ρ),ν)
26-
end
20+
MaternKernel::AbstractVector{<:Real}::Real=1.5) = MaternKernel(ARDTransform(ρ), ν)
2721

28-
function MaternKernel(t::Tr::T=1.5) where {Tr<:Transform,T<:Real}
29-
@check_args(MaternKernel, ν, ν > zero(T), "ν > 0")
30-
MaternKernel{eltype(t),Tr,T}(t,ν)
31-
end
22+
MaternKernel(t::Tr, ν::T=1.5) where {Tr<:Transform, T<:Real} = MaternKernel{Tr, T}(t, ν)
3223

3324
params(k::MaternKernel) = (params(transform(k)),k.ν)
3425
opt_params(k::MaternKernel) = (opt_params(transform(k)),k.ν)
@@ -44,15 +35,11 @@ The matern 3/2 kernel is an isotropic Mercer kernel given by the formula:
4435
κ(x,y) = (1+√(3)ρ‖x-y‖)exp(-√(3)ρ‖x-y‖)
4536
```
4637
"""
47-
struct Matern32Kernel{T,Tr} <: Kernel{T,Tr}
38+
struct Matern32Kernel{Tr} <: Kernel{Tr}
4839
transform::Tr
49-
50-
function Matern32Kernel{T,Tr}(transform::Tr) where {T,Tr<:Transform}
51-
return new{T,Tr}(transform)
52-
end
5340
end
5441

55-
@inline kappa::Matern32Kernel, d::T) where {T<:Real} = (1+sqrt(3)*d)*exp(-sqrt(3)*d)
42+
@inline kappa::Matern32Kernel, d::Real) = (1+sqrt(3)*d)*exp(-sqrt(3)*d)
5643

5744
metric(::Matern32Kernel) = Euclidean()
5845

@@ -63,14 +50,10 @@ The matern 5/2 kernel is an isotropic Mercer kernel given by the formula:
6350
κ(x,y) = (1+√(5)ρ‖x-y‖ + 5ρ²‖x-y‖^2/3)exp(-√(5)ρ‖x-y‖)
6451
```
6552
"""
66-
struct Matern52Kernel{T,Tr} <: Kernel{T,Tr}
53+
struct Matern52Kernel{Tr} <: Kernel{Tr}
6754
transform::Tr
68-
69-
function Matern52Kernel{T,Tr}(transform::Tr) where {T,Tr<:Transform}
70-
return new{T,Tr}(transform)
71-
end
7255
end
7356

74-
@inline kappa::Matern52Kernel, d::Real) where {T} = (1+sqrt(5)*d+5*d^2/3)*exp(-sqrt(5)*d)
57+
@inline kappa::Matern52Kernel, d::Real) = (1+sqrt(5)*d+5*d^2/3)*exp(-sqrt(5)*d)
7558

76-
metric(::Matern52Kernel) = Euclidean()
59+
metric(::Matern52Kernel) = Euclidean()

src/kernels/polynomial.jl

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,20 @@ The linear kernel is a Mercer kernel given by
66
```
77
Where `c` is a real number
88
"""
9-
struct LinearKernel{T,Tr,Tc<:Real} <: Kernel{T,Tr}
9+
struct LinearKernel{Tr, Tc<:Real} <: Kernel{Tr}
1010
transform::Tr
1111
c::Tc
12-
13-
function LinearKernel{T,Tr,Tc}(transform::Tr,c::Tc) where {T,Tr<:Transform,Tc<:Real}
14-
return new{T,Tr,Tc}(transform,c)
15-
end
1612
end
1713

18-
function LinearKernel::T=1.0,c::T₂=zero(T)) where {T<:Real,T₂<:Real}
19-
LinearKernel{T₁,ScaleTransform{T₁},T₂}(ScaleTransform(ρ),c)
14+
function LinearKernel::T=1.0, c::Real=zero(T)) where {T<:Real}
15+
LinearKernel(ScaleTransform(ρ), c)
2016
end
2117

22-
function LinearKernel::AbstractVector{T₁},c::T₂=zero(T)) where {T<:Real,T₂<:Real}
23-
LinearKernel{T₁,ARDTransform{T₁,length(ρ)},T₂}(ARDTransform(ρ),c)
18+
function LinearKernel::AbstractVector{T}, c::Real=zero(T)) where {T<:Real}
19+
LinearKernel(ARDTransform(ρ), c)
2420
end
2521

26-
function LinearKernel(t::Tr,c::T=zero(Float64)) where {Tr<:Transform,T<:Real}
27-
LinearKernel{eltype(t),Tr,T}(t,c)
28-
end
22+
LinearKernel(t::Transform) = LinearKernel(t, 0.0)
2923

3024
params(k::LinearKernel) = (params(transform(k)),k.c)
3125
opt_params(k::LinearKernel) = (opt_params(transform(k)),k.c)
@@ -42,34 +36,31 @@ The polynomial kernel is a Mercer kernel given by
4236
```
4337
Where `c` is a real number, and `d` is a shape parameter bigger than 1
4438
"""
45-
struct PolynomialKernel{T,Tr,Tc<:Real,Td<:Real} <: Kernel{T,Tr}
39+
struct PolynomialKernel{Tr,Tc<:Real,Td<:Real} <: Kernel{Tr}
4640
transform::Tr
47-
c::Tc
4841
d::Td
49-
50-
function PolynomialKernel{T,Tr,Tc,Td}(transform::Tr,c::Tc,d::Td) where {T,Tr<:Transform,Tc<:Real,Td<:Real}
51-
return new{T,Tr,Tc,Td}(transform,c,d)
42+
c::Tc
43+
function PolynomialKernel{Tr, Tc, Td}(transform::Tr, d::Td, c::Tc) where {Tr<:Transform, Td<:Real, Tc<:Real}
44+
@check_args(PolynomialKernel, d, d >= one(Td), "d >= 1")
45+
return new{Tr, Td, Tc}(transform,d, c)
5246
end
5347
end
5448

55-
function PolynomialKernel::T₁=1.0,d::T₂=2.0,c::T₃=zero(T₁)) where {T₁<:Real,T₂<:Real,T₃<:Real}
56-
@check_args(PolynomialKernel, d, d >= one(T₁), "d >= 1")
57-
PolynomialKernel{T₁,ScaleTransform{T₁},T₂,T₃}(ScaleTransform(ρ),c,d)
49+
function PolynomialKernel::Real=1.0, d::Td=2.0, c::Real=zero(Td)) where {Td<:Real}
50+
PolynomialKernel(ScaleTransform(ρ), d, c)
5851
end
5952

60-
function PolynomialKernel::AbstractVector{T₁},d::T₂=2.0,c::T₃=zero(T₁)) where {T₁<:Real,T₂<:Real,T₃<:Real}
61-
@check_args(PolynomialKernel, d, d >= one(T₂), "d >= 1")
62-
PolynomialKernel{T₁,ARDTransform{T₁,length(ρ)},T₂,T₃}(ARDTransform(ρ),c,d)
53+
function PolynomialKernel::AbstractVector{T}, d::Real=2.0, c::Real=zero(T₁)) where {T<:Real}
54+
PolynomialKernel(ARDTransform(ρ), d, c)
6355
end
6456

65-
function PolynomialKernel(t::Tr,d::T₁=2.0,c::T₂=zero(eltype(T₁))) where {Tr<:Transform,T₁<:Real,T₂<:Real}
66-
@check_args(PolynomialKernel, d, d >= one(T₁), "d >= 1")
67-
PolynomialKernel{eltype(Tr),Tr,T₁,T₂}(t,c,d)
57+
function PolynomialKernel(t::Tr, d::Td=2.0, c::Tc=zero(eltype(Td))) where {Tr<:Transform, Td<:Real, Tc<:Real}
58+
PolynomialKernel{Tr, Tc, Td}(t, d, c)
6859
end
6960

7061
params(k::PolynomialKernel) = (params(transform(k)),k.d,k.c)
7162
opt_params(k::PolynomialKernel) = (opt_params(transform(k)),k.d,k.c)
7263

7364
@inline kappa::PolynomialKernel, xᵀy::T) where {T<:Real} = (xᵀy + κ.c)^.d)
7465

75-
metric(::PolynomialKernel) = DotProduct()
66+
metric(::PolynomialKernel) = DotProduct()

0 commit comments

Comments
 (0)