
    xf-                     T   d Z dgZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ dd	l
mZ dd
l
mZ ddl
mZ ej                  ej                   ej"                  ej$                  dZej(                  ej*                  ej,                  ej.                  dZdddZ G d d      Z	 	 	 	 ddZy)a  
Python wrapper for PROPACK
--------------------------

PROPACK is a collection of Fortran routines for iterative computation
of partial SVDs of large matrices or linear operators.

Based on BSD licensed pypropack project:
  http://github.com/jakevdp/pypropack
  Author: Jake Vanderplas <vanderplas@astro.washington.edu>

PROPACK source is BSD licensed, and available at
  http://soi.stanford.edu/~rmunk/PROPACK/
_svdp    N)check_random_state)aslinearoperator)LinAlgError   )	_spropack)	_dpropack)	_cpropack)	_zpropack)fdFDLS)LMSMc                   <    e Zd ZdZd Zd Zed        Zed        Zy)_AProdz
    Wrapper class for linear operator

    The call signature of the __call__ method matches the callback of
    the PROPACK routines.
    c                     	 t        |      | _        y # t        $ r& t        t        j                  |            | _        Y y w xY wN)r   A	TypeErrornpasarray)selfr   s     ;/usr/lib/python3/dist-packages/scipy/sparse/linalg/_svdp.py__init__z_AProd.__init__:   s6    	5%a(DF 	5%bjjm4DF	5s    ,AAc                     |dk(  r| j                   j                  |      |d d  y | j                   j                  |      |d d  y )Nn)r   matvecrmatvec)r   transamr    xysparmiparms           r   __call__z_AProd.__call__@   s5    S=66==#AaD66>>!$AaD    c                 .    | j                   j                  S r   )r   shaper   s    r   r,   z_AProd.shapeF   s    vv||r*   c                     	 | j                   j                  S # t        $ rR | j                   j                  t	        j
                  | j                   j                  d               j                  cY S w xY w)Nr   )r   dtypeAttributeErrorr!   r   zerosr,   r-   s    r   r/   z_AProd.dtypeJ   sU    	B66<< 	B66==$&&,,q/!:;AAA	Bs    AA32A3N)	__name__
__module____qualname____doc__r   r)   propertyr,   r/    r*   r   r   r   3   s;    5%   B Br*   r   c                    t        j                  |       r-t        j                  d      j                  dk  rt	        d      t        |      }|j                         }|dvrt        d      |s|dk(  rt        d      t        |       }|j                  j                  }	 t        |   }t        |   }|j"                  \  }}|d	k  s|t%        ||      kD  rt        d
      |d|z  }|d}t%        |d	z   |d	z   |      }||k  rt        d| d| d      |rdnd}|rdnd}t        j&                  ||d	z   fd|      }t        j&                  ||fd|      }|h|j)                  |      |dddf<   t        j                  t        j                  d|            r/|dddfxx   d|j)                  |      z  z  cc<   n
	 ||dddf<   |
2t        j*                  t        j,                  |      j.                        }
|"t        j,                  |      j.                  dz  }|r^t        j0                  |
|||f|j3                               }|||z
  }|t%        ||z
  ||      kD  rt        d      |dk  r3t        d      t        j0                  |
||f|j3                               }t        j0                  t5        t7        |            t5        t7        |            fd      }d}|s|rF||z   d|z  z   d|z  |z  z   dz   t9        d |z  |z  d|z  z   dz   |t9        ||      z        z   } d|z  }!n5||z   d|z  z   d!|z  |z  z   dz   t9        ||z   d|z  dz         z   } d!|z  d	z   }!t        j                  | |j3                               }"t        j                  |!t         j:                        }#t        j                  d	|j3                               }$t        j                  d	t         j:                        }%|j=                         r&t        j                  ||z   d"|z  z   |      }&|"|&|#f}'n|"|#f}'|r* |t>        |   |||||||||||	g|'|||$|% \  }}(})}}*n ||||||||||	g	|'|||$|% \  }}(})}}*|*dkD  rtA        d#|* d$      |*dk  rtA        d%| d&| d'      |ddd|f   |(|ddd|f   jC                         jD                  |)fS # t        $ r t        j                  t        j                  d|            r$t        j                  t              j                  }n#t        j                  t               j                  }t        |   }t        |   }Y w xY w# t        $ r t        d|       w xY w)(a;  
    Compute the singular value decomposition of a linear operator using PROPACK

    Parameters
    ----------
    A : array_like, sparse matrix, or LinearOperator
        Operator for which SVD will be computed.  If `A` is a LinearOperator
        object, it must define both ``matvec`` and ``rmatvec`` methods.
    k : int
        Number of singular values/vectors to compute
    which : {"LM", "SM"}
        Which singluar triplets to compute:
        - 'LM': compute triplets corresponding to the `k` largest singular
                values
        - 'SM': compute triplets corresponding to the `k` smallest singular
                values
        `which='SM'` requires `irl_mode=True`.  Computes largest singular
        values by default.
    irl_mode : bool, optional
        If `True`, then compute SVD using IRL (implicitly restarted Lanczos)
        mode.  Default is `True`.
    kmax : int, optional
        Maximal number of iterations / maximal dimension of the Krylov
        subspace. Default is ``10 * k``.
    compute_u : bool, optional
        If `True` (default) then compute left singular vectors, `u`.
    compute_v : bool, optional
        If `True` (default) then compute right singular vectors, `v`.
    tol : float, optional
        The desired relative accuracy for computed singular values.
        If not specified, it will be set based on machine precision.
    v0 : array_like, optional
        Starting vector for iterations: must be of length ``A.shape[0]``.
        If not specified, PROPACK will generate a starting vector.
    full_output : bool, optional
        If `True`, then return sigma_bound.  Default is `False`.
    delta : float, optional
        Level of orthogonality to maintain between Lanczos vectors.
        Default is set based on machine precision.
    eta : float, optional
        Orthogonality cutoff.  During reorthogonalization, vectors with
        component larger than `eta` along the Lanczos vector will be purged.
        Default is set based on machine precision.
    anorm : float, optional
        Estimate of ``||A||``.  Default is `0`.
    cgs : bool, optional
        If `True`, reorthogonalization is done using classical Gram-Schmidt.
        If `False` (default), it is done using modified Gram-Schmidt.
    elr : bool, optional
        If `True` (default), then extended local orthogonality is enforced
        when obtaining singular vectors.
    min_relgap : float, optional
        The smallest relative gap allowed between any shift in IRL mode.
        Default is `0.001`.  Accessed only if ``irl_mode=True``.
    shifts : int, optional
        Number of shifts per restart in IRL mode.  Default is determined
        to satisfy ``k <= min(kmax-shifts, m, n)``.  Must be
        >= 0, but choosing 0 might lead to performance degredation.
        Accessed only if ``irl_mode=True``.
    maxiter : int, optional
        Maximum number of restarts in IRL mode.  Default is `1000`.
        Accessed only if ``irl_mode=True``.
    random_state : {None, int, `numpy.random.Generator`,
                    `numpy.random.RandomState`}, optional

        Pseudorandom number generator state used to generate resamples.

        If `random_state` is ``None`` (or `np.random`), the
        `numpy.random.RandomState` singleton is used.
        If `random_state` is an int, a new ``RandomState`` instance is used,
        seeded with `random_state`.
        If `random_state` is already a ``Generator`` or ``RandomState``
        instance then that instance is used.

    Returns
    -------
    u : ndarray
        The `k` largest (``which="LM"``) or smallest (``which="SM"``) left
        singular vectors, ``shape == (A.shape[0], 3)``, returned only if
        ``compute_u=True``.
    sigma : ndarray
        The top `k` singular values, ``shape == (k,)``
    vt : ndarray
        The `k` largest (``which="LM"``) or smallest (``which="SM"``) right
        singular vectors, ``shape == (3, A.shape[1])``, returned only if
        ``compute_v=True``.
    sigma_bound : ndarray
        the error bounds on the singular values sigma, returned only if
        ``full_output=True``.

    r      zBPROPACK complex-valued SVD methods not available for 32-bit builds>   r   r   z#`which` must be either 'LM' or 'SM'r   z#`which`='SM' requires irl_mode=True)r/   r   z.k must be positive and not greater than m or nN
   i  z3kmax must be greater than or equal to k, but kmax (z) < k ()r&   r    r   )orderr/   )sizey              ?zv0 must be of length g      ?z0shifts must satisfy k <= min(kmax-shifts, m, n)!zshifts must be >= 0!i   	                   z#An invariant subspace of dimension z was found.zk=z0 singular triplets did not converge within kmax=z iterations)#r   iscomplexobjintpitemsizer   r   upper
ValueErrorr   r/   char_lansvd_irl_dict_lansvd_dictKeyErroremptycomplexfloatr,   minr1   uniformsqrtfinfoepsarraylowerintboolmaxint32isupper_which_converterr   conjT)+r   kwhichirl_modekmax	compute_u	compute_vv0full_outputtoldeltaetaanormcgselr
min_relgapshiftsmaxiterrandom_stateaprodtyp
lansvd_irllansvdr$   r    jobujobvuvdoptionioption	blocksizelworkliworkworkiworkdparmr(   zworkworkssigmabndinfos+                                              r   r   r   R   s   B 
qrwwqz22Q6 , - 	- &l3LKKMEL >??>??1IE
++

C
#%c*
c" ;;DAq	A1s1ay=IJJ|!t q1ua!eT"DaxgaS+, 	,
 3D3D 	!TAXc5A
!T#S1A
 
z&&A&.!Q$??288AS12adGrL00a0888G	:AadG
 }))*
{hhsm4'((E3z:#))+N >AXFs4&=!Q'' < = =aZ344 ((E3.ciikBhhDIDI7sCG I IA$4,q03dF4K!D& 1$c!Qi4! ! 4A$4,q03q1uafqj3II4!88E-DHHV288,E HHQciik*EHHQbhh'E
{{} QAS1eU"e!+,<U,CT,0!Q7,11a"C?D"CFM"C -4"C 6;"C =B"C5#q$
 "(dAq!UAq# "P)."P07"P9@"PBG"PIN"P5#q$ ax1${CE 	E	 6&' 	' QU8UAa!eHMMO--s22y  #??288AS12((7#((C((5/&&C%c*
c"#V  	:4QC899	:s   !S 	U2 BU/.U/2V
)r   TNTTNFr   NNr   FTgMb`?NNN)r5   __all__numpyr   scipy._lib._utilr   scipy.sparse.linalgr   scipy.linalgr   _propackr   r	   r
   r   slansvddlansvdclansvdzlansvdrM   slansvd_irldlansvd_irlclansvd_irlzlansvd_irlrL   r^   r   r   r7   r*   r   <module>r      s    )  / 0 $     
												 
												  
 B B> 15JK8<DHo3r*   