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

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 

8 

9 

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 

17 

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

22 

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 

31 

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) 

41 

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 )