./utils/config.py

./utils/config.py#

from dataclasses import dataclass
import yaml

@dataclass
class EnvConfig:
    base: float = 5.0
    amplitude: float = 2.0
    period_s: float = 7200.0
    door_drop_C: float = 5.0
    door_start_s: float = 1200.0
    door_duration_s: float = 120.0

@dataclass
class SensorConfig:
    sigma: float = 0.2
    bias: float = 0.3
    dropout_prob: float = 0.02

@dataclass
class ControllerConfig:
    type: str = 'predictive_onoff'  # 'onoff' or 'predictive_onoff'
    setpoint: float = 21.0
    deadband: float = 1.0
    tau: float = 30.0
    safety_high: float = 26.0

@dataclass
class ModelConfig:
    R: float = 0.5
    C: float = 10000.0
    P: float = 200.0
    process_sigma: float = 0.0

@dataclass
class SimConfig:
    dt: float = 1.0
    duration_s: float = 3600.0
    seed: int = 42
    init_T: float = 18.0

@dataclass
class Config:
    env: EnvConfig
    sensor: SensorConfig
    controller: ControllerConfig
    model: ModelConfig
    sim: SimConfig

def load_config(path: str) -> Config:
    with open(path, "r") as f:
        raw = yaml.safe_load(f)
    env = EnvConfig(**raw.get("env", {}))
    sensor = SensorConfig(**raw.get("sensor", {}))
    controller = ControllerConfig(**raw.get("controller", {}))
    model = ModelConfig(**raw.get("model", {}))
    sim = SimConfig(**raw.get("sim", {}))
    return Config(env=env, sensor=sensor, controller=controller, model=model, sim=sim)