o
    $eC                     @  s  d dl mZ ddlmZ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 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diddZdddjd d!Zdkd"d#Zd d$dld&d'Zdmd(d)Zdkd*d+Zdkd,d-Zdnd.d/Zdd0d1dod5d6Zdpd8d9Z dd:dqd=d>Z!dkd?d@Z"dndAdBZ#dd:dqdCdDZ$dEdFdrdIdJZ%dsdKdLZ&dMdN Z'dndOdPZ(dQdRdtdTdUZ)dudWdXZ*dYdZdvd]d^Z+d d$dld_d`Z,dddjdadbZ-dddYdcdwdfdgZ.g dhZ/dS )x    )annotations   )_floating_dtypes_numeric_dtypes)Array)TYPE_CHECKING)LiteralOptionalSequenceTupleUnion)
NamedTupleNc                   @     e Zd ZU ded< ded< dS )
EighResultr   ZeigenvaluesZeigenvectorsN__name__
__module____qualname____annotations__ r   r   FD:\Projects\ConvertPro\env\Lib\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   r(   "   s   

r(   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-   )r$   r   r%   shape
ValueErrorndimr   r*   r&   crossr)   )r/   r0   r.   r   r   r   r6   2   s   
r6   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   r*   r&   r'   detr)   r!   r   r   r   r8   D   s   
r8   )offsetr:   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.
    r,   r:   Zaxis1Zaxis2)r   r*   r&   diagonalr)   r!   r:   r   r   r   r=   Q   s   r=   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   r*   r&   r'   eighr)   r9   r   r   r   rA   \      
rA   c                C  r7   )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   r*   r&   r'   eigvalshr)   r9   r   r   r   rC   l      
rC   c                C  r7   )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   r*   r&   r'   invr)   r9   r   r   r   rE   y   rD   rE   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   r*   r&   matmulr)   r/   r0   r   r   r   rF      s   rF   Zfro)keepdimsordrH   rI   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)r;   r,   r.   rH   rI   )	r$   r   r%   r   r*   r&   r'   normr)   )r!   rH   rI   r   r   r   matrix_norm   s   
rN   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   r*   r&   r'   matrix_powerr)   )r!   rO   r   r   r   rP      s   
rP   )rtolrQ   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.
       zA1-dimensional array given. Array must be at least two-dimensionalFZ
compute_uvNr,   T)r.   rH   r;   .r-   )r5   r&   r'   ZLinAlgErrorsvdr)   maxr3   finfor$   eps
isinstancer   asarrayZnewaxisr*   Zcount_nonzero)r!   rQ   r   Ztolr   r   r   matrix_rank   s   
0
"r[   c                C  s(   | j dk r	tdtt| jddS )NrS   z5x must be at least 2-dimensional for matrix_transposer,   r;   )r5   r4   r   r*   r&   Zswapaxesr)   r9   r   r   r   matrix_transpose   s   
r\   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%   r5   r4   r   r*   r&   outerr)   rG   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%   rV   r3   r&   rW   rX   r   r*   r'   pinvr)   )r!   rQ   r   r   r   r^      s
   
 r^   Zreducedmoder`   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 qrr_   )r$   r   r%   r   r@   r   r*   r&   r'   qrr)   )r!   r`   r   r   r   rc         
rc   c                C  r?   )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   r@   r   r*   r&   r'   slogdetr)   r9   r   r   r   re   	  rB   re   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 )
NrS   )
_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.linalgrf   rg   rh   ri   rj   rk   rl   r'   rm   r5   Zsolve1solveZastype)abrf   rg   rh   ri   rj   rk   rl   rm   _wraptZresult_tZgufuncrn   ro   rr   r   r   _solve!  s   $
rx   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   r*   rx   r)   rG   r   r   r   rq   <  s   rq   Tfull_matricesrz   c               C  rb   )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 svdry   )r$   r   r%   r   r@   r   r*   r&   r'   rU   r)   )r!   rz   r   r   r   rU   I  rd   rU   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 svdvalsFrT   )	r$   r   r%   r   r*   r&   r'   rU   r)   r9   r   r   r   svdvalsZ  s   
r|   rS   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   r*   r&   	tensordotr)   )r/   r0   r~   r   r   r   r   b  s   r   c            
   C  s2   | j tvr	td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 tracer;   r,   r<   )	r$   r   r%   r   r*   r&   rZ   tracer)   r>   r   r   r   r   k  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 axisr,   .).N).r   r   )r$   r   r%   rV   r5   tupler3   r4   r&   Zbroadcast_arraysr)   Zmoveaxisr   r*   )	r/   r0   r.   r5   Zx1_shapeZx2_shapeZx1_Zx2_resr   r   r   vecdotx  s   r   rL   %Optional[Union[int, Tuple[int, ...]]]Optional[Union[int, float]]c                 s   | j tvr	td| j du r   dn7ttrNtfddt jD }| }t	
 |t	 fddD g fdd|D R  dtt	jj ||dS )	rK   z.Only floating-point dtypes are allowed in normNr   c                 3  s    | ]	}| vr|V  qd S )Nr   .0ir-   r   r   	<genexpr>  s    zvector_norm.<locals>.<genexpr>c                   s   g | ]} j | qS r   )r3   r   )rr   r   r   
<listcomp>  s    zvector_norm.<locals>.<listcomp>rL   )r$   r   r%   r)   flattenrY   r   ranger5   r&   Z	transposeZreshapeprodr   r*   r'   rM   )r!   r.   rH   rI   restZnewshaper   )rr   r.   r   vector_norm  s   

<r   )r(   r6   r8   r=   rA   rC   rE   rF   rN   rP   r[   r\   r]   r^   rc   re   rq   rU   r|   r   r   r   r   )r!   r   r    r"   r#   r   )r/   r   r0   r   r.   r1   r#   r   )r!   r   r#   r   )r!   r   r:   r1   r#   r   )r!   r   r#   r   )r/   r   r0   r   r#   r   )r!   r   rH   r"   rI   rJ   r#   r   )r!   r   rO   r1   r#   r   )r!   r   rQ   rR   r#   r   )r!   r   r`   ra   r#   r   )r!   r   r#   r   )r!   r   rz   r"   r#   r   )r!   r   r#   r{   )r/   r   r0   r   r~   r   r#   r   )
r!   r   r.   r   rH   r"   rI   r   r#   r   )0
__future__r   Z_dtypesr   r   Z_array_objectr   typingr   Z_typingr   r	   r
   r   r   r   Znumpy.linalgnumpyr&   r   r   r   r   r(   r6   r8   r=   rA   rC   rE   rF   rN   rP   r[   r\   r]   r^   rc   re   rx   rq   rU   r|   r   r   r   r   __all__r   r   r   r   <module>   sL    










	