def test_optimal_sample_with_groups(setup_param_groups_prime): ''' Tests that the combinatorial optimisation approach matches that of the brute force approach ''' param_file = setup_param_groups_prime problem = read_param_file(param_file) N = 10 num_levels = 8 k_choices = 4 num_params = problem['num_vars'] sample = _sample_oat(problem, N, num_levels) strategy = GlobalOptimisation() actual = strategy.return_max_combo(sample, N, num_params, k_choices) brute_strategy = BruteForce() desired = brute_strategy.brute_force_most_distant(sample, N, num_params, k_choices) assert_equal(actual, desired)
def test_find_local_maximum_distance(self, setup_input): ''' Test whether finding the local maximum distance equals the global maximum distance in a simple case for a defined random seed. From Saltelli et al. 2008, in the solution to exercise 3a, Chapter 3, page 134. Note that local and brute force methods are not guaranteed to produce the same results, even for simple problems, hence forcing the seed here. ''' rd.seed(12345) local_strategy = LocalOptimisation() brute_strategy = BruteForce() sample_inputs = setup_input N = 6 num_params = 2 k_choices = 4 output_global = brute_strategy.brute_force_most_distant(sample_inputs, N, num_params, k_choices) output_local = local_strategy.find_local_maximum(sample_inputs, N, num_params, k_choices) assert_equal(output_global, output_local)
def test_local_optimised_groups(self, setup_param_groups_prime): """ Tests that the local optimisation problem gives the same answer as the brute force problem (for small values of `k_choices` and `N`) with groups """ N = 8 param_file = setup_param_groups_prime problem = read_param_file(param_file) num_levels = 4 grid_jump = num_levels / 2 k_choices = 4 num_params = problem['num_vars'] num_groups = len(set(problem['groups'])) input_sample = _sample_groups(problem, N, num_levels, grid_jump) strategy = LocalOptimisation() # From local optimal trajectories actual = strategy.find_local_maximum(input_sample, N, num_params, k_choices, num_groups) brute = BruteForce() desired = brute.brute_force_most_distant(input_sample, N, num_params, k_choices, num_groups) assert_equal(actual, desired)
def test_optimised_trajectories_without_groups(setup_function): """ Tests that the optimisation problem gives the same answer as the brute force problem (for small values of `k_choices` and `N`), particularly when there are two or more identical trajectories """ N = 6 param_file = setup_function problem = read_param_file(param_file) k_choices = 4 num_params = problem['num_vars'] groups = problem['groups'] # 6 trajectories, with 5th and 6th identical input_sample = np.array([[0.33333333, 0.66666667], [1., 0.66666667], [1., 0.], [0., 0.33333333], [0., 1.], [0.66666667, 1.], [0.66666667, 0.33333333], [0.66666667, 1.], [0., 1.], [0.66666667, 1.], [0.66666667, 0.33333333], [0., 0.33333333], [1., 1.], [1., 0.33333333], [0.33333333, 0.33333333], [1., 1.], [1., 0.33333333], [0.33333333, 0.33333333]], dtype=np.float32) # print(input_sample) # From gurobi optimal trajectories strategy = GlobalOptimisation() actual = strategy.return_max_combo(input_sample, N, num_params, k_choices) local_strategy = BruteForce() desired = local_strategy.brute_force_most_distant(input_sample, N, num_params, k_choices, groups) assert_equal(actual, desired)
def test_local_optimised_groups(self, setup_param_groups_prime, execution_number): """ Tests that the local optimisation problem gives the same answer as the brute force problem (for small values of `k_choices` and `N`) with groups for a defined random seed. Note that local and brute force methods are not guaranteed to produce exact answers, even for small problems. """ rd.seed(12345) N = 8 param_file = setup_param_groups_prime problem = read_param_file(param_file) num_levels = 4 k_choices = 4 num_params = problem['num_vars'] num_groups = len(set(problem['groups'])) input_sample = _sample_groups(problem, N, num_levels) local = LocalOptimisation() # From local optimal trajectories actual = local.find_local_maximum(input_sample, N, num_params, k_choices, num_groups) brute = BruteForce() desired = brute.brute_force_most_distant(input_sample, N, num_params, k_choices, num_groups) print("Actual: {}\nDesired: {}\n".format(actual, desired)) print(input_sample) assert_equal(actual, desired)
def test_optimal_combinations(setup_function): N = 6 param_file = setup_function problem = read_param_file(param_file) num_params = problem['num_vars'] num_levels = 10 grid_jump = num_levels / 2 k_choices = 4 morris_sample = _sample_oat(problem, N, num_levels, grid_jump) global_strategy = GlobalOptimisation() actual = global_strategy.return_max_combo(morris_sample, N, num_params, k_choices) brute_strategy = BruteForce() desired = brute_strategy.brute_force_most_distant(morris_sample, N, num_params, k_choices) assert_equal(actual, desired)
def test_find_local_maximum_distance(self, setup_input): ''' Test whether finding the local maximum distance equals the global maximum distance in a simple case. From Saltelli et al. 2008, in the solution to exercise 3a, Chapter 3, page 134. ''' local_strategy = LocalOptimisation() brute_strategy = BruteForce() sample_inputs = setup_input N = 6 num_params = 2 k_choices = 4 output_global = brute_strategy.brute_force_most_distant(sample_inputs, N, num_params, k_choices) output_local = local_strategy.find_local_maximum(sample_inputs, N, num_params, k_choices) assert_equal(output_global, output_local)
def test_optimal_combinations(setup_function): N = 6 param_file = setup_function problem = read_param_file(param_file) num_params = problem['num_vars'] num_levels = 10 k_choices = 4 morris_sample = _sample_oat(problem, N, num_levels) global_strategy = GlobalOptimisation() actual = global_strategy.return_max_combo(morris_sample, N, num_params, k_choices) brute_strategy = BruteForce() desired = brute_strategy.brute_force_most_distant(morris_sample, N, num_params, k_choices) assert_equal(actual, desired)