| from __future__ import annotations |
|
|
| import os |
| import time |
| import random |
| import re |
| from dataclasses import dataclass |
| from typing import Any, Dict, Iterable, Optional |
|
|
| import numpy as np |
|
|
|
|
| def now_ts() -> float: |
| return time.time() |
|
|
|
|
| def seed_everything(seed: int) -> None: |
| random.seed(seed) |
| np.random.seed(seed) |
| os.environ["PYTHONHASHSEED"] = str(seed) |
|
|
|
|
| def ensure_dir(path: str) -> None: |
| os.makedirs(path, exist_ok=True) |
|
|
|
|
| def clamp(x: float, lo: float, hi: float) -> float: |
| return max(lo, min(hi, x)) |
|
|
|
|
| def stable_hash(s: str) -> str: |
| |
| import hashlib |
| return hashlib.sha1(s.encode("utf-8")).hexdigest()[:10] |
|
|
|
|
| def sanitize_variant_prefix(name: str, max_len: int = 24) -> str: |
| safe = re.sub(r"[^A-Za-z0-9_]+", "_", name).strip("_") |
| if not safe: |
| safe = "run" |
| if max_len > 0 and len(safe) > max_len: |
| safe = safe[:max_len] |
| return safe |
|
|
|
|
| @dataclass(frozen=True) |
| class TrialKey: |
| exp_name: str |
| platform: str |
| design: str |
| variant: str |
| fidelity: str |
|
|