| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- main.py — evaluation.py の各種プロットを一括実行
- Unweighted:
- 1) plot_accuracy_vs_budget
- 2) plot_value_vs_used
- 3) plot_value_vs_budget_target
- 4) plot_widthsum_alllinks_vs_budget
- 5) plot_minwidthsum_perpair_vs_budget
- Weighted(重要度 I_d を幅に掛ける版):
- 6) plot_widthsum_alllinks_weighted_vs_budget
- 7) plot_minwidthsum_perpair_weighted_vs_budget
- 出力:
- - 生データ pickle -> ./outputs/
- - 図 PDF -> カレントディレクトリ
- """
- from multiprocessing.pool import Pool
- import os
- import random
- # 任意:あなたの環境のユーティリティ。無ければフォールバック。
- try:
- from utils import set_random_seed
- except Exception:
- def set_random_seed(seed: int = 12):
- random.seed(seed)
- try:
- import numpy as np
- np.random.seed(seed)
- except Exception:
- pass
- # evaluation 側のプロット関数
- from evaluation import (
- # Accuracy / Value 系
- plot_accuracy_vs_budget,
- plot_value_vs_used,
- plot_value_vs_budget_target,
- # 幅(UB-LB)系 - Unweighted
- plot_widthsum_alllinks_vs_budget,
- plot_minwidthsum_perpair_vs_budget,
- # 幅(UB-LB)系 - Weighted (× I_d)
- plot_widthsum_alllinks_weighted_vs_budget,
- plot_minwidthsum_perpair_weighted_vs_budget,
- )
- def main():
- # ===== 実験パラメータ =====
- set_random_seed(12)
- num_workers = max(1, (os.cpu_count() or 4) // 2)
- noise_model_list = ["Depolar"] # 例: ["Depolar", "Dephase"]
- scheduler_names = ["LNaive", "Greedy"] # 実装済みスケジューラ名に合わせて
- node_path_list = [5, 5, 5] # ペアごとのリンク本数
- importance_list = [0.3, 0.6, 0.9] # value系&weighted幅系で使用
- budget_list = [3000, 6000, 9000, 12000, 15000, 18000]
- bounces = (1, 2, 3, 4) # 測定深さ候補(あなたの定義に従う)
- repeat = 10 # 反復回数(精度と時間のトレードオフ)
- delta = 0.1 # 幅用の信頼度パラメータ(Hoeffding)
- print("=== Config ===")
- print(f"workers={num_workers}, noise_models={noise_model_list}")
- print(f"schedulers={scheduler_names}")
- print(f"node_path_list={node_path_list}, importance_list={importance_list}")
- print(f"budgets={budget_list}, bounces={bounces}, repeat={repeat}, delta={delta}")
- print("================\n")
- # ===== 実行キュー =====
- p = Pool(processes=num_workers)
- jobs = []
- for noise_model in noise_model_list:
- # --- Accuracy ---
- jobs.append(p.apply_async(
- plot_accuracy_vs_budget,
- args=(budget_list, scheduler_names, noise_model,
- node_path_list, importance_list, bounces, repeat),
- kwds={"verbose": True}
- ))
- # --- Value: x=used(実コスト平均) ---
- jobs.append(p.apply_async(
- plot_value_vs_used,
- args=(budget_list, scheduler_names, noise_model,
- node_path_list, importance_list, bounces, repeat),
- kwds={"verbose": True}
- ))
- # --- Value: x=target(指定予算) ---
- jobs.append(p.apply_async(
- plot_value_vs_budget_target,
- args=(budget_list, scheduler_names, noise_model,
- node_path_list, importance_list, bounces, repeat),
- kwds={"verbose": True}
- ))
- # --- Width (UB-LB) Unweighted: 全リンク総和 ---
- jobs.append(p.apply_async(
- plot_widthsum_alllinks_vs_budget,
- args=(budget_list, scheduler_names, noise_model,
- node_path_list, importance_list, bounces, repeat),
- kwds={"delta": delta, "verbose": True}
- ))
- # --- Width (UB-LB) Unweighted: ペア最小幅の総和 ---
- jobs.append(p.apply_async(
- plot_minwidthsum_perpair_vs_budget,
- args=(budget_list, scheduler_names, noise_model,
- node_path_list, importance_list, bounces, repeat),
- kwds={"delta": delta, "verbose": True}
- ))
- # --- Width (UB-LB) Weighted: 全リンク I_d·幅 総和 ---
- jobs.append(p.apply_async(
- plot_widthsum_alllinks_weighted_vs_budget,
- args=(budget_list, scheduler_names, noise_model,
- node_path_list, importance_list, bounces, repeat),
- kwds={"delta": delta, "verbose": True}
- ))
- # --- Width (UB-LB) Weighted: ペアごとの I_d·最小幅 総和 ---
- jobs.append(p.apply_async(
- plot_minwidthsum_perpair_weighted_vs_budget,
- args=(budget_list, scheduler_names, noise_model,
- node_path_list, importance_list, bounces, repeat),
- kwds={"delta": delta, "verbose": True}
- ))
- # ===== 実行 & 同期 =====
- p.close()
- p.join()
- for j in jobs:
- j.get()
- print("\nAll jobs finished.")
- print("Pickles -> ./outputs/, PDF -> カレントディレクトリ に保存されます。")
- if __name__ == "__main__":
- main()
|