+ 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 the space `\mathbf{LL}` of all Lyapunov-like transformations
+ on this cone.
+
+ OUTPUT:
+
+ A list of matrices forming a basis for the space of all
+ Lyapunov-like transformations on the given cone.
+
+ EXAMPLES:
+
+ The trivial cone has no Lyapunov-like transformations::
+
+ sage: L = ToricLattice(0)
+ sage: K = Cone([], lattice=L)
+ sage: LL(K)
+ []
+
+ The Lyapunov-like transformations on the nonnegative orthant are
+ simply diagonal matrices::
+
+ sage: K = Cone([(1,)])
+ sage: LL(K)
+ [[1]]
+
+ sage: K = Cone([(1,0),(0,1)])
+ sage: LL(K)
+ [
+ [1 0] [0 0]
+ [0 0], [0 1]
+ ]
+
+ sage: K = Cone([(1,0,0),(0,1,0),(0,0,1)])
+ sage: LL(K)
+ [
+ [1 0 0] [0 0 0] [0 0 0]
+ [0 0 0] [0 1 0] [0 0 0]
+ [0 0 0], [0 0 0], [0 0 1]
+ ]
+
+ Only the identity matrix is Lyapunov-like on the `L^{3}_{1}` and
+ `L^{3}_{\infty}` cones [Rudolf et al.]_::
+
+ sage: L31 = Cone([(1,0,1), (0,-1,1), (-1,0,1), (0,1,1)])
+ sage: LL(L31)
+ [
+ [1 0 0]
+ [0 1 0]
+ [0 0 1]
+ ]
+
+ sage: L3infty = Cone([(0,1,1), (1,0,1), (0,-1,1), (-1,0,1)])
+ sage: LL(L3infty)
+ [
+ [1 0 0]
+ [0 1 0]
+ [0 0 1]
+ ]
+
+ If our cone is the entire space, then every transformation on it is
+ Lyapunov-like::
+
+ sage: K = Cone([(1,0), (-1,0), (0,1), (0,-1)])
+ sage: M = MatrixSpace(QQ,2)
+ sage: M.basis() == LL(K)
+ True
+
+ TESTS: