81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from datetime import UTC, datetime
|
|
from pathlib import Path
|
|
|
|
from app.simulation.examples.test_mql.baseline import (
|
|
TestMqlBaselineRun,
|
|
run_test_mql_baseline_passthrough,
|
|
)
|
|
from app.simulation.paths import (
|
|
AMESIM_TEST_MQL_ARCHIVE_PATH,
|
|
SIMULATION_RUNS_DIR,
|
|
)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TestMqlBaselinePathConfig:
|
|
archive_path: Path = field(
|
|
default_factory=lambda: AMESIM_TEST_MQL_ARCHIVE_PATH
|
|
)
|
|
output_dir: Path | None = None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TestMqlBaselineExecutionConfig:
|
|
write_summary: bool = True
|
|
data_paths: tuple[str, ...] | None = None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TestMqlBaselineScriptConfig:
|
|
paths: TestMqlBaselinePathConfig = field(default_factory=TestMqlBaselinePathConfig)
|
|
execution: TestMqlBaselineExecutionConfig = field(default_factory=TestMqlBaselineExecutionConfig)
|
|
|
|
|
|
def _default_output_dir() -> Path:
|
|
timestamp = datetime.now(UTC).strftime("test_mql_baseline_%Y%m%d_%H%M%S_%f")
|
|
return SIMULATION_RUNS_DIR / timestamp
|
|
|
|
|
|
def format_test_mql_baseline_summary(run: TestMqlBaselineRun) -> str:
|
|
return "\n".join(
|
|
[
|
|
"Model: test_mql",
|
|
"Mode: AMESim baseline passthrough",
|
|
f"Samples: {run.sample_count}",
|
|
f"Output schema signals: {run.output_schema.signal_count}",
|
|
f"Compared signals: {run.signal_count}",
|
|
f"Observation bindings: {run.observation_catalog.binding_count}",
|
|
f"Max absolute error: {run.comparison.max_abs_error}",
|
|
f"Max relative error: {run.comparison.max_rel_error}",
|
|
]
|
|
) + "\n"
|
|
|
|
|
|
def run_test_mql_baseline(config: TestMqlBaselineScriptConfig | None = None):
|
|
config = config or TestMqlBaselineScriptConfig()
|
|
run = run_test_mql_baseline_passthrough(
|
|
config.paths.archive_path,
|
|
data_paths=config.execution.data_paths,
|
|
)
|
|
output_dir = config.paths.output_dir or _default_output_dir()
|
|
if config.execution.write_summary:
|
|
output_dir.mkdir(parents=True, exist_ok=True)
|
|
(output_dir / "test_mql_baseline_summary.txt").write_text(
|
|
format_test_mql_baseline_summary(run),
|
|
encoding="utf-8",
|
|
)
|
|
return run, output_dir
|
|
|
|
|
|
def main() -> None:
|
|
run, output_dir = run_test_mql_baseline()
|
|
print(format_test_mql_baseline_summary(run), end="")
|
|
print(f"Output directory: {output_dir}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|