From: Michael Orlitzky Date: Thu, 13 Oct 2016 12:44:03 +0000 (-0400) Subject: Add a test for Lyapunov games over the orthant. X-Git-Tag: 0.1.0~151 X-Git-Url: https://gitweb.michael.orlitzky.com/?p=dunshire.git;a=commitdiff_plain;h=d41f3e8b808185ef3a3e71ee64c1cd72112f4eb3 Add a test for Lyapunov games over the orthant. --- diff --git a/src/dunshire/games.py b/src/dunshire/games.py index 65fc791..279afdb 100644 --- a/src/dunshire/games.py +++ b/src/dunshire/games.py @@ -14,7 +14,8 @@ from unittest import TestCase from cvxopt import matrix, printing, solvers from cones import CartesianProduct, IceCream, NonnegativeOrthant from errors import GameUnsolvableException -from matrices import append_col, append_row, identity, inner_product, norm +from matrices import (append_col, append_row, eigenvalues_re, identity, + inner_product, norm) import options printing.options['dformat'] = options.FLOAT_FORMAT @@ -838,3 +839,27 @@ class SymmetricLinearGameTest(TestCase): game = SymmetricLinearGame(L, K, e1, e2) self.assertTrue(game.solution().game_value() >= -options.ABS_TOL) + + def test_lyapunov_orthant(self): + """ + Test that a Lyapunov game on the nonnegative orthant works. + """ + (_, K, e1, e2) = _random_orthant_params() + + # Ignore that L, we need a diagonal (Lyapunov-like) one. + L = _random_diagonal_matrix(K.dimension()) + game = SymmetricLinearGame(L, K, e1, e2) + soln = game.solution() + + # We only check for positive/negative stability if the game + # value is not basically zero. If the value is that close to + # zero, we just won't check any assertions. + L = matrix(L).trans() + if soln.game_value() > options.ABS_TOL: + # L should be positive stable + ps = all([eig > -options.ABS_TOL for eig in eigenvalues_re(L)]) + self.assertTrue(ps) + elif soln.game_value() < -options.ABS_TOL: + # L should be negative stable + ns = all([eig < options.ABS_TOL for eig in eigenvalues_re(L)]) + self.assertTrue(ns)