def test_expected_improvement_and_gradient(self): """Test EI by comparing the vectorized and "naive" versions. With the same RNG state, these two functions should return identical output. We use a fairly low number of monte-carlo iterations since we are not trying to converge; just check for consistency. .. Note:: this is not a particularly good test. It relies on the "naive" version being easier to verify manually and only checks for consistency between the naive and vectorized versions. """ num_points_p_q_list = ((1, 0), (1, 1), (2, 1), (1, 4), (5, 3)) ei_tolerance = 10.0 * numpy.finfo(numpy.float64).eps grad_ei_tolerance = 1.0e-13 numpy.random.seed(78532) for test_case in self.gp_test_environments: domain, gaussian_process = test_case for num_to_sample, num_being_sampled in num_points_p_q_list: points_to_sample = domain.generate_uniform_random_points_in_domain(num_to_sample) points_being_sampled = domain.generate_uniform_random_points_in_domain(num_being_sampled) union_of_points = numpy.reshape(numpy.append(points_to_sample, points_being_sampled), (num_to_sample + num_being_sampled, self.dim)) ei_eval = ExpectedImprovement( gaussian_process, points_to_sample, points_being_sampled=points_being_sampled, num_mc_iterations=self.num_mc_iterations, ) # Compute quantities required for EI mu_star = ei_eval._gaussian_process.compute_mean_of_points(union_of_points) var_star = ei_eval._gaussian_process.compute_variance_of_points(union_of_points) # Check EI # Save state first to restore at the end (o/w other "random" events will get screwed up) rng_state = numpy.random.get_state() numpy.random.seed(self.rng_seed) ei_vectorized = ei_eval._compute_expected_improvement_monte_carlo(mu_star, var_star) numpy.random.seed(self.rng_seed) ei_naive = ei_eval._compute_expected_improvement_monte_carlo_naive(mu_star, var_star) self.assert_scalar_within_relative(ei_vectorized, ei_naive, ei_tolerance) # Compute quantities required for grad EI grad_mu = ei_eval._gaussian_process.compute_grad_mean_of_points( union_of_points, num_derivatives=num_to_sample, ) grad_chol_decomp = ei_eval._gaussian_process.compute_grad_cholesky_variance_of_points( union_of_points, num_derivatives=num_to_sample, ) # Check grad EI numpy.random.seed(self.rng_seed) grad_ei_vectorized = ei_eval._compute_grad_expected_improvement_monte_carlo( mu_star, var_star, grad_mu, grad_chol_decomp, ) numpy.random.seed(self.rng_seed) grad_ei_naive = ei_eval._compute_grad_expected_improvement_monte_carlo_naive( mu_star, var_star, grad_mu, grad_chol_decomp, ) self.assert_vector_within_relative(grad_ei_vectorized, grad_ei_naive, grad_ei_tolerance) # Restore state numpy.random.set_state(rng_state)