X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=mjo%2Fcone%2Fcompletely_positive.py;h=15be5587cca1e85f50121fd020eb727fda568c36;hb=3d6ec3f4f138a6278be4f393b491aa1ac2bbffa8;hp=ac5f14435713b4b524c53a2e1c73607ee004b323;hpb=46c389b0eafe43e54afc9f81f855bfb5f889d25d;p=sage.d.git diff --git a/mjo/cone/completely_positive.py b/mjo/cone/completely_positive.py index ac5f144..15be558 100644 --- a/mjo/cone/completely_positive.py +++ b/mjo/cone/completely_positive.py @@ -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 ] +