X-Git-Url: https://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2Fdunshire%2Fgames.py;h=65fc791b20bd0624ee714a724581eb1537fa2edf;hb=d1638062ec3a28dc64b91f308858211db243db7b;hp=692a0ae550305c3ae56833d500c263498f070889;hpb=1c7a9200a0e65869f46eda49682f76a4f134dccd;p=dunshire.git diff --git a/src/dunshire/games.py b/src/dunshire/games.py index 692a0ae..65fc791 100644 --- a/src/dunshire/games.py +++ b/src/dunshire/games.py @@ -504,7 +504,7 @@ class SymmetricLinearGame: -def _random_square_matrix(dims): +def _random_matrix(dims): """ Generate a random square (``dims``-by-``dims``) matrix, represented as a list of rows. This is used only by the @@ -512,6 +512,23 @@ def _random_square_matrix(dims): """ return [[uniform(-10, 10) for i in range(dims)] for j in range(dims)] +def _random_nonnegative_matrix(dims): + """ + Generate a random square (``dims``-by-``dims``) matrix with + nonnegative entries, represented as a list of rows. This is used + only by the :class:`SymmetricLinearGameTest` class. + """ + L = _random_matrix(dims) + return [[abs(entry) for entry in row] for row in L] + +def _random_diagonal_matrix(dims): + """ + Generate a random square (``dims``-by-``dims``) matrix with nonzero + entries only on the diagonal, represented as a list of rows. This is + used only by the :class:`SymmetricLinearGameTest` class. + """ + return [[uniform(-10, 10)*int(i == j) for i in range(dims)] + for j in range(dims)] def _random_orthant_params(): """ @@ -523,7 +540,7 @@ def _random_orthant_params(): K = NonnegativeOrthant(ambient_dim) e1 = [uniform(0.5, 10) for idx in range(K.dimension())] e2 = [uniform(0.5, 10) for idx in range(K.dimension())] - L = _random_square_matrix(K.dimension()) + L = _random_matrix(K.dimension()) return (L, K, e1, e2) @@ -550,7 +567,7 @@ def _random_icecream_params(): fudge_factor = 1.0 / (2.0*sqrt(K.dimension() - 1.0)) e1 += [fudge_factor*uniform(0, 1) for idx in range(K.dimension() - 1)] e2 += [fudge_factor*uniform(0, 1) for idx in range(K.dimension() - 1)] - L = _random_square_matrix(K.dimension()) + L = _random_matrix(K.dimension()) return (L, K, e1, e2) @@ -814,11 +831,10 @@ class SymmetricLinearGameTest(TestCase): This test theoretically applies to the ice-cream cone as well, but we don't know how to make positive operators on that cone. """ - (L, K, e1, e2) = _random_orthant_params() + (_, K, e1, e2) = _random_orthant_params() - # Make the entries of ``L`` nonnegative... this makes it a - # positive operator on ``K``. - L = [[abs(entry) for entry in row] for row in L] + # Ignore that L, we need a nonnegative one. + L = _random_nonnegative_matrix(K.dimension()) game = SymmetricLinearGame(L, K, e1, e2) self.assertTrue(game.solution().game_value() >= -options.ABS_TOL)