Coverage for backend/idaes_service/solver/diagnostics/infeasibilities.py: 96%

18 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2026-02-11 21:43 +0000

1from ..properties_manager import PropertiesManager 

2from typing import Iterator, TextIO 

3import sys 

4import pyomo.environ as pyo 

5from pyomo.core.base.constraint import ScalarConstraint 

6 

7def compute_infeasibilities(properties_map: PropertiesManager) -> Iterator[tuple[any,float]]: 

8 """ 

9 Compute how far each constrained property is from its target value. 

10  

11 :param properties_map: PropertiesManager instance containing property components 

12 :type properties_map: PropertiesManager 

13 :return: A tuple list of property IDs and their infeasibility magnitudes 

14 :rtype: list[tuple[Any, float]] 

15 """ 

16 

17 for id, property_component in properties_map.items(): 

18 if property_component.corresponding_constraint is not None and type(next(iter(property_component.corresponding_constraint))) is ScalarConstraint: 18 ↛ 17line 18 didn't jump to line 17 because the condition on line 18 was always true

19 # Assuming the component is a Pyomo Var or Expression 

20 current_value :float = pyo.value(next(iter(property_component.corresponding_constraint))) 

21 target_value :float = pyo.value(next(iter(property_component.corresponding_constraint)).upper) 

22 infeasibility = abs(current_value - target_value) 

23 yield (id, infeasibility) 

24 

25def print_infeasibilities(properties_map: PropertiesManager): 

26 """ 

27 Print the infeasibilities of constrained properties, sorted by magnitude. 

28  

29 :param properties_map: PropertiesManager instance containing property components 

30 :type properties_map: PropertiesManager 

31 """ 

32 

33 

34 # Sort from most to least infeasible 

35 infeasibilities = list(compute_infeasibilities(properties_map)) 

36 infeasibilities.sort(key=lambda x: x[1], reverse=True) 

37 

38 print("Property Infeasibilities:") 

39 for id, infeasibility in infeasibilities: 

40 print(f"Property: {properties_map.get(id).name}, Infeasibility: {infeasibility}")