From cca6df801932a33628f734514b3cbc14dab70477 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Mon, 13 Feb 2017 13:15:09 -0500 Subject: [PATCH] Add another test and an implementation comment for is_lyapunov_like_on. --- mjo/cone/cone.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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() ]) -- 2.43.2