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

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 

9 

10_log = idaeslog.getLogger(__name__) 

11 

12 

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 

20 

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()) 

25 

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 

33 

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) 

43 

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 )