Skip to content

Commit 5128791

Browse files
authored
Refactors the test suite (#63)
* Refactors test suite * Includes Flux tests * Formats test/utils.jl properly * Remove redundant files
1 parent e90bb59 commit 5128791

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+613
-539
lines changed

test/approximations/nystrom.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
@testset "nystrom" begin
2+
dims = [10,5]
3+
X = rand(dims...)
4+
k = SqExponentialKernel()
5+
for obsdim in [1, 2]
6+
@test kernelmatrix(k, X; obsdim=obsdim) kernelmatrix(nystrom(k, X, 1.0; obsdim=obsdim))
7+
@test kernelmatrix(k, X; obsdim=obsdim) kernelmatrix(nystrom(k, X, collect(1:dims[obsdim]); obsdim=obsdim))
8+
end
9+
end

test/distances/delta.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
@testset "delta" begin
2+
A = rand(10,5)
3+
B = rand(20,5)
4+
d = KernelFunctions.Delta()
5+
@test pairwise(d,A,dims=1) == Matrix(I,size(A,1),size(A,1))
6+
@test pairwise(d,A,B,dims=1) == zeros(size(A,1),size(B,1))
7+
@test d(1,2) == 0
8+
@test d(1,1) == 1
9+
@test_throws DimensionMismatch d(rand(3),rand(4))
10+
end

test/distances/dotproduct.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
@testset "dotproduct" begin
2+
A = rand(10,5)
3+
B = rand(20,5)
4+
d = KernelFunctions.DotProduct()
5+
@test diag(pairwise(d,A,dims=2)) == [dot(A[:,i],A[:,i]) for i in 1:size(A,2)]
6+
@test_throws DimensionMismatch d(rand(3),rand(4))
7+
@test d(3.0,2.0) == 6.0
8+
end

test/test_generic.jl renamed to test/generic.jl

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
using KernelFunctions
2-
3-
k = SqExponentialKernel()
4-
5-
@testset "Generic functions to test" begin
1+
@testset "generic" begin
2+
k = SqExponentialKernel()
63
@test length(k) == 1
74
@test iterate(k) == (k,nothing)
85
@test iterate(k,1) == nothing

test/kernels/constant.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
@testset "constant" begin
2+
@testset "ZeroKernel" begin
3+
k = ZeroKernel()
4+
@test eltype(k) == Any
5+
@test kappa(k,2.0) == 0.0
6+
@test KernelFunctions.metric(ZeroKernel()) == KernelFunctions.Delta()
7+
end
8+
@testset "WhiteKernel" begin
9+
k = WhiteKernel()
10+
@test eltype(k) == Any
11+
@test kappa(k,1.0) == 1.0
12+
@test kappa(k,0.0) == 0.0
13+
@test EyeKernel == WhiteKernel
14+
@test metric(WhiteKernel()) == KernelFunctions.Delta()
15+
end
16+
@testset "ConstantKernel" begin
17+
c = 2.0
18+
k = ConstantKernel(c=c)
19+
@test eltype(k) == Any
20+
@test kappa(k,1.0) == c
21+
@test kappa(k,0.5) == c
22+
@test metric(ConstantKernel()) == KernelFunctions.Delta()
23+
@test metric(ConstantKernel(c=2.0)) == KernelFunctions.Delta()
24+
end
25+
end

test/kernels/cosine.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
@testset "cosine" begin
2+
rng = MersenneTwister(123456)
3+
x = rand(rng)*2
4+
v1 = rand(rng, 3)
5+
v2 = rand(rng, 3)
6+
7+
k = CosineKernel()
8+
@test eltype(k) == Any
9+
@test kappa(k, 1.0) -1.0 atol=1e-5
10+
@test kappa(k, 2.0) 1.0 atol=1e-5
11+
@test kappa(k, 1.5) 0.0 atol=1e-5
12+
@test kappa(k,x) cospi(x) atol=1e-5
13+
@test k(v1, v2) cospi(sqrt(sum(abs2.(v1-v2)))) atol=1e-5
14+
end

test/kernels/custom.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# minimal definition of a custom kernel
2+
struct MyKernel <: Kernel end
3+
4+
KernelFunctions.kappa(::MyKernel, d2::Real) = exp(-d2)
5+
KernelFunctions.metric(::MyKernel) = SqEuclidean()
6+
7+
# some syntactic sugar
8+
::MyKernel)(d::Real) = kappa(κ, d)
9+
::MyKernel)(x::AbstractVector{<:Real}, y::AbstractVector{<:Real}) = kappa(κ, x, y)
10+
::MyKernel)(X::AbstractMatrix{<:Real}, Y::AbstractMatrix{<:Real}; obsdim = 2) = kernelmatrix(κ, X, Y; obsdim = obsdim)
11+
::MyKernel)(X::AbstractMatrix{<:Real}; obsdim = 2) = kernelmatrix(κ, X; obsdim = obsdim)
12+
13+
@testset "custom" begin
14+
@test kappa(MyKernel(), 3) == kappa(SqExponentialKernel(), 3)
15+
@test kappa(MyKernel(), 1, 3) == kappa(SqExponentialKernel(), 1, 3)
16+
@test kappa(MyKernel(), [1, 2], [3, 4]) == kappa(SqExponentialKernel(), [1, 2], [3, 4])
17+
@test kernelmatrix(MyKernel(), [1 2; 3 4], [5 6; 7 8]) == kernelmatrix(SqExponentialKernel(), [1 2; 3 4], [5 6; 7 8])
18+
@test kernelmatrix(MyKernel(), [1 2; 3 4]) == kernelmatrix(SqExponentialKernel(), [1 2; 3 4])
19+
20+
@test MyKernel()(3) == SqExponentialKernel()(3)
21+
@test MyKernel()([1, 2], [3, 4]) == SqExponentialKernel()([1, 2], [3, 4])
22+
@test MyKernel()([1 2; 3 4], [5 6; 7 8]) == SqExponentialKernel()([1 2; 3 4], [5 6; 7 8])
23+
@test MyKernel()([1 2; 3 4]) == SqExponentialKernel()([1 2; 3 4])
24+
end

test/kernels/exponential.jl

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
@testset "exponential" begin
2+
rng = MersenneTwister(123456)
3+
x = rand(rng)*2
4+
v1 = rand(rng, 3)
5+
v2 = rand(rng, 3)
6+
@testset "SqExponentialKernel" begin
7+
k = SqExponentialKernel()
8+
@test kappa(k,x) exp(-x)
9+
@test k(v1,v2) exp(-norm(v1-v2)^2)
10+
@test kappa(SqExponentialKernel(),x) == kappa(k,x)
11+
@test metric(SqExponentialKernel()) == SqEuclidean()
12+
end
13+
@testset "ExponentialKernel" begin
14+
k = ExponentialKernel()
15+
@test kappa(k,x) exp(-x)
16+
@test k(v1,v2) exp(-norm(v1-v2))
17+
@test kappa(ExponentialKernel(),x) == kappa(k,x)
18+
@test metric(ExponentialKernel()) == Euclidean()
19+
end
20+
@testset "GammaExponentialKernel" begin
21+
γ = 2.0
22+
k = GammaExponentialKernel=γ)
23+
@test kappa(k,x) exp(-(x)^(γ))
24+
@test k(v1,v2) exp(-norm(v1-v2)^(2γ))
25+
@test kappa(GammaExponentialKernel(),x) == kappa(k,x)
26+
@test GammaExponentialKernel(gamma=γ).γ == [γ]
27+
@test metric(GammaExponentialKernel()) == SqEuclidean()
28+
@test metric(GammaExponentialKernel=2.0)) == SqEuclidean()
29+
30+
#Coherence :
31+
@test KernelFunctions._kernel(GammaExponentialKernel=1.0),v1,v2) KernelFunctions._kernel(SqExponentialKernel(),v1,v2)
32+
@test KernelFunctions._kernel(GammaExponentialKernel=0.5),v1,v2) KernelFunctions._kernel(ExponentialKernel(),v1,v2)
33+
end
34+
end

test/kernels/exponentiated.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
@testset "exponentiated" begin
2+
rng = MersenneTwister(123456)
3+
x = rand(rng)*2
4+
v1 = rand(rng, 3)
5+
v2 = rand(rng, 3)
6+
7+
k = ExponentiatedKernel()
8+
@test kappa(k,x) exp(x)
9+
@test kappa(k,-x) exp(-x)
10+
@test k(v1,v2) exp(dot(v1,v2))
11+
@test metric(ExponentiatedKernel()) == KernelFunctions.DotProduct()
12+
end

test/kernels/kernelproduct.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@testset "kernelproduct" begin
2+
rng = MersenneTwister(123456)
3+
v1 = rand(rng, 3)
4+
v2 = rand(rng, 3)
5+
6+
k1 = LinearKernel()
7+
k2 = SqExponentialKernel()
8+
k3 = RationalQuadraticKernel()
9+
10+
k = KernelProduct([k1,k2])
11+
@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)
15+
end

test/kernels/kernelsum.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
@testset "kernelsum" begin
2+
rng = MersenneTwister(123456)
3+
x = rand(rng)*2
4+
v1 = rand(rng, 3)
5+
v2 = rand(rng, 3)
6+
7+
k1 = LinearKernel()
8+
k2 = SqExponentialKernel()
9+
k3 = RationalQuadraticKernel()
10+
X = rand(rng, 2,2)
11+
12+
w = [2.0,0.5]
13+
k = KernelSum([k1,k2],w)
14+
ks1 = 2.0*k1
15+
ks2 = 0.5*k2
16+
@test length(k) == 2
17+
@test kappa(k,v1,v2) == kappa(2.0*k1+0.5*k2,v1,v2)
18+
@test kappa(k+k3,v1,v2) kappa(k3+k,v1,v2)
19+
@test kappa(k1+k2,v1,v2) == kappa(KernelSum([k1,k2]),v1,v2)
20+
@test kappa(k+ks1,v1,v2) kappa(ks1+k,v1,v2)
21+
@test kappa(k+k,v1,v2) == kappa(KernelSum([k1,k2,k1,k2],vcat(w,w)),v1,v2)
22+
end

test/kernels/maha.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
@testset "maha" begin
2+
P = rand(3,3)
3+
k = MahalanobisKernel(P)
4+
@test kappa(k,x) == exp(-x)
5+
@test k(v1,v2) exp(-sqmahalanobis(v1,v2, k.P))
6+
@test kappa(ExponentialKernel(),x) == kappa(k,x)
7+
end

test/kernels/matern.jl

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
@testset "matern" begin
2+
rng = MersenneTwister(123456)
3+
x = rand(rng)*2
4+
v1 = rand(rng, 3)
5+
v2 = rand(rng, 3)
6+
@testset "MaternKernel" begin
7+
ν = 2.0
8+
k = MaternKernel=ν)
9+
matern(x,ν) = 2^(1-ν)/gamma(ν)*(sqrt(2ν)*x)^ν*besselk(ν,sqrt(2ν)*x)
10+
@test MaternKernel(nu=ν).ν == [ν]
11+
@test kappa(k,x) matern(x,ν)
12+
@test kappa(k,0.0) == 1.0
13+
@test kappa(MaternKernel=ν),x) == kappa(k,x)
14+
@test metric(MaternKernel()) == Euclidean()
15+
@test metric(MaternKernel=2.0)) == Euclidean()
16+
end
17+
@testset "Matern32Kernel" begin
18+
k = Matern32Kernel()
19+
@test kappa(k,x) (1+sqrt(3)*x)exp(-sqrt(3)*x)
20+
@test k(v1,v2) (1+sqrt(3)*norm(v1-v2))exp(-sqrt(3)*norm(v1-v2))
21+
@test kappa(Matern32Kernel(),x) == kappa(k,x)
22+
@test metric(Matern32Kernel()) == Euclidean()
23+
end
24+
@testset "Matern52Kernel" begin
25+
k = Matern52Kernel()
26+
@test kappa(k,x) (1+sqrt(5)*x+5/3*x^2)exp(-sqrt(5)*x)
27+
@test k(v1,v2) (1+sqrt(5)*norm(v1-v2)+5/3*norm(v1-v2)^2)exp(-sqrt(5)*norm(v1-v2))
28+
@test kappa(Matern52Kernel(),x) == kappa(k,x)
29+
@test metric(Matern52Kernel()) == Euclidean()
30+
end
31+
@testset "Coherence Materns" begin
32+
@test kappa(MaternKernel=0.5),x) kappa(ExponentialKernel(),x)
33+
@test kappa(MaternKernel=1.5),x) kappa(Matern32Kernel(),x)
34+
@test kappa(MaternKernel=2.5),x) kappa(Matern52Kernel(),x)
35+
end
36+
end

test/kernels/polynomial.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
@testset "polynomial" begin
2+
rng = MersenneTwister(123456)
3+
x = rand(rng)*2
4+
v1 = rand(rng, 3)
5+
v2 = rand(rng, 3)
6+
c = randn(rng)
7+
@testset "LinearKernel" begin
8+
k = LinearKernel()
9+
@test kappa(k,x) x
10+
@test k(v1,v2) dot(v1,v2)
11+
@test kappa(LinearKernel(),x) == kappa(k,x)
12+
@test metric(LinearKernel()) == KernelFunctions.DotProduct()
13+
@test metric(LinearKernel(c=2.0)) == KernelFunctions.DotProduct()
14+
end
15+
@testset "PolynomialKernel" begin
16+
k = PolynomialKernel()
17+
@test kappa(k,x) x^2
18+
@test k(v1,v2) dot(v1,v2)^2
19+
@test kappa(PolynomialKernel(),x) == kappa(k,x)
20+
#Coherence test
21+
@test kappa(PolynomialKernel(d=1.0,c=c),x) kappa(LinearKernel(c=c),x)
22+
@test metric(PolynomialKernel()) == KernelFunctions.DotProduct()
23+
@test metric(PolynomialKernel(d=3.0)) == KernelFunctions.DotProduct()
24+
@test metric(PolynomialKernel(d=3.0,c=2.0)) == KernelFunctions.DotProduct()
25+
end
26+
end

test/kernels/rationalquad.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
@testset "rationalquad" begin
2+
rng = MersenneTwister(123456)
3+
x = rand(rng)*2
4+
v1 = rand(rng, 3)
5+
v2 = rand(rng, 3)
6+
@testset "RationalQuadraticKernel" begin
7+
α = 2.0
8+
k = RationalQuadraticKernel=α)
9+
@test RationalQuadraticKernel(alpha=α).α == [α]
10+
@test kappa(k,x) (1.0+x/2.0)^-2
11+
@test k(v1,v2) (1.0+norm(v1-v2)^2/2.0)^-2
12+
@test kappa(RationalQuadraticKernel=α),x) == kappa(k,x)
13+
@test metric(RationalQuadraticKernel()) == SqEuclidean()
14+
@test metric(RationalQuadraticKernel=2.0)) == SqEuclidean()
15+
end
16+
@testset "GammaRationalQuadraticKernel" begin
17+
k = GammaRationalQuadraticKernel()
18+
@test kappa(k,x) (1.0+x^2.0/2.0)^-2
19+
@test k(v1,v2) (1.0+norm(v1-v2)^4.0/2.0)^-2
20+
@test kappa(GammaRationalQuadraticKernel(),x) == kappa(k,x)
21+
a = 1.0 + rand()
22+
@test GammaRationalQuadraticKernel(alpha=a).α == [a]
23+
#Coherence test
24+
@test kappa(GammaRationalQuadraticKernel=a,γ=1.0),x) kappa(RationalQuadraticKernel=a),x)
25+
@test metric(GammaRationalQuadraticKernel()) == SqEuclidean()
26+
@test metric(GammaRationalQuadraticKernel=2.0)) == SqEuclidean()
27+
@test metric(GammaRationalQuadraticKernel=2.0=3.0)) == SqEuclidean()
28+
end
29+
end

test/kernels/scaledkernel.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
@testset "scaledkernel" begin
2+
rng = MersenneTwister(123456)
3+
x = rand(rng)*2
4+
s = rand(rng)
5+
6+
k = SqExponentialKernel()
7+
ks = ScaledKernel(k,s)
8+
@test kappa(ks,x) == s*kappa(k,x)
9+
@test kappa(ks,x) == kappa(s*k,x)
10+
end

test/kernels/transformedkernel.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
@testset "transformedkernel" begin
2+
rng = MersenneTwister(123456)
3+
x = rand(rng)*2
4+
v1 = rand(rng, 3)
5+
v2 = rand(rng, 3)
6+
7+
s = rand(rng)
8+
v = rand(rng, 3)
9+
k = SqExponentialKernel()
10+
kt = TransformedKernel(k,ScaleTransform(s))
11+
ktard = TransformedKernel(k,ARDTransform(v))
12+
@test kappa(kt,v1,v2) == kappa(transform(k,ScaleTransform(s)),v1,v2)
13+
@test kappa(kt,v1,v2) == kappa(transform(k,s),v1,v2)
14+
@test kappa(kt,v1,v2) kappa(k,s*v1,s*v2) atol=1e-5
15+
@test kappa(ktard,v1,v2) kappa(transform(k,ARDTransform(v)),v1,v2) atol=1e-5
16+
@test kappa(ktard,v1,v2) == kappa(transform(k,v),v1,v2)
17+
@test kappa(ktard,v1,v2) == kappa(k,v.*v1,v.*v2)
18+
@test KernelFunctions.metric(kt) == KernelFunctions.metric(k)
19+
end

test/matrix/kernelkroneckermat.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
@testset "kernelkroneckermat" begin
2+
rng = MersenneTwister(123456)
3+
k = SqExponentialKernel()
4+
x = range(0, 1; length=10)
5+
X = vcat(collect.(Iterators.product(x,x))'...)
6+
7+
@test all(collect(kernelkronmat(k,collect(x),2)).≈kernelmatrix(k,X,obsdim=1))
8+
@test all(collect(kernelkronmat(k,[x,x])).≈kernelmatrix(k,X,obsdim=1))
9+
@test_throws AssertionError kernelkronmat(LinearKernel(),collect(x),2)
10+
end

0 commit comments

Comments
 (0)