printing.options['dformat'] = options.FLOAT_FORMAT
+
class Solution:
"""
A representation of the solution of a linear game. It should contain
self.A(),
self.b(),
primalstart=self.player1_start(),
+ dualstart=self.player2_start(),
options=opts)
except ValueError as error:
if str(error) == 'math domain error':
printing.options['dformat'] = options.DEBUG_FLOAT_FORMAT
raise GameUnsolvableException(self, soln_dict)
+ # For the game value, we could use any of:
+ #
+ # * p1_value
+ # * p2_value
+ # * (p1_value + p2_value)/2
+ # * the game payoff
+ #
+ # We want the game value to be the payoff, however, so it
+ # makes the most sense to just use that, even if it means we
+ # can't test the fact that p1_value/p2_value are close to the
+ # payoff.
+ payoff = self.payoff(p1_optimal, p2_optimal)
+ soln = Solution(payoff, p1_optimal, p2_optimal)
+
# The "optimal" and "unknown" results, we actually treat the
# same. Even if CVXOPT bails out due to numerical difficulty,
# it will have some candidate points in mind. If those
# close enough (one could be low by ABS_TOL, the other high by
# it) because otherwise CVXOPT might return "unknown" and give
# us two points in the cone that are nowhere near optimal.
- if abs(p1_value - p2_value) > 2*options.ABS_TOL:
+ #
+ if abs(p1_value - p2_value) > self.epsilon_scale(soln)*options.ABS_TOL:
printing.options['dformat'] = options.DEBUG_FLOAT_FORMAT
raise GameUnsolvableException(self, soln_dict)
printing.options['dformat'] = options.DEBUG_FLOAT_FORMAT
raise GameUnsolvableException(self, soln_dict)
- # For the game value, we could use any of:
- #
- # * p1_value
- # * p2_value
- # * (p1_value + p2_value)/2
- # * the game payoff
- #
- # We want the game value to be the payoff, however, so it
- # makes the most sense to just use that, even if it means we
- # can't test the fact that p1_value/p2_value are close to the
- # payoff.
- payoff = self.payoff(p1_optimal, p2_optimal)
- return Solution(payoff, p1_optimal, p2_optimal)
+ return soln
def condition(self):