From a5ecd81c2b98bb38bfee58507f1b4360033ad480 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Wed, 12 Oct 2016 20:30:32 -0400 Subject: [PATCH] Refactor the random matrix functions a bit. --- src/dunshire/games.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) 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) -- 2.43.2