X-Git-Url: https://gitweb.michael.orlitzky.com/?p=dunshire.git;a=blobdiff_plain;f=test%2Frandomgen.py;h=bfc70f3cf320031f6c8b7047ebdf9746288c0882;hp=9510c04767150b967283f62f72d7e7a88f112186;hb=0274de467062ab29d2a41d2a91ec0b28fcd95c8d;hpb=79d8219c4ac2ce7972247f3e7690e776295fabba diff --git a/test/randomgen.py b/test/randomgen.py index 9510c04..bfc70f3 100644 --- a/test/randomgen.py +++ b/test/randomgen.py @@ -9,9 +9,13 @@ from dunshire.cones import NonnegativeOrthant, IceCream from dunshire.games import SymmetricLinearGame from dunshire.matrices import (append_col, append_row, identity) -MAX_COND = 250 +MAX_COND = 125 """ -The maximum condition number of a randomly-generated game. +The maximum condition number of a randomly-generated game. When the +condition number of the games gets too high, we start to see +:class:`PoorScalingException` being thrown. There's no science to +choosing the upper bound -- it got lowered until those exceptions +stopped popping up. It's at ``125`` because ``129`` doesn't work. """ RANDOM_MAX = 10 @@ -29,8 +33,8 @@ def random_scalar(): ------- float - A random real number between ``-RANDOM_MAX`` and ``RANDOM_MAX``, - inclusive. + A random real number between negative and positive + :const:`RANDOM_MAX`, inclusive. Examples -------- @@ -50,8 +54,8 @@ def random_nn_scalar(): ------- float - A random nonnegative real number between zero and ``RANDOM_MAX``, - inclusive. + A random nonnegative real number between zero and + :const:`RANDOM_MAX`, inclusive. Examples -------- @@ -71,7 +75,8 @@ def random_natural(): ------- int - A random natural number between ``1`` and ``RANDOM_MAX`` inclusive. + A random natural number between ``1`` and :const:`RANDOM_MAX`, + inclusive. Examples -------- @@ -101,8 +106,8 @@ def random_matrix(row_count, column_count=None): ------- matrix - A new matrix whose entries are random floats chosen uniformly from - the interval ``[-RANDOM_MAX, RANDOM_MAX]``. + A new matrix whose entries are random floats chosen uniformly + between negative and positive :const:`RANDOM_MAX`. Examples -------- @@ -184,7 +189,7 @@ def random_diagonal_matrix(dims): matrix A new matrix whose diagonal entries are random floats chosen - using func:`random_scalar` and whose off-diagonal entries are + using :func:`random_scalar` and whose off-diagonal entries are zero. Examples @@ -267,7 +272,7 @@ def random_lyapunov_like_icecream(dims): matrix A new matrix, Lyapunov-like on the ice-cream cone in ``dims`` dimensions, whose free entries are random floats chosen uniformly - from the interval ``[-RANDOM_MAX, RANDOM_MAX]``. + between negative and positive :const:`RANDOM_MAX`. References ---------- @@ -306,7 +311,7 @@ def random_orthant_game(): We generate each of ``L``, ``K``, ``e1``, and ``e2`` randomly within the constraints of the nonnegative orthant, and then construct a game from them. The process is repeated until we generate a game with - a condition number under ``MAX_COND``. + a condition number under :const:`MAX_COND`. Returns ------- @@ -323,8 +328,8 @@ def random_orthant_game(): """ ambient_dim = random_natural() + 1 K = NonnegativeOrthant(ambient_dim) - e1 = [random_nn_scalar() for _ in range(K.dimension())] - e2 = [random_nn_scalar() for _ in range(K.dimension())] + e1 = [0.1 + random_nn_scalar() for _ in range(K.dimension())] + e2 = [0.1 + random_nn_scalar() for _ in range(K.dimension())] L = random_matrix(K.dimension()) G = SymmetricLinearGame(L, K, e1, e2) @@ -341,7 +346,7 @@ def random_icecream_game(): We generate each of ``L``, ``K``, ``e1``, and ``e2`` randomly within the constraints of the ice-cream cone, and then construct a game from them. The process is repeated until we generate a game with a - condition number under ``MAX_COND``. + condition number under :const:`MAX_COND`. Returns ------- @@ -390,14 +395,17 @@ def random_ll_orthant_game(): to have a :func:`random_diagonal_matrix` as its operator. Such things are Lyapunov-like on the nonnegative orthant. That process is repeated until the condition number of the resulting game is within - ``MAX_COND``. + :const:`MAX_COND`. Returns ------- SymmetricLinearGame - A random game over some nonnegative orthant whose ``payoff`` method - is based on a Lyapunov-like ``L`` operator. + + A random game over some nonnegative orthant whose + :meth:`dunshire.games.SymmetricLinearGame.payoff` method is + based on a Lyapunov-like + :meth:`dunshire.games.SymmetricLinearGame.L` operator. Examples -------- @@ -407,16 +415,16 @@ def random_ll_orthant_game(): """ G = random_orthant_game() - L = random_diagonal_matrix(G._K.dimension()) + L = random_diagonal_matrix(G.dimension()) # Replace the totally-random ``L`` with random Lyapunov-like one. - G = SymmetricLinearGame(L, G._K, G._e1, G._e2) + G = SymmetricLinearGame(L, G.K(), G.e1(), G.e2()) while G.condition() > MAX_COND: # Try again until the condition number is satisfactory. G = random_orthant_game() - L = random_diagonal_matrix(G._K.dimension()) - G = SymmetricLinearGame(L, G._K, G._e1, G._e2) + L = random_diagonal_matrix(G.dimension()) + G = SymmetricLinearGame(L, G.K(), G.e1(), G.e2()) return G @@ -428,14 +436,16 @@ def random_ll_icecream_game(): We first construct a :func:`random_icecream_game` and then modify it to have a :func:`random_lyapunov_like_icecream` operator. That process is repeated until the condition number of the resulting game - is within ``MAX_COND``. + is within :const:`MAX_COND`. Returns ------- SymmetricLinearGame - A random game over some ice-cream cone whose ``payoff`` method - is based on a Lyapunov-like ``L`` operator. + A random game over some ice-cream cone whose + :meth:`dunshire.games.SymmetricLinearGame.payoff` method + is based on a Lyapunov-like + :meth:`dunshire.games.SymmetricLinearGame.L` operator. Examples -------- @@ -445,16 +455,16 @@ def random_ll_icecream_game(): """ G = random_icecream_game() - L = random_lyapunov_like_icecream(G._K.dimension()) + L = random_lyapunov_like_icecream(G.dimension()) # Replace the totally-random ``L`` with random Lyapunov-like one. - G = SymmetricLinearGame(L, G._K, G._e1, G._e2) + G = SymmetricLinearGame(L, G.K(), G.e1(), G.e2()) while G.condition() > MAX_COND: # Try again until the condition number is satisfactory. G = random_icecream_game() - L = random_lyapunov_like_icecream(G._K.dimension()) - G = SymmetricLinearGame(L, G._K, G._e1, G._e2) + L = random_lyapunov_like_icecream(G.dimension()) + G = SymmetricLinearGame(L, G.K(), G.e1(), G.e2()) return G @@ -467,14 +477,16 @@ def random_positive_orthant_game(): We first construct a :func:`random_orthant_game` and then modify it to have a :func:`random_nonnegative_matrix` as its operator. That process is repeated until the condition number of the resulting game - is within ``MAX_COND``. + is within :const:`MAX_COND`. Returns ------- SymmetricLinearGame - A random game over some nonnegative orthant whose ``payoff`` method - is based on a positive ``L`` operator. + A random game over some nonnegative orthant whose + :meth:`dunshire.games.SymmetricLinearGame.payoff` method + is based on a positive + :meth:`dunshire.games.SymmetricLinearGame.L` operator. Examples -------- @@ -485,16 +497,16 @@ def random_positive_orthant_game(): """ G = random_orthant_game() - L = random_nonnegative_matrix(G._K.dimension()) + L = random_nonnegative_matrix(G.dimension()) # Replace the totally-random ``L`` with the random nonnegative one. - G = SymmetricLinearGame(L, G._K, G._e1, G._e2) + G = SymmetricLinearGame(L, G.K(), G.e1(), G.e2()) while G.condition() > MAX_COND: # Try again until the condition number is satisfactory. G = random_orthant_game() - L = random_nonnegative_matrix(G._K.dimension()) - G = SymmetricLinearGame(L, G._K, G._e1, G._e2) + L = random_nonnegative_matrix(G.dimension()) + G = SymmetricLinearGame(L, G.K(), G.e1(), G.e2()) return G @@ -526,21 +538,21 @@ def random_nn_scaling(G): >>> (alpha, H) = random_nn_scaling(G) >>> alpha >= 0 True - >>> G._K == H._K + >>> G.K() == H.K() True - >>> norm(G._e1 - H._e1) < ABS_TOL + >>> norm(G.e1() - H.e1()) < ABS_TOL True - >>> norm(G._e2 - H._e2) < ABS_TOL + >>> norm(G.e2() - H.e2()) < ABS_TOL True """ alpha = random_nn_scalar() - H = SymmetricLinearGame(alpha*G._L.trans(), G._K, G._e1, G._e2) + H = SymmetricLinearGame(alpha*G.L().trans(), G.K(), G.e1(), G.e2()) while H.condition() > MAX_COND: # Loop until the condition number of H doesn't suck. alpha = random_nn_scalar() - H = SymmetricLinearGame(alpha*G._L.trans(), G._K, G._e1, G._e2) + H = SymmetricLinearGame(alpha*G.L().trans(), G.K(), G.e1(), G.e2()) return (alpha, H) @@ -571,23 +583,23 @@ def random_translation(G): >>> from dunshire.options import ABS_TOL >>> G = random_orthant_game() >>> (alpha, H) = random_translation(G) - >>> G._K == H._K + >>> G.K() == H.K() True - >>> norm(G._e1 - H._e1) < ABS_TOL + >>> norm(G.e1() - H.e1()) < ABS_TOL True - >>> norm(G._e2 - H._e2) < ABS_TOL + >>> norm(G.e2() - H.e2()) < ABS_TOL True """ alpha = random_scalar() - tensor_prod = G._e1 * G._e2.trans() - M = G._L + alpha*tensor_prod + tensor_prod = G.e1() * G.e2().trans() + M = G.L() + alpha*tensor_prod - H = SymmetricLinearGame(M.trans(), G._K, G._e1, G._e2) + H = SymmetricLinearGame(M.trans(), G.K(), G.e1(), G.e2()) while H.condition() > MAX_COND: # Loop until the condition number of H doesn't suck. alpha = random_scalar() - M = G._L + alpha*tensor_prod - H = SymmetricLinearGame(M.trans(), G._K, G._e1, G._e2) + M = G.L() + alpha*tensor_prod + H = SymmetricLinearGame(M.trans(), G.K(), G.e1(), G.e2()) return (alpha, H)