§
    fŠtjóB  ã                   ó‚  — d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZmZ ddlmZ g d	¢Z ed
¦  «        	 	 dd„¦   «         Z ed
¦  «        dd„¦   «         Z ed¦  «        d„ ¦   «         Z ed¦  «        dd„¦   «         Z ed¦  «        dddddœd„¦   «         Z edd¦  «        d„ ¦   «         ZdS )zSVD decomposition functions.é    N)ÚzerosÚr_ÚdiagÚdotÚarccosÚarcsinÚwhereÚclip)Ú_apply_over_batché   )ÚLinAlgErrorÚ_datacopied)Úget_lapack_funcsÚ_compute_lwork)Ú_asarray_validated)ÚsvdÚsvdvalsÚdiagsvdÚorthÚsubspace_anglesÚ
null_space)Úaé   TFÚgesddc                 ó  — t          | |¬¦  «        }t          |j        ¦  «        dk    rt          d¦  «        ‚|j        \  }}|j        dk    rút          t          j        d|j        ¬¦  «        ¦  «        \  }	}
}t          j	        |d|
j        ¬¦  «        }|rkt          j	        |||f|	j        ¬¦  «        }t          j
        |¦  «        |d<   t          j	        |||f|j        ¬¦  «        }t          j
        |¦  «        |d<   n<t          j	        ||df|	j        ¬¦  «        }t          j	        |d|f|j        ¬¦  «        }|r|||fS |S |pt          || ¦  «        }t          |t          ¦  «        st          d	¦  «        ‚|d
vrd|› d�}t          |¦  «        ‚|r¸||k    r||fn||f\  }}|rA||z  t          j        t          j        ¦  «        j        k    rt          d|› d|› d�¦  «        ‚ndt#          ||z  ||z  ¦  «        }t#          ||z  ||z  ¦  «        t          j        t          j        ¦  «        j        k    rt          d|› d�¦  «        ‚||dz   f}t%          ||fd¬¦  «        \  }}t'          ||j        d         |j        d         ||¬¦  «        } ||||||¬¦  «        \  }}}}|dk    rt)          d¦  «        ‚|dk     r1|dk    r|dk    rd}t          |¦  «        ‚t          d| › d�¦  «        ‚|r|||fS |S )a  
    Singular Value Decomposition.

    Factorizes the matrix `a` into two unitary matrices ``U`` and ``Vh``, and
    a 1-D array ``s`` of singular values (real, non-negative) such that
    ``a == U @ S @ Vh``, where ``S`` is a suitably shaped matrix of zeros with
    main diagonal ``s``.

    Parameters
    ----------
    a : (M, N) array_like
        Matrix to decompose.
    full_matrices : bool, optional
        If True (default), `U` and `Vh` are of shape ``(M, M)``, ``(N, N)``.
        If False, the shapes are ``(M, K)`` and ``(K, N)``, where
        ``K = min(M, N)``.
    compute_uv : bool, optional
        Whether to compute also ``U`` and ``Vh`` in addition to ``s``.
        Default is True.
    overwrite_a : bool, optional
        Whether to overwrite `a`; may improve performance.
        Default is False.
    check_finite : bool, optional
        Whether to check that the input matrix contains only finite numbers.
        Disabling may give a performance gain, but may result in problems
        (crashes, non-termination) if the inputs do contain infinities or NaNs.
    lapack_driver : {'gesdd', 'gesvd'}, optional
        Whether to use the more efficient divide-and-conquer approach
        (``'gesdd'``) or general rectangular approach (``'gesvd'``)
        to compute the SVD. MATLAB and Octave use the ``'gesvd'`` approach.
        Default is ``'gesdd'``.

    Returns
    -------
    U : ndarray
        Unitary matrix having left singular vectors as columns.
        Of shape ``(M, M)`` or ``(M, K)``, depending on `full_matrices`.
    s : ndarray
        The singular values, sorted in non-increasing order.
        Of shape (K,), with ``K = min(M, N)``.
    Vh : ndarray
        Unitary matrix having right singular vectors as rows.
        Of shape ``(N, N)`` or ``(K, N)`` depending on `full_matrices`.

    For ``compute_uv=False``, only ``s`` is returned.

    Raises
    ------
    LinAlgError
        If SVD computation does not converge.

    See Also
    --------
    svdvals : Compute singular values of a matrix.
    diagsvd : Construct the Sigma matrix, given the vector s.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy import linalg
    >>> rng = np.random.default_rng()
    >>> m, n = 9, 6
    >>> a = rng.standard_normal((m, n)) + 1.j*rng.standard_normal((m, n))
    >>> U, s, Vh = linalg.svd(a)
    >>> U.shape,  s.shape, Vh.shape
    ((9, 9), (6,), (6, 6))

    Reconstruct the original matrix from the decomposition:

    >>> sigma = np.zeros((m, n))
    >>> for i in range(min(m, n)):
    ...     sigma[i, i] = s[i]
    >>> a1 = np.dot(U, np.dot(sigma, Vh))
    >>> np.allclose(a, a1)
    True

    Alternatively, use ``full_matrices=False`` (notice that the shape of
    ``U`` is then ``(m, n)`` instead of ``(m, m)``):

    >>> U, s, Vh = linalg.svd(a, full_matrices=False)
    >>> U.shape, s.shape, Vh.shape
    ((9, 6), (6,), (6, 6))
    >>> S = np.diag(s)
    >>> np.allclose(a, np.dot(U, np.dot(S, Vh)))
    True

    >>> s2 = linalg.svd(a, compute_uv=False)
    >>> np.allclose(s, s2)
    True

    ©Úcheck_finiter   zexpected matrixr   ©Údtype)r   )Úshaper   .zlapack_driver must be a string)r   Úgesvdz/lapack_driver must be "gesdd" or "gesvd", not "ú"zIndexing a matrix size z x zL would incur integer overflow in LAPACK. Try using numpy.linalg.svd instead.zIndexing a matrix of z[ elements would incur an in integer overflow in LAPACK. Try using numpy.linalg.svd instead.Ú_lworkÚ	preferred)Úilp64r   )Ú
compute_uvÚfull_matrices)r&   Úlworkr'   Úoverwrite_azSVD did not converger   éüÿÿÿzA has a NaN entryzillegal value in zth argument of internal gesdd)r   Úlenr    Ú
ValueErrorÚsizer   ÚnpÚeyer   Ú
empty_likeÚidentityr   Ú
isinstanceÚstrÚ	TypeErrorÚiinfoÚint32Úmaxr   r   r   )r   r'   r&   r)   r   Úlapack_driverÚa1ÚmÚnÚu0Ús0Úv0ÚsÚuÚvÚmessageÚmax_mnÚmin_mnÚszÚfuncsÚgesXdÚgesXd_lworkr(   ÚinfoÚmsgs                            úV/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/scipy/linalg/_decomp_svd.pyr   r      s«  € õ| 
˜A¨LÐ	9Ñ	9Ô	9€BÝ
ˆ2Œ8�}„}˜ÒÐÝÐ*Ñ+Ô+Ð+ØŒ8�D€A€qð 
„w�!‚|€|Ý�œ ¨¬Ð2Ñ2Ô2Ñ3Ô3‰
ˆˆB�åŒM˜" D°´Ð9Ñ9Ô9ˆØð 	@Ý”˜b¨¨A¨°b´hÐ?Ñ?Ô?ˆAÝ”[ ‘^”^ˆAˆc‰FÝ”˜b¨¨A¨°b´hÐ?Ñ?Ô?ˆAÝ”[ ‘^”^ˆAˆc‰FˆFå”˜b¨¨A¨°b´hÐ?Ñ?Ô?ˆAÝ”˜b¨¨A¨°b´hÐ?Ñ?Ô?ˆAØð 	Ø�a˜�7ˆNàˆHàÐ5¥+¨b°!Ñ"4Ô"4€Kå�m¥SÑ)Ô)ð :ÝÐ8Ñ9Ô9Ð9ØÐ.Ð.Ð.ØTÀMÐTÐTÐTˆÝ˜Ñ!Ô!Ð!àð Ià#$ q¢5 5˜!˜Q˜˜¨q°!¨f‰ˆ�Øð 
	IØ�f‰}�rœx­¬Ñ1Ô1Ô5Ò5Ð5Ý ð "H¸6ð "Hð "HÀfð "Hð "Hð "Hñ Iô Ið Ið 6õ
 �Q˜‘Z  V¡Ñ,Ô,ˆBÝ�1�v‘:˜q 6™zÑ*Ô*­R¬Xµb´hÑ-?Ô-?Ô-CÒCÐCÝ ð "H¸ð "Hð "Hð "Hñ Iô Ið Ið ˜M¨HÑ4Ð5€Eõ *¨%°"°¸kÐJÑJÔJÑ€Eˆ;õ ˜;¨¬°¬°R´X¸a´[Ø&0ÀðOñ Oô O€Eð �E˜"¨¸5Ø(5À;ðPñ Pô P�M€A€qˆ!ˆTð ˆa‚x€xÝÐ0Ñ1Ô1Ð1Øˆa‚x€xØ˜GÒ#Ð#¨°ª
¨
Ø%ˆCÝ˜S‘/”/Ð!ÝÐQ¨d¨UÐQÐQÐQÑRÔRÐRØð Ø�!�Qˆwˆàˆó    c                 ó(   — t          | d||¬¦  «        S )aÇ  
    Compute singular values of a matrix.

    Parameters
    ----------
    a : (M, N) array_like
        Matrix to decompose.
    overwrite_a : bool, optional
        Whether to overwrite `a`; may improve performance.
        Default is False.
    check_finite : bool, optional
        Whether to check that the input matrix contains only finite numbers.
        Disabling may give a performance gain, but may result in problems
        (crashes, non-termination) if the inputs do contain infinities or NaNs.

    Returns
    -------
    s : (min(M, N),) ndarray
        The singular values, sorted in decreasing order.

    Raises
    ------
    LinAlgError
        If SVD computation does not converge.

    See Also
    --------
    svd : Compute the full singular value decomposition of a matrix.
    diagsvd : Construct the Sigma matrix, given the vector s.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import svdvals
    >>> m = np.array([[1.0, 0.0],
    ...               [2.0, 3.0],
    ...               [1.0, 1.0],
    ...               [0.0, 2.0],
    ...               [1.0, 0.0]])
    >>> svdvals(m)
    array([ 4.28091555,  1.63516424])

    We can verify the maximum singular value of `m` by computing the maximum
    length of `m.dot(u)` over all the unit vectors `u` in the (x,y) plane.
    We approximate "all" the unit vectors with a large sample. Because
    of linearity, we only need the unit vectors with angles in [0, pi].

    >>> t = np.linspace(0, np.pi, 2000)
    >>> u = np.array([np.cos(t), np.sin(t)])
    >>> np.linalg.norm(m.dot(u), axis=0).max()
    4.2809152422538475

    `p` is a projection matrix with rank 1. With exact arithmetic,
    its singular values would be [1, 0, 0, 0].

    >>> v = np.array([0.1, 0.3, 0.9, 0.3])
    >>> p = np.outer(v, v)
    >>> svdvals(p)
    array([  1.00000000e+00,   2.02021698e-17,   1.56692500e-17,
             8.15115104e-34])

    The singular values of an orthogonal matrix are all 1. Here, we
    create a random orthogonal matrix by using the `rvs()` method of
    `scipy.stats.ortho_group`.

    >>> from scipy.stats import ortho_group
    >>> orth = ortho_group.rvs(4)
    >>> svdvals(orth)
    array([ 1.,  1.,  1.,  1.])

    r   )r&   r)   r   )r   )r   r)   r   s      rK   r   r   ¶   s%   € õR ˆq˜Q¨KØ(ð*ñ *ô *ð *rL   )r?   r   c                 ó&  — t          | ¦  «        }|j        j        }t          | ¦  «        }||k    r*t	          j        |t          |||z
  f|¬¦  «        f¦  «        S ||k    r#t          |t          ||z
  |f|¬¦  «        f         S t          d¦  «        ‚)a§  
    Construct the sigma matrix in SVD from singular values and size M, N.

    Parameters
    ----------
    s : (M,) or (N,) array_like
        Singular values
    M : int
        Size of the matrix whose singular values are `s`.
    N : int
        Size of the matrix whose singular values are `s`.

    Returns
    -------
    S : (M, N) ndarray
        The S-matrix in the singular value decomposition

    See Also
    --------
    svd : Singular value decomposition of a matrix
    svdvals : Compute singular values of a matrix.

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import diagsvd
    >>> vals = np.array([1, 2, 3])  # The array representing the computed svd
    >>> diagsvd(vals, 3, 4)
    array([[1, 0, 0, 0],
           [0, 2, 0, 0],
           [0, 0, 3, 0]])
    >>> diagsvd(vals, 4, 3)
    array([[1, 0, 0],
           [0, 2, 0],
           [0, 0, 3],
           [0, 0, 0]])

    r   zLength of s must be M or N.)	r   r   Úcharr+   r.   Úhstackr   r   r,   )r?   ÚMÚNÚpartÚtypÚMorNs         rK   r   r     s”   € õP �‰7Œ7€DØ
Œ*Œ/€CÝˆq‰6Œ6€DØˆq‚y€yÝŒy˜$¥ q¨!¨a©% j¸Ð <Ñ <Ô <Ð=Ñ>Ô>Ð>Ø	�ŠˆÝ�$�˜q 1™u a˜j°Ð4Ñ4Ô4Ð4Ô5Ð5åÐ6Ñ7Ô7Ð7rL   )ÚAr   c                 óR  — t          | d¬¦  «        \  }}}|j        d         |j        d         }}|€/t          j        |j        ¦  «        j        t          ||¦  «        z  }t          j        |d¬¦  «        |z  }t          j        ||k    t          ¬¦  «        }|dd…d|…f         }	|	S )	a‚  
    Construct an orthonormal basis for the range of A using SVD

    Parameters
    ----------
    A : (M, N) array_like
        Input array
    rcond : float, optional
        Relative condition number. Singular values ``s`` smaller than
        ``rcond * max(s)`` are considered zero.
        Default: floating point eps * max(M,N).

    Returns
    -------
    Q : (M, K) ndarray
        Orthonormal basis for the range of A.
        K = effective rank of A, as determined by rcond

    See Also
    --------
    svd : Singular value decomposition of a matrix
    null_space : Matrix null space

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.linalg import orth
    >>> A = np.array([[2, 0, 0], [0, 5, 0]])  # rank 2 array
    >>> orth(A)
    array([[0., 1.],
           [1., 0.]])
    >>> orth(A.T)
    array([[0., 1.],
           [1., 0.],
           [0., 0.]])

    F)r'   r   r   Nç        ©Úinitialr   )
r   r    r.   Úfinfor   Úepsr7   ÚamaxÚsumÚint)
rV   Úrcondr@   r?   ÚvhrQ   rR   ÚtolÚnumÚQs
             rK   r   r   8  s£   € õN �1 EÐ*Ñ*Ô*�H€A€qˆ"ØŒ7�1Œ:�r”x ”{€q€AØ€}Ý”˜œÑ!Ô!Ô%­¨A¨q©	¬	Ñ1ˆÝ
Œ'�!˜RÐ
 Ñ
 Ô
  5Ñ
(€CÝ
Œ&��S’¥Ð
$Ñ
$Ô
$€CØ	ˆ!ˆ!ˆ!ˆTˆcˆTˆ'Œ
€AØ€HrL   )r)   r   r8   c                ó†  — t          | d|||¬¦  «        \  }}}|j        d         |j        d         }	}|€/t          j        |j        ¦  «        j        t          ||	¦  «        z  }t          j        |d¬¦  «        |z  }
t          j        ||
k    t          ¬¦  «        }||d…dd…f         j
                             ¦   «         }|S )	aà  
    Construct an orthonormal basis for the null space of A using SVD

    Parameters
    ----------
    A : (M, N) array_like
        Input array
    rcond : float, optional
        Relative condition number. Singular values ``s`` smaller than
        ``rcond * max(s)`` are considered zero.
        Default: floating point eps * max(M,N).
    overwrite_a : bool, optional
        Whether to overwrite `a`; may improve performance.
        Default is False.
    check_finite : bool, optional
        Whether to check that the input matrix contains only finite numbers.
        Disabling may give a performance gain, but may result in problems
        (crashes, non-termination) if the inputs do contain infinities or NaNs.
    lapack_driver : {'gesdd', 'gesvd'}, optional
        Whether to use the more efficient divide-and-conquer approach
        (``'gesdd'``) or general rectangular approach (``'gesvd'``)
        to compute the SVD. MATLAB and Octave use the ``'gesvd'`` approach.
        Default is ``'gesdd'``.

    Returns
    -------
    Z : (N, K) ndarray
        Orthonormal basis for the null space of A.
        K = dimension of effective null space, as determined by rcond

    See Also
    --------
    svd : Singular value decomposition of a matrix
    orth : Matrix range

    Examples
    --------
    1-D null space:

    >>> import numpy as np
    >>> from scipy.linalg import null_space
    >>> A = np.array([[1, 1], [1, 1]])
    >>> ns = null_space(A)
    >>> ns * np.copysign(1, ns[0,0])  # Remove the sign ambiguity of the vector
    array([[ 0.70710678],
           [-0.70710678]])

    2-D null space:

    >>> from numpy.random import default_rng
    >>> rng = default_rng()
    >>> B = rng.random((3, 5))
    >>> Z = null_space(B)
    >>> Z.shape
    (5, 2)
    >>> np.allclose(B.dot(Z), 0)
    True

    The basis vectors are orthonormal (up to rounding error):

    >>> Z.T.dot(Z)
    array([[  1.00000000e+00,   6.92087741e-17],
           [  6.92087741e-17,   1.00000000e+00]])

    T)r'   r)   r   r8   r   r   NrX   rY   r   )r   r    r.   r[   r   r\   r7   r]   r^   r_   ÚTÚconj)rV   r`   r)   r   r8   r@   r?   ra   rQ   rR   rb   rc   rd   s                rK   r   r   i  sÁ   € õH �1 D°kØ ,¸MðKñ Kô K�H€A€qˆ"àŒ7�1Œ:�r”x ”{€q€AØ€}Ý”˜œÑ!Ô!Ô%­¨A¨q©	¬	Ñ1ˆÝ
Œ'�!˜RÐ
 Ñ
 Ô
  5Ñ
(€CÝ
Œ&��S’¥Ð
$Ñ
$Ô
$€CØ
ˆ3ˆ4ˆ4���ˆ6Œ
Œ×ÒÑÔ€AØ€HrL   )ÚBr   c                 ó  — t          | d¬¦  «        } t          | j        ¦  «        dk    rt          d| j        › �¦  «        ‚t	          | ¦  «        }~ t          |d¬¦  «        }t          |j        ¦  «        dk    rt          d|j        › �¦  «        ‚t          |¦  «        t          |¦  «        k    r+t          d|j        d         › d|j        d         › �¦  «        ‚t	          |¦  «        }~t          |j                             ¦   «         |¦  «        }t          |¦  «        }|j        d         |j        d         k    r|t          ||¦  «        z
  }n*|t          ||j                             ¦   «         ¦  «        z
  }~~~|dz  d	k    }| 	                    ¦   «         r.t          t          t          |d¬
¦  «        dd¦  «        ¦  «        }nd}t          ||t          t          |ddd…         dd¦  «        ¦  «        ¦  «        }|S )a­  
    Compute the subspace angles between two matrices.

    Parameters
    ----------
    A : (M, N) array_like
        The first input array.
    B : (M, K) array_like
        The second input array.

    Returns
    -------
    angles : ndarray, shape (min(N, K),)
        The subspace angles between the column spaces of `A` and `B` in
        descending order.

    See Also
    --------
    orth
    svd

    Notes
    -----
    This computes the subspace angles according to the formula
    provided in [1]_. For equivalence with MATLAB and Octave behavior,
    use ``angles[0]``.

    .. versionadded:: 1.0

    References
    ----------
    .. [1] Knyazev A, Argentati M (2002) Principal Angles between Subspaces
           in an A-Based Scalar Product: Algorithms and Perturbation
           Estimates. SIAM J. Sci. Comput. 23:2008-2040.

    Examples
    --------
    An Hadamard matrix, which has orthogonal columns, so we expect that
    the suspace angle to be :math:`\frac{\pi}{2}`:

    >>> import numpy as np
    >>> from scipy.linalg import hadamard, subspace_angles
    >>> rng = np.random.default_rng()
    >>> H = hadamard(4)
    >>> print(H)
    [[ 1  1  1  1]
     [ 1 -1  1 -1]
     [ 1  1 -1 -1]
     [ 1 -1 -1  1]]
    >>> np.rad2deg(subspace_angles(H[:, :2], H[:, 2:]))
    array([ 90.,  90.])

    And the subspace angle of a matrix to itself should be zero:

    >>> subspace_angles(H[:, :2], H[:, :2]) <= 2 * np.finfo(float).eps
    array([ True,  True], dtype=bool)

    The angles between non-orthogonal subspaces are in between these extremes:

    >>> x = rng.standard_normal((4, 3))
    >>> np.rad2deg(subspace_angles(x[:, :2], x[:, [2]]))
    array([ 55.832])  # random
    Tr   r   zexpected 2D array, got shape z/A and B must have the same number of rows, got r   z and r   g      à?)r)   g      ð¿g      ð?rX   Néÿÿÿÿ)r   r+   r    r,   r   r   rf   rg   r   Úanyr   r
   r	   r   )	rV   rh   ÚQAÚQBÚQA_H_QBÚsigmaÚmaskÚ	mu_arcsinÚthetas	            rK   r   r   ¸  sò  € õH 	˜1¨4Ð0Ñ0Ô0€AÝ
ˆ1Œ7�|„|�qÒÐÝÐB¸¼ÐBÐBÑCÔCÐCÝ	ˆa‰Œ€BØ	å˜1¨4Ð0Ñ0Ô0€AÝ
ˆ1Œ7�|„|�qÒÐÝÐB¸¼ÐBÐBÑCÔCÐCÝ
ˆ1�v„v•�R‘”ÒÐÝð ;ØœH QœKð;ð ;Ø./¬g°a¬jð;ð ;ñ <ô <ð 	<å	ˆa‰Œ€BØ	õ �"”$—)’)‘+”+˜rÑ"Ô"€GÝ�GÑÔ€Eð 
„x�„{�b”h˜q”kÒ!Ð!Ø•�R˜Ñ!Ô!Ñ!ˆˆà•�R˜œŸšÑ)Ô)Ñ*Ô*Ñ*ˆØ
ˆB�ð �A‰:˜Ò€DØ‡x‚x�z„zð Ý�4¥¨°tÐ <Ñ <Ô <¸cÀ2ÑFÔFÑGÔGˆ	ˆ	àˆ	õ
 �$˜	¥6­$¨u°T°T°r°T¬{¸CÀÑ*DÔ*DÑ#EÔ#EÑFÔF€EØ€LrL   )TTFTr   )FT)N)Ú__doc__Únumpyr.   r   r   r   r   r   r   r	   r
   Úscipy._lib._utilr   Ú_miscr   r   Úlapackr   r   Ú_decompr   Ú__all__r   r   r   r   r   r   © rL   rK   ú<module>r{      sð  ðØ "Ð "Ø Ð Ð Ð Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ Cà .Ð .Ð .Ð .Ð .Ð .ð ,Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'ð QÐ
PÐ
P€ð Ð�8ÑÔØ<AØ)0ðbð bð bñ ÔðbðJ Ð�8ÑÔðI*ð I*ð I*ñ ÔðI*ðX Ð�8ÑÔð/8ð /8ñ Ôð/8ðh Ð�8ÑÔð-ð -ð -ñ Ôð-ð` Ð�8ÑÔðK¨UÀØ$ðKð Kð Kð Kñ ÔðKð\ Ð�8˜XÑ&Ô&ðhð hñ 'Ô&ðhð hð hrL   