| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- from __future__ import annotations
- import numpy as np
- def generate_fidelity_list_avg_gap(path_num: int):
- assert path_num >= 1
- fidelity_max = 1.0
- fidelity_min = 0.9
- if path_num == 1:
- return [fidelity_max]
- gap = (fidelity_max - fidelity_min) / (path_num - 1)
- return [fidelity_max - i * gap for i in range(path_num)]
- def generate_fidelity_list_fix_gap(path_num: int, gap: float, fidelity_max: float = 1.0):
- assert path_num >= 1
- return [float(fidelity_max) - i * gap for i in range(path_num)]
- def generate_fidelity_list_random(path_num: int, alpha: float = 0.90, beta: float = 0.85, variance: float = 0.1):
- """(非決定版) Generate `path_num` links with a guaranteed top-1 gap."""
- assert path_num >= 2
- while True:
- mean = [alpha] + [beta] * (path_num - 1)
- result = []
- for mu in mean:
- # [0.8, 1.0] の範囲に入るまでサンプリング
- while True:
- r = np.random.normal(mu, variance)
- if 0.8 <= r <= 1.0:
- break
- result.append(float(r))
- sorted_res = sorted(result, reverse=True)
- if sorted_res[0] - sorted_res[1] > 0.02:
- return result
- # 再現性のため:rng を使ったバージョン(← 正式名はアンダースコア付き)
- def _generate_fidelity_list_random_rng(rng: np.random.Generator, path_num: int,
- alpha: float = 0.95, beta: float = 0.85, variance: float = 0.1):
- assert path_num >= 2
- while True:
- mean = [alpha] + [beta] * (path_num - 1)
- res = []
- for mu in mean:
- # [0.8, 1.0] の範囲に入るまでサンプリング
- while True:
- r = rng.normal(mu, variance)
- if 0.8 <= r <= 1.0:
- break
- res.append(float(r))
- sorted_res = sorted(res, reverse=True)
- if sorted_res[0] - sorted_res[1] > 0.02:
- return res
- __all__ = [
- "generate_fidelity_list_avg_gap",
- "generate_fidelity_list_fix_gap",
- "generate_fidelity_list_random",
- "_generate_fidelity_list_random_rng", # ← 公開はアンダースコア版のみ
- ]
|