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.
SETUP::
- sage: from mjo.cone.faces import dual_face
+ sage: from mjo.cone.faces import (dual_face, face_generated_by)
EXAMPLES:
sage: dual_face(K,trivial_face).is_equivalent(K.dual())
True
+ The dual of the cone of ``K`` at ``y`` is the dual face of the face
+ of ``K`` generated by ``y`` ([Tam]_ Corollary 3.2)::
+
+ sage: set_random_seed()
+ sage: K = random_cone(max_ambient_dim=8, max_rays=10)
+ sage: y = K.random_element()
+ sage: S = [y]
+ sage: phi_y = face_generated_by(K,S)
+ sage: points_cone_gens = list(K.rays()) + [-z for z in phi_y.rays()]
+ sage: points_cone = Cone(points_cone_gens, K.lattice())
+ 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):