]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/cone/tests.py
Remove lyapunov_rank() for inclusion in Sage.
[sage.d.git] / mjo / cone / tests.py
index 0df9e32a4e526c544a9b58fd72b74efe09887d6c..816215c8473910bd3c1cdf7162f05f321a83af25 100644 (file)
@@ -15,11 +15,89 @@ 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, _restrict_to_space
 
 #
 # Tests for _restrict_to_space.
 #
+def _look_isomorphic(K1, K2):
+    r"""
+    Test whether or not ``K1`` and ``K2`` look linearly isomorphic.
+
+    This is a hack to get around the fact that it's difficult to tell
+    when two cones are linearly isomorphic. Instead, we check a list of
+    properties that should be preserved under linear isomorphism.
+
+    OUTPUT:
+
+    ``True`` if ``K1`` and ``K2`` look isomorphic, or ``False``
+    if we can prove that they are not isomorphic.
+
+    EXAMPLES:
+
+    Any proper cone with three generators in `\mathbb{R}^{3}` is
+    isomorphic to the nonnegative orthant::
+
+        sage: K1 = Cone([(1,0,0), (0,1,0), (0,0,1)])
+        sage: K2 = Cone([(1,2,3), (3, 18, 4), (66, 51, 0)])
+        sage: _look_isomorphic(K1, K2)
+        True
+
+    Negating a cone gives you an isomorphic cone::
+
+        sage: K = Cone([(0,2,-5), (-6, 2, 4), (0, 51, 0)])
+        sage: _look_isomorphic(K, -K)
+        True
+
+    TESTS:
+
+    Any cone is isomorphic to itself::
+
+        sage: K = random_cone(max_ambient_dim = 8)
+        sage: _look_isomorphic(K, K)
+        True
+
+    After applying an invertible matrix to the rows of a cone, the
+    result should is isomorphic to the cone we started with::
+
+        sage: K1 = random_cone(max_ambient_dim = 8)
+        sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular')
+        sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice())
+        sage: _look_isomorphic(K1, K2)
+        True
+
+    """
+    if K1.lattice_dim() != K2.lattice_dim():
+        return False
+
+    if K1.nrays() != K2.nrays():
+        return False
+
+    if K1.dim() != K2.dim():
+        return False
+
+    if K1.lineality() != K2.lineality():
+        return False
+
+    if K1.is_solid() != K2.is_solid():
+        return False
+
+    if K1.is_strictly_convex() != K2.is_strictly_convex():
+        return False
+
+    if len(K1.lyapunov_like_basis()) != len(K2.lyapunov_like_basis()):
+        return False
+
+    C_of_K1 = K1.discrete_complementarity_set()
+    C_of_K2 = K2.discrete_complementarity_set()
+    if len(C_of_K1) != len(C_of_K2):
+        return False
+
+    if len(K1.facets()) != len(K2.facets()):
+        return False
+
+    return True
+
+
 """
 Apply _restrict_to_space according to our paper (to obtain our main
 result). Test all four parameter combinations::
@@ -28,11 +106,11 @@ result). Test all four parameter combinations::
     sage: K = random_cone(max_ambient_dim = 8,
     ....:                 strictly_convex=False,
     ....:                 solid=False)
-    sage: K_S = _restrict_to_space(K, K.span())
-    sage: K_SP = _restrict_to_space(K_S.dual(), K_S.dual().span()).dual()
+    sage: K_S = K._restrict_to_space(K.span())
+    sage: K_SP = K_S.dual()._restrict_to_space(K_S.dual().span()).dual()
     sage: K_SP.is_proper()
     True
-    sage: K_SP = _restrict_to_space(K_S, K_S.dual().span())
+    sage: K_SP = K_S._restrict_to_space(K_S.dual().span())
     sage: K_SP.is_proper()
     True
 
@@ -42,11 +120,11 @@ result). Test all four parameter combinations::
     sage: K = random_cone(max_ambient_dim = 8,
     ....:                 strictly_convex=True,
     ....:                 solid=False)
-    sage: K_S = _restrict_to_space(K, K.span())
-    sage: K_SP = _restrict_to_space(K_S.dual(), K_S.dual().span()).dual()
+    sage: K_S = K._restrict_to_space(K.span())
+    sage: K_SP = K_S.dual()._restrict_to_space(K_S.dual().span()).dual()
     sage: K_SP.is_proper()
     True
-    sage: K_SP = _restrict_to_space(K_S, K_S.dual().span())
+    sage: K_SP = K_S._restrict_to_space(K_S.dual().span())
     sage: K_SP.is_proper()
     True
 
@@ -56,11 +134,11 @@ result). Test all four parameter combinations::
     sage: K = random_cone(max_ambient_dim = 8,
     ....:                 strictly_convex=False,
     ....:                 solid=True)
-    sage: K_S = _restrict_to_space(K, K.span())
-    sage: K_SP = _restrict_to_space(K_S.dual(), K_S.dual().span()).dual()
+    sage: K_S = K._restrict_to_space(K.span())
+    sage: K_SP = K_S.dual()._restrict_to_space(K_S.dual().span()).dual()
     sage: K_SP.is_proper()
     True
-    sage: K_SP = _restrict_to_space(K_S, K_S.dual().span())
+    sage: K_SP = K_S._restrict_to_space(K_S.dual().span())
     sage: K_SP.is_proper()
     True
 
@@ -70,11 +148,11 @@ result). Test all four parameter combinations::
     sage: K = random_cone(max_ambient_dim = 8,
     ....:                 strictly_convex=True,
     ....:                 solid=True)
-    sage: K_S = _restrict_to_space(K, K.span())
-    sage: K_SP = _restrict_to_space(K_S.dual(), K_S.dual().span()).dual()
+    sage: K_S = K._restrict_to_space(K.span())
+    sage: K_SP = K_S.dual()._restrict_to_space(K_S.dual().span()).dual()
     sage: K_SP.is_proper()
     True
-    sage: K_SP = _restrict_to_space(K_S, K_S.dual().span())
+    sage: K_SP = K_S._restrict_to_space(K_S.dual().span())
     sage: K_SP.is_proper()
     True
 
@@ -89,9 +167,9 @@ all parameter combinations::
     ....:                 solid=False,
     ....:                 strictly_convex=False)
     sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
-    sage: K_W_star = _restrict_to_space(K, J.span()).dual()
-    sage: K_star_W = _restrict_to_space(K.dual(), J.span())
-    sage: _basically_the_same(K_W_star, K_star_W)
+    sage: K_W_star = K._restrict_to_space(J.span()).dual()
+    sage: K_star_W = K.dual()._restrict_to_space(J.span())
+    sage: _look_isomorphic(K_W_star, K_star_W)
     True
 
 ::
@@ -101,9 +179,9 @@ all parameter combinations::
     ....:                 solid=True,
     ....:                 strictly_convex=False)
     sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
-    sage: K_W_star = _restrict_to_space(K, J.span()).dual()
-    sage: K_star_W = _restrict_to_space(K.dual(), J.span())
-    sage: _basically_the_same(K_W_star, K_star_W)
+    sage: K_W_star = K._restrict_to_space(J.span()).dual()
+    sage: K_star_W = K.dual()._restrict_to_space(J.span())
+    sage: _look_isomorphic(K_W_star, K_star_W)
     True
 
 ::
@@ -113,9 +191,9 @@ all parameter combinations::
     ....:                 solid=False,
     ....:                 strictly_convex=True)
     sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
-    sage: K_W_star = _restrict_to_space(K, J.span()).dual()
-    sage: K_star_W = _restrict_to_space(K.dual(), J.span())
-    sage: _basically_the_same(K_W_star, K_star_W)
+    sage: K_W_star = K._restrict_to_space(J.span()).dual()
+    sage: K_star_W = K.dual()._restrict_to_space(J.span())
+    sage: _look_isomorphic(K_W_star, K_star_W)
     True
 
 ::
@@ -125,9 +203,9 @@ all parameter combinations::
     ....:                 solid=True,
     ....:                 strictly_convex=True)
     sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
-    sage: K_W_star = _restrict_to_space(K, J.span()).dual()
-    sage: K_star_W = _restrict_to_space(K.dual(), J.span())
-    sage: _basically_the_same(K_W_star, K_star_W)
+    sage: K_W_star = K._restrict_to_space(J.span()).dual()
+    sage: K_star_W = K.dual()._restrict_to_space(J.span())
+    sage: _look_isomorphic(K_W_star, K_star_W)
     True
 
 """
@@ -146,7 +224,7 @@ combinations of parameters::
     ....:                  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)
+    sage: K1.lyapunov_rank() == K2.lyapunov_rank()
     True
 
 ::
@@ -156,7 +234,7 @@ combinations of parameters::
     ....:                  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)
+    sage: K1.lyapunov_rank() == K2.lyapunov_rank()
     True
 
 ::
@@ -166,7 +244,7 @@ combinations of parameters::
     ....:                  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)
+    sage: K1.lyapunov_rank() == K2.lyapunov_rank()
     True
 
 ::
@@ -176,7 +254,7 @@ combinations of parameters::
     ....:                  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)
+    sage: K1.lyapunov_rank() == K2.lyapunov_rank()
     True
 
 The Lyapunov rank of a dual cone should be the same as the original
@@ -186,7 +264,7 @@ cone. Check all combinations of parameters::
     sage: K = random_cone(max_ambient_dim=8,
     ....:                 strictly_convex=False,
     ....:                 solid=False)
-    sage: lyapunov_rank(K) == lyapunov_rank(K.dual())
+    sage: K.lyapunov_rank() == K.dual().lyapunov_rank()
     True
 
 ::
@@ -195,7 +273,7 @@ cone. Check all combinations of parameters::
     sage: K = random_cone(max_ambient_dim=8,
     ....:                 strictly_convex=False,
     ....:                 solid=True)
-    sage: lyapunov_rank(K) == lyapunov_rank(K.dual())
+    sage: K.lyapunov_rank() == K.dual().lyapunov_rank()
     True
 
 ::
@@ -204,7 +282,7 @@ cone. Check all combinations of parameters::
     sage: K = random_cone(max_ambient_dim=8,
     ....:                 strictly_convex=True,
     ....:                 solid=False)
-    sage: lyapunov_rank(K) == lyapunov_rank(K.dual())
+    sage: K.lyapunov_rank() == K.dual().lyapunov_rank()
     True
 
 ::
@@ -213,17 +291,17 @@ cone. Check all combinations of parameters::
     sage: K = random_cone(max_ambient_dim=8,
     ....:                 strictly_convex=True,
     ....:                 solid=True)
-    sage: lyapunov_rank(K) == lyapunov_rank(K.dual())
+    sage: K.lyapunov_rank() == K.dual().lyapunov_rank()
     True
 
-The Lyapunov rank of a cone ``K`` is the dimension of ``LL(K)``. Check
-all combinations of parameters::
+The Lyapunov rank of a cone ``K`` is the dimension of
+``K.lyapunov_like_basis()``. 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(K.LL())
+    sage: K.lyapunov_rank() == len(K.lyapunov_like_basis())
     True
 
 ::
@@ -232,7 +310,7 @@ all combinations of parameters::
     sage: K = random_cone(max_ambient_dim=8,
     ....:                 strictly_convex=True,
     ....:                 solid=False)
-    sage: lyapunov_rank(K) == len(K.LL())
+    sage: K.lyapunov_rank() == len(K.lyapunov_like_basis())
     True
 
 ::
@@ -241,7 +319,7 @@ all combinations of parameters::
     sage: K = random_cone(max_ambient_dim=8,
     ....:                 strictly_convex=False,
     ....:                 solid=True)
-    sage: lyapunov_rank(K) == len(K.LL())
+    sage: K.lyapunov_rank() == len(K.lyapunov_like_basis())
     True
 
 ::
@@ -250,7 +328,7 @@ all combinations of parameters::
     sage: K = random_cone(max_ambient_dim=8,
     ....:                 strictly_convex=False,
     ....:                 solid=False)
-    sage: lyapunov_rank(K) == len(K.LL())
+    sage: K.lyapunov_rank() == len(K.lyapunov_like_basis())
     True
 
 """