def test_rff_sampler_returns_correctly_shaped_samples( sample_min_value: bool, sample_size: int ) -> None: search_space = Box([0.0, 0.0], [1.0, 1.0]) model = QuadraticMeanAndRBFKernel(noise_variance=tf.constant(1.0, dtype=tf.float64)) model.kernel = ( gpflow.kernels.RBF() ) # need a gpflow kernel object for random feature decompositions x_range = tf.linspace(0.0, 1.0, 5) x_range = tf.cast(x_range, dtype=tf.float64) xs = tf.reshape(tf.stack(tf.meshgrid(x_range, x_range, indexing="ij"), axis=-1), (-1, 2)) ys = quadratic(xs) dataset = Dataset(xs, ys) sampler = RandomFourierFeatureThompsonSampler( sample_size, model, dataset, num_features=100, sample_min_value=sample_min_value ) query_points = search_space.sample(100) thompson_samples = sampler.sample(query_points) if sample_min_value: tf.debugging.assert_shapes([(thompson_samples, [sample_size, 1])]) else: tf.debugging.assert_shapes([(thompson_samples, [sample_size, 2])])
def test_rff_sampler_raises_for_invalid_number_of_features( num_features: int, ) -> None: model = QuadraticMeanAndRBFKernel(noise_variance=tf.constant(1.0, dtype=tf.float64)) model.kernel = ( gpflow.kernels.RBF() ) # need a gpflow kernel object for random feature decompositions dataset = Dataset( tf.constant([[-2.0]], dtype=tf.float64), tf.constant([[4.1]], dtype=tf.float64) ) with pytest.raises(TF_DEBUGGING_ERROR_TYPES): RandomFourierFeatureThompsonSampler(1, model, dataset, num_features=num_features)
def test_discrete_thompson_sampling_acquire_returns_correct_shape( num_fourier_features: bool, num_query_points: int ) -> None: search_space = Box(tf.constant([-2.2, -1.0]), tf.constant([1.3, 3.3])) ts = DiscreteThompsonSampling(100, num_query_points, num_fourier_features=num_fourier_features) dataset = Dataset(tf.zeros([1, 2], dtype=tf.float64), tf.zeros([1, 1], dtype=tf.float64)) model = QuadraticMeanAndRBFKernel(noise_variance=tf.constant(1.0, dtype=tf.float64)) model.kernel = ( gpflow.kernels.RBF() ) # need a gpflow kernel object for random feature decompositions query_points = ts.acquire_single(search_space, model, dataset=dataset) npt.assert_array_equal(query_points.shape, tf.constant([num_query_points, 2]))
def test_rff_sampler_sample_raises_for_invalid_at_shape( shape: ShapeLike, ) -> None: model = QuadraticMeanAndRBFKernel(noise_variance=tf.constant(1.0, dtype=tf.float64)) model.kernel = ( gpflow.kernels.RBF() ) # need a gpflow kernel object for random feature decompositions dataset = Dataset( tf.constant([[-2.0]], dtype=tf.float64), tf.constant([[4.1]], dtype=tf.float64) ) sampler = RandomFourierFeatureThompsonSampler(1, model, dataset, num_features=100) with pytest.raises(TF_DEBUGGING_ERROR_TYPES): sampler.sample(tf.zeros(shape))
def test_rff_sampler_returns_trajectory_function_with_correct_shaped_output(num_evals: int) -> None: model = QuadraticMeanAndRBFKernel(noise_variance=tf.constant(1.0, dtype=tf.float64)) model.kernel = ( gpflow.kernels.RBF() ) # need a gpflow kernel object for random feature decompositions dataset = Dataset( tf.constant([[-2.0]], dtype=tf.float64), tf.constant([[4.1]], dtype=tf.float64) ) sampler = RandomFourierFeatureThompsonSampler(1, model, dataset, num_features=100) trajectory = sampler.get_trajectory() xs = tf.linspace([-10.0], [10.0], num_evals) tf.debugging.assert_shapes([(trajectory(xs), [num_evals, 1])])
def test_rff_sampler_returns_deterministic_trajectory() -> None: model = QuadraticMeanAndRBFKernel(noise_variance=tf.constant(1.0, dtype=tf.float64)) model.kernel = ( gpflow.kernels.RBF() ) # need a gpflow kernel object for random feature decompositions x_range = tf.linspace(0.0, 1.0, 5) x_range = tf.cast(x_range, dtype=tf.float64) xs = tf.reshape(tf.stack(tf.meshgrid(x_range, x_range, indexing="ij"), axis=-1), (-1, 2)) ys = quadratic(xs) dataset = Dataset(xs, ys) sampler = RandomFourierFeatureThompsonSampler(1, model, dataset, num_features=100) trajectory = sampler.get_trajectory() trajectory_eval_1 = trajectory(xs) trajectory_eval_2 = trajectory(xs) npt.assert_allclose(trajectory_eval_1, trajectory_eval_2)
def test_rff_sampler_returns_same_posterior_from_each_calculation_method() -> None: model = QuadraticMeanAndRBFKernel(noise_variance=tf.constant(1.0, dtype=tf.float64)) model.kernel = ( gpflow.kernels.RBF() ) # need a gpflow kernel object for random feature decompositions x_range = tf.linspace(0.0, 1.0, 5) x_range = tf.cast(x_range, dtype=tf.float64) xs = tf.reshape(tf.stack(tf.meshgrid(x_range, x_range, indexing="ij"), axis=-1), (-1, 2)) ys = quadratic(xs) dataset = Dataset(xs, ys) sampler = RandomFourierFeatureThompsonSampler(1, model, dataset, num_features=100) sampler.get_trajectory() posterior_1 = sampler._prepare_theta_posterior_in_design_space() posterior_2 = sampler._prepare_theta_posterior_in_gram_space() npt.assert_allclose(posterior_1.loc, posterior_2.loc, rtol=0.02) npt.assert_allclose(posterior_1.scale_tril, posterior_2.scale_tril, rtol=0.02)
def test_rff_thompson_samples_are_minima() -> None: search_space = Box([0.0, 0.0], [1.0, 1.0]) model = QuadraticMeanAndRBFKernel(noise_variance=tf.constant(1e-5, dtype=tf.float64)) model.kernel = ( gpflow.kernels.RBF() ) # need a gpflow kernel object for random feature decompositions x_range = tf.linspace(0.0, 1.0, 5) x_range = tf.cast(x_range, dtype=tf.float64) xs = tf.reshape(tf.stack(tf.meshgrid(x_range, x_range, indexing="ij"), axis=-1), (-1, 2)) ys = quadratic(xs) dataset = Dataset(xs, ys) sampler = RandomFourierFeatureThompsonSampler( 1, model, dataset, num_features=100, sample_min_value=True ) query_points = search_space.sample(100) query_points = tf.concat([dataset.query_points, query_points], 0) thompson_samples = sampler.sample(query_points) fmean, _ = model.predict(dataset.query_points) assert max(thompson_samples) < min(fmean)