Coverage for backend/ahuora-builder/src/ahuora_builder/solver.py: 94%
34 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-03-26 20:57 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-03-26 20:57 +0000
1import traceback
2from typing import Optional
3from pydantic import BaseModel
4from ahuora_builder_types import FlowsheetSchema
5from ahuora_builder_types.flowsheet_schema import SolvedFlowsheetSchema
6from ahuora_builder_types.payloads.solve_request_schema import IdaesSolveRequestPayload
7from .flowsheet_manager import FlowsheetManager
10class SolveModelResult(BaseModel):
11 input_flowsheet: FlowsheetSchema
12 output_flowsheet: SolvedFlowsheetSchema
13 solve_index: Optional[int] = None
14 scenario_id: Optional[int] = None
15 task_id: int
16 timing: dict
18def solve_model(solve_request: IdaesSolveRequestPayload) -> SolveModelResult:
19 """Solves the model and returns the results"""
20 flowsheet = FlowsheetManager(solve_request.flowsheet)
21 #print(solve_request.flowsheet.model_dump_json())
23 def run_phase(name: str, fn):
24 try:
25 return fn()
26 except Exception as e:
27 details = f"[solve_model:{name}] {type(e).__name__}: {e}"
28 print(details)
29 print(traceback.format_exc())
30 raise RuntimeError(details) from e
32 run_phase("load", flowsheet.load)
33 run_phase("initialise", flowsheet.initialise)
34 run_phase("report_statistics", flowsheet.report_statistics)
35 if solve_request.perform_diagnostics: 35 ↛ 36line 35 didn't jump to line 36 because the condition on line 35 was never true
36 run_phase("diagnose_problems", flowsheet.diagnose_problems)
37 run_phase("check_model_valid", flowsheet.check_model_valid)
38 run_phase("solve", flowsheet.solve)
39 run_phase("optimize", flowsheet.optimize)
40 result = run_phase("serialise", flowsheet.serialise)
42 return SolveModelResult(
43 input_flowsheet=solve_request.flowsheet,
44 output_flowsheet=result,
45 solve_index=solve_request.solve_index,
46 scenario_id=solve_request.scenario_id,
47 task_id=solve_request.task_id,
48 timing=flowsheet.timing.close()
49 )