o
    ҷhG                     @  s2  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 d d	lmZ erFd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doddZ"dddpd$d%Z#dqd&d'Z$d d(drd*d+Z%dsd,d-Z&dqd.d/Z'dqd0d1Z(dtd2d3Z)dd4d5dud9d:Z*dvd<d=Z+dd>dwdAdBZ,dqdCdDZ-dtdEdFZ.dd>dwdGdHZ/dIdJdxdMdNZ0dydOdPZ1dQdR Z2dtdSdTZ3dUdVdzdXdYZ4d{d[d\Z5dd]d|d`daZ6d ddbd}dedfZ7dddpdgdhZ8ddddid~dldmZ9g dnZ:dS )    )annotations   )_floating_dtypes_numeric_dtypesfloat32float64	complex64
complex128)reshape)conj)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  sT   | j tvr	tdtj| j}|r%t|j	}|j t
tfv r#t|}|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mTr   r	   r   )r.   r-   Lr*   r    r    r!   r5   -   s   

r5   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;   )r1   r   r2   shape
ValueErrorndimr   r7   r3   crossr6   )r=   r>   r<   r    r    r!   rD   @   s   
rD   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)	r1   r   r2   r   r7   r3   r4   detr6   r.   r    r    r!   rF   R   s   
rF   )offsetrH   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:   )rH   axis1axis2)r   r7   r3   diagonalr6   )r.   rH   r    r    r!   rL   _   s   rL   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)r1   r   r2   r   mapr   r7   r3   r4   eighr6   rG   r    r    r!   rO   j      
rO   c                C  rE   )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)	r1   r   r2   r   r7   r3   r4   eigvalshr6   rG   r    r    r!   rQ   z      
rQ   c                C  rE   )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)	r1   r   r2   r   r7   r3   r4   invr6   rG   r    r    r!   rS      rR   rS   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)r1   r   r2   r   r7   r3   matmulr6   r=   r>   r    r    r!   rT      s   rT   fro)keepdimsordrW   rX   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)rI   r:   r<   rW   rX   )	r1   r   r2   r   r7   r3   r4   normr6   )r.   rW   rX   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)	r1   r   r2   r   r7   r3   r4   matrix_powerr6   )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_uvNr:   T)r<   rW   rI   .r;   )rC   r3   r4   LinAlgErrorsvdr6   maxrA   finfor1   eps
isinstancer   asarraynewaxisr7   count_nonzero)r.   r`   r+   tolr    r    r!   matrix_rank   s   
0
"rn   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_transposer:   rI   )rC   rB   r   r7   r3   swapaxesr6   rG   r    r    r!   matrix_transpose   s   
rp   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)
r1   r   r2   rC   rB   r   r7   r3   outerr6   rU   r    r    r!   rq      s
   rq   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 pinvNrI   )rcond)r1   r   r2   rf   rA   r3   rg   rh   r   r7   r4   pinvr6   )r.   r`   r    r    r!   rs      s
   
 rs   reducedmoderv   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 qrru   )r1   r   r2   r#   rN   r   r7   r3   r4   qrr6   )r.   rv   r    r    r!   ry        
ry   c                C  rM   )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)r1   r   r2   r&   rN   r   r7   r3   r4   slogdetr6   rG   r    r    r!   r{     rP   r{   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   r4   r   rC   solve1solver3   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)r1   r   r2   r   r7   r   r6   rU   r    r    r!   r   K  s   r   Tfull_matricesr   c               C  rx   )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   )r1   r   r2   r)   rN   r   r7   r3   r4   re   r6   )r.   r   r    r    r!   re   X  rz   re   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 svdvalsFrb   )	r1   r   r2   r   r7   r3   r4   re   r6   rG   r    r    r!   svdvalsi  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   )r1   r   r2   r   r7   r3   	tensordotr6   )r=   r>   r   r    r    r!   r   q  s   r   )rH   r1   r1   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 traceNrI   r:   )rH   rJ   rK   r1   )r1   r   r2   r   r   r   r	   r   r7   r3   rj   tracer6   )r.   rH   r1   r    r    r!   r   z  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   )r1   r   r2   rf   rC   tuplerA   rB   r3   broadcast_arraysr6   moveaxisr   r7   )	r=   r>   r<   rC   x1_shapex2_shapex1_x2_resr    r    r!   vecdot  s   r   r[   %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 )rZ   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    )rA   r   )r   r    r!   
<listcomp>  s    zvector_norm.<locals>.<listcomp>)r1   )r<   rX   r   )r1   r   r2   r6   ravelri   r   r   rC   ranger3   	transposer
   prodr?   r   r7   r4   r\   listrA   )
r.   r<   rW   rX   _axisrestnewshaper   rA   r   r    )r   r   r!   vector_norm  s.   

0

r   )r5   rD   rF   rL   rO   rQ   rS   rT   r]   r_   rn   rp   rq   rs   ry   r{   r   re   r   r   r   r   r   )r.   r   r-   r/   r0   r   )r=   r   r>   r   r<   r?   r0   r   )r.   r   r0   r   )r.   r   rH   r?   r0   r   )r.   r   r0   r   )r=   r   r>   r   r0   r   )r.   r   rW   r/   rX   rY   r0   r   )r.   r   r^   r?   r0   r   )r.   r   r`   ra   r0   r   )r.   r   rv   rw   r0   r#   )r.   r   r0   r&   )r.   r   r   r/   r0   r)   )r.   r   r0   r   )r=   r   r>   r   r   r   r0   r   )r.   r   rH   r?   r1   r   r0   r   )
r.   r   r<   r   rW   r/   rX   r   r0   r   );
__future__r   _dtypesr   r   r   r   r   r	   _manipulation_functionsr
   _elementwise_functionsr   _array_objectr   core.numericr   typingr   _typingr   r   r   r   r   r   r   numpy.linalgnumpyr3   r   r#   r&   r)   r5   rD   rF   rL   rO   rQ   rS   rT   r]   r_   rn   rp   rq   rs   ry   r{   r   r   re   r   r   r   r   r   __all__r    r    r    r!   <module>   sR      










	-