Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
d5a5a92
Restore additions
Crown421 Aug 30, 2021
a7ad44e
Improvements for lazy kron
Crown421 Aug 30, 2021
dde0c08
Remove unneeded lines
Crown421 Aug 30, 2021
a2a345f
Merge branch 'JuliaGaussianProcesses:master' into mo-lazy
Crown421 Aug 31, 2021
88cb606
Small experiment with overwriting
Crown421 Sep 4, 2021
af90bf1
Reorder and overwrite
Crown421 Sep 4, 2021
c6e9f06
Format and kernelmatrix!
Crown421 Sep 4, 2021
5c45aed
Merge branch 'mo-lazy' of github.com:Crown421/KernelFunctions.jl into…
Crown421 Sep 4, 2021
62e4b5e
Reinstate separate method
Crown421 Sep 15, 2021
d9287d7
Adding tests
Crown421 Sep 15, 2021
a732763
Merge branch 'master' into mo-lazy
Crown421 Sep 15, 2021
7f23921
Duplicate code for readability
Crown421 Sep 22, 2021
1e898b7
Merge branch 'mo-lazy' of github.com:Crown421/KernelFunctions.jl into…
Crown421 Sep 22, 2021
ceab3cf
Format
Crown421 Sep 22, 2021
8ed6be3
Remove comment and patch bump
Crown421 Sep 22, 2021
f46bd61
Change kernelmatrix!
Crown421 Sep 22, 2021
9540fce
Change to output covariance type
Crown421 Sep 22, 2021
09cd20e
Change to output covariance type - revert
Crown421 Sep 22, 2021
e0bce9d
Merge branch 'mo-lazy' of github.com:Crown421/KernelFunctions.jl into…
Crown421 Sep 22, 2021
204d99c
Revert "Change to output covariance type - revert"
Crown421 Sep 22, 2021
8b5757a
Revert "Change kernelmatrix!"
Crown421 Sep 22, 2021
dfee74f
Add kernelmatrix! changes again
Crown421 Sep 22, 2021
24f6b49
Change input types for pairwise pullback
Crown421 Sep 22, 2021
a00ba6d
Missing changes to Any
Crown421 Sep 23, 2021
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
2 changes: 1 addition & 1 deletion src/KernelFunctions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,8 @@ include(joinpath("kernels", "neuralkernelnetwork.jl"))
include(joinpath("approximations", "nystrom.jl"))
include("generic.jl")

include(joinpath("mokernels", "mokernel.jl"))
include(joinpath("mokernels", "moinput.jl"))
include(joinpath("mokernels", "mokernel.jl"))
include(joinpath("mokernels", "independent.jl"))
include(joinpath("mokernels", "slfm.jl"))
include(joinpath("mokernels", "intrinsiccoregion.jl"))
Expand Down
8 changes: 8 additions & 0 deletions src/matrix/kernelkroneckermat.jl
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,11 @@ end
k(x,x') = ∏ᵢᴰ k(xᵢ,x'ᵢ)
"""
@inline iskroncompatible(κ::Kernel) = false # Default return for kernels

function _kernelmatrix_kron_helper(::MOInputIsotopicByFeatures, Kfeatures, Koutputs)
return Kronecker.kronecker(Kfeatures, Koutputs)
end

function _kernelmatrix_kron_helper(::MOInputIsotopicByOutputs, Kfeatures, Koutputs)
return Kronecker.kronecker(Koutputs, Kfeatures)
end
38 changes: 2 additions & 36 deletions src/mokernels/independent.jl
Original file line number Diff line number Diff line change
Expand Up @@ -27,43 +27,9 @@ function (κ::IndependentMOKernel)((x, px)::Tuple{Any,Int}, (y, py)::Tuple{Any,I
return κ.kernel(x, y) * (px == py)
end

function _kernelmatrix_kron_helper(::MOInputIsotopicByFeatures, Kfeatures, B)
return kron(Kfeatures, B)
end

function _kernelmatrix_kron_helper(::MOInputIsotopicByOutputs, Kfeatures, B)
return kron(B, Kfeatures)
end

function kernelmatrix(
k::IndependentMOKernel, x::MOI, y::MOI
) where {MOI<:IsotopicMOInputsUnion}
@assert x.out_dim == y.out_dim
Kfeatures = kernelmatrix(k.kernel, x.x, y.x)
mtype = eltype(Kfeatures)
return _kernelmatrix_kron_helper(x, Kfeatures, Eye{mtype}(x.out_dim))
end

if VERSION >= v"1.6"
function _kernelmatrix_kron_helper!(K, ::MOInputIsotopicByFeatures, Kfeatures, B)
return kron!(K, Kfeatures, B)
end
_mo_output_covariance(k::IndependentMOKernel, out_dim) = Eye{Bool}(out_dim)

function _kernelmatrix_kron_helper!(K, ::MOInputIsotopicByOutputs, Kfeatures, B)
return kron!(K, B, Kfeatures)
end

function kernelmatrix!(
K::AbstractMatrix, k::IndependentMOKernel, x::MOI, y::MOI
) where {MOI<:IsotopicMOInputsUnion}
@assert x.out_dim == y.out_dim
Ktmp = kernelmatrix(k.kernel, x.x, y.x)
mtype = eltype(Ktmp)
return _kernelmatrix_kron_helper!(
K, x, Ktmp, Matrix{mtype}(I, x.out_dim, x.out_dim)
)
end
end
# for specialized kernelmatrix implementation see intrinsiccoregion.jl

function Base.show(io::IO, k::IndependentMOKernel)
return print(io, string("Independent Multi-Output Kernel\n\t", string(k.kernel)))
Expand Down
24 changes: 18 additions & 6 deletions src/mokernels/intrinsiccoregion.jl
Original file line number Diff line number Diff line change
Expand Up @@ -42,21 +42,33 @@ function (k::IntrinsicCoregionMOKernel)((x, px)::Tuple{Any,Int}, (y, py)::Tuple{
return k.B[px, py] * k.kernel(x, y)
end

function _mo_output_covariance(k::IntrinsicCoregionMOKernel, out_dim)
@assert size(k.B) == (out_dim, out_dim)
return k.B
end

function kernelmatrix(
k::IntrinsicCoregionMOKernel, x::MOI, y::MOI
) where {MOI<:IsotopicMOInputsUnion}
k::Union{IndependentMOKernel,IntrinsicCoregionMOKernel},
x::IsotopicMOInputsUnion,
y::IsotopicMOInputsUnion,
)
@assert x.out_dim == y.out_dim
Kfeatures = kernelmatrix(k.kernel, x.x, y.x)
return _kernelmatrix_kron_helper(x, Kfeatures, k.B)
Koutputs = _mo_output_covariance(k, x.out_dim)
return _kernelmatrix_kron_helper(x, Kfeatures, Koutputs)
end

if VERSION >= v"1.6"
function kernelmatrix!(
K::AbstractMatrix, k::IntrinsicCoregionMOKernel, x::MOI, y::MOI
) where {MOI<:IsotopicMOInputsUnion}
K::AbstractMatrix,
k::Union{IndependentMOKernel,IntrinsicCoregionMOKernel},
x::IsotopicMOInputsUnion,
y::IsotopicMOInputsUnion,
)
@assert x.out_dim == y.out_dim
Kfeatures = kernelmatrix(k.kernel, x.x, y.x)
return _kernelmatrix_kron_helper!(K, x, Kfeatures, k.B)
Koutputs = _mo_output_covariance(k, x.out_dim)
return _kernelmatrix_kron_helper!(K, x, Kfeatures, Koutputs)
end
end

Expand Down
18 changes: 18 additions & 0 deletions src/mokernels/mokernel.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,21 @@
Abstract type for kernels with multiple outpus.
"""
abstract type MOKernel <: Kernel end

function _kernelmatrix_kron_helper(::MOInputIsotopicByFeatures, Kfeatures, Koutputs)
return kron(Kfeatures, Koutputs)
end

function _kernelmatrix_kron_helper(::MOInputIsotopicByOutputs, Kfeatures, Koutputs)
return kron(Koutputs, Kfeatures)
end

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

function _kernelmatrix_kron_helper!(K, ::MOInputIsotopicByOutputs, Kfeatures, Koutputs)
return kron!(K, Koutputs, Kfeatures)
end
end