+
    &j)                     z    R t RR.t^ RIt^ RIHtHt ^ RIHtHt RR R llt	RR R	 llt
RR
 R lltRR R lltR# )zBImplement various linear algebra algorithms for low rank matrices.svd_lowrankpca_lowrankN)_linalg_utilsTensor)handle_torch_functionhas_torch_functionc          
      p    V ^8  d   QhR\         R\        R\        R,          R\         R,          R\         /# )   AqniterNMreturn)r   int)formats   "f/Users/jameslopez/projects/CWCArchive/cwc-podcast/.venv/lib/python3.14/site-packages/torch/_lowrank.py__annotate__r      sI     G GG
G :G }	G
 G    c                   Vf   ^MTpV P                  4       '       g   \        P                  ! V 4      MV P                  p\        P                  p\
        P                  ! V P                  R,          WV P                  R7      pV! W4      pVe   Wu! W64      ,
          p\
        P                  P                  V4      P                  p\        V4       F  p	V! V P                  V4      pVe   Wu! VP                  V4      ,
          p\
        P                  P                  V4      P                  pV! W4      pVe   Wu! W84      ,
          p\
        P                  P                  V4      P                  pK  	  V# )a  Return tensor :math:`Q` with :math:`q` orthonormal columns such
that :math:`Q Q^H A` approximates :math:`A`. If :math:`M` is
specified, then :math:`Q` is such that :math:`Q Q^H (A - M)`
approximates :math:`A - M`. without instantiating any tensors
of the size of :math:`A` or :math:`M`.

.. note:: The implementation is based on the Algorithm 4.4 from
          Halko et al., 2009.

.. note:: For an adequate approximation of a k-rank matrix
          :math:`A`, where k is not known in advance but could be
          estimated, the number of :math:`Q` columns, q, can be
          chosen according to the following criteria: in general,
          :math:`k <= q <= min(2*k, m, n)`. For large low-rank
          matrices, take :math:`q = k + 5..10`.  If k is
          relatively small compared to :math:`min(m, n)`, choosing
          :math:`q = k + 0..2` may be sufficient.

.. note:: To obtain repeatable results, reset the seed for the
          pseudorandom number generator

Args::
    A (Tensor): the input tensor of size :math:`(*, m, n)`

    q (int): the dimension of subspace spanned by :math:`Q`
             columns.

    niter (int, optional): the number of subspace iterations to
                           conduct; ``niter`` must be a
                           nonnegative integer. In most cases, the
                           default value 2 is more than enough.

    M (Tensor, optional): the input tensor's mean of size
                          :math:`(*, m, n)`.

References::
    - Nathan Halko, Per-Gunnar Martinsson, and Joel Tropp, Finding
      structure with randomness: probabilistic algorithms for
      constructing approximate matrix decompositions,
      arXiv:0909.4061 [math.NA; math.PR], 2009 (available at
      `arXiv <http://arxiv.org/abs/0909.4061>`_).
dtypedevice)
is_complex_utilsget_floating_dtyper   matmultorchrandnshaper   linalgqrQrangemH)
r
   r   r   r   r   r   RXr"   _s
   &&&&      r   get_approximate_basisr(      s   b AEE01F%%a(AGGE]]FAGGBKAA
 	qA}qA5\144O=F144O#ALLOOA  1L=F1L ALLOOA    Hr   c                    V ^8  d   QhR\         R\        R,          R\        R,          R\         R,          R\        \         \         \         3,          /# r	   r
   r   Nr   r   r   r   r   tuple)r   s   "r   r   r   U   sR     =2 =2=2
Tz=2 :=2 }	=2
 666!"=2r   c           	     @   \         P                  P                  4       '       go   W3p\        \	        \
        V4      4      P                  \         P                  \        R4      34      '       g%   \        V4      '       d   \        \        W@WVR7      # \        WW#R7      # )a*  Return the singular value decomposition ``(U, S, V)`` of a matrix,
batches of matrices, or a sparse matrix :math:`A` such that
:math:`A \approx U \operatorname{diag}(S) V^{\text{H}}`. In case :math:`M` is given, then
SVD is computed for the matrix :math:`A - M`.

.. note:: The implementation is based on the Algorithm 5.1 from
          Halko et al., 2009.

.. note:: For an adequate approximation of a k-rank matrix
          :math:`A`, where k is not known in advance but could be
          estimated, the number of :math:`Q` columns, q, can be
          chosen according to the following criteria: in general,
          :math:`k <= q <= min(2*k, m, n)`. For large low-rank
          matrices, take :math:`q = k + 5..10`.  If k is
          relatively small compared to :math:`min(m, n)`, choosing
          :math:`q = k + 0..2` may be sufficient.

.. note:: This is a randomized method. To obtain repeatable results,
          set the seed for the pseudorandom number generator

.. note:: In general, use the full-rank SVD implementation
          :func:`torch.linalg.svd` for dense matrices due to its 10x
          higher performance characteristics. The low-rank SVD
          will be useful for huge sparse matrices that
          :func:`torch.linalg.svd` cannot handle.

Args::
    A (Tensor): the input tensor of size :math:`(*, m, n)`

    q (int, optional): a slightly overestimated rank of A.

    niter (int, optional): the number of subspace iterations to
                           conduct; niter must be a nonnegative
                           integer, and defaults to 2

    M (Tensor, optional): the input tensor's mean of size
                          :math:`(*, m, n)`, which will be broadcasted
                          to the size of A in this function.

References::
    - Nathan Halko, Per-Gunnar Martinsson, and Joel Tropp, Finding
      structure with randomness: probabilistic algorithms for
      constructing approximate matrix decompositions,
      arXiv:0909.4061 [math.NA; math.PR], 2009 (available at
      `arXiv <https://arxiv.org/abs/0909.4061>`_).

N)r   r   r   )r   jitis_scriptingsetmaptypeissubsetr   r   r   r   _svd_lowrank)r
   r   r   r   
tensor_opss   &&&& r   r   r   U   s~    j 99!!##V
3tZ()22\\4:&
 
 ,,(Za  e11r   c                    V ^8  d   QhR\         R\        R,          R\        R,          R\         R,          R\        \         \         \         3,          /# r*   r+   )r   s   "r   r   r      sR      
Tz : }	
 666!"r   c                    Vf   ^MTpV P                   RR  w  rE\        P                  pVe    VP                  V P	                  4       4      pWE8  d   V P
                  p Ve   VP
                  p\        WW#R7      pV! VP
                  V 4      pVe   W! VP
                  V4      ,
          p\        P                  P                  VRR7      w  rpVP
                  pVP                  V	4      p	WE8  d   YrWV3# )Nr   r   F)full_matrices)
r   r   r   broadcast_tosizer$   r(   r   r    svd)r
   r   r   r   mnr   r"   BUSVhVs   &&&&         r   r4   r4      s     YAA7723<DA]]F}NN1668$ 	uDD=Aa%5AqttQA}qttQ||7HA"
A	Au17Nr   c                    V ^8  d   QhR\         R\        R,          R\        R\        R\        \         \         \         3,          /# )r	   r
   r   Ncenterr   r   )r   r   boolr,   )r   s   "r   r   r      sQ     n; n;n;
Tzn; n; 	n;
 666!"n;r   c           	        \         P                  P                  4       '       gD   \        V 4      \         P                  Jd'   \        V 34      '       d   \        \        V 3WW#R7      # V P                  RR w  rEVf   \        ^WE4      pM1V^ 8  d   V\        WE4      8:  g   \        RV R\        WE4       24      hV^ 8  g   \        RV R24      h\        P                  ! V 4      pV'       g   \        WVRR7      # \        P                  ! V 4      '       EdA   \        V P                  4      ^8w  d   \        R4      h\         P                   P#                  V RR	7      V,          pVP%                  4       ^ ,          p\         P&                  ! ^\        V4      VP(                  VP*                  R
7      p	W^ &   \         P,                  ! WP/                  4       V^3W`P*                  R
7      p
\         P0                  ! V P                  RR ^V3,           W`P*                  R
7      p\         P                   P3                  W4      P4                  p\        WW<R7      # V P7                  RRR7      p\        W,
          WRR7      # )a;  Performs linear Principal Component Analysis (PCA) on a low-rank
matrix, batches of such matrices, or sparse matrix.

This function returns a namedtuple ``(U, S, V)`` which is the
nearly optimal approximation of a singular value decomposition of
a centered matrix :math:`A` such that :math:`A \approx U \operatorname{diag}(S) V^{\text{H}}`

.. note:: The relation of ``(U, S, V)`` to PCA is as follows:

            - :math:`A` is a data matrix with ``m`` samples and
              ``n`` features

            - the :math:`V` columns represent the principal directions

            - :math:`S ** 2 / (m - 1)` contains the eigenvalues of
              :math:`A^T A / (m - 1)` which is the covariance of
              ``A`` when ``center=True`` is provided.

            - ``matmul(A, V[:, :k])`` projects data to the first k
              principal components

.. note:: Different from the standard SVD, the size of returned
          matrices depend on the specified rank and q
          values as follows:

            - :math:`U` is m x q matrix

            - :math:`S` is q-vector

            - :math:`V` is n x q matrix

.. note:: To obtain repeatable results, reset the seed for the
          pseudorandom number generator

Args:

    A (Tensor): the input tensor of size :math:`(*, m, n)`

    q (int, optional): a slightly overestimated rank of
                       :math:`A`. By default, ``q = min(6, m,
                       n)``.

    center (bool, optional): if True, center the input tensor,
                             otherwise, assume that the input is
                             centered.

    niter (int, optional): the number of subspace iterations to
                           conduct; niter must be a nonnegative
                           integer, and defaults to 2.

References::

    - Nathan Halko, Per-Gunnar Martinsson, and Joel Tropp, Finding
      structure with randomness: probabilistic algorithms for
      constructing approximate matrix decompositions,
      arXiv:0909.4061 [math.NA; math.PR], 2009 (available at
      `arXiv <http://arxiv.org/abs/0909.4061>`_).

)r   rF   r   Nzq(=z>) must be non-negative integer and not greater than min(m, n)=zniter(=z) must be non-negative integerr8   z8pca_lowrank input is expected to be 2-dimensional tensor)dimr   T)rI   keepdimr:   )r:   )r   r.   r/   r2   r   r   r   r   r   min
ValueErrorr   r   r4   	is_sparselensparsesumindiceszerosr   r   sparse_coo_tensorvaluesonesmmmTmean)r
   r   rF   r   r>   r?   r   ccolumn_indicesrQ   C_t	ones_m1_tr   Cs   &&&&          r   r   r      s   D 99!!##7%,,&+=qd+C+C(aT1&  WWRS\FQy1L1fc!i!RSVWXS\R]^
 	
 QJ75')GHII%%a(EA66qww<1WXXLLQE*Q.Q++ &&!((	
 $
%%XXZ!QuXX
 JJqwws|q!f4E((S	LLOOC+..A33FFudF+AE1T::r   )r	   N)   r	   N)NTr	   )__doc____all__r   r   r   r   torch.overridesr   r   r(   r   r4   r    r   r   <module>rc      s<    H-
(  1 EGT=2@Dn; n;r   