X-Git-Url: https://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=symmetric_linear_game.py;h=694e09f6a9f21930ee028d732f96ddda9cdbb553;hb=a448c7849ff1af10a8e0ecd6f9d143b5f58e49d8;hp=8c37c66c4cbe7c21aa85bdd37fa4cf7c2aabdd5a;hpb=2030b75d2cd3074319de8c15e241723a1b9d75d2;p=dunshire.git diff --git a/symmetric_linear_game.py b/symmetric_linear_game.py index 8c37c66..694e09f 100644 --- a/symmetric_linear_game.py +++ b/symmetric_linear_game.py @@ -7,14 +7,14 @@ from matrices import append_col, append_row, identity printing.options['dformat'] = '%.7f' solvers.options['show_progress'] = False + class Solution: """ A representation of the solution of a linear game. It should contain the value of the game, and both players' strategies. """ - def __init__(self, p1_value, p2_value, p1_optimal, p2_optimal): - self._player1_value = p1_value - self._player2_value = p2_value + def __init__(self, game_value, p1_optimal, p2_optimal): + self._game_value = game_value self._player1_optimal = p1_optimal self._player2_optimal = p2_optimal @@ -29,27 +29,27 @@ class Solution: * The optimal strategy of player two. """ - # The string representations of the player strategy matrices - # already contain trailing newlines. + tpl = 'Game value: {:.7f}\n' \ - 'Player 1 optimal: {!s}' \ - 'Player 2 optimal: {!s}' - return tpl.format(self.game_value(), - self.player1_optimal().trans(), - self.player2_optimal().trans()) + 'Player 1 optimal:{:s}\n' \ + 'Player 2 optimal:{:s}\n' + + p1 = '\n{!s}'.format(self.player1_optimal()) + p1 = '\n '.join(p1.splitlines()) + p2 = '\n{!s}'.format(self.player2_optimal()) + p2 = '\n '.join(p2.splitlines()) + + return tpl.format(self.game_value(), p1, p2) - def game_value(self): - return ((self.player1_value() + self.player2_value()) / 2.0) - def player1_value(self): - return self._player1_value + def game_value(self): + return self._game_value - def player2_value(self): - return self._player2_value def player1_optimal(self): return self._player1_optimal + def player2_optimal(self): return self._player2_optimal @@ -113,13 +113,12 @@ class SymmetricLinearGame: A = matrix([0, self._e1], (1, K.dimension() + 1), 'd') soln_dict = solvers.conelp(c, G, h, C.cvxopt_dims(), A, b) + + if soln_dict['status'] != 'optimal': + raise GameUnsolvableException(soln_dict) + p1_value = soln_dict['x'][0] - p2_value = soln_dict['y'][0] p1_optimal = soln_dict['x'][1:] p2_optimal = soln_dict['z'][self._K.dimension():] - soln = Solution(p1_value, p2_value, p1_optimal, p2_optimal) - - #if soln_dict['status'] != 'optimal': - raise GameUnsolvableException(soln_dict['status'], soln, soln_dict) - return soln + return Solution(p1_value, p1_optimal, p2_optimal)