
    `i?;                         d dl 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dddd d	d
dZd Zd Z ej        dddd          Zd Zddd ddd	ddZd ZdS )    N)cublas)_dtype)device)_csr)
_interface   LMT)whichv0ncvmaxitertolreturn_eigenvectorsc          	      	   | j         d         }| j        dk    s| j         d         | j         d         k    r't          d                    | j                             | j        j        dvr't          d                    | j                            |dk    r"t          d                    |                    ||k    r"t          d                    |                    |d	vr"t          d
                    |                    |(t          t          d|z  |dz             |dz
            }n$t          t          ||dz             |dz
            }|d|z  }|dk    rt          j
        | j                  j        }t          j        |f| j                  }	t          j        |f| j        j                                                  }
t          j        ||f| j                  }|St          j                            |f                              | j                  }|t%          j        |          z  |d<   n|}|t%          j        |          z  |d<   d}|dk    rt)          | ||          }nt*          } || |||	|
d|           |}t-          |	|
d||          \  }}|j        |z  }|
d         |dddf         z  }t%          j        |          }t          j        |f| j                  }||k    r||k     rd|
d|<   ||	d|<   |j        |d|<   t%          j        t2          j        d|d|         j        |d|           t%          j        t2          j        d|d|         j        |d|           |t%          j        |          z  ||<   | ||         z  |d<   t%          j        ||         ||	|                    ||	|         ||         z  z  }||d|         j        |z  z  }t%          j        ||
|                    ||
|         z  ||dz   <    || |||	|
|dz   |           |||z
  z  }t-          |	|
|||          \  }}|j        |z  }|
d         |dddf         z  }t%          j        |          }||k    r||k     |r(t          j        |          }||         |dd|f         fS t          j        |          S )a3  
    Find ``k`` eigenvalues and eigenvectors of the real symmetric square
    matrix or complex Hermitian matrix ``A``.

    Solves ``Ax = wx``, the standard eigenvalue problem for ``w`` eigenvalues
    with corresponding eigenvectors ``x``.

    Args:
        a (ndarray, spmatrix or LinearOperator): A symmetric square matrix with
            dimension ``(n, n)``. ``a`` must :class:`cupy.ndarray`,
            :class:`cupyx.scipy.sparse.spmatrix` or
            :class:`cupyx.scipy.sparse.linalg.LinearOperator`.
        k (int): The number of eigenvalues and eigenvectors to compute. Must be
            ``1 <= k < n``.
        which (str): 'LM' or 'LA' or 'SA'.
            'LM': finds ``k`` largest (in magnitude) eigenvalues.
            'LA': finds ``k`` largest (algebraic) eigenvalues.
            'SA': finds ``k`` smallest (algebraic) eigenvalues.

        v0 (ndarray): Starting vector for iteration. If ``None``, a random
            unit vector is used.
        ncv (int): The number of Lanczos vectors generated. Must be
            ``k + 1 < ncv < n``. If ``None``, default value is used.
        maxiter (int): Maximum number of Lanczos update iterations.
            If ``None``, default value is used.
        tol (float): Tolerance for residuals ``||Ax - wx||``. If ``0``, machine
            precision is used.
        return_eigenvectors (bool): If ``True``, returns eigenvectors in
            addition to eigenvalues.

    Returns:
        tuple:
            If ``return_eigenvectors is True``, it returns ``w`` and ``x``
            where ``w`` is eigenvalues and ``x`` is eigenvectors. Otherwise,
            it returns only ``w``.

    .. seealso:: :func:`scipy.sparse.linalg.eigsh`

    .. note::
        This function uses the thick-restart Lanczos methods
        (https://sdm.lbl.gov/~kewu/ps/trlan.html).

    r         z"expected square matrix (shape: {})fdFDunsupprted dtype (actual: {})%k must be greater than 0 (actual: {})z%k must be smaller than n (actual: {}))r	   LASAz*which must be 'LM','LA'or'SA' (actual: {})N    
   dtypefast.out)shapendim
ValueErrorformatr   char	TypeErrorminmaxnumpyfinfoepscupyzerosloweremptyrandomastyper   nrm2_lanczos_fast_lanczos_asis_eigsh_solve_ritzTgemv_cublasCUBLAS_OP_CCUBLAS_OP_Ndotcargsortsort)akr
   r   r   r   r   r   nalphabetaVuupadte_impllanczositerwsxbeta_kresuuidxs                          t/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/cupyx/scipy/sparse/linalg/_eigen.pyeigshrO      s   Z 	

Av{{agajAGAJ..=DDQWMMNNNw|6!!7>>qwGGHHHAvv@GGJJKKKAvv@GGJJKKK&&& "F5MM+ + 	+
{#a!eQV$$a!e,,#c1q5//1q5))q&
axxk!'""&JvQW---E:sfAGL$6$6$8$8999D
C817+++A 
zKt$$++AG446;q>>!!FKOO#! Kf1c** GAq!UD!S)))DUD$599DAq	aA "X"aaa% F
+f

C	QD	(	(	(B
))wRaRbqb	"1" 	G'AbqbEGQ2>>>G'QrrUWb!Q???6;q>>!!QqT#AaD!q****	U1X!_	QrrUWvA47####T!W!A# 	1aa!eS111a fa??1C!G bAb!!!eH$k&!!7 ))w:  l1oovqCy  y||    c                 z   t          ||          D ]}| ||         z  |d<   t          j        ||         |||                    ||j        |d |dz                                            j        z  |d |dz            z  z  }t          j        |||                    ||dz
  k    r d S |||         z  ||dz   <   d S )N.r   r   )ranger   r:   r5   conjr1   )r=   rB   rC   r@   rA   i_starti_endis           rN   r3   r3      s    7E""  QqT#AaD!q****	QS1TacT7<<>>##a1g--A47####	>>EET!W!A# rP   c                   	
 ddl m ddlm	 t          j                    t          j                  | j        j        dk    r1t
          j	        t
          j
        t
          j        t
          j        n| j        j        dk    r1t
          j        t
          j        t
          j        t
          j        n| j        j        dk    r1t
          j        t
          j        t
          j        t
          j        nh| j        j        dk    r1t
          j        t
          j        t
          j        t
          j        n't3          d                    | j                            d 
t7          j        |           r	                    d          rnt          j                    
j        tA          j!        d	| j                  tA          j!        d
| j                  tE          j#        | j                  j$        tK          j&        f| j                  tK          j&        |f| j                  tK          j&        f| j                  tK          j&        d| j                  tA          j!        d	| j                  tA          j!        d
| j                  tA          j!        d| j                  | 	
fd}|S )Nr   )cusparsefdFDzinvalid dtype ({})spmvg      ?g        r    g      c                 V   | u sJ j                             |           }j                            !          }j                            |          }	                    j        j        |j        |j        j        j        |	j        	  	        }
t          j        |
t          j	                  }||         !d<   t          ||          D ]U}	| !z  |d<   nK                    j        j        |j        |j        j        j        |	j        |j        j        
  
         t          j        t          j                   	  !j        j        d|j        j        d|j        j        ||j        z  z              t          j                   n# t          j                   w xY w"                    d           ||dz
           d<   t          j        t          j                   	  |j        j        ||j        z  z   !j        j        d"j        j        d            j        j        ||dz
           j        j        d"j        j        d           t          j                   n# t          j                   w xY w j        j        "j        j        d|j        j        d            t          j        |dz   j        j        |j        j        |j        j        d#j        j         j        j        d            t          j        |dz   j        j        |j        j         j        j        dj        j        |j        j        d           ||xx          |         z  cc<   t          j        t          j                   	  |j        j        d|j        j        ||j        z  z              t          j                   n# t          j                   w xY w||dz
  k    r d S t)          |||!|           Wd S )N.r   r   )SpMatDescriptorcreateDnVecDescriptorspMV_bufferSizectypesdatadescr+   r.   int8rR   spMVptrr7   setPointerModeCUBLAS_POINTER_MODE_DEVICEitemsizefillr8   r9   _kernel_normalize)$ArB   rC   r@   rA   rT   rU   spmv_desc_Aspmv_desc_vspmv_desc_u	buff_size	spmv_buffrV   	_cusparseaxpybcublas_handlecublas_pointer_moderX   cusparse_handler:   r6   moner?   r1   oneouter_Aspmv_alg
spmv_alpha	spmv_betaspmv_cuda_dtype	spmv_op_arL   vvvzeros$                rN   auxz_lanczos_fast.<locals>.aux   sw   G|||| & #299!<<K"299!<<K"299!<<K!11J,=,B +"2I4D4I /8= =I 
9di88I7#w&& A	3 A	3A&Q##Y
0A0F$k&6$);+;#Xy~/A	C C C "wAC C CK]Aqvz1afj!Z^a%.&88: : : &}6IJJJJ&}6IJJJJ GGAJJJ!a%[AcF"wAC C CK]AZ^a%.&88VZBGK4 4 4 ]AVZq1uX]&27;; ; ; &}6IJJJJ&}6IJJJJD!aQ0 0 0
 D 3AE!&*aQ!27;	3 3 3
 D 3AE!16:qa!&*a	1 1 1
 !HHH1HHH "wAC C CK]Aqvz1Y]Q%668 8 8 &}6IJJJJ&}6IJJJJ EAI~~ aq!Q2222CA	3 A	3s%   :FF28A2J  J).O--P)'cupy_backends.cuda.libsrX   cupyxr   get_cublas_handler7   getPointerModer   r$   sdotsnrm2sgemvsaxpyddotdnrm2dgemvdaxpycdotcscnrm2cgemvcaxpyzdotcdznrm2zgemvzaxpyr%   r#   r   isspmatrix_csrcheck_availabilityget_cusparse_handle CUSPARSE_OPERATION_NON_TRANSPOSEr(   arrayr   to_cuda_dtypeCUSPARSE_MV_ALG_DEFAULTr+   r.   )ro   r?   r   r   ru   rv   rw   rx   ry   rX   rz   r:   r6   r{   r1   r|   r}   r~   r   r   r   r   rL   r   r   r   s    `  @@@@@@@@@@@@@@@@@@@@@@rN   r2   r2      s   ======,..M!0??w|s|}}}	
		|}}}	
		}~}}	
		}~}},33AG<<===O1 5("="=f"E"E 5 466>	[ag..
KQW--	 .qw774
A4qw'''A	SF!'	*	*	*B	QD	(	(	(B
2QW%%%A
+c
)
)
)C;s!'***D;t17+++DGS3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3 S3j JrP   z!T u, raw S beta, int32 j, int32 nzT v, raw T Vz&v = u / beta[j]; V[i + (j+1) * n] = v;cupy_eigsh_normalizec                    t          j        |           } t          j        |          }t          j        |           }|t          j        |d d         d          z   }|t          j        |d d         d          z   }|&t          j        |          }|||d |f<   ||d ||f<   t          j                            |          \  }}|dk    r;t          j        |          }||| d                   }	|d d || d          f         }
n|dk    rMt          j        t          j        |                    }||| d                   }	|d d || d          f         }
n>|dk    r8t          j        |          }||d |                  }	|d d |d |         f         }
t          j        |	          t          j        |
          fS )Nr   r   )r>   r   r	   r   )	r+   asnumpyr(   diaglinalgeighr;   absoluter   )r@   rA   rJ   r>   r
   trG   rH   rM   wksks              rN   r4   r4   +  s    LE<D
5A	EJtCRCyA&&&&A	EJtCRCyB''''Af%%!RaR%"1"a%<QDAq }}mAsA233x[qqq#qbcc({^	$mEN1--..sA233x[qqq#qbcc({^	$mAs2A2wZqqq#bqb'z]
 :b>>4:b>>))rP   )r   r   r
   r   return_singular_vectorsc          	         | j         dk    r't          d                    | j                            | j        j        dvr't          d                    | j                            | j        \  }}|dk    r"t          d                    |                    |t          ||          k    r"t          d                    |                    t          j	        |           } ||k    r
| j
        | } }	n	| | j
        } }	|rt          |	| z  |||||d	          \  }
}nt          |	| z  |||||d
	          }
t          j        |
d          }
|
j        j                                        }ddd}||         t          j        |          j        z  }|t          j        |
          z  }|
|k    }|                                                                }t          j        |
          }t          j        |
|                   |d|<   |s|S |dd|f         }||k    r|}| |z  |d|         z  }n|}| |z  |d|         z  }t/          |||z
            }t/          |||z
            }|||                                j        fS )a  Finds the largest ``k`` singular values/vectors for a sparse matrix.

    Args:
        a (ndarray, spmatrix or LinearOperator): A real or complex array with
            dimension ``(m, n)``. ``a`` must :class:`cupy.ndarray`,
            :class:`cupyx.scipy.sparse.spmatrix` or
            :class:`cupyx.scipy.sparse.linalg.LinearOperator`.
        k (int): The number of singular values/vectors to compute. Must be
            ``1 <= k < min(m, n)``.
        ncv (int): The number of Lanczos vectors generated. Must be
            ``k + 1 < ncv < min(m, n)``. If ``None``, default value is used.
        tol (float): Tolerance for singular values. If ``0``, machine precision
            is used.
        which (str): Only 'LM' is supported. 'LM': finds ``k`` largest singular
            values.
        maxiter (int): Maximum number of Lanczos update iterations.
            If ``None``, default value is used.
        return_singular_vectors (bool): If ``True``, returns singular vectors
            in addition to singular values.

    Returns:
        tuple:
            If ``return_singular_vectors`` is ``True``, it returns ``u``, ``s``
            and ``vt`` where ``u`` is left singular vectors, ``s`` is singular
            values and ``vt`` is right singular vectors. Otherwise, it returns
            only ``s``.

    .. seealso:: :func:`scipy.sparse.linalg.svds`

    .. note::
        This is a naive implementation using cupyx.scipy.sparse.linalg.eigsh as
        an eigensolver on ``a.H @ a`` or ``a @ a.H``.

    r   zexpected 2D (shape: {})r   r   r   r   z-k must be smaller than min(m, n) (actual: {})T)r>   r
   r   r   r   r   Fg     @@g    .A)rY   rZ   N)r!   r"   r#   r    r   r$   r%   r&   r   aslinearoperatorHrO   r+   maximumr-   r(   r)   r*   r'   sumitem
zeros_likesqrt_augmented_orthnormal_colsrS   r5   )r=   r>   r   r   r
   r   r   mr?   aHrG   rI   r   factorcondcutoffabove_cutoffn_largerH   r   rC   s                        rN   svdsr   O  s   H 	v{{299!'BBCCCw|6!!7>>qwGGHHH7DAqAvv@GGJJKKKC1II~~ "F1II' ' 	' 	#A&&AAvvQA13A -R!Vq3$8 8 811 "q&AUW#&+- - - 	QA	AS!!F!9u{1~~))DDHQKKFJL  %%''GA)AlO,,AhwhK" 	!!!\/AAvvEAhwhKEAhwhK"1a'k22A"1a'k22AarP   c                    |dk    r| S | j         \  }}t          j        |||z   f| j                  }| |d d d |f<   t	          |||z             D ]}t          j                            |f                              | j                  }|||d d d |f                                         z  |d d d |f         j        z  z  }|t          j	        
                    |          z  |d d |f<   |S )Nr   r   )r    r+   r.   r   rR   r/   r0   rS   r5   r   norm)rI   n_augr   r?   yrV   r   s          rN   r   r     s    zz7DAq
Aq5y>111AAaaa!eH1a%i   * *Ku%%,,QW55	Q111bqb5 1QQQU8:--dk&&q)))!!!Q$HrP   )r   )r(   r+   r   
cupy._corer   	cupy.cudar   r   r7   cupyx.scipy.sparser   cupyx.scipy.sparse.linalgr   rO   r3   r2   ElementwiseKernelrn   r4   r   r   r^   rP   rN   <module>r      sR                       5 5 5 5 5 5 # # # # # # 0 0 0 0 0 0C4DdDTC C C C CL  E E EP +D*',.D  !* !* !*HR!4!%R R R R Rj
 
 
 
 
rP   