
    ^j*                     ,   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
 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)_svdp    N)	HAS_ILP64)aslinearoperator)LinAlgError   )_propack)fdFD)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     R/opt/ringagent/.cad-venv/lib/python3.12/site-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 )Nr   )r   matvecrmatvec)r   transamnxys         r   __call__z_AProd.__call__/   s5    Q;66==#AaD66>>!$AaD    c                 .    | j                   j                  S r   )r   shaper   s    r   r%   z_AProd.shape5   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.dtype9   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   "   s;    5%   B Br#   r   c                    |t        d      |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|      }t        j                  |d|j                               }t        j                  |d|j                               }|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        j&                  |
|||f|j                               }|||z
  }|t        ||z
  ||      kD  rt        d      |dk  r3t        d      t        j&                  |
||f|j                               }t(        rt        j*                  nt        j,                  } t        j&                  t/        t1        |            t/        t1        |            f|       }!d}"|s|rH||z   d|dz  z  z   d|z  z   dz   }#|#t3        d|dz  z  d|z  z   dz   |"t3        ||      z        z  }#d |z  }$n5||z   d|z  z   d|dz  z  z   dz   t3        ||z   d|z  dz         z   }#d|z  dz   }$t        j                  |#|j                               }%t        j                  |$|       }&t        j                  d|j                               }'t        j                  d|       }(|j5                         r#t        j                  ||z   |z   |      })|%|)|&f}*n|%|&f}*t7        |d!      rO|j9                  dt        j:                  t        j*                        j2                  dt        j<                  "      }+nN|j?                  dt        j:                  t        j*                        j2                  dt        j<                  "      }+|r( |t@        |   ||||||||	|||||g|*||!|'|(|+ },n ||||||||	|||||g|*||!|'|(|+ },|,dkD  rtC        d#|, d$      |,dk  rtC        d%| d&| d'      |ddd|f   ||ddd|f   jE                         jF                  |fS # t        $ rE t        j                  t        j                  d|            rd	}nd
}t
        |   }t        |   }Y tw xY w# t         $ r t        d|       w xY w)(ax  
    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 singular 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 degradation.
        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``.
    rng : `numpy.random.Generator`, optional
        Pseudorandom number generator state. When `rng` is None, a new
        `numpy.random.Generator` is created using entropy from the
        operating system. Types other than `numpy.random.Generator` are
        passed to `numpy.random.default_rng` to instantiate a ``Generator``.

    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``.

    Nz:`rng` must be a normalized numpy.random.Generator instance>   r   r   z#`which` must be either 'LM' or 'SM'r   z#`which`='SM' requires irl_mode=Truer   )r(   r   r
   r   z.k must be positive and not greater than m or n
   i  z3kmax must be greater than or equal to k, but kmax (z) < k ()r   )orderr(   )sizey              ?zv0 must be of length g      ?z0shifts must satisfy k <= min(kmax-shifts, m, n)!zshifts must be >= 0!          	            integers)lowhighr5   r(   z#An invariant subspace of dimension z was found.zk=z0 singular triplets did not converge within kmax=z iterations)$
ValueErrorupperr   r(   char_lansvd_irl_dict_lansvd_dictKeyErrorr   iscomplexobjemptyr%   minr*   loweruniformsqrtfinfoepsarrayr   int64int32intboolmaxisupperhasattrr=   iinfouint64randint_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rngaprodtyp
lansvd_irllansvdr   r   jobujobvuvsigmabnddoption	int_dtypeioptionNBlworkliworkworkiworkdparmiparmzworkworks	rng_stateinfos-                                                r   r   r   A   sG   r {UVVKKMEL >??>??1IE
++

C
#%c*
c" ;;DAq	A1s1ay=IJJ|!t q1ua!eT"DaxgaS+, 	,
 1qD1qD 	!TAXc5A
!T#S1AHHQc5E
((1Csyy{
3C
 
z++1+%!Q$??288AS12adGrCKKQK///G	:AadG
 }))*
{hhsm4'((E3z:#))+N >AXFs4&=!Q'' < = =aZ344 ((E3.ciikB%288IhhDIDI7yIG 
B IA$'	!AdF*Q.QtQwY4'!+RAq	\::4A$47*Q.QUAdFQJ1GG4!88E-DHHV9-E HHQciik*EHHQi(E
{{}QS1eU"e sJLL*..Qbii ! 
	 KK*..Qbii   
	 *5141fa#E3<49<;B< "< $)< +0< 2;<
 dD!Q4eQsA II%I'.I05I7<I>GI ax1${CE 	E	 6&' 	' QU8UAa!eHMMO--s22O  #??288AS12CC%c*
c"#Z  	:4QC899	:s   !V 	W+ A
W('W(+X)r   TNTTNFr   NNr   FTgMb`?NNN)__all__numpyr   scipy.linalg.lapackr   scipy.sparse.linalgr   scipy.linalgr    r   slansvddlansvdclansvdzlansvdrD   slansvd_irldlansvd_irlclansvd_irlzlansvd_irlrC   rY   r   r   r0   r#   r   <module>r      s   )  ) 0 $  
												 
												  
 B B> 15JK8<;?o3r#   