a
    ;emG                     @  s  d dl mZ ddlmZmZmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZ d dlmZ erdd	lmZmZmZmZmZmZ d d
lmZ d dlZd dlZG dd deZG dd deZG dd deZG dd deZddddddddZ ddddddddd Z!ddd!d"d#Z"d d$dddd%d&d'Z#ddd!d(d)Z$ddd!d*d+Z%ddd!d,d-Z&dddd.d/d0Z'dd1d2ddd3dd4d5d6Z(dddd7d8d9Z)dd:dd;dd<d=d>Z*ddd!d?d@Z+dddd.dAdBZ,dd:dd;dd<dCdDZ-dEdFddGddHdIdJZ.ddd!dKdLZ/dMdN Z0dddd.dOdPZ1dQdRddddSdTdUZ2ddVd!dWdXZ3ddYdddZdd[d\d]Z4d dd^ddd_dd`dadbZ5ddddddddcddZ6ddddeddfddgddhdidjZ7g dkZ8dS )l    )annotations   )_floating_dtypes_numeric_dtypesfloat32float64	complex64
complex128)reshape)Array   )normalize_axis_tuple)TYPE_CHECKING)LiteralOptionalSequenceTupleUnionDtype)
NamedTupleNc                   @  s   e Zd ZU ded< ded< dS )
EighResultr   ZeigenvaluesZeigenvectorsN__name__
__module____qualname____annotations__ r   r   J/var/www/sunrise/env/lib/python3.9/site-packages/numpy/array_api/linalg.pyr      s   
r   c                   @  s   e Zd ZU ded< ded< dS )QRResultr   QRNr   r   r   r   r   r      s   
r   c                   @  s   e Zd ZU ded< ded< dS )SlogdetResultr   signZ	logabsdetNr   r   r   r   r   r!   !   s   
r!   c                   @  s&   e Zd ZU ded< ded< ded< dS )	SVDResultr   USZVhNr   r   r   r   r   r#   %   s   
r#   F)upperr   bool)xr&   returnc               C  s:   | j tvrtdtj| j}|r0t|j	S t|S )z
    Array API compatible wrapper for :py:func:`np.linalg.cholesky <numpy.linalg.cholesky>`.

    See its docstring for more information.
    z2Only floating-point dtypes are allowed in cholesky)
dtyper   	TypeErrornplinalgcholesky_arrayr   _newZmT)r(   r&   Lr   r   r   r.   ,   s    
r.   axisint)x1x2r4   r)   c               C  sr   | j tvs|j tvrtd| j|jkr0td| jdkrBtd| j| dkrXtdttj	| j
|j
|dS )zz
    Array API compatible wrapper for :py:func:`np.cross <numpy.cross>`.

    See its docstring for more information.
    z(Only numeric dtypes are allowed in crossz"x1 and x2 must have the same shaper   z/cross() requires arrays of dimension at least 1   zcross() dimension must equal 3r3   )r*   r   r+   shape
ValueErrorndimr   r0   r,   crossr/   )r6   r7   r4   r   r   r   r<   <   s    
r<   )r(   r)   c                C  s&   | j tvrtdttj| jS )z
    Array API compatible wrapper for :py:func:`np.linalg.det <numpy.linalg.det>`.

    See its docstring for more information.
    z-Only floating-point dtypes are allowed in det)	r*   r   r+   r   r0   r,   r-   detr/   r(   r   r   r   r=   N   s    
r=   )offset)r(   r?   r)   c               C  s   t tj| j|dddS )z
    Array API compatible wrapper for :py:func:`np.diagonal <numpy.diagonal>`.

    See its docstring for more information.
    r2   )r?   axis1axis2)r   r0   r,   diagonalr/   )r(   r?   r   r   r   rC   [   s    rC   c                C  s,   | j tvrtdtttjtj	| j
 S )z
    Array API compatible wrapper for :py:func:`np.linalg.eigh <numpy.linalg.eigh>`.

    See its docstring for more information.
    z.Only floating-point dtypes are allowed in eigh)r*   r   r+   r   mapr   r0   r,   r-   eighr/   r>   r   r   r   rE   f   s    
rE   c                C  s&   | j tvrtdttj| jS )z
    Array API compatible wrapper for :py:func:`np.linalg.eigvalsh <numpy.linalg.eigvalsh>`.

    See its docstring for more information.
    z2Only floating-point dtypes are allowed in eigvalsh)	r*   r   r+   r   r0   r,   r-   eigvalshr/   r>   r   r   r   rF   v   s    
rF   c                C  s&   | j tvrtdttj| jS )z
    Array API compatible wrapper for :py:func:`np.linalg.inv <numpy.linalg.inv>`.

    See its docstring for more information.
    z-Only floating-point dtypes are allowed in inv)	r*   r   r+   r   r0   r,   r-   invr/   r>   r   r   r   rG      s    
rG   )r6   r7   r)   c                C  s2   | j tvs|j tvrtdtt| j|jS )z|
    Array API compatible wrapper for :py:func:`np.matmul <numpy.matmul>`.

    See its docstring for more information.
    z)Only numeric dtypes are allowed in matmul)r*   r   r+   r   r0   r,   matmulr/   r6   r7   r   r   r   rH      s    rH   Zfro)keepdimsordz2Optional[Union[int, float, Literal['fro', 'nuc']]])r(   rJ   rK   r)   c               C  s.   | j tvrtdttjj| jd||dS )
    Array API compatible wrapper for :py:func:`np.linalg.norm <numpy.linalg.norm>`.

    See its docstring for more information.
    z5Only floating-point dtypes are allowed in matrix_norm)r@   r2   r4   rJ   rK   )	r*   r   r+   r   r0   r,   r-   normr/   )r(   rJ   rK   r   r   r   matrix_norm   s    
rO   )r(   nr)   c                C  s(   | j tvrtdttj| j|S )z
    Array API compatible wrapper for :py:func:`np.matrix_power <numpy.matrix_power>`.

    See its docstring for more information.
    zMOnly floating-point dtypes are allowed for the first argument of matrix_power)	r*   r   r+   r   r0   r,   r-   matrix_powerr/   )r(   rP   r   r   r   rQ      s    
rQ   )rtolzOptional[Union[float, Array]])r(   rR   r)   c               C  s   | j dk rtjdtjj| jdd}|du r`|jdddt| jd	d  t|j	j
 }n2t|trp|j}|jdddt|d
tjf  }ttj||kddS )z
    Array API compatible wrapper for :py:func:`np.matrix_rank <numpy.matrix_rank>`.

    See its docstring for more information.
    r   zA1-dimensional array given. Array must be at least two-dimensionalFZ
compute_uvNr2   T)r4   rJ   r@   .r3   )r;   r,   r-   ZLinAlgErrorsvdr/   maxr9   finfor*   eps
isinstancer   asarrayZnewaxisr0   Zcount_nonzero)r(   rR   r%   Ztolr   r   r   matrix_rank   s    
0
"rZ   c                C  s(   | j dk rtdtt| jddS )Nr   z5x must be at least 2-dimensional for matrix_transposer2   r@   )r;   r:   r   r0   r,   Zswapaxesr/   r>   r   r   r   matrix_transpose   s    
r[   c                C  sN   | j tvs|j tvrtd| jdks0|jdkr8tdtt| j	|j	S )zz
    Array API compatible wrapper for :py:func:`np.outer <numpy.outer>`.

    See its docstring for more information.
    z(Only numeric dtypes are allowed in outerr   z/The input arrays to outer must be 1-dimensional)
r*   r   r+   r;   r:   r   r0   r,   outerr/   rI   r   r   r   r\      s
    r\   c               C  sR   | j tvrtd|du r:t| jdd t| j j }t	tj
j| j|dS )z
    Array API compatible wrapper for :py:func:`np.linalg.pinv <numpy.linalg.pinv>`.

    See its docstring for more information.
    z.Only floating-point dtypes are allowed in pinvNr@   )Zrcond)r*   r   r+   rU   r9   r,   rV   rW   r   r0   r-   pinvr/   )r(   rR   r   r   r   r]      s
    
 r]   ZreducedmodezLiteral['reduced', 'complete'])r(   r_   r)   c               C  s0   | j tvrtdtttjtjj	| j
|d S )z
    Array API compatible wrapper for :py:func:`np.linalg.qr <numpy.linalg.qr>`.

    See its docstring for more information.
    z,Only floating-point dtypes are allowed in qrr^   )r*   r   r+   r   rD   r   r0   r,   r-   qrr/   )r(   r_   r   r   r   r`     s    
r`   c                C  s,   | j tvrtdtttjtj	| j
 S )z
    Array API compatible wrapper for :py:func:`np.linalg.slogdet <numpy.linalg.slogdet>`.

    See its docstring for more information.
    z1Only floating-point dtypes are allowed in slogdet)r*   r   r+   r!   rD   r   r0   r,   r-   slogdetr/   r>   r   r   r   ra     s    
ra   c                 C  s   ddl m}m}m}m}m}m}m} ddlm	}	 || \} }
||  ||  ||\}}|| |\}}|j
dkrx|	j}n|	j}||rdnd}tj|ddddd	 || ||d
}W d    n1 s0    Y  ||j|ddS )Nr   )
_makearray_assert_stacked_2d_assert_stacked_square_commonTypeisComplexTypeget_linalg_error_extobj_raise_linalgerror_singular)_umath_linalgr   zDD->Dzdd->dcallignore)rj   invalidZoverdivideZunder)	signatureF)copy)Zlinalg.linalgrb   rc   rd   re   rf   rg   rh   r-   ri   r;   Zsolve1solver,   ZerrstateZastype)abrb   rc   rd   re   rf   rg   rh   ri   _wraptZresult_tZgufuncrn   rr   r   r   _solve+  s     $
,rw   c                C  s0   | j tvs|j tvrtdtt| j|jS )z
    Array API compatible wrapper for :py:func:`np.linalg.solve <numpy.linalg.solve>`.

    See its docstring for more information.
    z/Only floating-point dtypes are allowed in solve)r*   r   r+   r   r0   rw   r/   rI   r   r   r   rp   G  s    rp   Tfull_matrices)r(   ry   r)   c               C  s0   | j tvrtdtttjtjj	| j
|d S )z
    Array API compatible wrapper for :py:func:`np.linalg.svd <numpy.linalg.svd>`.

    See its docstring for more information.
    z-Only floating-point dtypes are allowed in svdrx   )r*   r   r+   r#   rD   r   r0   r,   r-   rT   r/   )r(   ry   r   r   r   rT   T  s    
rT   zUnion[Array, Tuple[Array, ...]]c                C  s*   | j tvrtdttjj| jddS )Nz1Only floating-point dtypes are allowed in svdvalsFrS   )	r*   r   r+   r   r0   r,   r-   rT   r/   r>   r   r   r   svdvalse  s    
rz   axesz/Union[int, Tuple[Sequence[int], Sequence[int]]])r6   r7   r|   r)   c               C  s6   | j tvs|j tvrtdttj| j|j|dS )Nz,Only numeric dtypes are allowed in tensordotr{   )r*   r   r+   r   r0   r,   	tensordotr/   )r6   r7   r|   r   r   r   r}   m  s    r}   )r?   r*   zOptional[Dtype])r(   r?   r*   r)   c               C  sZ   | j tvrtd|du r8| j tkr*t}n| j tkr8t}tt	
t	j| j|dd|dS )zz
    Array API compatible wrapper for :py:func:`np.trace <numpy.trace>`.

    See its docstring for more information.
    z(Only numeric dtypes are allowed in traceNr@   r2   )r?   rA   rB   r*   )r*   r   r+   r   r   r   r	   r   r0   r,   rY   tracer/   )r(   r?   r*   r   r   r   r~   v  s    


r~   c         	      C  s   | j tvs|j tvrtdt| j|j}d|| j  t| j }d||j  t|j }|| || krrtdt	| j
|j
\}}t||d}t||d}|dd d d f |d  }t|d S )Nz)Only numeric dtypes are allowed in vecdot)r   z6x1 and x2 must have the same size along the given axisr2   .).N).r   r   )r*   r   r+   rU   r;   tupler9   r:   r,   Zbroadcast_arraysr/   Zmoveaxisr   r0   )	r6   r7   r4   r;   Zx1_shapeZx2_shapeZx1_Zx2_resr   r   r   vecdot  s    r   rM   z%Optional[Union[int, Tuple[int, ...]]]zOptional[Union[int, float]])r(   r4   rJ   rK   r)   c         
        s  | j tvrtd| j |du r.   d}nt|trt|| jtfddt	 jD }|| }t
 |t
j fdd|D tdg fdd|D R  d}n|}tt
jj ||d	}|rt| j}t|du rt	| jn|| j}|D ]}	d
||	< qt|t|}|S )rL   z.Only floating-point dtypes are allowed in normNr   c                 3  s   | ]}| vr|V  qd S )Nr   .0i)normalized_axisr   r   	<genexpr>      zvector_norm.<locals>.<genexpr>c                   s   g | ]} j | qS r   )r9   r   )rq   r   r   
<listcomp>  r   zvector_norm.<locals>.<listcomp>)r*   )r4   rK   r   )r*   r   r+   r/   ZravelrX   r   r   r;   ranger,   Z	transposer
   prodr5   r   r0   r-   rN   listr9   )
r(   r4   rJ   rK   Z_axisrestZnewshaper   r9   r   r   )rq   r   r   vector_norm  s.    

0

r   )r.   r<   r=   rC   rE   rF   rG   rH   rO   rQ   rZ   r[   r\   r]   r`   ra   rp   rT   rz   r}   r~   r   r   )9
__future__r   Z_dtypesr   r   r   r   r   r	   Z_manipulation_functionsr
   Z_array_objectr   Zcore.numericr   typingr   _typingr   r   r   r   r   r   r   Znumpy.linalgnumpyr,   r   r   r!   r#   r.   r<   r=   rC   rE   rF   rG   rH   rO   rQ   rZ   r[   r\   r]   r`   ra   rw   rp   rT   rz   r}   r~   r   r   __all__r   r   r   r   <module>   sN     	 -