From: Michael Orlitzky Date: Mon, 13 Feb 2017 18:15:09 +0000 (-0500) Subject: Add another test and an implementation comment for is_lyapunov_like_on. X-Git-Url: https://gitweb.michael.orlitzky.com/?a=commitdiff_plain;h=cca6df801932a33628f734514b3cbc14dab70477;p=sage.d.git Add another test and an implementation comment for is_lyapunov_like_on. --- diff --git a/mjo/cone/cone.py b/mjo/cone/cone.py index aeec0c9..0158757 100644 --- a/mjo/cone/cone.py +++ b/mjo/cone/cone.py @@ -422,12 +422,28 @@ def is_lyapunov_like_on(L,K): ... ValueError: The base ring of L is neither SR nor exact. + An operator is Lyapunov-like on a cone if and only if both the + operator and its negation are cross-positive on the cone:: + + sage: K = random_cone(max_ambient_dim=5) + sage: R = K.lattice().vector_space().base_ring() + sage: L = random_matrix(R, K.lattice_dim()) + sage: actual = is_lyapunov_like_on(L,K) # long time + sage: expected = (is_cross_positive_on(L,K) and # long time + ....: is_cross_positive_on(-L,K)) # long time + sage: actual == expected # long time + True + """ if not is_Cone(K): raise TypeError('K must be a Cone.') if not L.base_ring().is_exact() and not L.base_ring() is SR: raise ValueError('The base ring of L is neither SR nor exact.') + # Even though ``discrete_complementarity_set`` is a cached method + # of cones, this is faster than calling ``is_cross_positive_on`` + # twice: doing so checks twice as many inequalities as the number + # of equalities that we're about to check. return all([ s*(L*x) == 0 for (x,s) in K.discrete_complementarity_set() ])