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