o
    &iG                     @  s  d dl mZ ddl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r6d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dkddZdddld#d$Zdmd%d&Zd d'dnd)d*Zdod+d,Zdmd-d.Z dmd/d0Z!dpd1d2Z"dd3d4dqd8d9Z#drd;d<Z$dd=dsd@dAZ%dmdBdCZ&dpdDdEZ'dd=dsdFdGZ(dHdIdtdLdMZ)dudNdOZ*dPdQ Z+dpdRdSZ,dTdUdvdWdXZ-dwdZd[Z.dd\dxd_d`Z/d d'dndadbZ0dddldcddZ1ddddedydhdiZ2g djZ3dS )z    )annotations   )_floating_dtypes_numeric_dtypes)reshape)Array   )normalize_axis_tuple)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   AC:\wamp64\www\opt\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x2r1   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 3r0   )r'   r   r(   shape
ValueErrorndimr   r-   r)   crossr,   )r2   r3   r1   r   r   r   r9   5   s   
r9   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   r;   G   s   
r;   )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@   T   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,   r<   r   r   r   rD   _      
rD   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   r-   r)   r*   eigvalshr,   r<   r   r   r   rF   o      
rF   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   r-   r)   r*   invr,   r<   r   r   r   rH   |   rG   rH   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,   r2   r3   r   r   r   rI      s   rI   Zfro)keepdimsordrK   rL   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/   r1   rK   rL   )	r'   r   r(   r   r-   r)   r*   normr,   )r$   rK   rL   r   r   r   matrix_norm   s   
rQ   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$   rR   r   r   r   rS      s   
rS   )rtolrT   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_uvNr/   T)r1   rK   r>   .r0   )r8   r)   r*   ZLinAlgErrorsvdr,   maxr6   finfor'   eps
isinstancer   asarrayZnewaxisr-   Zcount_nonzero)r$   rT   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 )Nr   z5x must be at least 2-dimensional for matrix_transposer/   r>   )r8   r7   r   r-   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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(   r8   r7   r   r-   r)   outerr,   rJ   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(   rX   r6   r)   rY   rZ   r   r-   r*   pinvr,   )r$   rT   r   r   r   r`      s
   
 r`   Zreducedmoderb   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 qrra   )r'   r   r(   r   rC   r   r-   r)   r*   qrr,   )r$   rb   r   r   r   re         
re   c                C  rB   )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   rC   r   r-   r)   r*   slogdetr,   r<   r   r   r   rg     rE   rg   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.linalgrh   ri   rj   rk   rl   rm   rn   r*   ro   r8   Zsolve1solveZastype)abrh   ri   rj   rk   rl   rm   rn   ro   _wraptZresult_tZgufuncrp   rq   rr   r   r   _solve$  s   $
rz   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-   rz   r,   rJ   r   r   r   rs   ?  s   rs   Tfull_matricesr|   c               C  rd   )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    rC   r   r-   r)   r*   rW   r,   )r$   r|   r   r   r   rW   L  rf   rW   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 svdvalsFrV   )	r'   r   r(   r   r-   r)   r*   rW   r,   r<   r   r   r   svdvals]  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   r-   r)   	tensordotr,   )r2   r3   r   r   r   r   r   e  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)   r\   tracer,   rA   r   r   r   r   n  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(   rX   r8   tupler6   r7   r)   Zbroadcast_arraysr,   Zmoveaxisr   r-   )	r2   r3   r1   r8   Zx1_shapeZx2_shapeZx1_Zx2_resr   r   r   vecdot{  s   r   rO   %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 )rN   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   )r6   r   )rt   r   r   
<listcomp>  s    zvector_norm.<locals>.<listcomp>)r'   )r1   rL   r   )r'   r   r(   r,   Zravelr[   r   r	   r8   ranger)   Z	transposer   prodr4   r   r-   r*   rP   listr6   )
r$   r1   rK   rL   Z_axisrestZnewshaper   r6   r   r   )rt   r   r   vector_norm  s.   

0

r   )r+   r9   r;   r@   rD   rF   rH   rI   rQ   rS   r]   r^   r_   r`   re   rg   rs   rW   r~   r   r   r   r   )r$   r   r#   r%   r&   r   )r2   r   r3   r   r1   r4   r&   r   )r$   r   r&   r   )r$   r   r=   r4   r&   r   )r$   r   r&   r   )r2   r   r3   r   r&   r   )r$   r   rK   r%   rL   rM   r&   r   )r$   r   rR   r4   r&   r   )r$   r   rT   rU   r&   r   )r$   r   rb   rc   r&   r   )r$   r   r&   r   )r$   r   r|   r%   r&   r    )r$   r   r&   r}   )r2   r   r3   r   r   r   r&   r   )
r$   r   r1   r   rK   r%   rL   r   r&   r   )4
__future__r   Z_dtypesr   r   Z_manipulation_functionsr   Z_array_objectr   Zcore.numericr	   typingr
   Z_typingr   r   r   r   r   r   Znumpy.linalgnumpyr)   r   r   r   r    r+   r9   r;   r@   rD   rF   rH   rI   rQ   rS   r]   r^   r_   r`   re   rg   rz   rs   rW   r~   r   r   r   r   __all__r   r   r   r   <module>   sP    










	-