From ef21e03efdad7f813b15fbcf2f53fccae3c81083 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Sat, 6 Feb 2016 15:51:38 -0500 Subject: [PATCH] Change "Z-transformation" to "Z-operator". --- mjo/cone/cone.py | 82 +++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/mjo/cone/cone.py b/mjo/cone/cone.py index 6661402..3b3a028 100644 --- a/mjo/cone/cone.py +++ b/mjo/cone/cone.py @@ -87,7 +87,7 @@ def positive_operator_gens(K): .. [Orlitzky-Pi-Z] M. Orlitzky. - Positive operators and Z-transformations on closed convex cones. + Positive and Z-operators on closed convex cones. .. [Tam] B.-S. Tam. @@ -430,9 +430,9 @@ def positive_operator_gens(K): return [ M(v.list()) for v in pi_cone ] -def Z_transformation_gens(K): +def Z_operator_gens(K): r""" - Compute generators of the cone of Z-transformations on this cone. + Compute generators of the cone of Z-operators on this cone. OUTPUT: @@ -446,88 +446,88 @@ def Z_transformation_gens(K): REFERENCES: M. Orlitzky. - Positive operators and Z-transformations on closed convex cones. + Positive and Z-operators on closed convex cones. EXAMPLES: - Z-transformations on the nonnegative orthant are just Z-matrices. + Z-operators on the nonnegative orthant are just Z-matrices. That is, matrices whose off-diagonal elements are nonnegative:: sage: K = Cone([(1,0),(0,1)]) - sage: Z_transformation_gens(K) + sage: Z_operator_gens(K) [ [ 0 -1] [ 0 0] [-1 0] [1 0] [ 0 0] [0 0] [ 0 0], [-1 0], [ 0 0], [0 0], [ 0 -1], [0 1] ] sage: K = Cone([(1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1)]) - sage: all([ z[i][j] <= 0 for z in Z_transformation_gens(K) + sage: all([ z[i][j] <= 0 for z in Z_operator_gens(K) ....: for i in range(z.nrows()) ....: for j in range(z.ncols()) ....: if i != j ]) True - The trivial cone in a trivial space has no Z-transformations:: + The trivial cone in a trivial space has no Z-operators:: sage: K = Cone([], ToricLattice(0)) - sage: Z_transformation_gens(K) + sage: Z_operator_gens(K) [] - Every operator is a Z-transformation on the ambient vector space:: + Every operator is a Z-operator on the ambient vector space:: sage: K = Cone([(1,),(-1,)]) sage: K.is_full_space() True - sage: Z_transformation_gens(K) + sage: Z_operator_gens(K) [[-1], [1]] sage: K = Cone([(1,0),(-1,0),(0,1),(0,-1)]) sage: K.is_full_space() True - sage: Z_transformation_gens(K) + sage: Z_operator_gens(K) [ [-1 0] [1 0] [ 0 -1] [0 1] [ 0 0] [0 0] [ 0 0] [0 0] [ 0 0], [0 0], [ 0 0], [0 0], [-1 0], [1 0], [ 0 -1], [0 1] ] - A non-obvious application is to find the Z-transformations on the + A non-obvious application is to find the Z-operators on the right half-plane:: sage: K = Cone([(1,0),(0,1),(0,-1)]) - sage: Z_transformation_gens(K) + sage: Z_operator_gens(K) [ [-1 0] [1 0] [ 0 0] [0 0] [ 0 0] [0 0] [ 0 0], [0 0], [-1 0], [1 0], [ 0 -1], [0 1] ] - Z-transformations on a subspace are Lyapunov-like and vice-versa:: + Z-operators on a subspace are Lyapunov-like and vice-versa:: sage: K = Cone([(1,0),(-1,0),(0,1),(0,-1)]) sage: K.is_full_space() True sage: lls = span([ vector(l.list()) for l in K.lyapunov_like_basis() ]) - sage: zs = span([ vector(z.list()) for z in Z_transformation_gens(K) ]) + sage: zs = span([ vector(z.list()) for z in Z_operator_gens(K) ]) sage: zs == lls True TESTS: - The Z-property is possessed by every Z-transformation:: + The Z-property is possessed by every Z-operator:: sage: set_random_seed() sage: K = random_cone(max_ambient_dim=4) - sage: Z_of_K = Z_transformation_gens(K) + sage: Z_of_K = Z_operator_gens(K) sage: dcs = K.discrete_complementarity_set() sage: all([(z*x).inner_product(s) <= 0 for z in Z_of_K ....: for (x,s) in dcs]) True - The lineality space of the cone of Z-transformations is the space of - Lyapunov-like transformations:: + The lineality space of the cone of Z-operators is the space of + Lyapunov-like operators:: sage: set_random_seed() sage: K = random_cone(max_ambient_dim=4) sage: L = ToricLattice(K.lattice_dim()**2) - sage: Z_cone = Cone([ z.list() for z in Z_transformation_gens(K) ], + sage: Z_cone = Cone([ z.list() for z in Z_operator_gens(K) ], ....: lattice=L, ....: check=False) sage: ll_basis = [ vector(l.list()) for l in K.lyapunov_like_basis() ] @@ -535,12 +535,12 @@ def Z_transformation_gens(K): sage: Z_cone.linear_subspace() == lls True - The lineality of the Z-transformations on a cone is the Lyapunov + The lineality of the Z-operators on a cone is the Lyapunov rank of that cone:: sage: set_random_seed() sage: K = random_cone(max_ambient_dim=4) - sage: Z_of_K = Z_transformation_gens(K) + sage: Z_of_K = Z_operator_gens(K) sage: L = ToricLattice(K.lattice_dim()**2) sage: Z_cone = Cone([ z.list() for z in Z_of_K ], ....: lattice=L, @@ -548,15 +548,14 @@ def Z_transformation_gens(K): sage: Z_cone.lineality() == K.lyapunov_rank() True - The lineality spaces of the duals of the positive operator and - Z-transformation cones are equal. From this it follows that the - dimensions of the Z-transformation cone and positive operator cone - are equal:: + The lineality spaces of the duals of the positive and Z-operator + cones are equal. From this it follows that the dimensions of the + Z-operator cone and positive operator cone are equal:: sage: set_random_seed() sage: K = random_cone(max_ambient_dim=4) sage: pi_of_K = positive_operator_gens(K) - sage: Z_of_K = Z_transformation_gens(K) + sage: Z_of_K = Z_operator_gens(K) sage: L = ToricLattice(K.lattice_dim()**2) sage: pi_cone = Cone([p.list() for p in pi_of_K], ....: lattice=L, @@ -579,7 +578,7 @@ def Z_transformation_gens(K): sage: K.is_trivial() True sage: L = ToricLattice(n^2) - sage: Z_of_K = Z_transformation_gens(K) + sage: Z_of_K = Z_operator_gens(K) sage: Z_cone = Cone([z.list() for z in Z_of_K], ....: lattice=L, ....: check=False) @@ -589,7 +588,7 @@ def Z_transformation_gens(K): sage: K = K.dual() sage: K.is_full_space() True - sage: Z_of_K = Z_transformation_gens(K) + sage: Z_of_K = Z_operator_gens(K) sage: Z_cone = Cone([z.list() for z in Z_of_K], ....: lattice=L, ....: check=False) @@ -597,32 +596,31 @@ def Z_transformation_gens(K): sage: actual == n^2 True sage: K = Cone([(1,0),(0,1),(0,-1)]) - sage: Z_of_K = Z_transformation_gens(K) + sage: Z_of_K = Z_operator_gens(K) sage: Z_cone = Cone([z.list() for z in Z_of_K], check=False) sage: Z_cone.dim() == 3 True - The Z-transformations of a permuted cone can be obtained by - conjugation:: + The Z-operators of a permuted cone can be obtained by conjugation:: sage: set_random_seed() sage: K = random_cone(max_ambient_dim=4) sage: L = ToricLattice(K.lattice_dim()**2) sage: p = SymmetricGroup(K.lattice_dim()).random_element().matrix() sage: pK = Cone([ p*k for k in K ], K.lattice(), check=False) - sage: Z_of_pK = Z_transformation_gens(pK) + sage: Z_of_pK = Z_operator_gens(pK) sage: actual = Cone([t.list() for t in Z_of_pK], ....: lattice=L, ....: check=False) - sage: Z_of_K = Z_transformation_gens(K) + sage: Z_of_K = Z_operator_gens(K) sage: expected = Cone([(p*t*p.inverse()).list() for t in Z_of_K], ....: lattice=L, ....: check=False) sage: actual.is_equivalent(expected) True - A transformation is a Z-transformation on a cone if and only if its - adjoint is a Z-transformation on the dual of that cone:: + An operator is a Z-operator on a cone if and only if its + adjoint is a Z-operator on the dual of that cone:: sage: set_random_seed() sage: K = random_cone(max_ambient_dim=4) @@ -630,8 +628,8 @@ def Z_transformation_gens(K): sage: n = K.lattice_dim() sage: L = ToricLattice(n**2) sage: W = VectorSpace(F, n**2) - sage: Z_of_K = Z_transformation_gens(K) - sage: Z_of_K_star = Z_transformation_gens(K.dual()) + sage: Z_of_K = Z_operator_gens(K) + sage: Z_of_K_star = Z_operator_gens(K.dual()) sage: Z_cone = Cone([p.list() for p in Z_of_K], ....: lattice=L, ....: check=False) @@ -655,7 +653,7 @@ def Z_transformation_gens(K): n = K.lattice_dim() # These tensor products contain generators for the dual cone of - # the cross-positive transformations. + # the cross-positive operators. tensor_products = [ s.tensor_product(x) for (x,s) in K.discrete_complementarity_set() ] @@ -680,14 +678,14 @@ def Z_transformation_gens(K): Sigma_cone = Sigma_dual.dual() # And finally convert its rays back to matrix representations. - # But first, make them negative, so we get Z-transformations and + # But first, make them negative, so we get Z-operators and # not cross-positive ones. M = MatrixSpace(F, n) return [ -M(v.list()) for v in Sigma_cone ] def Z_cone(K): - gens = Z_transformation_gens(K) + gens = Z_operator_gens(K) L = ToricLattice(K.lattice_dim()**2) return Cone([ g.list() for g in gens ], lattice=L, check=False) -- 2.44.2