| from __future__ import annotations |
|
|
| import os |
| import json |
| import sqlite3 |
| from typing import Any, Dict |
|
|
| import pandas as pd |
| import matplotlib.pyplot as plt |
|
|
| from edgeeda.utils import ensure_dir |
|
|
|
|
| def export_trials(db_path: str) -> pd.DataFrame: |
| con = sqlite3.connect(db_path) |
| df = pd.read_sql_query("SELECT * FROM trials", con) |
| con.close() |
| return df |
|
|
|
|
| def make_plots(df: pd.DataFrame, out_dir: str) -> None: |
| ensure_dir(out_dir) |
|
|
| |
| df2 = df.copy() |
| df2["reward"] = pd.to_numeric(df2["reward"], errors="coerce") |
| df2 = df2.dropna(subset=["reward"]).sort_values("id") |
| if not df2.empty: |
| best = df2["reward"].cummax() |
| plt.figure() |
| plt.plot(df2["id"].values, best.values) |
| plt.xlabel("trial id") |
| plt.ylabel("best reward so far") |
| plt.tight_layout() |
| plt.savefig(os.path.join(out_dir, "learning_curve.png"), dpi=200) |
| plt.close() |
|
|
| |
| areas, wnss = [], [] |
| for _, r in df.iterrows(): |
| mj = r.get("metrics_json") |
| if not isinstance(mj, str) or not mj: |
| continue |
| try: |
| m = json.loads(mj) |
| except Exception: |
| continue |
| |
| a = m.get("design__die__area") or m.get("finish__design__die__area") |
| w = m.get("timing__setup__wns") or m.get("finish__timing__setup__wns") |
| if a is None or w is None: |
| continue |
| try: |
| areas.append(float(a)); wnss.append(float(w)) |
| except Exception: |
| pass |
|
|
| if areas: |
| plt.figure() |
| plt.scatter(areas, wnss) |
| plt.xlabel("die area") |
| plt.ylabel("WNS") |
| plt.tight_layout() |
| plt.savefig(os.path.join(out_dir, "area_vs_wns.png"), dpi=200) |
| plt.close() |
|
|