X-Git-Url: http://gitweb.michael.orlitzky.com/?p=dunshire.git;a=blobdiff_plain;f=dunshire%2Fgames.py;h=bb808cb592d8e013d390e69ee1b6527fc64db583;hp=f9877b334cfa3bcf2d60c6269ecbf4340de24eb1;hb=2132f293d3ab198630f9fa26151eed52b21512fb;hpb=b934f519ba41db6fe6b4fb025b13ee9718f27be6 diff --git a/dunshire/games.py b/dunshire/games.py index f9877b3..bb808cb 100644 --- a/dunshire/games.py +++ b/dunshire/games.py @@ -5,7 +5,7 @@ This module contains the main :class:`SymmetricLinearGame` class that knows how to solve a linear game. """ from cvxopt import matrix, printing, solvers -from .cones import CartesianProduct, IceCream, NonnegativeOrthant +from .cones import CartesianProduct from .errors import GameUnsolvableException, PoorScalingException from .matrices import (append_col, append_row, condition_number, identity, inner_product, norm, specnorm) @@ -820,26 +820,9 @@ class SymmetricLinearGame: :meth:`L` is satisfied. """ p = self.e2() / (norm(self.e2()) ** 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.e1())) - 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? - # We use "2" because it's better numerically than sqrt(2). - height = self.e1()[0] - radius = norm(self.e1()[1:]) - dist = (height - radius) / 2 - else: - raise NotImplementedError - + dist = self.K().ball_radius(self.e1()) nu = - specnorm(self.L())/(dist*norm(self.e2())) - x = matrix([nu,p], (self.dimension() + 1, 1)) + x = matrix([nu, p], (self.dimension() + 1, 1)) s = - self._G()*x return {'x': x, 's': s} @@ -850,29 +833,12 @@ class SymmetricLinearGame: 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? - # We use "2" because it's better numerically than sqrt(2). - height = self.e2()[0] - radius = norm(self.e2()[1:]) - dist = (height - radius) / 2 - else: - raise NotImplementedError - + dist = self.K().ball_radius(self.e2()) 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)) + z = matrix([z1, z2], (self.dimension()*2, 1)) return {'y': y, 'z': z}