Skip to content

Commit b36342d

Browse files
committed
Merge branch 'master' of github.com:JuliaGaussianProcesses/KernelFunctions.jl into st/dw/scalar_parameterhandling/merge
2 parents 2ccf8cf + 04fa7f7 commit b36342d

File tree

14 files changed

+75
-127
lines changed

14 files changed

+75
-127
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "KernelFunctions"
22
uuid = "ec8451be-7e33-11e9-00cf-bbf324bd1392"
3-
version = "0.10.26"
3+
version = "0.10.27"
44

55
[deps]
66
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
@@ -32,7 +32,7 @@ IrrationalConstants = "0.1"
3232
LogExpFunctions = "0.2.1, 0.3"
3333
ParameterHandling = "0.4"
3434
Requires = "1.0.1"
35-
SpecialFunctions = "0.8, 0.9, 0.10, 1"
35+
SpecialFunctions = "0.8, 0.9, 0.10, 1, 2"
3636
StatsBase = "0.32, 0.33"
3737
TensorCore = "0.1"
3838
ZygoteRules = "0.2"

src/basekernels/fbm.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,16 @@ function (κ::FBMKernel)(x::AbstractVector{<:Real}, y::AbstractVector{<:Real})
3535
modX = sum(abs2, x)
3636
modY = sum(abs2, y)
3737
modXY = sqeuclidean(x, y)
38-
h = first.h)
38+
h = only.h)
3939
return (modX^h + modY^h - modXY^h) / 2
4040
end
4141

4242
function::FBMKernel)(x::Real, y::Real)
43-
return (abs2(x)^first.h) + abs2(y)^first.h) - abs2(x - y)^first.h)) / 2
43+
return (abs2(x)^only.h) + abs2(y)^only.h) - abs2(x - y)^only.h)) / 2
4444
end
4545

4646
function Base.show(io::IO, κ::FBMKernel)
47-
return print(io, "Fractional Brownian Motion Kernel (h = ", first.h), ")")
47+
return print(io, "Fractional Brownian Motion Kernel (h = ", only.h), ")")
4848
end
4949

5050
_fbm(modX, modY, modXY, h) = (modX^h + modY^h - modXY^h) / 2

src/basekernels/matern.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ function ParameterHandling.flatten(::Type{T}, k::MaternKernel{S}) where {T<:Real
3838
end
3939

4040
@inline function kappa::MaternKernel, d::Real)
41-
result = _matern(first.ν), d)
41+
result = _matern(only.ν), d)
4242
return ifelse(iszero(d), one(result), result)
4343
end
4444

@@ -50,7 +50,7 @@ end
5050
metric(k::MaternKernel) = k.metric
5151

5252
function Base.show(io::IO, κ::MaternKernel)
53-
return print(io, "Matern Kernel (ν = ", first.ν), ", metric = ", κ.metric, ")")
53+
return print(io, "Matern Kernel (ν = ", only.ν), ", metric = ", κ.metric, ")")
5454
end
5555

5656
## Matern12Kernel = ExponentialKernel aliased in exponential.jl

src/distances/sinus.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ struct Sinus{T} <: Distances.UnionSemiMetric
22
r::Vector{T}
33
end
44

5+
Sinus(r::Real) = Sinus([r])
6+
57
Distances.parameters(d::Sinus) = d.r
68
@inline Distances.eval_op(::Sinus, a::Real, b::Real, p::Real) = abs2(sinpi(a - b) / p)
79
@inline (dist::Sinus)(a::AbstractArray, b::AbstractArray) = Distances._evaluate(dist, a, b)
8-
@inline (dist::Sinus)(a::Number, b::Number) = abs2(sinpi(a - b) / first(dist.r))
10+
@inline (dist::Sinus)(a::Number, b::Number) = abs2(sinpi(a - b) / only(dist.r))
911

1012
Distances.result_type(::Sinus{T}, Ta::Type, Tb::Type) where {T} = promote_type(T, Ta, Tb)
1113

src/kernels/transformedkernel.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ function (k::TransformedKernel{<:SimpleKernel,<:ScaleTransform})(
4343
end
4444

4545
function _scale(t::ScaleTransform, metric::Euclidean, x, y)
46-
return first(t.s) * evaluate(metric, x, y)
46+
return only(t.s) * evaluate(metric, x, y)
4747
end
4848
function _scale(t::ScaleTransform, metric::Union{SqEuclidean,DotProduct}, x, y)
49-
return first(t.s)^2 * evaluate(metric, x, y)
49+
return only(t.s)^2 * evaluate(metric, x, y)
5050
end
5151
_scale(t::ScaleTransform, metric, x, y) = evaluate(metric, t(x), t(y))
5252

src/transform/ardtransform.jl

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

3636
dim(t::ARDTransform) = length(t.v)
3737

38-
(t::ARDTransform)(x::Real) = first(t.v) * x
38+
(t::ARDTransform)(x::Real) = only(t.v) * x
3939
(t::ARDTransform)(x) = t.v .* x
4040

4141
_map(t::ARDTransform, x::AbstractVector{<:Real}) = t.v' .* x

src/utils.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ function validate_inputs(x, y)
178178
if dim(x) != dim(y) # Passes by default if `dim` is not defined
179179
throw(
180180
DimensionMismatch(
181-
"Dimensionality of x ($(dim(x))) not equality to that of y ($(dim(y)))"
181+
"dimensionality of x ($(dim(x))) is not equal to that of y ($(dim(y)))"
182182
),
183183
)
184184
end

test/Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[deps]
22
AxisArrays = "39de3d68-74b9-583c-8d2d-e117c070f3a9"
3+
Compat = "34da2185-b29b-5c13-b0c7-acf172513d20"
34
Distances = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7"
45
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
56
FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000"
@@ -17,6 +18,7 @@ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
1718

1819
[compat]
1920
AxisArrays = "0.4.3"
21+
Compat = "3"
2022
Distances = "= 0.10.0, = 0.10.1, = 0.10.2, = 0.10.3, = 0.10.4"
2123
Documenter = "0.25, 0.26, 0.27"
2224
FiniteDifferences = "0.10.8, 0.11, 0.12"

test/basekernels/constant.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@
3838
# Standardised tests.
3939
TestUtils.test_interface(k, Float64)
4040
test_params(k, ([log(c)],))
41-
test_ADs(c -> ConstantKernel(; c=first(c)), [c])
41+
test_ADs(c -> ConstantKernel(; c=only(c)), [c])
4242
end
4343
end

test/basekernels/exponential.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
@test metric(k2) isa WeightedEuclidean
5959
@test k2(v1, v2) k(v1, v2)
6060

61-
test_ADs-> GammaExponentialKernel(; gamma=first(γ)), [1 + 0.5 * rand()])
61+
test_ADs-> GammaExponentialKernel(; gamma=only(γ)), [1 + 0.5 * rand()])
6262
test_params(k, ([logit/ 2)],))
6363
TestUtils.test_interface(GammaExponentialKernel(; γ=1.36))
6464

test/distances/sinus.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
d = KernelFunctions.Sinus(p)
66
@test Distances.parameters(d) == p
77
@test evaluate(d, A, B) == sum(abs2.(sinpi.(A - B) ./ p))
8-
@test d(3.0, 2.0) == abs2(sinpi(3.0 - 2.0) / first(p))
8+
d1 = KernelFunctions.Sinus(first(p))
9+
@test d1(3.0, 2.0) == abs2(sinpi(3.0 - 2.0) / first(p))
910
end

test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ using Zygote: Zygote
1414
using ForwardDiff: ForwardDiff
1515
using ReverseDiff: ReverseDiff
1616
using FiniteDifferences: FiniteDifferences
17+
using Compat: only
1718

1819
using KernelFunctions: SimpleKernel, metric, kappa, ColVecs, RowVecs, TestUtils
1920

test/test_utils.jl

Lines changed: 51 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const FDM = FiniteDifferences.central_fdm(5, 1)
4545
gradient(f, s::Symbol, args) = gradient(f, Val(s), args)
4646

4747
function gradient(f, ::Val{:Zygote}, args)
48-
g = first(Zygote.gradient(f, args))
48+
g = only(Zygote.gradient(f, args))
4949
if isnothing(g)
5050
if args isa AbstractArray{<:Real}
5151
return zeros(size(args)) # To respect the same output as other ADs
@@ -66,7 +66,11 @@ function gradient(f, ::Val{:ReverseDiff}, args)
6666
end
6767

6868
function gradient(f, ::Val{:FiniteDiff}, args)
69-
return first(FiniteDifferences.grad(FDM, f, args))
69+
return only(FiniteDifferences.grad(FDM, f, args))
70+
end
71+
72+
function compare_gradient(f, ::Val{:FiniteDiff}, args)
73+
@test_nowarn gradient(f, :FiniteDiff, args)
7074
end
7175

7276
function compare_gradient(f, AD::Symbol, args)
@@ -88,7 +92,7 @@ testdiagfunction(k::MOKernel, A, B) = sum(kernelmatrix_diag(k, A, B))
8892
function test_ADs(
8993
kernelfunction, args=nothing; ADs=[:Zygote, :ForwardDiff, :ReverseDiff], dims=[3, 3]
9094
)
91-
test_fd = test_FiniteDiff(kernelfunction, args, dims)
95+
test_fd = test_AD(:FiniteDiff, kernelfunction, args, dims)
9296
if !test_fd.anynonpass
9397
for AD in ADs
9498
test_AD(AD, kernelfunction, args, dims)
@@ -114,70 +118,6 @@ function test_ADs(
114118
end
115119
end
116120

117-
function test_FiniteDiff(kernelfunction, args=nothing, dims=[3, 3])
118-
# Init arguments :
119-
k = if args === nothing
120-
kernelfunction()
121-
else
122-
kernelfunction(args)
123-
end
124-
rng = MersenneTwister(42)
125-
@testset "FiniteDifferences" begin
126-
if k isa SimpleKernel
127-
for d in log.([eps(), rand(rng)])
128-
@test_nowarn gradient(:FiniteDiff, [d]) do x
129-
kappa(k, exp(first(x)))
130-
end
131-
end
132-
end
133-
## Testing Kernel Functions
134-
x = rand(rng, dims[1])
135-
y = rand(rng, dims[1])
136-
@test_nowarn gradient(:FiniteDiff, x) do x
137-
k(x, y)
138-
end
139-
if !(args === nothing)
140-
@test_nowarn gradient(:FiniteDiff, args) do p
141-
kernelfunction(p)(x, y)
142-
end
143-
end
144-
## Testing Kernel Matrices
145-
A = rand(rng, dims...)
146-
B = rand(rng, dims...)
147-
for dim in 1:2
148-
@test_nowarn gradient(:FiniteDiff, A) do a
149-
testfunction(k, a, dim)
150-
end
151-
@test_nowarn gradient(:FiniteDiff, A) do a
152-
testfunction(k, a, B, dim)
153-
end
154-
@test_nowarn gradient(:FiniteDiff, B) do b
155-
testfunction(k, A, b, dim)
156-
end
157-
if !(args === nothing)
158-
@test_nowarn gradient(:FiniteDiff, args) do p
159-
testfunction(kernelfunction(p), A, B, dim)
160-
end
161-
end
162-
163-
@test_nowarn gradient(:FiniteDiff, A) do a
164-
testdiagfunction(k, a, dim)
165-
end
166-
@test_nowarn gradient(:FiniteDiff, A) do a
167-
testdiagfunction(k, a, B, dim)
168-
end
169-
@test_nowarn gradient(:FiniteDiff, B) do b
170-
testdiagfunction(k, A, b, dim)
171-
end
172-
if args !== nothing
173-
@test_nowarn gradient(:FiniteDiff, args) do p
174-
testdiagfunction(kernelfunction(p), A, B, dim)
175-
end
176-
end
177-
end
178-
end
179-
end
180-
181121
function test_FiniteDiff(k::MOKernel, dims=(in=3, out=2, obs=3))
182122
rng = MersenneTwister(42)
183123
@testset "FiniteDifferences" begin
@@ -224,68 +164,68 @@ end
224164

225165
function test_AD(AD::Symbol, kernelfunction, args=nothing, dims=[3, 3])
226166
@testset "$(AD)" begin
227-
# Test kappa function
228167
k = if args === nothing
229168
kernelfunction()
230169
else
231170
kernelfunction(args)
232171
end
233172
rng = MersenneTwister(42)
173+
234174
if k isa SimpleKernel
235-
for d in log.([eps(), rand(rng)])
236-
compare_gradient(AD, [d]) do x
237-
kappa(k, exp(x[1]))
175+
@testset "kappa function" begin
176+
for d in log.([eps(), rand(rng)])
177+
compare_gradient(AD, [d]) do x
178+
kappa(k, exp(x[1]))
179+
end
238180
end
239181
end
240182
end
241-
# Testing kernel evaluations
242-
x = rand(rng, dims[1])
243-
y = rand(rng, dims[1])
244-
compare_gradient(AD, x) do x
245-
k(x, y)
246-
end
247-
compare_gradient(AD, y) do y
248-
k(x, y)
249-
end
250-
if !(args === nothing)
251-
compare_gradient(AD, args) do p
252-
kernelfunction(p)(x, y)
253-
end
254-
end
255-
# Testing kernel matrices
256-
A = rand(rng, dims...)
257-
B = rand(rng, dims...)
258-
for dim in 1:2
259-
compare_gradient(AD, A) do a
260-
testfunction(k, a, dim)
261-
end
262-
compare_gradient(AD, A) do a
263-
testfunction(k, a, B, dim)
183+
184+
@testset "kernel evaluations" begin
185+
x = rand(rng, dims[1])
186+
y = rand(rng, dims[1])
187+
compare_gradient(AD, x) do x
188+
k(x, y)
264189
end
265-
compare_gradient(AD, B) do b
266-
testfunction(k, A, b, dim)
190+
compare_gradient(AD, y) do y
191+
k(x, y)
267192
end
268193
if !(args === nothing)
269-
compare_gradient(AD, args) do p
270-
testfunction(kernelfunction(p), A, dim)
194+
@testset "hyperparameters" begin
195+
compare_gradient(AD, args) do p
196+
kernelfunction(p)(x, y)
197+
end
271198
end
272199
end
200+
end
273201

274-
compare_gradient(AD, A) do a
275-
testdiagfunction(k, a, dim)
276-
end
277-
compare_gradient(AD, A) do a
278-
testdiagfunction(k, a, B, dim)
279-
end
280-
compare_gradient(AD, B) do b
281-
testdiagfunction(k, A, b, dim)
282-
end
283-
if args !== nothing
284-
compare_gradient(AD, args) do p
285-
testdiagfunction(kernelfunction(p), A, dim)
202+
@testset "kernel matrices" begin
203+
A = rand(rng, dims...)
204+
B = rand(rng, dims...)
205+
@testset "$(_testfn)" for _testfn in (testfunction, testdiagfunction)
206+
for dim in 1:2
207+
compare_gradient(AD, A) do a
208+
_testfn(k, a, dim)
209+
end
210+
compare_gradient(AD, A) do a
211+
_testfn(k, a, B, dim)
212+
end
213+
compare_gradient(AD, B) do b
214+
_testfn(k, A, b, dim)
215+
end
216+
if !(args === nothing)
217+
@testset "hyperparameters" begin
218+
compare_gradient(AD, args) do p
219+
_testfn(kernelfunction(p), A, dim)
220+
end
221+
compare_gradient(AD, args) do p
222+
_testfn(kernelfunction(p), A, B, dim)
223+
end
224+
end
225+
end
286226
end
287227
end
288-
end
228+
end # kernel matrices
289229
end
290230
end
291231

test/transform/chaintransform.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
@test repr(tp tf) == "Chain of 2 transforms:\n\t - $(tf) |> $(tp)"
2525
test_ADs(
2626
x -> SEKernel() (ScaleTransform(exp(x[1])) ARDTransform(exp.(x[2:4]))),
27-
randn(rng, 4),
27+
randn(rng, 4);
28+
ADs=[:ForwardDiff, :ReverseDiff], # explicitly pass ADs to exclude :Zygote
2829
)
30+
@test_broken "test_AD of chain transform is currently broken in Zygote, see GitHub issue #263"
2931
end

0 commit comments

Comments
 (0)