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