def test_fast_non_dominated_sort_constrained_feasible_infeasible() -> None: with warnings.catch_warnings(): warnings.simplefilter("ignore", optuna.exceptions.ExperimentalWarning) sampler = NSGAIISampler(constraints_func=lambda _: [0]) # Single objective. directions = [StudyDirection.MINIMIZE] trials = [ _create_frozen_trial(0, [10], [0]), _create_frozen_trial(1, [20], [-1]), _create_frozen_trial(2, [20], [-2]), _create_frozen_trial(3, [30], [1]), ] population_per_rank = sampler._fast_non_dominated_sort(trials, directions) assert [{t.number for t in population} for population in population_per_rank] == [ {0}, {1, 2}, {3}, ] # Two objective. directions = [StudyDirection.MAXIMIZE, StudyDirection.MAXIMIZE] trials = [ _create_frozen_trial(0, [10, 30], [-1, -1]), _create_frozen_trial(1, [10, 10], [-2, -2]), _create_frozen_trial(2, [20, 20], [3, 3]), _create_frozen_trial(3, [30, 10], [6, -1]), _create_frozen_trial(4, [15, 15], [4, 4]), ] population_per_rank = sampler._fast_non_dominated_sort(trials, directions) assert [{t.number for t in population} for population in population_per_rank] == [ {0}, {1}, {2, 3}, {4}, ] # Three objective. directions = [ StudyDirection.MAXIMIZE, StudyDirection.MAXIMIZE, StudyDirection.MINIMIZE ] trials = [ _create_frozen_trial(0, [5, 5, 4], [-1, -1, -1]), _create_frozen_trial(1, [5, 5, 5], [1, 1, -1]), _create_frozen_trial(2, [9, 9, 0], [1, -1, -1]), _create_frozen_trial(3, [5, 7, 5], [-1, -1, -1]), _create_frozen_trial(4, [0, 0, 9], [-1, -1, -1]), _create_frozen_trial(5, [0, 9, 9], [-1, -1, -1]), ] population_per_rank = sampler._fast_non_dominated_sort(trials, directions) assert [{t.number for t in population} for population in population_per_rank] == [ {0, 3, 5}, {4}, {2}, {1}, ]
def test_fast_non_dominated_sort() -> None: sampler = NSGAIISampler() # Single objective. directions = [StudyDirection.MINIMIZE] trials = [ _create_frozen_trial(0, [10]), _create_frozen_trial(1, [20]), _create_frozen_trial(2, [20]), _create_frozen_trial(3, [30]), ] population_per_rank = sampler._fast_non_dominated_sort(trials, directions) assert [{t.number for t in population} for population in population_per_rank] == [ {0}, {1, 2}, {3}, ] # Two objective. directions = [StudyDirection.MAXIMIZE, StudyDirection.MAXIMIZE] trials = [ _create_frozen_trial(0, [10, 30]), _create_frozen_trial(1, [10, 10]), _create_frozen_trial(2, [20, 20]), _create_frozen_trial(3, [30, 10]), _create_frozen_trial(4, [15, 15]), ] population_per_rank = sampler._fast_non_dominated_sort(trials, directions) assert [{t.number for t in population} for population in population_per_rank] == [ {0, 2, 3}, {4}, {1}, ] # Three objective. directions = [ StudyDirection.MAXIMIZE, StudyDirection.MAXIMIZE, StudyDirection.MINIMIZE ] trials = [ _create_frozen_trial(0, [5, 5, 4]), _create_frozen_trial(1, [5, 5, 5]), _create_frozen_trial(2, [9, 9, 0]), _create_frozen_trial(3, [5, 7, 5]), _create_frozen_trial(4, [0, 0, 9]), _create_frozen_trial(5, [0, 9, 9]), ] population_per_rank = sampler._fast_non_dominated_sort(trials, directions) assert [{t.number for t in population} for population in population_per_rank] == [ {2}, {0, 3, 5}, {1}, {4}, ]
def test_fast_non_dominated_sort_empty(n_dims: int) -> None: for directions in itertools.product( [StudyDirection.MINIMIZE, StudyDirection.MAXIMIZE], repeat=n_dims): trials: List[FrozenTrial] = [] sampler = NSGAIISampler() population_per_rank = sampler._fast_non_dominated_sort( trials, list(directions)) assert population_per_rank == []
def test_fast_non_dominated_sort_missing_constraint_values() -> None: with warnings.catch_warnings(): warnings.simplefilter("ignore", optuna.exceptions.ExperimentalWarning) sampler = NSGAIISampler(constraints_func=lambda _: [0]) # Single objective. directions = [StudyDirection.MINIMIZE] trials = [ _create_frozen_trial(0, [10]), _create_frozen_trial(1, [20]), _create_frozen_trial(2, [20], [0]), _create_frozen_trial(3, [20], [1]), _create_frozen_trial(4, [30], [-1]), ] with pytest.warns(UserWarning): population_per_rank = sampler._fast_non_dominated_sort( trials, directions) assert [{t.number for t in population} for population in population_per_rank] == [ {2}, {4}, {3}, {0}, {1}, ] # Two objectives. directions = [StudyDirection.MAXIMIZE, StudyDirection.MAXIMIZE] trials = [ _create_frozen_trial(0, [50, 30]), _create_frozen_trial(1, [30, 50]), _create_frozen_trial(2, [20, 20], [3, 3]), _create_frozen_trial(3, [30, 10], [0, -1]), _create_frozen_trial(4, [15, 15], [4, 4]), ] with pytest.warns(UserWarning): population_per_rank = sampler._fast_non_dominated_sort( trials, directions) assert [{t.number for t in population} for population in population_per_rank] == [ {3}, {2}, {4}, {0, 1}, ]
def test_fast_non_dominated_sort_no_constraints( direction1: StudyDirection, direction2: StudyDirection) -> None: sampler = NSGAIISampler() directions = [direction1, direction2] value_list = [10, 20, 20, 30, float("inf"), float("inf"), -float("inf")] values = [[v1, v2] for v1 in value_list for v2 in value_list] trials = [_create_frozen_trial(i, v) for i, v in enumerate(values)] population_per_rank = sampler._fast_non_dominated_sort( copy.copy(trials), directions) _assert_population_per_rank(trials, directions, population_per_rank)
def test_fast_non_dominated_sort_missing_constraint_values( values_and_constraints: List[Tuple[List[float], List[float]]]) -> None: with warnings.catch_warnings(): warnings.simplefilter("ignore", optuna.exceptions.ExperimentalWarning) sampler = NSGAIISampler(constraints_func=lambda _: [0]) values_dim = len(values_and_constraints[0][0]) for directions in itertools.product( [StudyDirection.MINIMIZE, StudyDirection.MAXIMIZE], repeat=values_dim): trials = [ _create_frozen_trial(i, v, c) for i, (v, c) in enumerate(values_and_constraints) ] with pytest.warns(UserWarning): population_per_rank = sampler._fast_non_dominated_sort( copy.copy(trials), list(directions)) _assert_population_per_rank(trials, list(directions), population_per_rank)
def test_fast_non_dominated_sort_with_constraints() -> None: with warnings.catch_warnings(): warnings.simplefilter("ignore", optuna.exceptions.ExperimentalWarning) sampler = NSGAIISampler(constraints_func=lambda _: [0]) value_list = [10, 20, 20, 30, float("inf"), float("inf"), -float("inf")] values = [[v1, v2] for v1 in value_list for v2 in value_list] constraint_list = [-float("inf"), -2, 0, 1, 2, 3, float("inf")] constraints = [[c1, c2] for c1 in constraint_list for c2 in constraint_list] trials = [ _create_frozen_trial(i, v, c) for i, (v, c) in enumerate(itertools.product(values, constraints)) ] directions = [StudyDirection.MINIMIZE, StudyDirection.MAXIMIZE] population_per_rank = sampler._fast_non_dominated_sort( copy.copy(trials), directions) _assert_population_per_rank(trials, directions, population_per_rank)