simulation_result.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. """Simulation result model."""
  2. import json
  3. from datetime import datetime
  4. from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, Float
  5. from ..database import Base
  6. class SimulationResult(Base):
  7. """A single simulation result row (from scan_results.csv)."""
  8. __tablename__ = "simulation_results"
  9. id = Column(Integer, primary_key=True, index=True)
  10. plan_id = Column(Integer, ForeignKey("simulation_plans.id"), nullable=False, index=True)
  11. run_index = Column(Integer, default=0)
  12. status = Column(String(20), default="OK") # OK / FAILED / UNCERTAIN
  13. solve_time_s = Column(Float, default=0.0)
  14. params_json = Column(Text, default="{}") # JSON: parameter values
  15. metrics_json = Column(Text, default="{}") # JSON: metric values
  16. error_message = Column(Text, default="")
  17. created_at = Column(DateTime, default=datetime.utcnow)
  18. def get_params(self) -> dict:
  19. try:
  20. return json.loads(self.params_json) if self.params_json else {}
  21. except (json.JSONDecodeError, TypeError):
  22. return {}
  23. def set_params(self, data: dict) -> None:
  24. self.params_json = json.dumps(data, ensure_ascii=False)
  25. def get_metrics(self) -> dict:
  26. try:
  27. return json.loads(self.metrics_json) if self.metrics_json else {}
  28. except (json.JSONDecodeError, TypeError):
  29. return {}
  30. def set_metrics(self, data: dict) -> None:
  31. self.metrics_json = json.dumps(data, ensure_ascii=False)