diff --git a/gpkit/constraints/loose.py b/gpkit/constraints/loose.py index e0621e6b..fb5840d5 100644 --- a/gpkit/constraints/loose.py +++ b/gpkit/constraints/loose.py @@ -16,6 +16,10 @@ def process_result(self, result): "Checks that all constraints are satisfied with equality" super().process_result(result) initsolwarning(result, "Unexpectedly Tight Constraints") + if "sensitivities" not in result: + appendsolwarning("Could not evaluate due to choice variables.", + (), result, "Unexpectedly Tight Constraints") + return for constraint in self.flat(): c_senss = result["sensitivities"]["constraints"].get(constraint, 0) if c_senss >= self.senstol: diff --git a/gpkit/constraints/sgp.py b/gpkit/constraints/sgp.py index 0ab40ade..ff3ef5a9 100644 --- a/gpkit/constraints/sgp.py +++ b/gpkit/constraints/sgp.py @@ -213,15 +213,16 @@ def localsolve(self, solver=None, *, verbosity=1, x0=None, reltol=1e-4, self.result["cost function"] = self.cost del self.result["freevariables"][self.slack.key] # pylint: disable=no-member del self.result["variables"][self.slack.key] # pylint: disable=no-member - del self.result["sensitivities"]["variables"][self.slack.key] # pylint: disable=no-member - del self.result["sensitivities"]["variablerisk"][self.slack.key] # pylint: disable=no-member - slcon = self.gpconstraints[0] - slconsenss = self.result["sensitivities"]["constraints"][slcon] - del self.result["sensitivities"]["constraints"][slcon] - # TODO: create constraint in RelaxPCCP namespace - self.result["sensitivities"]["models"][""] -= slconsenss - if not self.result["sensitivities"]["models"][""]: - del self.result["sensitivities"]["models"][""] + if "sensitivities" in self.result: # not true for MIGP + del self.result["sensitivities"]["variables"][self.slack.key] # pylint: disable=no-member + del self.result["sensitivities"]["variablerisk"][self.slack.key] # pylint: disable=no-member + slcon = self.gpconstraints[0] + slconsenss = self.result["sensitivities"]["constraints"][slcon] + del self.result["sensitivities"]["constraints"][slcon] + # TODO: create constraint in RelaxPCCP namespace + self.result["sensitivities"]["models"][""] -= slconsenss + if not self.result["sensitivities"]["models"][""]: + del self.result["sensitivities"]["models"][""] return self.result @property diff --git a/gpkit/solution_array.py b/gpkit/solution_array.py index f11fea38..8c9d088b 100644 --- a/gpkit/solution_array.py +++ b/gpkit/solution_array.py @@ -41,7 +41,9 @@ def __init__(self, solarray, saveconstraints): def __enter__(self): - if self.saveconstraints: + if "sensitivities" not in self.solarray: + pass + elif self.saveconstraints: for constraint_attr in ["bounded", "meq_bounded", "vks", "v_ss", "unsubbed", "varkeys"]: store = {} @@ -55,7 +57,9 @@ def __enter__(self): self.solarray["sensitivities"].pop("constraints") def __exit__(self, type_, val, traceback): - if self.saveconstraints: + if not self.constraintstore: + pass + elif self.saveconstraints: for constraint_attr, store in self.attrstore.items(): for constraint, value in store.items(): setattr(constraint, constraint_attr, value) @@ -772,7 +776,8 @@ def table(self, showvars=(), strs = [] for table in tables: if "breakdown" in table: - if len(self) > 1 or not UNICODE_EXPONENTS: + if (len(self) > 1 or not UNICODE_EXPONENTS + or "sensitivities" not in self): # no breakdowns for sweeps or no-unicode environments table = table.replace(" breakdown", "") if "sensitivities" not in self and ("sensitivities" in table or