Coverage for gpkit/constraints/loose.py: 91%
22 statements
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-07 22:15 -0500
« prev ^ index » next coverage.py v7.4.0, created at 2024-01-07 22:15 -0500
1"Implements Loose"
2from .set import ConstraintSet
3from ..small_scripts import appendsolwarning, initsolwarning
6class Loose(ConstraintSet):
7 "ConstraintSet whose inequalities must result in an equality."
8 senstol = 1e-5
9 raiseerror = False
11 def __init__(self, constraints, *, senstol=None):
12 super().__init__(constraints)
13 self.senstol = senstol or self.senstol
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)