https://github.com/GPflow/GPflow
Tip revision: 941b21fdda87cfc39169d71edf8647820fcbe82d authored by ST John on 04 December 2019, 13:22:57 UTC
fix links to point to correct (1.0) tutorial notebooks
fix links to point to correct (1.0) tutorial notebooks
Tip revision: 941b21f
test_broadcasting.py
# Copyright 2017 the GPflow authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import tensorflow as tf
import numpy as np
from numpy.testing import assert_allclose
import pytest
import gpflow
from gpflow.test_util import session_tf
from gpflow import settings
from gpflow import kernels
# TODO: kernels.Coregion
Kerns = [
# Static
kernels.White,
kernels.Constant,
# Stationary
kernels.SquaredExponential,
kernels.RationalQuadratic,
kernels.Exponential,
kernels.Matern12,
kernels.Matern32,
kernels.Matern52,
kernels.Cosine,
kernels.Linear,
kernels.Polynomial,
pytest.param(kernels.ArcCosine, marks=pytest.mark.xfail), # broadcasting not implemented
kernels.Periodic,
lambda input_dim: kernels.White(input_dim) + kernels.Matern12(input_dim),
lambda input_dim: kernels.White(input_dim) * kernels.Matern12(input_dim),
]
@pytest.mark.parametrize("Kern", Kerns)
def test_broadcast_no_active_dims(Kern, session_tf):
S, N, M, D = 5, 4, 3, 2
X1 = tf.identity(np.random.randn(S, N, D))
X2 = tf.identity(np.random.randn(M, D))
kern = Kern(D) + gpflow.kernels.White(2)
compare_vs_map(X1, X2, kern, session_tf)
@pytest.mark.parametrize("Kern", [gpflow.kernels.SquaredExponential])
def test_broadcast_slice_active_dims(Kern, session_tf):
S, N, M, D = 5, 4, 3, 4
d = 2
X1 = tf.identity(np.random.randn(S, N, D))
X2 = tf.identity(np.random.randn(M, D))
kern = Kern(d, active_dims=slice(1, 1+d))
compare_vs_map(X1, X2, kern, session_tf)
@pytest.mark.parametrize("Kern", [gpflow.kernels.SquaredExponential])
def test_broadcast_indices_active_dims(Kern, session_tf):
S, N, M, D = 5, 4, 3, 4
X1 = tf.identity(np.random.randn(S, N, D))
X2 = tf.identity(np.random.randn(M, D))
kern = Kern(2, active_dims=[1, 3])
compare_vs_map(X1, X2, kern, session_tf)
def compare_vs_map(X1, X2, kern, sess):
K12_map = tf.map_fn(lambda x: kern.K(x[0], X2), [X1], dtype=settings.float_type)
K12_native = kern.K(X1, X2)
assert_allclose(*sess.run([K12_map, K12_native]))
K_map = tf.map_fn(kern.K, X1, dtype=settings.float_type)
K_native = kern.K(X1)
assert_allclose(*sess.run([K_map, K_native]))
Kdiag_map = tf.map_fn(kern.Kdiag, X1, dtype=settings.float_type)
Kdiag_native = kern.Kdiag(X1)
assert_allclose(*sess.run([Kdiag_map, Kdiag_native]))