Skip to content

Commit 9207a96

Browse files
willtebbutttheogf
andauthored
Remove _kernel, sort out kappa (JuliaGaussianProcesses#95)
* Removes _kernel * Remove _scale * Removes binary kappa * Removes k(x, y) -> Matrix * Fixes tests and adds eval * Removes metric from Transformed * Refactors eval * Remove eval from MyKernel * Improves style src/basekernels/fbm.jl Co-Authored-By: Théo Galy-Fajou <[email protected]> * Reverts removal of _scale * Reverts change to transforms. Co-Authored-By: Théo Galy-Fajou <[email protected]> * Requires Julia 1.3 * Removes 1.0 CI * Reverts rationalquad.jl changes * Removes custom show * Adds reference to JuliaGaussianProcesses#96 * Moves abstract types around * Pins Zygote to 0.4.16 * Adds extra tests Co-authored-by: Théo Galy-Fajou <[email protected]>
1 parent ff69083 commit 9207a96

31 files changed

+89
-93
lines changed

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ os:
77
- linux
88
- osx
99
julia:
10-
- 1.0
1110
- 1.3
1211
- 1.4
1312
- nightly

Project.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ SpecialFunctions = "0.8, 0.9, 0.10"
2121
StatsBase = "0.32, 0.33"
2222
StatsFuns = "0.8, 0.9"
2323
ZygoteRules = "0.2"
24-
julia = "1.0"
24+
Zygote = "= 0.4.16"
25+
julia = "1.3"
2526

2627
[extras]
2728
FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000"

docs/src/userguide.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ To premultiply the kernel by a variance, you can use `*` or create a `ScaledKern
2727
To compute the kernel function on two vectors you can call
2828
```julia
2929
k = SqExponentialKernel()
30-
x1 = rand(3); x2 = rand(3)
31-
kappa(k,x1,x2) == k(x1,x2) # Syntactic sugar
30+
x1 = rand(3)
31+
x2 = rand(3)
32+
k(x1,x2)
3233
```
3334

3435
## Creating a kernel matrix

src/KernelFunctions.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ KernelFunctions. [Github](https://github.com/JuliaGaussianProcesses/KernelFuncti
44
"""
55
module KernelFunctions
66

7-
export kernelmatrix, kernelmatrix!, kerneldiagmatrix, kerneldiagmatrix!, kappa
7+
export kernelmatrix, kernelmatrix!, kerneldiagmatrix, kerneldiagmatrix!
88
export transform
99
export duplicate, set! # Helpers
1010

@@ -42,6 +42,7 @@ const defaultobs = 2
4242
Abstract type defining a slice-wise transformation on an input matrix
4343
"""
4444
abstract type Transform end
45+
4546
abstract type Kernel end
4647
abstract type BaseKernel <: Kernel end
4748
abstract type SimpleKernel <: BaseKernel end

src/approximations/nystrom.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ end
1212
function nystrom_sample(k::Kernel, X::AbstractMatrix, S::Vector{<:Integer}; obsdim::Integer=defaultobs)
1313
obsdim [1, 2] || throw(ArgumentError("`obsdim` should be 1 or 2 (see docs of kernelmatrix))"))
1414
Xₘ = obsdim == 1 ? X[S, :] : X[:, S]
15-
C = k(Xₘ, X; obsdim=obsdim)
15+
C = kernelmatrix(k, Xₘ, X; obsdim=obsdim)
1616
Cs = C[:, S]
1717
return (C, Cs)
1818
end

src/basekernels/cosine.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ The cosine kernel is a stationary kernel for a sinusoidal given by
99
struct CosineKernel <: SimpleKernel end
1010

1111
kappa::CosineKernel, d::Real) = cospi(d)
12+
1213
metric(::CosineKernel) = Euclidean()
1314

1415
Base.show(io::IO, ::CosineKernel) = print(io, "Cosine Kernel")

src/basekernels/exponential.jl

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ related form of the kernel or [`GammaExponentialKernel`](@ref) for a generalizat
1212
struct SqExponentialKernel <: SimpleKernel end
1313

1414
kappa::SqExponentialKernel, d²::Real) = exp(-d²)
15-
iskroncompatible(::SqExponentialKernel) = true
15+
1616
metric(::SqExponentialKernel) = SqEuclidean()
1717

18+
iskroncompatible(::SqExponentialKernel) = true
19+
1820
Base.show(io::IO,::SqExponentialKernel) = print(io,"Squared Exponential Kernel")
1921

2022
## Aliases ##
@@ -33,9 +35,11 @@ The exponential kernel is a Mercer kernel given by the formula:
3335
struct ExponentialKernel <: SimpleKernel end
3436

3537
kappa::ExponentialKernel, d::Real) = exp(-d)
36-
iskroncompatible(::ExponentialKernel) = true
38+
3739
metric(::ExponentialKernel) = Euclidean()
3840

41+
iskroncompatible(::ExponentialKernel) = true
42+
3943
Base.show(io::IO, ::ExponentialKernel) = print(io, "Exponential Kernel")
4044

4145
## Alias ##
@@ -60,7 +64,9 @@ struct GammaExponentialKernel{Tγ<:Real} <: SimpleKernel
6064
end
6165

6266
kappa::GammaExponentialKernel, d²::Real) = exp(-^first.γ))
63-
iskroncompatible(::GammaExponentialKernel) = true
67+
6468
metric(::GammaExponentialKernel) = SqEuclidean()
6569

70+
iskroncompatible(::GammaExponentialKernel) = true
71+
6672
Base.show(io::IO, κ::GammaExponentialKernel) = print(io, "Gamma Exponential Kernel (γ = ", first.γ), ")")

src/basekernels/exponentiated.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ The exponentiated kernel is a Mercer kernel given by:
99
struct ExponentiatedKernel <: SimpleKernel end
1010

1111
kappa::ExponentiatedKernel, xᵀy::Real) = exp(xᵀy)
12+
1213
metric(::ExponentiatedKernel) = DotProduct()
14+
1315
iskroncompatible(::ExponentiatedKernel) = true
1416

1517
Base.show(io::IO, ::ExponentiatedKernel) = print(io, "Exponentiated Kernel")

src/basekernels/fbm.jl

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,16 @@ struct FBMKernel{T<:Real} <: BaseKernel
1717
end
1818
end
1919

20+
function::FBMKernel)(x::AbstractVector{<:Real}, y::AbstractVector{<:Real})
21+
modX = sum(abs2, x)
22+
modY = sum(abs2, y)
23+
modXY = evaluate(SqEuclidean(sqroundoff), x, y)
24+
h = first.h)
25+
return (modX^h + modY^h - modXY^h)/2
26+
end
27+
28+
::FBMKernel)(x::Real, y::Real) = (abs2(x)^first.h) + abs2(y)^first.h) - abs2(x - y)^first.h)) / 2
29+
2030
Base.show(io::IO, κ::FBMKernel) = print(io, "Fractional Brownian Motion Kernel (h = ", first.h), ")")
2131

2232
const sqroundoff = 1e-15
@@ -65,13 +75,3 @@ function kernelmatrix!(
6575
K .= _fbm.(vec(modX), reshape(modY, 1, :), modXY, κ.h)
6676
return K
6777
end
68-
69-
function kappa::FBMKernel, x::AbstractVector{<:Real}, y::AbstractVector{<:Real})
70-
modX = sum(abs2, x)
71-
modY = sum(abs2, y)
72-
modXY = evaluate(SqEuclidean(sqroundoff), x, y)
73-
h = first.h)
74-
return (modX^h + modY^h - modXY^h)/2
75-
end
76-
77-
::FBMKernel)(x::Real, y::Real) = (abs2(x)^first.h) + abs2(y)^first.h) - abs2(x-y)^first.h))/2

src/basekernels/gabor.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ struct GaborKernel{K<:Kernel} <: BaseKernel
1515
end
1616
end
1717

18+
::GaborKernel)(x, y) = κ.kernel(x ,y)
19+
1820
function _gabor(; ell = nothing, p = nothing)
1921
if ell === nothing
2022
if p === nothing
@@ -53,8 +55,6 @@ end
5355

5456
Base.show(io::IO, κ::GaborKernel) = print(io, "Gabor Kernel (ell = ", κ.ell, ", p = ", κ.p, ")")
5557

56-
kappa::GaborKernel, x, y) = kappa.kernel, x ,y)
57-
5858
function kernelmatrix(
5959
κ::GaborKernel,
6060
X::AbstractMatrix;

src/basekernels/maha.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ struct MahalanobisKernel{T<:Real, A<:AbstractMatrix{T}} <: SimpleKernel
1717
end
1818

1919
kappa::MahalanobisKernel, d::T) where {T<:Real} = exp(-d)
20+
2021
metric::MahalanobisKernel) = SqMahalanobis.P)
2122

2223
Base.show(io::IO, κ::MahalanobisKernel) = print(io, "Mahalanobis Kernel (size(P) = ", size.P), ")")

src/basekernels/matern.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ The matern 3/2 kernel is a Mercer kernel given by the formula:
4040
struct Matern32Kernel <: SimpleKernel end
4141

4242
kappa::Matern32Kernel, d::Real) = (1 + sqrt(3) * d) * exp(-sqrt(3) * d)
43+
4344
metric(::Matern32Kernel) = Euclidean()
4445

4546
Base.show(io::IO, ::Matern32Kernel) = print(io, "Matern 3/2 Kernel")
@@ -55,6 +56,7 @@ The matern 5/2 kernel is a Mercer kernel given by the formula:
5556
struct Matern52Kernel <: SimpleKernel end
5657

5758
kappa::Matern52Kernel, d::Real) = (1 + sqrt(5) * d + 5 * d^2 / 3) * exp(-sqrt(5) * d)
59+
5860
metric(::Matern52Kernel) = Euclidean()
5961

6062
Base.show(io::IO, ::Matern52Kernel) = print(io, "Matern 5/2 Kernel")

src/basekernels/polynomial.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ struct LinearKernel{Tc<:Real} <: SimpleKernel
1515
end
1616

1717
kappa::LinearKernel, xᵀy::Real) = xᵀy + first.c)
18+
1819
metric(::LinearKernel) = DotProduct()
1920

2021
Base.show(io::IO, κ::LinearKernel) = print(io, "Linear Kernel (c = ", first.c), ")")
@@ -37,7 +38,8 @@ struct PolynomialKernel{Td<:Real, Tc<:Real} <: SimpleKernel
3738
end
3839
end
3940

40-
kappa::PolynomialKernel, xᵀy::T) where {T<:Real} = (xᵀy + first.c))^(first.d))
41+
kappa::PolynomialKernel, xᵀy::Real) = (xᵀy + first.c))^(first.d))
42+
4143
metric(::PolynomialKernel) = DotProduct()
4244

4345
Base.show(io::IO, κ::PolynomialKernel) = print(io, "Polynomial Kernel (c = ", first.c), ", d = ", first.d), ")")

src/generic.jl

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,25 @@ Base.length(::Kernel) = 1
33
Base.iterate(k::Kernel) = (k,nothing)
44
Base.iterate(k::Kernel, ::Any) = nothing
55

6-
# default fallback for evaluating a kernel with two arguments (such as vectors etc)
7-
kappa::Kernel, x, y) = kappa(κ, evaluate(metric(κ), x, y))
8-
kappa::TransformedKernel, x, y) = kappa(kernel(κ), apply.transform,x), apply.transform,y))
9-
kappa::TransformedKernel{<:BaseKernel,<:ScaleTransform}, x, y) = kappa(κ, _scale.transform, metric(κ), x, y))
6+
printshifted(io::IO, o, shift::Int) = print(io, o)
7+
8+
# See https://github.com/JuliaGaussianProcesses/KernelFunctions.jl/issues/96
109
_scale(t::ScaleTransform, metric::Euclidean, x, y) = first(t.s) * evaluate(metric, x, y)
1110
_scale(t::ScaleTransform, metric::Union{SqEuclidean,DotProduct}, x, y) = first(t.s)^2 * evaluate(metric, x, y)
1211
_scale(t::ScaleTransform, metric, x, y) = evaluate(metric, apply(t, x), apply(t, y))
1312

14-
printshifted(io::IO, o, shift::Int) = print(io, o)
15-
Base.show(io::IO, κ::Kernel) = print(io, nameof(typeof(κ)))
16-
1713
### Syntactic sugar for creating matrices and using kernel functions
1814
function concretetypes(k, ktypes::Vector)
1915
isempty(subtypes(k)) ? push!(ktypes, k) : concretetypes.(subtypes(k), Ref(ktypes))
2016
return ktypes
2117
end
2218

23-
for k in concretetypes(Kernel, [])
24-
@eval begin
25-
@inline::$k)(x, y) = kappa(κ, x, y)
26-
@inline::$k)(X::AbstractMatrix{T}, Y::AbstractMatrix{T}; obsdim::Integer=defaultobs) where {T} = kernelmatrix(κ, X, Y, obsdim=obsdim)
27-
@inline::$k)(X::AbstractMatrix{T}; obsdim::Integer=defaultobs) where {T} = kernelmatrix(κ, X, obsdim=obsdim)
28-
end
29-
end
30-
3119
for k in nameof.(subtypes(BaseKernel))
3220
@eval begin
3321
@deprecate($k::Real;args...),transform($k(args...),ρ))
3422
@deprecate($k::AbstractVector{<:Real};args...),transform($k(args...),ρ))
3523
end
3624
end
25+
26+
# Fallback implementation of evaluate for `SimpleKernel`s.
27+
(k::SimpleKernel)(x, y) = kappa(k, evaluate(metric(k), x, y))

src/kernels/kernelproduct.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Base.:*(kp::KernelProduct,k::Kernel) = KernelProduct(vcat(kp.kernels,k))
2222

2323
Base.length(k::KernelProduct) = length(k.kernels)
2424

25-
kappa::KernelProduct, x ,y) = prod(kappa(k, x, y) for k in κ.kernels)
25+
::KernelProduct)(x, y) = prod(k(x, y) for k in κ.kernels)
2626

2727
hadamard(x,y) = x.*y
2828

src/kernels/kernelsum.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ Base.:*(w::Real, k::KernelSum) = KernelSum(k.kernels, weights = w * k.weights) #
4646

4747
Base.length(k::KernelSum) = length(k.kernels)
4848

49-
kappa::KernelSum, x, y) = sum.weights[i] * kappa(κ.kernels[i], x, y) for i in 1:length(κ))
49+
::KernelSum)(x, y) = sum.weights[i] * κ.kernels[i](x, y) for i in 1:length(κ))
5050

5151
function kernelmatrix::KernelSum, X::AbstractMatrix; obsdim::Int = defaultobs)
5252
sum.weights[i] * kernelmatrix.kernels[i], X, obsdim = obsdim) for i in 1:length(κ))

src/kernels/scaledkernel.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ end
1515

1616
kappa(k::ScaledKernel, x) = first(k.σ²) * kappa(k.kernel, x)
1717

18-
kappa(k::ScaledKernel, x, y) = first(k.σ²) * kappa(k.kernel, x, y)
18+
(k::ScaledKernel)(x, y) = first(k.σ²) * k.kernel(x, y)
1919

2020
metric(k::ScaledKernel) = metric(k.kernel)
2121

src/kernels/tensorproduct.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ end
2222

2323
Base.length(kernel::TensorProduct) = length(kernel.kernels)
2424

25-
function kappa(kernel::TensorProduct, x, y)
26-
return prod(kappa(k, xi, yi) for (k, xi, yi) in zip(kernel.kernels, x, y))
25+
function (kernel::TensorProduct)(x, y)
26+
return prod(k(xi, yi) for (k, xi, yi) in zip(kernel.kernels, x, y))
2727
end
2828

2929
# TODO: General implementation of `kernelmatrix` and `kerneldiagmatrix`

src/kernels/transformedkernel.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ struct TransformedKernel{Tk<:Kernel,Tr<:Transform} <: Kernel
99
transform::Tr
1010
end
1111

12+
function (k::TransformedKernel)(x, y)
13+
x′ = apply(k.transform, x)
14+
y′ = apply(k.transform, y)
15+
return k.kernel(x′, y′)
16+
end
17+
1218
"""
1319
```julia
1420
transform(k::BaseKernel, t::Transform) (1)
@@ -29,10 +35,6 @@ transform(k::BaseKernel,ρ::AbstractVector) = TransformedKernel(k, ARDTransform(
2935

3036
kernel(κ) = κ.kernel
3137

32-
kappa::TransformedKernel, x) = kappa.kernel, x)
33-
34-
metric::TransformedKernel) = metric.kernel)
35-
3638
Base.show(io::IO, κ::TransformedKernel) = printshifted(io, κ, 0)
3739

3840
function printshifted(io::IO, κ::TransformedKernel, shift::Int)

test/basekernels/exponential.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
@test GaussianKernel == SqExponentialKernel
1414
@test SEKernel == SqExponentialKernel
1515
@test repr(k) == "Squared Exponential Kernel"
16+
@test KernelFunctions.iskroncompatible(k) == true
1617
end
1718
@testset "ExponentialKernel" begin
1819
k = ExponentialKernel()
@@ -22,6 +23,7 @@
2223
@test metric(ExponentialKernel()) == Euclidean()
2324
@test repr(k) == "Exponential Kernel"
2425
@test LaplacianKernel == ExponentialKernel
26+
@test KernelFunctions.iskroncompatible(k) == true
2527
end
2628
@testset "GammaExponentialKernel" begin
2729
γ = 2.0
@@ -33,6 +35,7 @@
3335
@test metric(GammaExponentialKernel()) == SqEuclidean()
3436
@test metric(GammaExponentialKernel=2.0)) == SqEuclidean()
3537
@test repr(k) == "Gamma Exponential Kernel (γ = $(γ))"
38+
@test KernelFunctions.iskroncompatible(k) == true
3639

3740
#Coherence :
3841
@test GammaExponentialKernel=1.0)(v1,v2) SqExponentialKernel()(v1,v2)

test/basekernels/fbm.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
m1 = rand(3,3)
99
m2 = rand(3,3)
1010
@test kernelmatrix(k, m1, m1) kernelmatrix(k, m1) atol=1e-5
11-
@test kernelmatrix(k, m1, m2) k(m1, m2) atol=1e-5
1211

1312

1413
x1 = rand()

test/basekernels/gabor.jl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@
55
k = GaborKernel(ell=ell, p=p)
66
@test k.ell ell atol=1e-5
77
@test k.p p atol=1e-5
8-
@test kappa(k,v1,v2) exp(-sqeuclidean(v1,v2) ./(k.ell.^2))*cospi(euclidean(v1,v2)./ k.p) atol=1e-5
9-
@test kappa(k,v1,v2) kappa(transform(SqExponentialKernel(), 1/k.ell),v1,v2)*kappa(transform(CosineKernel(), 1/k.p), v1,v2) atol=1e-5
8+
9+
k_manual = exp(-sqeuclidean(v1, v2) / (k.ell^2)) * cospi(euclidean(v1, v2) / k.p)
10+
@test k(v1,v2) k_manual atol=1e-5
11+
12+
lhs_manual = transform(SqExponentialKernel(), 1/k.ell)(v1,v2)
13+
rhs_manual = transform(CosineKernel(), 1/k.p)(v1,v2)
14+
@test k(v1,v2) lhs_manual * rhs_manual atol=1e-5
1015

1116
k = GaborKernel()
1217
@test k.ell 1.0 atol=1e-5

test/basekernels/piecewisepolynomial.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
@test k2(v1, v2) k(v1, v2) atol=1e-5
1313

14-
@test k(v1, v2) kappa(k, v1, v2) atol=1e-5
1514
@test typeof(k(v1, v2)) <: Real
1615
@test size(kernelmatrix(k, m1, m2)) == (4, 4)
1716
@test size(kernelmatrix(k, m1)) == (4, 4)

test/kernels/custom.jl

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,8 @@ struct MyKernel <: SimpleKernel end
44
KernelFunctions.kappa(::MyKernel, d2::Real) = exp(-d2)
55
KernelFunctions.metric(::MyKernel) = SqEuclidean()
66

7-
# some syntactic sugar
8-
::MyKernel)(x::AbstractVector{<:Real}, y::AbstractVector{<:Real}) = kappa(κ, x, y)
9-
::MyKernel)(X::AbstractMatrix{<:Real}, Y::AbstractMatrix{<:Real}; obsdim = 2) = kernelmatrix(κ, X, Y; obsdim = obsdim)
10-
::MyKernel)(X::AbstractMatrix{<:Real}; obsdim = 2) = kernelmatrix(κ, X; obsdim = obsdim)
11-
127
@testset "custom" begin
138
@test kappa(MyKernel(), 3) == kappa(SqExponentialKernel(), 3)
14-
@test kappa(MyKernel(), 1, 3) == kappa(SqExponentialKernel(), 1, 3)
15-
@test kappa(MyKernel(), [1, 2], [3, 4]) == kappa(SqExponentialKernel(), [1, 2], [3, 4])
169
@test kernelmatrix(MyKernel(), [1 2; 3 4], [5 6; 7 8]) == kernelmatrix(SqExponentialKernel(), [1 2; 3 4], [5 6; 7 8])
1710
@test kernelmatrix(MyKernel(), [1 2; 3 4]) == kernelmatrix(SqExponentialKernel(), [1 2; 3 4])
18-
19-
@test MyKernel()([1, 2], [3, 4]) == SqExponentialKernel()([1, 2], [3, 4])
20-
@test MyKernel()([1 2; 3 4], [5 6; 7 8]) == SqExponentialKernel()([1 2; 3 4], [5 6; 7 8])
21-
@test MyKernel()([1 2; 3 4]) == SqExponentialKernel()([1 2; 3 4])
2211
end

test/kernels/kernelproduct.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
k2 = SqExponentialKernel()
88
k3 = RationalQuadraticKernel()
99

10-
k = KernelProduct([k1,k2])
10+
k = KernelProduct([k1, k2])
1111
@test length(k) == 2
12-
@test kappa(k,v1,v2) == kappa(k1*k2,v1,v2)
13-
@test kappa(k*k,v1,v2) kappa(k,v1,v2)^2
14-
@test kappa(k*k3,v1,v2) kappa(k3*k,v1,v2)
12+
@test k(v1, v2) == (k1 * k2)(v1, v2)
13+
@test (k * k)(v1, v2) k(v1, v2)^2
14+
@test (k * k3)(v1, v2) (k3 * k)(v1, v2)
1515
end

0 commit comments

Comments
 (0)