]>
gitweb.michael.orlitzky.com - sage.d.git/blob - mjo/cone/tests.py
2 Additional tests for the mjo.cone.cone module. These are extra
3 properties that we'd like to check, but which are overkill for inclusion
7 # Sage doesn't load ~/.sage/init.sage during testing (sage -t), so we
8 # have to explicitly mangle our sitedir here so that "mjo.cone"
10 from os
.path
import abspath
11 from site
import addsitedir
12 addsitedir(abspath('../../'))
14 from sage
.all
import *
16 # The double-import is needed to get the underscore methods.
17 from mjo
.cone
.cone
import *
20 # Tests for _restrict_to_space.
22 def _look_isomorphic(K1
, K2
):
24 Test whether or not ``K1`` and ``K2`` look linearly isomorphic.
26 This is a hack to get around the fact that it's difficult to tell
27 when two cones are linearly isomorphic. Instead, we check a list of
28 properties that should be preserved under linear isomorphism.
32 ``True`` if ``K1`` and ``K2`` look isomorphic, or ``False``
33 if we can prove that they are not isomorphic.
37 Any proper cone with three generators in `\mathbb{R}^{3}` is
38 isomorphic to the nonnegative orthant::
40 sage: K1 = Cone([(1,0,0), (0,1,0), (0,0,1)])
41 sage: K2 = Cone([(1,2,3), (3, 18, 4), (66, 51, 0)])
42 sage: _look_isomorphic(K1, K2)
45 Negating a cone gives you an isomorphic cone::
47 sage: K = Cone([(0,2,-5), (-6, 2, 4), (0, 51, 0)])
48 sage: _look_isomorphic(K, -K)
53 Any cone is isomorphic to itself::
55 sage: K = random_cone(max_ambient_dim = 8)
56 sage: _look_isomorphic(K, K)
59 After applying an invertible matrix to the rows of a cone, the
60 result should is isomorphic to the cone we started with::
62 sage: K1 = random_cone(max_ambient_dim = 8)
63 sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular')
64 sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice())
65 sage: _look_isomorphic(K1, K2)
69 if K1
.lattice_dim() != K2
.lattice_dim():
72 if K1
.nrays() != K2
.nrays():
75 if K1
.dim() != K2
.dim():
78 if K1
.lineality() != K2
.lineality():
81 if K1
.is_solid() != K2
.is_solid():
84 if K1
.is_strictly_convex() != K2
.is_strictly_convex():
87 if len(K1
.lyapunov_like_basis()) != len(K2
.lyapunov_like_basis()):
90 C_of_K1
= K1
.discrete_complementarity_set()
91 C_of_K2
= K2
.discrete_complementarity_set()
92 if len(C_of_K1
) != len(C_of_K2
):
95 if len(K1
.facets()) != len(K2
.facets()):
102 Apply _restrict_to_space according to our paper (to obtain our main
103 result). Test all four parameter combinations::
105 sage: set_random_seed()
106 sage: K = random_cone(max_ambient_dim = 8,
107 ....: strictly_convex=False,
109 sage: K_S = K._restrict_to_space(K.span())
110 sage: K_SP = K_S.dual()._restrict_to_space(K_S.dual().span()).dual()
111 sage: K_SP.is_proper()
113 sage: K_SP = K_S._restrict_to_space(K_S.dual().span())
114 sage: K_SP.is_proper()
119 sage: set_random_seed()
120 sage: K = random_cone(max_ambient_dim = 8,
121 ....: strictly_convex=True,
123 sage: K_S = K._restrict_to_space(K.span())
124 sage: K_SP = K_S.dual()._restrict_to_space(K_S.dual().span()).dual()
125 sage: K_SP.is_proper()
127 sage: K_SP = K_S._restrict_to_space(K_S.dual().span())
128 sage: K_SP.is_proper()
133 sage: set_random_seed()
134 sage: K = random_cone(max_ambient_dim = 8,
135 ....: strictly_convex=False,
137 sage: K_S = K._restrict_to_space(K.span())
138 sage: K_SP = K_S.dual()._restrict_to_space(K_S.dual().span()).dual()
139 sage: K_SP.is_proper()
141 sage: K_SP = K_S._restrict_to_space(K_S.dual().span())
142 sage: K_SP.is_proper()
147 sage: set_random_seed()
148 sage: K = random_cone(max_ambient_dim = 8,
149 ....: strictly_convex=True,
151 sage: K_S = K._restrict_to_space(K.span())
152 sage: K_SP = K_S.dual()._restrict_to_space(K_S.dual().span()).dual()
153 sage: K_SP.is_proper()
155 sage: K_SP = K_S._restrict_to_space(K_S.dual().span())
156 sage: K_SP.is_proper()
159 Test the proposition in our paper concerning the duals and
160 restrictions. Generate a random cone, then create a subcone of
161 it. The operation of dual-taking should then commute with rho. Test
162 all parameter combinations::
165 sage: set_random_seed()
166 sage: J = random_cone(max_ambient_dim = 8,
168 ....: strictly_convex=False)
169 sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
170 sage: K_W_star = K._restrict_to_space(J.span()).dual()
171 sage: K_star_W = K.dual()._restrict_to_space(J.span())
172 sage: _look_isomorphic(K_W_star, K_star_W)
177 sage: set_random_seed()
178 sage: J = random_cone(max_ambient_dim = 8,
180 ....: strictly_convex=False)
181 sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
182 sage: K_W_star = K._restrict_to_space(J.span()).dual()
183 sage: K_star_W = K.dual()._restrict_to_space(J.span())
184 sage: _look_isomorphic(K_W_star, K_star_W)
189 sage: set_random_seed()
190 sage: J = random_cone(max_ambient_dim = 8,
192 ....: strictly_convex=True)
193 sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
194 sage: K_W_star = K._restrict_to_space(J.span()).dual()
195 sage: K_star_W = K.dual()._restrict_to_space(J.span())
196 sage: _look_isomorphic(K_W_star, K_star_W)
201 sage: set_random_seed()
202 sage: J = random_cone(max_ambient_dim = 8,
204 ....: strictly_convex=True)
205 sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
206 sage: K_W_star = K._restrict_to_space(J.span()).dual()
207 sage: K_star_W = K.dual()._restrict_to_space(J.span())
208 sage: _look_isomorphic(K_W_star, K_star_W)
215 # Lyapunov rank tests
219 The Lyapunov rank is invariant under a linear isomorphism. Check all
220 combinations of parameters::
222 sage: K1 = random_cone(max_ambient_dim=8,
223 ....: strictly_convex=True,
225 sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular')
226 sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice())
227 sage: K1.lyapunov_rank() == K2.lyapunov_rank()
232 sage: K1 = random_cone(max_ambient_dim=8,
233 ....: strictly_convex=True,
235 sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular')
236 sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice())
237 sage: K1.lyapunov_rank() == K2.lyapunov_rank()
242 sage: K1 = random_cone(max_ambient_dim=8,
243 ....: strictly_convex=False,
245 sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular')
246 sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice())
247 sage: K1.lyapunov_rank() == K2.lyapunov_rank()
252 sage: K1 = random_cone(max_ambient_dim=8,
253 ....: strictly_convex=False,
255 sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular')
256 sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice())
257 sage: K1.lyapunov_rank() == K2.lyapunov_rank()
260 The Lyapunov rank of a dual cone should be the same as the original
261 cone. Check all combinations of parameters::
263 sage: set_random_seed()
264 sage: K = random_cone(max_ambient_dim=8,
265 ....: strictly_convex=False,
267 sage: K.lyapunov_rank() == K.dual().lyapunov_rank()
272 sage: set_random_seed()
273 sage: K = random_cone(max_ambient_dim=8,
274 ....: strictly_convex=False,
276 sage: K.lyapunov_rank() == K.dual().lyapunov_rank()
281 sage: set_random_seed()
282 sage: K = random_cone(max_ambient_dim=8,
283 ....: strictly_convex=True,
285 sage: K.lyapunov_rank() == K.dual().lyapunov_rank()
290 sage: set_random_seed()
291 sage: K = random_cone(max_ambient_dim=8,
292 ....: strictly_convex=True,
294 sage: K.lyapunov_rank() == K.dual().lyapunov_rank()
297 The Lyapunov rank of a cone ``K`` is the dimension of
298 ``K.lyapunov_like_basis()``. Check all combinations of parameters::
300 sage: set_random_seed()
301 sage: K = random_cone(max_ambient_dim=8,
302 ....: strictly_convex=True,
304 sage: K.lyapunov_rank() == len(K.lyapunov_like_basis())
309 sage: set_random_seed()
310 sage: K = random_cone(max_ambient_dim=8,
311 ....: strictly_convex=True,
313 sage: K.lyapunov_rank() == len(K.lyapunov_like_basis())
318 sage: set_random_seed()
319 sage: K = random_cone(max_ambient_dim=8,
320 ....: strictly_convex=False,
322 sage: K.lyapunov_rank() == len(K.lyapunov_like_basis())
327 sage: set_random_seed()
328 sage: K = random_cone(max_ambient_dim=8,
329 ....: strictly_convex=False,
331 sage: K.lyapunov_rank() == len(K.lyapunov_like_basis())