from __future__ import annotations from dataclasses import dataclass, field from datetime import UTC, datetime from pathlib import Path from PythonModels.systems.test_mql import TestMqlRunConfig, TestMqlSystem @dataclass(frozen=True) class TestMqlPathConfig: output_dir: Path | None = None @dataclass(frozen=True) class TestMqlExecutionConfig: write_summary: bool = True @dataclass(frozen=True) class TestMqlScriptConfig: run: TestMqlRunConfig = field(default_factory=TestMqlRunConfig) paths: TestMqlPathConfig = field(default_factory=TestMqlPathConfig) execution: TestMqlExecutionConfig = field(default_factory=TestMqlExecutionConfig) def _default_output_dir() -> Path: pythonmodels_root = Path(__file__).resolve().parents[1] timestamp = datetime.now(UTC).strftime("test_mql_%Y%m%d_%H%M%S_%f") return pythonmodels_root / "runs" / timestamp def format_test_mql_summary(system: TestMqlSystem) -> str: snapshot = system.snapshot() lines = [ "Model: test_mql", f"Source archive: {system.archive_path}", f"Components: {snapshot.component_count}", f"Connections: {snapshot.connection_count}", f"Continuous states in AMESim modelinfo: {snapshot.continuous_state_count}", f"Discrete states in AMESim modelinfo: {snapshot.discrete_state_count}", "Global parameters:", ] for name, value in sorted(snapshot.global_parameters.items()): lines.append(f" - {name}: {value}") lines.append("Component submodels:") for name, count in sorted(snapshot.submodel_counts.items()): lines.append(f" - {name}: {count}") return "\n".join(lines) + "\n" def run_test_mql(config: TestMqlScriptConfig | None = None): config = config or TestMqlScriptConfig() system = TestMqlSystem() result = system.simulate(config.run) 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_model_summary.txt").write_text( format_test_mql_summary(system), encoding="utf-8", ) return system, result, output_dir def main() -> None: system, result, output_dir = run_test_mql() print(format_test_mql_summary(system), end="") print(f"Samples: {len(result.t)}") print(f"Output directory: {output_dir}") if __name__ == "__main__": main()