str(self._K),
indented_e1,
indented_e2,
- self._condition())
+ self.condition())
def _zero(self):
# objectives match (within a tolerance) and that the
# primal/dual optimal solutions are within the cone (to a
# tolerance as well).
- if abs(p1_value - p2_value) > options.ABS_TOL:
+ #
+ # The fudge factor of two is basically unjustified, but
+ # makes intuitive sense when you imagine that the primal
+ # value could be under the true optimal by ``ABS_TOL``
+ # and the dual value could be over by the same amount.
+ #
+ if abs(p1_value - p2_value) > 2*options.ABS_TOL:
raise GameUnsolvableException(self, soln_dict)
if (p1_optimal not in self._K) or (p2_optimal not in self._K):
raise GameUnsolvableException(self, soln_dict)
return Solution(p1_value, p1_optimal, p2_optimal)
- def _condition(self):
+ def condition(self):
r"""
Return the condition number of this game.
>>> e1 = [1]
>>> e2 = e1
>>> SLG = SymmetricLinearGame(L, K, e1, e2)
- >>> actual = SLG._condition()
+ >>> actual = SLG.condition()
>>> expected = 1.8090169943749477
>>> abs(actual - expected) < options.ABS_TOL
True