Esempio n. 1
0
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},
             ]
Esempio n. 2
0
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},
             ]
Esempio n. 3
0
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 == []
Esempio n. 4
0
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},
             ]
Esempio n. 5
0
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)
Esempio n. 6
0
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)
Esempio n. 7
0
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)