o
    Je-G                     @  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r@d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dnddZ dddod#d$Z!dpd%d&Z"d d'dqd)d*Z#drd+d,Z$dpd-d.Z%dpd/d0Z&dsd1d2Z'dd3d4dtd8d9Z(dud;d<Z)dd=dvd@dAZ*dpdBdCZ+dsdDdEZ,dd=dvdFdGZ-dHdIdwdLdMZ.dxdNdOZ/dPdQ Z0dsdRdSZ1dTdUdydWdXZ2dzdZd[Z3dd\d{d_d`Z4d ddad|dddeZ5dddodfdgZ6ddddhd}dkdlZ7g dmZ8dS )~    )annotations   )_floating_dtypes_numeric_dtypesfloat32float64	complex64
complex128)reshape)Array   )normalize_axis_tuple)TYPE_CHECKING)LiteralOptionalSequenceTupleUnionDtype)
NamedTupleNc                   @     e Zd ZU ded< ded< dS )
EighResultr   ZeigenvaluesZeigenvectorsN__name__
__module____qualname____annotations__ r   r   d/home/seandotau/au.memorygallery.club/gallery/lib/python3.10/site-packages/numpy/array_api/linalg.pyr         
 r   c                   @  r   )QRResultr   QRNr   r   r   r   r   r       r   r    c                   @  r   )SlogdetResultr   signZ	logabsdetNr   r   r   r   r   r#   !   r   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)upperxr   r(   boolreturnc               C  s:   | j tvr	tdtj| j}|rt|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   r0   ,   s   

r0   axisx1x2r6   intc               C  sr   | j tvs
|j tvrtd| j|jkrtd| jdkr!td| j| dkr,t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 3r5   )r,   r   r-   shape
ValueErrorndimr   r2   r.   crossr1   )r7   r8   r6   r   r   r   r>   <   s   
r>   c                C  &   | 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   r2   r.   r/   detr1   r)   r   r   r   r@   N   s   
r@   )offsetrB   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.
    r4   )rB   axis1axis2)r   r2   r.   diagonalr1   )r)   rB   r   r   r   rF   [   s   rF   c                C  ,   | 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   r2   r.   r/   eighr1   rA   r   r   r   rI   f      
rI   c                C  r?   )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   r2   r.   r/   eigvalshr1   rA   r   r   r   rK   v      
rK   c                C  r?   )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   r2   r.   r/   invr1   rA   r   r   r   rM      rL   rM   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   r2   r.   matmulr1   r7   r8   r   r   r   rN      s   rN   Zfro)keepdimsordrP   rQ   2Optional[Union[int, float, Literal['fro', 'nuc']]]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)rC   r4   r6   rP   rQ   )	r,   r   r-   r   r2   r.   r/   normr1   )r)   rP   rQ   r   r   r   matrix_norm   s   
rV   nc                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   r2   r.   r/   matrix_powerr1   )r)   rW   r   r   r   rX      s   
rX   )rtolrY   Optional[Union[float, Array]]c               C  s   | j dk rtjdtjj| jdd}|du r0|jdddt| jd	d  t|j	j
 }nt|tr8|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_uvNr4   T)r6   rP   rC   .r5   )r=   r.   r/   ZLinAlgErrorsvdr1   maxr;   finfor,   eps
isinstancer   asarrayZnewaxisr2   Zcount_nonzero)r)   rY   r'   Ztolr   r   r   matrix_rank   s   
0
"rb   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_transposer4   rC   )r=   r<   r   r2   r.   Zswapaxesr1   rA   r   r   r   matrix_transpose   s   
rc   c                C  sN   | j tvs
|j tvrtd| jdks|jdkrt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   r2   r.   outerr1   rO   r   r   r   rd      s
   rd   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 pinvNrC   )Zrcond)r,   r   r-   r]   r;   r.   r^   r_   r   r2   r/   pinvr1   )r)   rY   r   r   r   re      s
   
 re   Zreducedmoderg   Literal['reduced', 'complete']c               C  0   | 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 qrrf   )r,   r   r-   r    rH   r   r2   r.   r/   qrr1   )r)   rg   r   r   r   rj        
rj   c                C  rG   )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#   rH   r   r2   r.   r/   slogdetr1   rA   r   r   r   rl     rJ   rl   c                 C  s   ddl m}m}m}m}m}m}m} ddlm	}	 || \} }
||  ||  ||\}}|| |\}}|j
dkr<|	j}n|	j}||rEdnd}||}|| |||d}||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)	signatureextobjF)copy)Zlinalg.linalgrm   rn   ro   rp   rq   rr   rs   r/   rt   r=   Zsolve1solveZastype)abrm   rn   ro   rp   rq   rr   rs   rt   _wraptZresult_tZgufuncru   rv   rr   r   r   _solve+  s   $
r   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   r2   r   r1   rO   r   r   r   rx   F  s   rx   Tfull_matricesr   c               C  ri   )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 svdr   )r,   r   r-   r%   rH   r   r2   r.   r/   r\   r1   )r)   r   r   r   r   r\   S  rk   r\   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 svdvalsFr[   )	r,   r   r-   r   r2   r.   r/   r\   r1   rA   r   r   r   svdvalsd  s   
r   axesr   /Union[int, Tuple[Sequence[int], Sequence[int]]]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   r2   r.   	tensordotr1   )r7   r8   r   r   r   r   r   l  s   r   )rB   r,   r,   Optional[Dtype]c               C  sZ   | j tvr	td|du r| j tkrt}n| j tkrt}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 traceNrC   r4   )rB   rD   rE   r,   )r,   r   r-   r   r   r   r	   r   r2   r.   ra   tracer1   )r)   rB   r,   r   r   r   r   u  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r9t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 axisr4   .).N).r   r   )r,   r   r-   r]   r=   tupler;   r<   r.   Zbroadcast_arraysr1   Zmoveaxisr   r2   )	r7   r8   r6   r=   Zx1_shapeZx2_shapeZx1_Zx2_resr   r   r   vecdot  s   r   rT   %Optional[Union[int, Tuple[int, ...]]]Optional[Union[int, float]]c         
        s  | j tvr	td| j |du r   d}nBt|trWt|| 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	}|rt| j}t|du rvt	| jn|| j}|D ]}	d
||	< q}t|t|}|S )rS   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>  s    zvector_norm.<locals>.<genexpr>c                   s   g | ]} j | qS r   )r;   r   )ry   r   r   
<listcomp>  s    zvector_norm.<locals>.<listcomp>)r,   )r6   rQ   r   )r,   r   r-   r1   Zravelr`   r   r   r=   ranger.   Z	transposer
   prodr9   r   r2   r/   rU   listr;   )
r)   r6   rP   rQ   Z_axisrestZnewshaper   r;   r   r   )ry   r   r   vector_norm  s.   

0

r   )r0   r>   r@   rF   rI   rK   rM   rN   rV   rX   rb   rc   rd   re   rj   rl   rx   r\   r   r   r   r   r   )r)   r   r(   r*   r+   r   )r7   r   r8   r   r6   r9   r+   r   )r)   r   r+   r   )r)   r   rB   r9   r+   r   )r)   r   r+   r   )r7   r   r8   r   r+   r   )r)   r   rP   r*   rQ   rR   r+   r   )r)   r   rW   r9   r+   r   )r)   r   rY   rZ   r+   r   )r)   r   rg   rh   r+   r    )r)   r   r+   r#   )r)   r   r   r*   r+   r%   )r)   r   r+   r   )r7   r   r8   r   r   r   r+   r   )r)   r   rB   r9   r,   r   r+   r   )
r)   r   r6   r   rP   r*   rQ   r   r+   r   )9
__future__r   Z_dtypesr   r   r   r   r   r	   Z_manipulation_functionsr
   Z_array_objectr   Zcore.numericr   typingr   Z_typingr   r   r   r   r   r   r   Znumpy.linalgnumpyr.   r   r    r#   r%   r0   r>   r@   rF   rI   rK   rM   rN   rV   rX   rb   rc   rd   re   rj   rl   r   rx   r\   r   r   r   r   r   __all__r   r   r   r   <module>   sP      










	-