- """
- phi_domain = K.sublattice().vector_space()
- phi_codo = VectorSpace(phi_domain.base_field(), phi_domain.dimension())
-
- # S goes from the new space to the cone space.
- S = linear_transformation(phi_codo, phi_domain, phi_domain.basis())
-
- # phi goes from the cone space to the new space.
- def phi(J_orig):
- r"""
- Takes a cone ``J`` and sends it into the new space.
- """
- newrays = map(S.inverse(), J_orig.rays())
- L = None
- if len(newrays) == 0:
- L = ToricLattice(0)
-
- return Cone(newrays, lattice=L)
-
- def phi_inverse(J_sub):
- r"""
- The inverse to phi which goes from the new space to the cone space.
- """
- newrays = map(S, J_sub.rays())
- return Cone(newrays, lattice=K.lattice())
-
-
- return (phi, phi_inverse)
-
-
-
-def discrete_complementarity_set(K):
- r"""
- Compute the discrete complementarity set of this cone.
-
- The complementarity set of this cone is the set of all orthogonal
- pairs `(x,s)` such that `x` is in this cone, and `s` is in its
- dual. The discrete complementarity set restricts `x` and `s` to be
- generators of their respective cones.
-
- OUTPUT:
-
- A list of pairs `(x,s)` such that,
-
- * `x` is in this cone.
- * `x` is a generator of this cone.
- * `s` is in this cone's dual.
- * `s` is a generator of this cone's dual.
- * `x` and `s` are orthogonal.
-
- 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)
- []
-
- TESTS: