原生结果series通过字节索引直传,C端使用Ryu精确回读编码和64 KiB批量写出;网页采用Float64缓存和CSV工作线程,减少结果处理与保存等待。 补充八路AME曲线核查、全流程分阶段计时、独立编码基准和复现工具,固定后续优化采用修正八路及rtol=1e-8。C写出1.1808→0.1638 s,点击到可查看8.0100→6.9756 s。 验证:最终10项编码专项、29项相关后端回归通过;8份原生结果逐位一致,16次网页结果/CSV/刷新恢复通过。前端构建及缓存/CSV专项在本轮结果处理工作中通过。环境、原始大结果与临时构建不纳入Git。
57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
"""Backend-neutral simulation result and preparation error contracts."""
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from typing import TYPE_CHECKING, Literal
|
|
|
|
if TYPE_CHECKING:
|
|
from app.simulation.native_codegen.transport import NativeSeriesJson
|
|
from app.simulation.core.metadata import ResultVariableMetadata
|
|
|
|
SimulationRunStatus = Literal["completed", "cancelled", "failed"]
|
|
|
|
@dataclass(frozen=True)
|
|
class SimulationPreparationIssue:
|
|
code: str
|
|
message: str
|
|
|
|
def as_dict(self) -> dict[str, str]:
|
|
return {"code": self.code, "message": self.message}
|
|
|
|
|
|
class SimulationPreparationError(ValueError):
|
|
def __init__(self, issues: tuple[SimulationPreparationIssue, ...]) -> None:
|
|
super().__init__("The compiled model is not ready for simulation.")
|
|
self.issues = issues
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class GenericSimulationResult:
|
|
success: bool
|
|
status: SimulationRunStatus
|
|
message: str
|
|
simulated_until: float
|
|
requested_stop_time: float
|
|
variables: tuple[ResultVariableMetadata, ...]
|
|
series: dict[str, list[float]] | NativeSeriesJson
|
|
final: dict[str, float]
|
|
diagnostics: dict[str, object]
|
|
|
|
def as_dict(self, *, raw_series: bool = False) -> dict[str, object]:
|
|
from app.simulation.native_codegen.transport import NativeSeriesJson
|
|
series = self.series
|
|
if isinstance(series, NativeSeriesJson) and not raw_series:
|
|
series = series.materialize()
|
|
return {
|
|
"success": self.success,
|
|
"status": self.status,
|
|
"partial": self.status != "completed",
|
|
"message": self.message,
|
|
"simulatedUntil": self.simulated_until,
|
|
"requestedStopTime": self.requested_stop_time,
|
|
"variables": [variable.as_dict() for variable in self.variables],
|
|
"series": series,
|
|
"final": self.final,
|
|
"diagnostics": self.diagnostics,
|
|
}
|