optuna
55 строк · 1.7 Кб
1import itertools
2from typing import Tuple
3
4import numpy as np
5import pytest
6
7import optuna
8
9
10def _compute_hssp_truth_and_approx(test_case: np.ndarray, subset_size: int) -> Tuple[float, float]:
11r = 1.1 * np.max(test_case, axis=0)
12truth = 0.0
13for subset in itertools.permutations(test_case, subset_size):
14truth = max(truth, optuna._hypervolume.WFG().compute(np.asarray(subset), r))
15indices = optuna._hypervolume.hssp._solve_hssp(
16test_case, np.arange(len(test_case)), subset_size, r
17)
18approx = optuna._hypervolume.WFG().compute(test_case[indices], r)
19return truth, approx
20
21
22@pytest.mark.parametrize("dim", [2, 3])
23def test_solve_hssp(dim: int) -> None:
24rng = np.random.RandomState(128)
25
26for i in range(1, 9):
27subset_size = np.random.randint(1, i + 1)
28test_case = rng.rand(8, dim)
29truth, approx = _compute_hssp_truth_and_approx(test_case, subset_size)
30assert approx / truth > 0.6321 # 1 - 1/e
31
32
33@pytest.mark.filterwarnings("ignore::RuntimeWarning")
34def test_solve_hssp_infinite_loss() -> None:
35rng = np.random.RandomState(128)
36
37subset_size = 4
38test_case = rng.rand(9, 2)
39test_case[-1].fill(float("inf"))
40truth, approx = _compute_hssp_truth_and_approx(test_case, subset_size)
41assert np.isinf(truth)
42assert np.isinf(approx)
43
44test_case = rng.rand(9, 3)
45test_case[-1].fill(float("inf"))
46truth, approx = _compute_hssp_truth_and_approx(test_case, subset_size)
47assert truth == 0
48assert np.isnan(approx)
49
50for dim in range(2, 4):
51test_case = rng.rand(9, dim)
52test_case[-1].fill(-float("inf"))
53truth, approx = _compute_hssp_truth_and_approx(test_case, subset_size)
54assert np.isinf(truth)
55assert np.isinf(approx)
56