def test_trust_region_for_unsuccessful_local_to_global_trust_region_reduced( ) -> None: tr = TrustRegion(NegativeLowerConfidenceBound(0).using(OBJECTIVE)) dataset = Dataset(tf.constant([[0.1, 0.2], [-0.1, -0.2]]), tf.constant([[0.4], [0.5]])) lower_bound = tf.constant([-2.2, -1.0]) upper_bound = tf.constant([1.3, 3.3]) search_space = Box(lower_bound, upper_bound) eps = 0.5 * (search_space.upper - search_space.lower) / 10 previous_y_min = dataset.observations[0] is_global = False acquisition_space = Box(dataset.query_points[0] - eps, dataset.query_points[0] + eps) previous_state = TrustRegion.State(acquisition_space, eps, previous_y_min, is_global) _, current_state = tr.acquire(search_space, {OBJECTIVE: dataset}, {OBJECTIVE: QuadraticMeanAndRBFKernel()}, previous_state) npt.assert_array_less( current_state.eps, previous_state.eps) # current TR smaller than previous assert current_state.is_global npt.assert_array_almost_equal(current_state.acquisition_space.lower, lower_bound)
def test_reducers_on_lcb(reducer): m = 6 beta = tf.convert_to_tensor(1.96, dtype=tf.float64) model = QuadraticMeanAndRBFKernel() acqs = [NegativeLowerConfidenceBound(beta).using("foo") for _ in range(m)] acq = reducer.type_class(*acqs) acq_fn = acq.prepare_acquisition_function({"foo": reducer.dataset}, {"foo": model}) individual_lcb = [-lower_confidence_bound(model, beta, reducer.query_point) for _ in range(m)] expected = reducer.raw_reduce_op(individual_lcb) desired = acq_fn(reducer.query_point) np.testing.assert_array_almost_equal(expected, desired)
def test_trust_region_for_default_state() -> None: tr = TrustRegion(NegativeLowerConfidenceBound(0)) dataset = Dataset(tf.constant([[0.1, 0.2]]), tf.constant([[0.012]])) lower_bound = tf.constant([-2.2, -1.0]) upper_bound = tf.constant([1.3, 3.3]) search_space = Box(lower_bound, upper_bound) query_point, state = tr.acquire_single(search_space, dataset, QuadraticMeanAndRBFKernel(), None) npt.assert_array_almost_equal(query_point, tf.constant([[0.0, 0.0]]), 5) npt.assert_array_almost_equal(state.acquisition_space.lower, lower_bound) npt.assert_array_almost_equal(state.acquisition_space.upper, upper_bound) npt.assert_array_almost_equal(state.y_min, [0.012]) assert state.is_global
def test_async_greedy_raises_for_non_greedy_function() -> None: non_greedy_function_builder = NegativeLowerConfidenceBound() with pytest.raises(NotImplementedError): # we are deliberately passing in wrong object # hence type ignore AsynchronousGreedy(non_greedy_function_builder) # type: ignore
class _Midpoint(AcquisitionRule[TensorType, Box]): def acquire( self, search_space: Box, models: Mapping[str, ProbabilisticModel], datasets: Optional[Mapping[str, Dataset]] = None, ) -> TensorType: return (search_space.upper[None] + search_space.lower[None]) / 2 @pytest.mark.parametrize( "rule, expected_query_point", [ (EfficientGlobalOptimization(NegativeLowerConfidenceBound(0)), [[0.0, 0.0]]), (_Midpoint(), [[-0.45, 1.15]]), ], ) def test_trust_region_for_default_state( rule: AcquisitionRule[TensorType, Box], expected_query_point: TensorType ) -> None: tr = TrustRegion(rule) dataset = Dataset(tf.constant([[0.1, 0.2]]), tf.constant([[0.012]])) lower_bound = tf.constant([-2.2, -1.0]) upper_bound = tf.constant([1.3, 3.3]) search_space = Box(lower_bound, upper_bound) state, query_point = tr.acquire_single( search_space, QuadraticMeanAndRBFKernel(), dataset=dataset )(None)