o
    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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   eigenvalueseigenvectorsN__name__
__module____qualname____annotations__ r   r   I/var/www/html/venv/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   sign	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S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   _newmT)r-   r,   Lr   r   r    r4   ,   s   

r4   axisx1x2r;   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 3r:   )r0   r   r1   shape
ValueErrorndimr   r6   r2   crossr5   )r<   r=   r;   r   r   r    rC   <   s   
rC   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)	r0   r   r1   r   r6   r2   r3   detr5   r-   r   r   r    rE   N   s   
rE   )offsetrG   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.
    r9   )rG   axis1axis2)r   r6   r2   diagonalr5   )r-   rG   r   r   r    rK   [   s   rK   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)r0   r   r1   r   mapr   r6   r2   r3   eighr5   rF   r   r   r    rN   f      
rN   c                C  rD   )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)	r0   r   r1   r   r6   r2   r3   eigvalshr5   rF   r   r   r    rP   v      
rP   c                C  rD   )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)	r0   r   r1   r   r6   r2   r3   invr5   rF   r   r   r    rR      rQ   rR   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)r0   r   r1   r   r6   r2   matmulr5   r<   r=   r   r   r    rS      s   rS   fro)keepdimsordrV   rW   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)rH   r9   r;   rV   rW   )	r0   r   r1   r   r6   r2   r3   normr5   )r-   rV   rW   r   r   r    matrix_norm   s   
r\   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)	r0   r   r1   r   r6   r2   r3   matrix_powerr5   )r-   r]   r   r   r    r^      s   
r^   )rtolr_   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
compute_uvNr9   T)r;   rV   rH   .r:   )rB   r2   r3   LinAlgErrorsvdr5   maxr@   finfor0   eps
isinstancer   asarraynewaxisr6   count_nonzero)r-   r_   r*   tolr   r   r    matrix_rank   s   
0
"rm   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_transposer9   rH   )rB   rA   r   r6   r2   swapaxesr5   rF   r   r   r    matrix_transpose   s   
ro   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)
r0   r   r1   rB   rA   r   r6   r2   outerr5   rT   r   r   r    rp      s
   rp   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 pinvNrH   )rcond)r0   r   r1   re   r@   r2   rf   rg   r   r6   r3   pinvr5   )r-   r_   r   r   r    rr      s
   
 rr   reducedmoderu   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 qrrt   )r0   r   r1   r"   rM   r   r6   r2   r3   qrr5   )r-   ru   r   r   r    rx        
rx   c                C  rL   )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)r0   r   r1   r%   rM   r   r6   r2   r3   slogdetr5   rF   r   r   r    rz     rO   rz   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}tj|ddddd	 || ||d
}W d    n1 scw   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)r   invalidoverdivideunder)	signatureF)copy)linalg.linalgr{   r|   r}   r~   r   r   r   r3   r   rB   solve1solver2   errstateastype)abr{   r|   r}   r~   r   r   r   r   _wraptresult_tgufuncr   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)r0   r   r1   r   r6   r   r5   rT   r   r   r    r   G  s   r   Tfull_matricesr   c               C  rw   )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   )r0   r   r1   r(   rM   r   r6   r2   r3   rd   r5   )r-   r   r   r   r    rd   T  ry   rd   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 svdvalsFra   )	r0   r   r1   r   r6   r2   r3   rd   r5   rF   r   r   r    svdvalse  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   )r0   r   r1   r   r6   r2   	tensordotr5   )r<   r=   r   r   r   r    r   m  s   r   )rG   r0   r0   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 traceNrH   r9   )rG   rI   rJ   r0   )r0   r   r1   r   r   r   r	   r   r6   r2   ri   tracer5   )r-   rG   r0   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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 axisr9   .).N).r   r   )r0   r   r1   re   rB   tupler@   rA   r2   broadcast_arraysr5   moveaxisr   r6   )	r<   r=   r;   rB   x1_shapex2_shapex1_x2_resr   r   r    vecdot  s   r   rZ   %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 )rY   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   )r   r   r    
<listcomp>  s    zvector_norm.<locals>.<listcomp>)r0   )r;   rW   r   )r0   r   r1   r5   ravelrh   r   r   rB   ranger2   	transposer
   prodr>   r   r6   r3   r[   listr@   )
r-   r;   rV   rW   _axisrestnewshaper   r@   r   r   )r   r   r    vector_norm  s.   

0

r   )r4   rC   rE   rK   rN   rP   rR   rS   r\   r^   rm   ro   rp   rr   rx   rz   r   rd   r   r   r   r   r   )r-   r   r,   r.   r/   r   )r<   r   r=   r   r;   r>   r/   r   )r-   r   r/   r   )r-   r   rG   r>   r/   r   )r-   r   r/   r   )r<   r   r=   r   r/   r   )r-   r   rV   r.   rW   rX   r/   r   )r-   r   r]   r>   r/   r   )r-   r   r_   r`   r/   r   )r-   r   ru   rv   r/   r"   )r-   r   r/   r%   )r-   r   r   r.   r/   r(   )r-   r   r/   r   )r<   r   r=   r   r   r   r/   r   )r-   r   rG   r>   r0   r   r/   r   )
r-   r   r;   r   rV   r.   rW   r   r/   r   )9
__future__r   _dtypesr   r   r   r   r   r	   _manipulation_functionsr
   _array_objectr   core.numericr   typingr   _typingr   r   r   r   r   r   r   numpy.linalgnumpyr2   r   r"   r%   r(   r4   rC   rE   rK   rN   rP   rR   rS   r\   r^   rm   ro   rp   rr   rx   rz   r   r   rd   r   r   r   r   r   __all__r   r   r   r    <module>   sP      










	-