from __future__ import annotations from dataclasses import dataclass, field from pathlib import Path CORE_FEATURE_NAMES: tuple[str, ...] = ( "frequency_hz", "frequency_squared", "x_rms", "theoretical_accel", ) @dataclass class DataConfig: project_root: Path = field(default_factory=lambda: Path(__file__).resolve().parents[1]) data_dir: str = "downloads/Non_TMD" harmonic_pattern: str = "harmonic*.csv" code_column: str = "code" time_column: str = "time" base_sensor_code: str = "WSMS00012" base_axis: str = "value1" response_sensor_code: str = "WSMS00007" response_axis: str = "value3" middle_segment_start_ratio: float = 0.20 middle_segment_end_ratio: float = 0.80 min_segment_length: int = 512 steady_window_ratio: float = 0.25 steady_window_stride_ratio: float = 0.05 stability_subwindow_count: int = 4 interpolation_method: str = "linear" normalization_eps: float = 1e-6 harmonic_amplitude_m: float = 0.005 data_root: Path = field(init=False) def __post_init__(self) -> None: self.project_root = Path(self.project_root).resolve() self.data_root = (self.project_root / self.data_dir).resolve() @dataclass class ModelConfig: model_name: str = "knn_distance" n_neighbors: int = 4 distance_power: int = 2 @dataclass class TrainConfig: checkpoint_dir: str = "checkpoints_final" model_name: str = "task1_final_model.pkl" fit_csv_name: str = "task1_final_fit_all.csv" fit_figure_name: str = "task1_final_fit_curve.png" dense_curve_csv_name: str = "task1_final_dense_curve.csv" evaluation_dense_csv_name: str = "evaluation_dense_curve.csv" dense_curve_points: int = 400 @dataclass class ExperimentConfig: data: DataConfig = field(default_factory=DataConfig) model: ModelConfig = field(default_factory=ModelConfig) train: TrainConfig = field(default_factory=TrainConfig) def make_experiment_config() -> ExperimentConfig: return ExperimentConfig() def checkpoint_dir(config: ExperimentConfig) -> Path: path = config.data.project_root / config.train.checkpoint_dir / "task1_final" path.mkdir(parents=True, exist_ok=True) return path def evaluation_dir(config: ExperimentConfig) -> Path: path = config.data.project_root / "evaluation_outputs" / "task1_final" path.mkdir(parents=True, exist_ok=True) return path