]>
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 *
18 from mjo
.cone
.cone
import _restrict_to_space
21 # Tests for _restrict_to_space.
23 def _look_isomorphic(K1
, K2
):
25 Test whether or not ``K1`` and ``K2`` look linearly isomorphic.
27 This is a hack to get around the fact that it's difficult to tell
28 when two cones are linearly isomorphic. Instead, we check a list of
29 properties that should be preserved under linear isomorphism.
33 ``True`` if ``K1`` and ``K2`` look isomorphic, or ``False``
34 if we can prove that they are not isomorphic.
38 Any proper cone with three generators in `\mathbb{R}^{3}` is
39 isomorphic to the nonnegative orthant::
41 sage: K1 = Cone([(1,0,0), (0,1,0), (0,0,1)])
42 sage: K2 = Cone([(1,2,3), (3, 18, 4), (66, 51, 0)])
43 sage: _look_isomorphic(K1, K2)
46 Negating a cone gives you an isomorphic cone::
48 sage: K = Cone([(0,2,-5), (-6, 2, 4), (0, 51, 0)])
49 sage: _look_isomorphic(K, -K)
54 Any cone is isomorphic to itself::
56 sage: K = random_cone(max_ambient_dim = 8)
57 sage: _look_isomorphic(K, K)
60 After applying an invertible matrix to the rows of a cone, the
61 result should is isomorphic to the cone we started with::
63 sage: K1 = random_cone(max_ambient_dim = 8)
64 sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular')
65 sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice())
66 sage: _look_isomorphic(K1, K2)
70 if K1
.lattice_dim() != K2
.lattice_dim():
73 if K1
.nrays() != K2
.nrays():
76 if K1
.dim() != K2
.dim():
79 if K1
.lineality() != K2
.lineality():
82 if K1
.is_solid() != K2
.is_solid():
85 if K1
.is_strictly_convex() != K2
.is_strictly_convex():
88 if len(K1
.lyapunov_like_basis()) != len(K2
.lyapunov_like_basis()):
91 C_of_K1
= K1
.discrete_complementarity_set()
92 C_of_K2
= K2
.discrete_complementarity_set()
93 if len(C_of_K1
) != len(C_of_K2
):
96 if len(K1
.facets()) != len(K2
.facets()):
103 Apply _restrict_to_space according to our paper (to obtain our main
104 result). Test all four parameter combinations::
106 sage: set_random_seed()
107 sage: K = random_cone(max_ambient_dim = 8,
108 ....: strictly_convex=False,
110 sage: K_S = _restrict_to_space(K, K.span())
111 sage: K_SP = _restrict_to_space(K_S.dual(), K_S.dual().span()).dual()
112 sage: K_SP.is_proper()
114 sage: K_SP = _restrict_to_space(K_S, K_S.dual().span())
115 sage: K_SP.is_proper()
120 sage: set_random_seed()
121 sage: K = random_cone(max_ambient_dim = 8,
122 ....: strictly_convex=True,
124 sage: K_S = _restrict_to_space(K, K.span())
125 sage: K_SP = _restrict_to_space(K_S.dual(), K_S.dual().span()).dual()
126 sage: K_SP.is_proper()
128 sage: K_SP = _restrict_to_space(K_S, K_S.dual().span())
129 sage: K_SP.is_proper()
134 sage: set_random_seed()
135 sage: K = random_cone(max_ambient_dim = 8,
136 ....: strictly_convex=False,
138 sage: K_S = _restrict_to_space(K, K.span())
139 sage: K_SP = _restrict_to_space(K_S.dual(), K_S.dual().span()).dual()
140 sage: K_SP.is_proper()
142 sage: K_SP = _restrict_to_space(K_S, K_S.dual().span())
143 sage: K_SP.is_proper()
148 sage: set_random_seed()
149 sage: K = random_cone(max_ambient_dim = 8,
150 ....: strictly_convex=True,
152 sage: K_S = _restrict_to_space(K, K.span())
153 sage: K_SP = _restrict_to_space(K_S.dual(), K_S.dual().span()).dual()
154 sage: K_SP.is_proper()
156 sage: K_SP = _restrict_to_space(K_S, K_S.dual().span())
157 sage: K_SP.is_proper()
160 Test the proposition in our paper concerning the duals and
161 restrictions. Generate a random cone, then create a subcone of
162 it. The operation of dual-taking should then commute with rho. Test
163 all parameter combinations::
166 sage: set_random_seed()
167 sage: J = random_cone(max_ambient_dim = 8,
169 ....: strictly_convex=False)
170 sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
171 sage: K_W_star = _restrict_to_space(K, J.span()).dual()
172 sage: K_star_W = _restrict_to_space(K.dual(), J.span())
173 sage: _look_isomorphic(K_W_star, K_star_W)
178 sage: set_random_seed()
179 sage: J = random_cone(max_ambient_dim = 8,
181 ....: strictly_convex=False)
182 sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
183 sage: K_W_star = _restrict_to_space(K, J.span()).dual()
184 sage: K_star_W = _restrict_to_space(K.dual(), J.span())
185 sage: _look_isomorphic(K_W_star, K_star_W)
190 sage: set_random_seed()
191 sage: J = random_cone(max_ambient_dim = 8,
193 ....: strictly_convex=True)
194 sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
195 sage: K_W_star = _restrict_to_space(K, J.span()).dual()
196 sage: K_star_W = _restrict_to_space(K.dual(), J.span())
197 sage: _look_isomorphic(K_W_star, K_star_W)
202 sage: set_random_seed()
203 sage: J = random_cone(max_ambient_dim = 8,
205 ....: strictly_convex=True)
206 sage: K = Cone(random_sublist(J.rays(), 0.5), lattice=J.lattice())
207 sage: K_W_star = _restrict_to_space(K, J.span()).dual()
208 sage: K_star_W = _restrict_to_space(K.dual(), J.span())
209 sage: _look_isomorphic(K_W_star, K_star_W)
216 # Lyapunov rank tests
220 The Lyapunov rank is invariant under a linear isomorphism. Check all
221 combinations of parameters::
223 sage: K1 = random_cone(max_ambient_dim=8,
224 ....: strictly_convex=True,
226 sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular')
227 sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice())
228 sage: lyapunov_rank(K1) == lyapunov_rank(K2)
233 sage: K1 = random_cone(max_ambient_dim=8,
234 ....: strictly_convex=True,
236 sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular')
237 sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice())
238 sage: lyapunov_rank(K1) == lyapunov_rank(K2)
243 sage: K1 = random_cone(max_ambient_dim=8,
244 ....: strictly_convex=False,
246 sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular')
247 sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice())
248 sage: lyapunov_rank(K1) == lyapunov_rank(K2)
253 sage: K1 = random_cone(max_ambient_dim=8,
254 ....: strictly_convex=False,
256 sage: A = random_matrix(QQ, K1.lattice_dim(), algorithm='unimodular')
257 sage: K2 = Cone( [ A*r for r in K1.rays() ], lattice=K1.lattice())
258 sage: lyapunov_rank(K1) == lyapunov_rank(K2)
261 The Lyapunov rank of a dual cone should be the same as the original
262 cone. Check all combinations of parameters::
264 sage: set_random_seed()
265 sage: K = random_cone(max_ambient_dim=8,
266 ....: strictly_convex=False,
268 sage: lyapunov_rank(K) == lyapunov_rank(K.dual())
273 sage: set_random_seed()
274 sage: K = random_cone(max_ambient_dim=8,
275 ....: strictly_convex=False,
277 sage: lyapunov_rank(K) == lyapunov_rank(K.dual())
282 sage: set_random_seed()
283 sage: K = random_cone(max_ambient_dim=8,
284 ....: strictly_convex=True,
286 sage: lyapunov_rank(K) == lyapunov_rank(K.dual())
291 sage: set_random_seed()
292 sage: K = random_cone(max_ambient_dim=8,
293 ....: strictly_convex=True,
295 sage: lyapunov_rank(K) == lyapunov_rank(K.dual())
298 The Lyapunov rank of a cone ``K`` is the dimension of
299 ``K.lyapunov_like_basis()``. Check all combinations of parameters::
301 sage: set_random_seed()
302 sage: K = random_cone(max_ambient_dim=8,
303 ....: strictly_convex=True,
305 sage: lyapunov_rank(K) == len(K.lyapunov_like_basis())
310 sage: set_random_seed()
311 sage: K = random_cone(max_ambient_dim=8,
312 ....: strictly_convex=True,
314 sage: lyapunov_rank(K) == len(K.lyapunov_like_basis())
319 sage: set_random_seed()
320 sage: K = random_cone(max_ambient_dim=8,
321 ....: strictly_convex=False,
323 sage: lyapunov_rank(K) == len(K.lyapunov_like_basis())
328 sage: set_random_seed()
329 sage: K = random_cone(max_ambient_dim=8,
330 ....: strictly_convex=False,
332 sage: lyapunov_rank(K) == len(K.lyapunov_like_basis())