]> gitweb.michael.orlitzky.com - dunshire.git/blobdiff - dunshire/games.py
Add the player2_start() method and some tests for it.
[dunshire.git] / dunshire / games.py
index 77c83300a586e7e9f8a98a766d242f98738635f1..0a473915716de7f4be4ce7d99cbc64d87c960795 100644 (file)
@@ -846,6 +846,37 @@ class SymmetricLinearGame:
         return {'x': x, 's': s}
 
 
+    def player2_start(self):
+        """
+        Return a feasible starting point for player two.
+        """
+        q = self.e1() / (norm(self.e1()) ** 2)
+
+        # Compute the distance from p to the outside of K.
+        if isinstance(self.K(), NonnegativeOrthant):
+            # How far is it to a wall?
+            dist = min(list(self.e2()))
+        elif isinstance(self.K(), IceCream):
+            # How far is it to the boundary of the ball that defines
+            # the ice-cream cone at a given height? Now draw a
+            # 45-45-90 triangle and the shortest distance to the
+            # outside of the cone should be 1/sqrt(2) of that.
+            # It works in R^2, so it works everywhere, right?
+            height = self.e2()[0]
+            radius = norm(self.e2()[1:])
+            dist = (height - radius) / sqrt(2)
+        else:
+            raise NotImplementedError
+
+        omega = specnorm(self.L())/(dist*norm(self.e1()))
+        y = matrix([omega])
+        z2 = q
+        z1 = y*self.e2() - self.L().trans()*z2
+        z = matrix([z1,z2], (self.dimension()*2, 1))
+
+        return {'y': y, 'z': z}
+
+
     def solution(self):
         """
         Solve this linear game and return a :class:`Solution`.