]> gitweb.michael.orlitzky.com - dunshire.git/blobdiff - symmetric_linear_game.py
Play with the error/solution formatting some more.
[dunshire.git] / symmetric_linear_game.py
index 8c37c66c4cbe7c21aa85bdd37fa4cf7c2aabdd5a..694e09f6a9f21930ee028d732f96ddda9cdbb553 100644 (file)
@@ -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)