main.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. # main.py — Run experiments: budget, random-gap, fixed-gap, and #pairs
  2. import os
  3. import random
  4. import numpy as np
  5. from evaluation import plot_accuracy_vs_budget, plot_value_vs_used, plot_value_vs_budget
  6. from evaluationgap import plot_accuracy_vs_gap, plot_accuracy_vs_gap_fixgap
  7. from evaluationpair import plot_accuracy_vs_pairs
  8. # =====================
  9. # Simple configuration
  10. # =====================
  11. # Toggle which experiments to run
  12. RUN_BUDGET = True
  13. RUN_GAP_RANDOM = False
  14. RUN_GAP_FIX = False
  15. RUN_PAIRS = False
  16. # Global seed + common settings
  17. SEED = 13
  18. NOISE_MODEL = "Depolar"
  19. BOUNCES = (1, 2, 3, 4)
  20. REPEAT = 5
  21. SCHEDULERS = ["LNaive","Groups","Greedy","WNaive"]
  22. # Importance settings
  23. # NOTE: "uniform" のときは *_IMPORTANCES は使われず、各リピートで U[a,b] から再サンプルされます
  24. IMPORTANCE_MODE = "fixed" # "fixed" or "uniform"
  25. IMPORTANCE_UNIFORM = (0.0, 1.0) # used only if IMPORTANCE_MODE == "uniform"
  26. # -----------------
  27. # 1) Budget sweep
  28. # -----------------
  29. BUDGET_LIST = [50,100,200,500,1000]
  30. BUDGET_NODE_PATHS = [5,5,5,5]
  31. BUDGET_IMPORTANCES = [0.2,0.4,0.6,0.8] # Budget専用: IMPORTANCE_MODE == "fixed" のときのみ使用
  32. # --------------
  33. # 2) Gap sweeps
  34. # --------------
  35. # (a) Random (alpha - beta = gap) version
  36. GAP_LIST_RANDOM = [0.025, 0.05, 0.075, 0.10, 0.125, 0.150]
  37. ALPHA_BASE = 0.95
  38. VARIANCE = 0.025
  39. C_GAP_TOTAL = 10000 # total budget per gap point
  40. GAP_RANDOM_NODE_PATHS = [4,4,4,4,4]
  41. GAP_RANDOM_IMPORTANCES = [0.3, 0.6, 0.9, 0.6, 0.3] # fixed時のみ使用(長さ=ペア数に合わせる)
  42. # (b) Fixed arithmetic-sequence version
  43. GAP_LIST_FIX = [0.01, 0.02,0.05,0.1]
  44. FIDELITY_MAX = 1.0 # sequence starts at this max and steps down by 'gap'
  45. GAP_FIX_NODE_PATHS = [4,4,4,4]
  46. GAP_FIX_IMPORTANCES = [0.3, 0.6, 0.9, 0.3] # fixed時のみ使用
  47. # --------------------
  48. # 3) #Pairs (N) sweep
  49. # --------------------
  50. PAIRS_LIST = [3, 4, 5, 6, 7, 8] # number of destination pairs
  51. PATHS_PER_PAIR = 8 # candidate links per pair
  52. C_PAIRS_TOTAL = 10000 # total budget per N
  53. def set_random_seed(seed: int = 12):
  54. random.seed(seed)
  55. try:
  56. np.random.seed(seed)
  57. except Exception:
  58. pass
  59. try:
  60. import netsquid as ns
  61. ns.set_random_state(seed)
  62. except Exception:
  63. pass
  64. def main():
  65. set_random_seed(SEED)
  66. os.makedirs("outputs", exist_ok=True)
  67. # (1) Budget vs Accuracy
  68. if RUN_BUDGET:
  69. plot_accuracy_vs_budget(
  70. budget_list=BUDGET_LIST,
  71. scheduler_names=SCHEDULERS,
  72. noise_model=NOISE_MODEL,
  73. node_path_list=BUDGET_NODE_PATHS,
  74. importance_list=BUDGET_IMPORTANCES,
  75. bounces=BOUNCES,
  76. repeat=REPEAT,
  77. importance_mode=IMPORTANCE_MODE,
  78. importance_uniform=IMPORTANCE_UNIFORM,
  79. seed=SEED,
  80. verbose=True,
  81. )
  82. # 価値関数プロット(必要ならコメント解除)
  83. plot_value_vs_used(
  84. budget_list=BUDGET_LIST,
  85. scheduler_names=SCHEDULERS,
  86. noise_model=NOISE_MODEL,
  87. node_path_list=BUDGET_NODE_PATHS,
  88. importance_list=BUDGET_IMPORTANCES,
  89. bounces=BOUNCES,
  90. repeat=REPEAT,
  91. importance_mode=IMPORTANCE_MODE,
  92. importance_uniform=IMPORTANCE_UNIFORM,
  93. seed=SEED,
  94. verbose=True,
  95. )
  96. plot_value_vs_budget(
  97. budget_list=BUDGET_LIST,
  98. scheduler_names=SCHEDULERS,
  99. noise_model=NOISE_MODEL,
  100. node_path_list=BUDGET_NODE_PATHS,
  101. importance_list=BUDGET_IMPORTANCES,
  102. bounces=BOUNCES,
  103. repeat=REPEAT,
  104. importance_mode=IMPORTANCE_MODE,
  105. importance_uniform=IMPORTANCE_UNIFORM,
  106. seed=SEED,
  107. verbose=True,
  108. )
  109. # (2a) Gap vs Accuracy (randomized: alpha - beta = gap)
  110. if RUN_GAP_RANDOM:
  111. plot_accuracy_vs_gap(
  112. gap_list=GAP_LIST_RANDOM,
  113. scheduler_names=SCHEDULERS,
  114. noise_model=NOISE_MODEL,
  115. node_path_list=GAP_RANDOM_NODE_PATHS,
  116. importance_list=GAP_RANDOM_IMPORTANCES,
  117. bounces=BOUNCES,
  118. repeat=REPEAT,
  119. importance_mode=IMPORTANCE_MODE,
  120. importance_uniform=IMPORTANCE_UNIFORM,
  121. seed=SEED,
  122. alpha_base=ALPHA_BASE,
  123. variance=VARIANCE,
  124. C_total_override=C_GAP_TOTAL,
  125. verbose=True,
  126. )
  127. # (2b) Gap vs Accuracy (fixed arithmetic sequence)
  128. if RUN_GAP_FIX:
  129. plot_accuracy_vs_gap_fixgap(
  130. gap_list=GAP_LIST_FIX,
  131. scheduler_names=SCHEDULERS,
  132. noise_model=NOISE_MODEL,
  133. node_path_list=GAP_FIX_NODE_PATHS,
  134. importance_list=GAP_FIX_IMPORTANCES,
  135. bounces=BOUNCES,
  136. repeat=REPEAT,
  137. importance_mode=IMPORTANCE_MODE,
  138. importance_uniform=IMPORTANCE_UNIFORM,
  139. seed=SEED, # used only if IMPORTANCE_MODE == "uniform"
  140. fidelity_max=FIDELITY_MAX, # sequence head value
  141. C_total_override=C_GAP_TOTAL,
  142. verbose=True,
  143. )
  144. # (3) #Pairs vs Accuracy
  145. if RUN_PAIRS:
  146. plot_accuracy_vs_pairs(
  147. pairs_list=PAIRS_LIST,
  148. paths_per_pair=PATHS_PER_PAIR,
  149. C_total=C_PAIRS_TOTAL,
  150. scheduler_names=SCHEDULERS,
  151. noise_model=NOISE_MODEL,
  152. bounces=BOUNCES,
  153. repeat=REPEAT,
  154. importance_mode=IMPORTANCE_MODE,
  155. importance_uniform=IMPORTANCE_UNIFORM,
  156. seed=SEED,
  157. verbose=True,
  158. )
  159. if __name__ == "__main__":
  160. main()