X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Fcone%2Ftests.py;fp=mjo%2Fcone%2Ftests.py;h=b9dc2e064d771de1eb9bb02184a5d4d1df8ea319;hb=af3e2ce56ad6561c5c9b1b6cf3df22d690550618;hp=0000000000000000000000000000000000000000;hpb=98637c981445d35a061878923baf3ae4651ecb0b;p=sage.d.git diff --git a/mjo/cone/tests.py b/mjo/cone/tests.py new file mode 100644 index 0000000..b9dc2e0 --- /dev/null +++ b/mjo/cone/tests.py @@ -0,0 +1,256 @@ +""" +Additional tests for the mjo.cone.cone module. These are extra +properties that we'd like to check, but which are overkill for inclusion +into Sage. +""" + +# Sage doesn't load ~/.sage/init.sage during testing (sage -t), so we +# have to explicitly mangle our sitedir here so that "mjo.cone" +# resolves. +from os.path import abspath +from site import addsitedir +addsitedir(abspath('../../')) + +from sage.all import * + +# The double-import is needed to get the underscore methods. +from mjo.cone.cone import * +from mjo.cone.cone import _basically_the_same, _rho + +# +# Tests for _rho. +# +""" +Apply _rho according to our paper (to obtain our main result). Test all +four parameter combinations:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim = 8, + ....: strictly_convex=False, + ....: solid=False) + sage: K_S = _rho(K) + sage: K_SP = _rho(K_S.dual()).dual() + sage: K_SP.is_proper() + True + sage: K_SP = _rho(K_S, K_S.dual()) + sage: K_SP.is_proper() + True + +:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim = 8, + ....: strictly_convex=True, + ....: solid=False) + sage: K_S = _rho(K) + sage: K_SP = _rho(K_S.dual()).dual() + sage: K_SP.is_proper() + True + sage: K_SP = _rho(K_S, K_S.dual()) + sage: K_SP.is_proper() + True + +:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim = 8, + ....: strictly_convex=False, + ....: solid=True) + sage: K_S = _rho(K) + sage: K_SP = _rho(K_S.dual()).dual() + sage: K_SP.is_proper() + True + sage: K_SP = _rho(K_S, K_S.dual()) + sage: K_SP.is_proper() + True + +:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim = 8, + ....: strictly_convex=True, + ....: solid=True) + sage: K_S = _rho(K) + sage: K_SP = _rho(K_S.dual()).dual() + sage: K_SP.is_proper() + True + sage: K_SP = _rho(K_S, K_S.dual()) + sage: K_SP.is_proper() + True + +Test the proposition in our paper concerning the duals and +restrictions. Generate a random cone, then create a subcone of +it. The operation of dual-taking should then commute with rho. Test +all parameter combinations:: + + + sage: set_random_seed() + sage: J = random_cone(max_ambient_dim = 8, + ....: solid=False, + ....: strictly_convex=False) + sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice()) + sage: K_W_star = _rho(K, J).dual() + sage: K_star_W = _rho(K.dual(), J) + sage: _basically_the_same(K_W_star, K_star_W) + True + +:: + + sage: set_random_seed() + sage: J = random_cone(max_ambient_dim = 8, + ....: solid=True, + ....: strictly_convex=False) + sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice()) + sage: K_W_star = _rho(K, J).dual() + sage: K_star_W = _rho(K.dual(), J) + sage: _basically_the_same(K_W_star, K_star_W) + True + +:: + + sage: set_random_seed() + sage: J = random_cone(max_ambient_dim = 8, + ....: solid=False, + ....: strictly_convex=True) + sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice()) + sage: K_W_star = _rho(K, J).dual() + sage: K_star_W = _rho(K.dual(), J) + sage: _basically_the_same(K_W_star, K_star_W) + True + +:: + + sage: set_random_seed() + sage: J = random_cone(max_ambient_dim = 8, + ....: solid=True, + ....: strictly_convex=True) + sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice()) + sage: K_W_star = _rho(K, J).dual() + sage: K_star_W = _rho(K.dual(), J) + sage: _basically_the_same(K_W_star, K_star_W) + True + +""" + + +# +# Lyapunov rank tests +# +""" + +The Lyapunov rank is invariant under a linear isomorphism. Check all +combinations of parameters:: + + sage: K1 = random_cone(max_ambient_dim=8, + ....: strictly_convex=True, + ....: solid=True) + sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular') + sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice()) + sage: lyapunov_rank(K1) == lyapunov_rank(K2) + True + +:: + + sage: K1 = random_cone(max_ambient_dim=8, + ....: strictly_convex=True, + ....: solid=False) + sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular') + sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice()) + sage: lyapunov_rank(K1) == lyapunov_rank(K2) + True + +:: + + sage: K1 = random_cone(max_ambient_dim=8, + ....: strictly_convex=False, + ....: solid=True) + sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular') + sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice()) + sage: lyapunov_rank(K1) == lyapunov_rank(K2) + True + +:: + + sage: K1 = random_cone(max_ambient_dim=8, + ....: strictly_convex=False, + ....: solid=False) + sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular') + sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice()) + sage: lyapunov_rank(K1) == lyapunov_rank(K2) + True + +The Lyapunov rank of a dual cone should be the same as the original +cone. Check all combinations of parameters:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim=8, + ....: strictly_convex=False, + ....: solid=False) + sage: lyapunov_rank(K) == lyapunov_rank(K.dual()) + True + +:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim=8, + ....: strictly_convex=False, + ....: solid=True) + sage: lyapunov_rank(K) == lyapunov_rank(K.dual()) + True + +:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim=8, + ....: strictly_convex=True, + ....: solid=False) + sage: lyapunov_rank(K) == lyapunov_rank(K.dual()) + True + +:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim=8, + ....: strictly_convex=True, + ....: solid=True) + sage: lyapunov_rank(K) == lyapunov_rank(K.dual()) + True + +The Lyapunov rank of a cone ``K`` is the dimension of ``LL(K)``. Check +all combinations of parameters:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim=8, + ....: strictly_convex=True, + ....: solid=True) + sage: lyapunov_rank(K) == len(LL(K)) + True + +:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim=8, + ....: strictly_convex=True, + ....: solid=False) + sage: lyapunov_rank(K) == len(LL(K)) + True + +:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim=8, + ....: strictly_convex=False, + ....: solid=True) + sage: lyapunov_rank(K) == len(LL(K)) + True + +:: + + sage: set_random_seed() + sage: K = random_cone(max_ambient_dim=8, + ....: strictly_convex=False, + ....: solid=False) + sage: lyapunov_rank(K) == len(LL(K)) + True + +"""