
    [Th:)                     <   S r SS/rSSKJr  SSKrSSKJrJr  SSKJ	r	J
r
    SS\S	\S
\\   S\\   S\4
S jjr   SS\S	\\   S
\\   S\\   S\\\\4   4
S jjr   SS\S	\\   S
\\   S\\   S\\\\4   4
S jjr   SS\S	\\   S\S
\S\\\\4   4
S jjrg)zBImplement various linear algebra algorithms for low rank matrices.svd_lowrankpca_lowrank    )OptionalN)_linalg_utilsTensor)handle_torch_functionhas_torch_functionAqniterMreturnc                    Uc  SOUnU R                  5       (       d  [        R                  " U 5      OU R                  n[        R                  n[
        R                  " U R                  S   XU R                  S9nU" X5      nUb
  Xu" X65      -
  n[
        R                  R                  U5      R                  n[        U5       H  n	U" U R                  U5      nUb  Xu" UR                  U5      -
  n[
        R                  R                  U5      R                  nU" X5      nUb
  Xu" X85      -
  n[
        R                  R                  U5      R                  nM     U$ )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
          choosen 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
             F/var/www/auris/envauris/lib/python3.13/site-packages/torch/_lowrank.py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    H    c           	      .   [         R                  R                  5       (       di  X4n[        [	        [
        U5      5      R                  [         R                  [        S5      45      (       d   [        U5      (       a  [        [        X@XUS9$ [        XX#S9$ )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
          choosen 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   V   s~    j 99!!##V
3tZ()22\\4:&
 
 ,,(Za  e11r&   c                    Uc  SOUnU R                   SS  u  pE[        R                  nUb  UR                  U R	                  5       5      nXE:  a  U R
                  n Ub  UR
                  n[        XX#S9nU" UR
                  U 5      nUb  X" UR
                  U5      -
  n[        R                  R                  USS9u  pnUR
                  nUR                  U	5      n	XE:  a  XpXU4$ )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$   r.   r.      s     YAA7723<DA]]F}NN1668$ 	uDD=Aa%5AqttQA}qttQ||7HA"
A	Au17Nr&   centerc           	         [         R                  R                  5       (       d>  [        U 5      [         R                  La"  [        U 45      (       a  [        [        U 4XX#S9$ U R                  SS u  pEUc  [        SXE5      nO/US:  a  U[        XE5      ::  d  [        SU S[        XE5       35      eUS:  d  [        SU S	35      e[        R                  " U 5      nU(       d  [        XUSS
9$ [        R                  " U 5      (       Ga$  [        U R                  5      S:w  a  [        S5      e[         R                   R#                  U SS9U-  nUR%                  5       S   n[         R&                  " S[        U5      UR(                  UR*                  S9n	XS'   [         R,                  " XR/                  5       US4X`R*                  S9n
[         R0                  " U R                  SS SU4-   X`R*                  S9n[         R                   R3                  X5      R4                  n[        XX<S
9$ U R7                  SSS9n[        X-
  XSS
9$ )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   r?   r   r2   Nr1   r   zq(=z>) must be non-negative integer and not greater than min(m, n)=zniter(=z) must be non-negative integerr3   r   z8pca_lowrank input is expected to be 2-dimensional tensor)r2   )dimr      T)rA   keepdim)r   r(   r)   r,   r   r	   r   r   r   min
ValueErrorr   r   r.   	is_sparselensparsesumindiceszerosr   r   sparse_coo_tensorvaluesonesmmmTmean)r
   r   r?   r   r8   r9   r   ccolumn_indicesrJ   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)r1   r   N)NTr   )__doc____all__typingr   r   r   r   r   torch.overridesr   r	   intr%   tupler   r.   boolr    r&   r$   <module>r_      sm   H-
(   1 E 	GG
G C=G 	G
 GX 	=2=2}=2 C==2 	=2
 666!"=2D 	} C= 	
 666!"H 	n;n;}n; n; 	n;
 666!"n;r&   