Source code for pyetsimul.simulation.config

"""Generic configuration system for parameter variation experiments."""

from dataclasses import dataclass, field
from pathlib import Path

from ..core import Camera, Eye, Light
from ..types import Position3D


[docs] @dataclass class ExperimentConfig: """Generic configuration for any parameter variation experiment.""" # Required experiment metadata experiment_name: str # Required hardware setup eyes: list[Eye] cameras: list[Camera] lights: list[Light] # Optional configuration gaze_target: Position3D | None = None output_dir: Path = field(default_factory=lambda: Path("outputs")) def __post_init__(self) -> None: """Validate configuration.""" if not self.experiment_name: raise ValueError("experiment_name cannot be empty") if not self.eyes: raise ValueError("Must specify at least one eye") if not self.cameras: raise ValueError("Must specify at least one camera") if not self.lights: raise ValueError("Must specify at least one light")
[docs] def get_gaze_target(self) -> Position3D | None: """Get the gaze target if specified.""" return self.gaze_target
# Helper factory functions for common setups
[docs] def create_experiment_config( experiment_name: str, eyes: list[Eye], cameras: list[Camera], lights: list[Light], gaze_target: Position3D | None = None, output_dir: str | Path = "outputs", ) -> ExperimentConfig: """Create experiment configuration with validation.""" return ExperimentConfig( experiment_name=experiment_name, eyes=eyes, cameras=cameras, lights=lights, gaze_target=gaze_target, output_dir=Path(output_dir), )
[docs] def validate_config(config: ExperimentConfig) -> None: """Validate experiment configuration.""" # Validation is automatic via __post_init__, just ensure config exists if not config: raise ValueError("Config cannot be None")