fidelity.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from __future__ import annotations
  2. import numpy as np
  3. def generate_fidelity_list_avg_gap(path_num: int):
  4. assert path_num >= 1
  5. fidelity_max = 1.0
  6. fidelity_min = 0.9
  7. if path_num == 1:
  8. return [fidelity_max]
  9. gap = (fidelity_max - fidelity_min) / (path_num - 1)
  10. return [fidelity_max - i * gap for i in range(path_num)]
  11. def generate_fidelity_list_fix_gap(path_num: int, gap: float, fidelity_max: float = 1.0):
  12. assert path_num >= 1
  13. return [float(fidelity_max) - i * gap for i in range(path_num)]
  14. def generate_fidelity_list_random(path_num: int, alpha: float = 0.90, beta: float = 0.85, variance: float = 0.1):
  15. """(非決定版) Generate `path_num` links with a guaranteed top-1 gap."""
  16. assert path_num >= 2
  17. while True:
  18. mean = [alpha] + [beta] * (path_num - 1)
  19. result = []
  20. for mu in mean:
  21. # [0.8, 1.0] の範囲に入るまでサンプリング
  22. while True:
  23. r = np.random.normal(mu, variance)
  24. if 0.8 <= r <= 1.0:
  25. break
  26. result.append(float(r))
  27. sorted_res = sorted(result, reverse=True)
  28. if sorted_res[0] - sorted_res[1] > 0.02:
  29. return result
  30. # 再現性のため:rng を使ったバージョン(← 正式名はアンダースコア付き)
  31. def _generate_fidelity_list_random_rng(rng: np.random.Generator, path_num: int,
  32. alpha: float = 0.95, beta: float = 0.85, variance: float = 0.1):
  33. assert path_num >= 2
  34. while True:
  35. mean = [alpha] + [beta] * (path_num - 1)
  36. res = []
  37. for mu in mean:
  38. # [0.8, 1.0] の範囲に入るまでサンプリング
  39. while True:
  40. r = rng.normal(mu, variance)
  41. if 0.8 <= r <= 1.0:
  42. break
  43. res.append(float(r))
  44. sorted_res = sorted(res, reverse=True)
  45. if sorted_res[0] - sorted_res[1] > 0.02:
  46. return res
  47. __all__ = [
  48. "generate_fidelity_list_avg_gap",
  49. "generate_fidelity_list_fix_gap",
  50. "generate_fidelity_list_random",
  51. "_generate_fidelity_list_random_rng", # ← 公開はアンダースコア版のみ
  52. ]