X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Fcone%2Ffaces.py;h=acd9802c0ee953d28723da484c148ccd7b4a0b6d;hb=a339e89c225bb46379332ecb8b0c50b918d34ac6;hp=ee16890dd6234cd0003cc0e8e9448674668386f5;hpb=d3561bfcfea6f26e5942e6e49992bf34efc24b5c;p=sage.d.git diff --git a/mjo/cone/faces.py b/mjo/cone/faces.py index ee16890..acd9802 100644 --- a/mjo/cone/faces.py +++ b/mjo/cone/faces.py @@ -53,7 +53,7 @@ def face_generated_by(K,S): sage: set_random_seed() sage: K = random_cone(max_ambient_dim=8, max_rays=10) - sage: S = [K.random_element() for idx in range(0,5)] + sage: S = ( K.random_element() for idx in range(5) ) sage: F = face_generated_by(K, S) sage: F.is_face_of(K) True @@ -62,9 +62,9 @@ def face_generated_by(K,S): sage: set_random_seed() sage: K = random_cone(max_ambient_dim=8, max_rays=10) - sage: S = [K.random_element() for idx in range(0,5)] + sage: S = ( K.random_element() for idx in range(5) ) sage: F = face_generated_by(K, S) - sage: all([F.contains(x) for x in S]) + sage: all(F.contains(x) for x in S) True The generators of a proper cone are all extreme vectors of the cone, @@ -75,7 +75,7 @@ def face_generated_by(K,S): ....: max_rays=10, ....: strictly_convex=True, ....: solid=True) - sage: all([face_generated_by(K, [r]) == Cone([r]) for r in K]) + sage: all(face_generated_by(K, [r]) == Cone([r]) for r in K) True For any point ``x`` in ``K`` and any face ``F`` of ``K``, we have @@ -123,7 +123,7 @@ def face_generated_by(K,S): """ face_lattice = K.face_lattice() - candidates = [F for F in face_lattice if all([F.contains(x) for x in S])] + candidates = [F for F in face_lattice if all(F.contains(x) for x in S)] # K itself is a face of K, so unless we were given a set S that # isn't a subset of K, the candidates list will be nonempty. @@ -143,6 +143,10 @@ def dual_face(K,F): REFERENCES: + .. [HilgertHofmannLawson] Joachim Hilgert, Karl Heinrich Hofmann, and Jimmie + D. Lawson. Lie groups, convex cones and semigroups. Oxford Mathematical + Monographs. Clarendon Press, Oxford, 1989. ISBN 9780198535690. + .. [Tam] Bit-Shun Tam. On the duality operator of a convex cone. Linear Algebra and its Applications, 64:33-56, 1985, doi:10.1016/0024-3795(85) 90265-4. @@ -171,7 +175,7 @@ def dual_face(K,F): sage: set_random_seed() sage: K = random_cone(max_ambient_dim=8, max_rays=10) sage: K_dual = K.dual() - sage: lKd_gens = [ dir*l for dir in [1,-1] for l in K_dual.lines() ] + sage: lKd_gens = ( dir*l for dir in [1,-1] for l in K_dual.lines() ) sage: linspace_K_dual = Cone(lKd_gens, K_dual.lattice()) sage: dual_face(K,K).is_equivalent(linspace_K_dual) True @@ -202,10 +206,20 @@ def dual_face(K,F): sage: points_cone.dual().is_equivalent(dual_face(K, phi_y)) True + Since all faces of a polyhedral cone are exposed, the dual face of a + dual face should be the original face [HilgertHofmannLawson]_:: + + sage: set_random_seed() + sage: def check_prop(K,F): + ....: return dual_face(K.dual(), dual_face(K,F)).is_equivalent(F) + sage: K = random_cone(max_ambient_dim=8, max_rays=10) + sage: all(check_prop(K,F) for F in K.face_lattice()) + True + """ # Ensure that F is actually a face of K before continuing. if not F.is_face_of(K): raise ValueError("%s is not a face of %s" % (F,K)) - span_F = Cone([c*g for c in [1,-1] for g in F], F.lattice()) + span_F = Cone((c*g for c in [1,-1] for g in F), F.lattice()) return K.dual().intersection(span_F.dual())