Coverage for gpkit/constraints/loose.py: 91%

22 statements  

« prev     ^ index     » next       coverage.py v7.4.0, created at 2024-01-07 22:56 -0500

1"Implements Loose" 

2from .set import ConstraintSet 

3from ..small_scripts import appendsolwarning, initsolwarning 

4 

5 

6class Loose(ConstraintSet): 

7 "ConstraintSet whose inequalities must result in an equality." 

8 senstol = 1e-5 

9 raiseerror = False 

10 

11 def __init__(self, constraints, *, senstol=None): 

12 super().__init__(constraints) 

13 self.senstol = senstol or self.senstol 

14 

15 def process_result(self, result): 

16 "Checks that all constraints are satisfied with equality" 

17 super().process_result(result) 

18 initsolwarning(result, "Unexpectedly Tight Constraints") 

19 if "sensitivities" not in result: 

20 appendsolwarning("Could not evaluate due to choice variables.", 

21 (), result, "Unexpectedly Tight Constraints") 

22 return 

23 for constraint in self.flat(): 

24 c_senss = result["sensitivities"]["constraints"].get(constraint, 0) 

25 if c_senss >= self.senstol: 

26 # pylint: disable=consider-using-f-string 

27 cstr = ("Constraint [ %.100s... %s %.100s... )" 

28 % (constraint.left, constraint.oper, constraint.right)) 

29 msg = ("%s is not loose: it has a sensitivity of %+.4g." 

30 " (Allowable sensitivity: %.4g)" % 

31 (cstr, c_senss, self.senstol)) 

32 appendsolwarning(msg, (c_senss, constraint), result, 

33 "Unexpectedly Tight Constraints") 

34 if self.raiseerror: 

35 raise RuntimeWarning(msg)