from __future__ import annotations import json import random from pathlib import Path import numpy as np import torch import yaml def load_config(path: str | Path) -> dict: with Path(path).open("r", encoding="utf-8") as handle: return yaml.safe_load(handle) def seed_everything(seed: int) -> None: random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) def choose_device(requested: str = "auto") -> torch.device: if requested != "auto": return torch.device(requested) if torch.cuda.is_available(): return torch.device("cuda") if torch.backends.mps.is_available(): return torch.device("mps") return torch.device("cpu") def write_json(path: str | Path, value: object) -> None: target = Path(path) target.parent.mkdir(parents=True, exist_ok=True) target.write_text(json.dumps(value, indent=2, ensure_ascii=False), encoding="utf-8")