| | 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 |
| |
|