]> gitweb.michael.orlitzky.com - sage.d.git/blobdiff - mjo/cone/completely_positive.py
mjo/cone/completely_positive.py: add completely_positive_operators_gens().
[sage.d.git] / mjo / cone / completely_positive.py
index ac5f14435713b4b524c53a2e1c73607ee004b323..15be5587cca1e85f50121fd020eb727fda568c36 100644 (file)
@@ -5,14 +5,10 @@ the set of all matrices `$A$`of the form `$\sum uu^{T}$` for `$u \in
 `$X$` are nonnegative.
 """
 
-# Sage doesn't load ~/.sage/init.sage during testing (sage -t), so we
-# have to explicitly mangle our sitedir here so that "mjo.cone"
-# resolves.
-from os.path import abspath
-from site import addsitedir
-addsitedir(abspath('../../'))
+from sage.all import *
 from mjo.cone.symmetric_psd import factor_psd, is_symmetric_psd
-from mjo.cone.doubly_nonnegative import is_doubly_nonnegative, is_extreme_doubly_nonnegative
+from mjo.cone.doubly_nonnegative import (is_doubly_nonnegative,
+                                         is_extreme_doubly_nonnegative)
 
 def is_completely_positive(A):
     """
@@ -30,6 +26,10 @@ def is_completely_positive(A):
     Either ``True`` if ``A`` is completely positive, or ``False``
     otherwise.
 
+    SETUP::
+
+        sage: from mjo.cone.completely_positive import is_completely_positive
+
     EXAMPLES:
 
     Generate an extreme completely positive matrix and check that we
@@ -124,6 +124,10 @@ def is_extreme_completely_positive(A):
     1. Berman, Abraham and Shaked-Monderer, Naomi. Completely Positive
        Matrices. World Scientific, 2003.
 
+    SETUP::
+
+        sage: from mjo.cone.completely_positive import is_extreme_completely_positive
+
     EXAMPLES:
 
     Generate an extreme completely positive matrix and check that we
@@ -191,3 +195,57 @@ def is_extreme_completely_positive(A):
     # factorization into `$XX^{T}$` may not be unique!
     raise ValueError('Unable to determine extremity of ``A``.')
 
+
+
+def completely_positive_operators_gens(K):
+    r"""
+    Return a list of generators (matrices) for the completely-positive
+    cone of ``K``.
+
+    INPUT:
+
+    - ``K`` -- a closed convex rational polyhedral cone.
+
+    OUTPUT:
+
+    A list of matrices, the conic hull of which is the
+    completely-positive cone of ``K``.
+
+    SETUP::
+
+        sage: from mjo.cone.completely_positive import (
+        ....:   completely_positive_operators_gens,
+        ....:   is_completely_positive )
+        sage: from mjo.cone.nonnegative_orthant import nonnegative_orthant
+        sage: from mjo.matrix_vector import isomorphism
+
+    EXAMPLES::
+
+        sage: K = nonnegative_orthant(2)
+        sage: completely_positive_operators_gens(K)
+        [
+        [1 0]  [0 0]
+        [0 0], [0 1]
+        ]
+        sage: all( is_completely_positive(M)
+        ....:      for M in completely_positive_operators_gens(K) )
+        True
+
+    TESTS:
+
+    The completely-positive cone of ``K`` is subdual::
+
+       sage: K = random_cone(max_ambient_dim=8, max_rays=10)
+       sage: cp_gens = completely_positive_operators_gens(K)
+       sage: n = K.lattice_dim()
+       sage: M = MatrixSpace(QQ, n, n)
+       sage: (p, p_inv) = isomorphism(M)
+       sage: L = ToricLattice(n**2)
+       sage: cp_cone = Cone( (p(m) for m in cp_gens), lattice=L )
+       sage: copos_cone = Cone(cp_cone.dual().rays(), lattice=L )
+       sage: all( x in copos_cone for x in cp_cone )
+       True
+
+    """
+    return [ x.tensor_product(x) for x in K ]
+