From c751dadc58e972026f9bde474909fbe31ff2b0bb Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Thu, 1 Oct 2015 21:24:03 -0400 Subject: [PATCH] Remove the discrete_complementarity_set() function (into Sage proper). --- mjo/cone/cone.py | 108 +++-------------------------------------------- 1 file changed, 5 insertions(+), 103 deletions(-) diff --git a/mjo/cone/cone.py b/mjo/cone/cone.py index b4d2be0..f8b8791 100644 --- a/mjo/cone/cone.py +++ b/mjo/cone/cone.py @@ -79,8 +79,8 @@ def _basically_the_same(K1, K2): if len(LL(K1)) != len(LL(K2)): return False - C_of_K1 = discrete_complementarity_set(K1) - C_of_K2 = discrete_complementarity_set(K2) + 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 @@ -211,104 +211,6 @@ def _restrict_to_space(K, W): return Cone(K_W_rays, lattice=L) - -def discrete_complementarity_set(K): - r""" - Compute a discrete complementarity set of this cone. - - A discrete complementarity set of `K` is the set of all orthogonal - pairs `(x,s)` such that `x \in G_{1}` and `s \in G_{2}` for some - generating sets `G_{1}` of `K` and `G_{2}` of its dual. Polyhedral - convex cones are input in terms of their generators, so "the" (this - particular) discrete complementarity set corresponds to ``G1 - == K.rays()`` and ``G2 == K.dual().rays()``. - - OUTPUT: - - A list of pairs `(x,s)` such that, - - * Both `x` and `s` are vectors (not rays). - * `x` is one of ``K.rays()``. - * `s` is one of ``K.dual().rays()``. - * `x` and `s` are orthogonal. - - REFERENCES: - - .. [Orlitzky/Gowda] M. Orlitzky and M. S. Gowda. The Lyapunov Rank of an - Improper Cone. Work in-progress. - - EXAMPLES: - - The discrete complementarity set of the nonnegative orthant consists - of pairs of standard basis vectors:: - - sage: K = Cone([(1,0),(0,1)]) - sage: discrete_complementarity_set(K) - [((1, 0), (0, 1)), ((0, 1), (1, 0))] - - If the cone consists of a single ray, the second components of the - discrete complementarity set should generate the orthogonal - complement of that ray:: - - sage: K = Cone([(1,0)]) - sage: discrete_complementarity_set(K) - [((1, 0), (0, 1)), ((1, 0), (0, -1))] - sage: K = Cone([(1,0,0)]) - sage: discrete_complementarity_set(K) - [((1, 0, 0), (0, 1, 0)), - ((1, 0, 0), (0, -1, 0)), - ((1, 0, 0), (0, 0, 1)), - ((1, 0, 0), (0, 0, -1))] - - When the cone is the entire space, its dual is the trivial cone, so - the discrete complementarity set is empty:: - - sage: K = Cone([(1,0),(-1,0),(0,1),(0,-1)]) - sage: discrete_complementarity_set(K) - [] - - Likewise when this cone is trivial (its dual is the entire space):: - - sage: L = ToricLattice(0) - sage: K = Cone([], ToricLattice(0)) - sage: discrete_complementarity_set(K) - [] - - TESTS: - - The complementarity set of the dual can be obtained by switching the - components of the complementarity set of the original cone:: - - sage: set_random_seed() - sage: K1 = random_cone(max_ambient_dim=6) - sage: K2 = K1.dual() - sage: expected = [(x,s) for (s,x) in discrete_complementarity_set(K2)] - sage: actual = discrete_complementarity_set(K1) - sage: sorted(actual) == sorted(expected) - True - - The pairs in the discrete complementarity set are in fact - complementary:: - - sage: set_random_seed() - sage: K = random_cone(max_ambient_dim=6) - sage: dcs = discrete_complementarity_set(K) - sage: sum([x.inner_product(s).abs() for (x,s) in dcs]) - 0 - - """ - V = K.lattice().vector_space() - - # Convert rays to vectors so that we can compute inner products. - xs = [V(x) for x in K.rays()] - - # We also convert the generators of the dual cone so that we - # return pairs of vectors and not (vector, ray) pairs. - ss = [V(s) for s in K.dual().rays()] - - return [(x,s) for x in xs for s in ss if x.inner_product(s) == 0] - - def LL(K): r""" Compute a basis of Lyapunov-like transformations on this cone. @@ -384,7 +286,7 @@ def LL(K): sage: set_random_seed() sage: K = random_cone(max_ambient_dim=8) - sage: C_of_K = discrete_complementarity_set(K) + sage: C_of_K = K.discrete_complementarity_set() sage: l = [ (L*x).inner_product(s) for (x,s) in C_of_K for L in LL(K) ] sage: sum(map(abs, l)) 0 @@ -406,7 +308,7 @@ def LL(K): """ V = K.lattice().vector_space() - C_of_K = discrete_complementarity_set(K) + C_of_K = K.discrete_complementarity_set() tensor_products = [ s.tensor_product(x) for (x,s) in C_of_K ] @@ -748,7 +650,7 @@ def is_lyapunov_like(L,K): """ return all([(L*x).inner_product(s) == 0 - for (x,s) in discrete_complementarity_set(K)]) + for (x,s) in K.discrete_complementarity_set()]) def random_element(K): -- 2.44.2