o
    Zh`                  
   @  s
  d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	Z	ddl
mZmZ erBddlmZ ddlmZmZmZmZmZmZmZ 	
dzd{ddZ		d|d}ddZd~ddZd~ddZd~d d!Zd"d# Zdd$d%Z	ddd&d'Z				ddd.d/Zddd0dd2d3Z e Z!ddd0dd4d5Z"ddd0dd6d7Z#ddd0dd8d9Z$		dddd0dd;d<Z%ddd?d@Z&ddAdBZ'ddCdDZ(dEdF Z)dddHdIZ*dddJdKZ+ddLdMZ,ddNdOZ-ddPdQZ.ddSdTZ/dddVdWZ0	X	Y	
		ddd\d]Z1	X	Y		ddd^d_Z2	X	Y	`		dddadbZ3				dddcddgdhZ4		idddcddjdkZ5				
	dddmdnZ6		idddcddpdqZ7				
	dddrdsZ8		idddcddtduZ9				
	dddvdwZ:		idddcddxdyZ;				
	dddzd{Z<dd|d}Z=		Y		ddd~dddZ>		Y	
			ddd~dddZ?dd Z@ddddZAddddZBddddZC		ddddZDdddZEdddZFddddZGdddZHddddZIdddZJdddZKddddZLddddZMddl	mNZN d
ddddZOdYd
dddddZPeQd
fdddZRddddZSddddZTdddZUdddZVddddZWddddZX			dddcdddZYddddƄZZddddȄZ[dddʄZ\dddd΄Z]dddЄZ^	ddddӄZ_			ԐddddׄZ`dddلZa	ԐddddۄZbddd݄Zc		ԐddddZd	
	
	
	ddYddddZedddZfdddZgdddZh			ddddZiddddZjdddZkddddZlddddZm					dÐdddZn				idddcdddZodddcdd dZpddƐddZqddƐddZrdǐddZsdd	d
ZtddȐddZudddZvdǐdddZwddɐddZxdddZyddɐddZzdʐdddZ{ddd	dd
dddZ|dd  Z}dːd̐d!d"Z~dːd̐d#d$Z	d͐dΐd'd(Zdd)d*Zdd+d,Zddd-d.Zddd/d0Zddd1d2Zdϐd̐d3d4Zddd5d6Zdϐd̐d7d8Z				dАdѐd:d;ZddҐd=d>Zdd?d@ZdddAdӐdCdDZddԐdEdFZeZeZdՐddHdIZddJdKZddLdMZddNdOZddPdQZddRdSZddTdUZdd֐dVdWZdd֐dXdYZddZd[Zd\d] Zd^d_ Zd`da Zdbdc Zddde Zdfdg Ze	je	je	jgde	je	jggZe	jde	jde	jde	jde	jdiZdאdidjZ	k				dؐdِdmdnZ	k				dؐdڐdpdqZ	k				dؐdڐdrdsZddtduZdېdܐdxdyZdS (  zA thin pytorch / numpy compat layer.

Things imported from here have numpy-compatible signatures but operate on
pytorch tensors.
    )annotationsN)OptionalTYPE_CHECKING   )_dtypes_impl_util)Sequence)	ArrayLikeArrayLikeOrScalarCastingModes	DTypeLikeNDArrayNotImplementedTypeOutArrayKFar	   orderr   subokc                 C  s   |   S Nclone)r   r   r    r   G/var/www/auris/lib/python3.10/site-packages/torch/_numpy/_funcs_impl.pycopy$   s   r   	same_kinddstr   srccastingOptional[CastingModes]wherec                 C  s$   t j|f| j|d\}| | d S )Nr   )r   typecast_tensorsdtypecopy_)r   r   r   r   r   r   r   copyto*   s   r$   arysc                  G      t j|  }t|trt|S |S r   )torch
atleast_1d
isinstancetuplelistr%   resr   r   r   r(   4      

r(   c                  G  r&   r   )r'   
atleast_2dr)   r*   r+   r,   r   r   r   r/   <   r.   r/   c                  G  r&   r   )r'   
atleast_3dr)   r*   r+   r,   r   r   r   r0   D   r.   r0   c                 C  s2   | dkrt d	 |d ur|d urtdd S d S )Nr   z&need at least one array to concatenatezQconcatenate() only takes `out` or `dtype` as an argument, but both were provided.)
ValueError	TypeError)tupr"   outr   r   r   _concat_checkL   s   r5   c                 C  sB   |dus|dur|du r|j jn|}ntj|  }t| ||} | S )z%Figure out dtypes, cast if necessary.N)r"   Ztorch_dtyper   result_type_implr   r!   )tensorsr4   r"   r   Z	out_dtyper   r   r   _concat_cast_helperY   s
   
r8   c                 C  s.   t j| d|i\} }t| |||} t| |S )Naxis)r   axis_none_flattenr8   r'   cat)r7   r9   r4   r"   r   r   r   r   _concatenateh   s   r<   ar_tupleSequence[ArrayLike]r4   Optional[OutArray]r"   Optional[DTypeLike]c                 C  s$   t | ||d t| ||||d}|S )Nr4   )r9   r4   r"   r   )r5   r<   )r=   r9   r4   r"   r   resultr   r   r   concatenateq   s   rC   r"   r   r3   c                C  &   t | |d d t| ||d}t|S NrA   rD   )r5   r8   r'   vstackr3   r"   r   r7   r   r   r   rG   }      
rG   c                C  rE   rF   )r5   r8   r'   hstackrH   r   r   r   rJ      rI   rJ   c                C  rE   rF   )r5   r8   r'   dstackrH   r   r   r   rK      s   
rK   c                C  rE   rF   )r5   r8   r'   column_stackrH   r   r   r   rL      s   	
rL   arraysc                C  sD   t | ||d t| ||d}|d jd }t||}tj||dS )NrA   rD   r   r   r9   )r5   r8   ndimr   normalize_axis_indexr'   stack)rM   r9   r4   r"   r   r7   Zresult_ndimr   r   r   rQ      s
   rQ   arrvaluesc                 C  s<   |d u r| j dkr|  } | }| j d }t| |f|dS )Nr   rN   )rO   flattenr<   )rR   rS   r9   r   r   r   append   s   

rU   c                 C  sD   t |trt| |||S t |ttfrt| t||S tdt|)Nzsplit_helper: )r)   int_split_helper_intr+   r*   _split_helper_listr2   type)tensorindices_or_sectionsr9   strictr   r   r   _split_helper   s
   
r]   c           	      C  s   t |ts	tdt|| j}| j| |}}|dkrt|| dkr1||| }}|g| }n|r7td|| || d }}|g| }||d g||  7 }t	| ||S )Nzsplit: indices_or_sectionsr   z0array split does not result in an equal divisionr   )
r)   rV   NotImplementedErrorr   rP   rO   shaper1   r'   split)	rZ   r[   r9   r\   lnnumszlstr   r   r   rW      s   

rW   c                   s   t |ts	td fdd|D }t|t| }|j   |d gdd t|dd  |d d D  }|dg| 7 }t| S )Nz split: indices_or_sections: listc                   s   g | ]}|j   kr|qS r   )r_   .0xr9   rZ   r   r   
<listcomp>   s    z&_split_helper_list.<locals>.<listcomp>r   c                 S  s   g | ]\}}|| qS r   r   )rg   r   br   r   r   rj      s    r   )	r)   r+   r^   lenrU   r_   zipr'   r`   )rZ   r[   r9   re   Z	num_extrar   ri   r   rX      s   
"rX   aryc                 C  s   t | ||S r   r]   ro   r[   r9   r   r   r   array_split     rr   c                 C  s   t | ||ddS )NTr\   rp   rq   r   r   r   r`     s   r`   c                 C  s4   | j dkr	td| j dkrdnd}t| ||ddS )Nr   z3hsplit only works on arrays of 1 or more dimensionsr   Trt   rO   r1   r]   rq   r   r   r   hsplit  s   
rv   c                 C  "   | j dk r	tdt| |dddS )N   z3vsplit only works on arrays of 2 or more dimensionsr   Trt   ru   ro   r[   r   r   r   vsplit     
rz   c                 C  rw   )N   z3dsplit only works on arrays of 3 or more dimensionsrx   Trt   ru   ry   r   r   r   dsplit  r{   r}   rk   c                 C     t | |S r   )r'   kron)r   rk   r   r   r   r     rs   r   rh   c                 C     t | ||S r   )r'   vander)rh   NZ
increasingr   r   r   r   "     r   2   Tstartstopc                 C  s8   |dks|s|s
t |d u rt j}tj| |||dS Nr   r"   )r^   r   default_dtypesfloat_dtyper'   linspace)r   r   rc   endpointZretstepr"   r9   r   r   r   r   )  s
   	
r   c                 C  sX   |dks|st t||  d|d  }t|}tjt| | t|| ||dS )Nr         ?r   )base)r^   r'   powloglogspace)r   r   rc   r   r"   r9   r   Zlogbaser   r   r   	geomspace:  s   
r         $@c                 C  s$   |dks|st tj| ||||dS )Nr   )r   r"   )r^   r'   r   )r   r   rc   r   r   r"   r9   r   r   r   r   N  s   	r   )likeOptional[ArrayLikeOrScalar]stepr   c                C  s   |dkrt |d u r| d u rt|d u rd| } }| d u rd} |d u r9tdd | ||fD r4t jnt j}|jr?tj	n|}tdd | ||fD rOt
|dkrW| |ks_|dk rf| |k rftjd|dS tj| |||d}t||}|S )Nr   c                 s      | ]}t |V  qd S r   )r   Zis_float_or_fp_tensorrf   r   r   r   	<genexpr>s      zarange.<locals>.<genexpr>c                 s  r   r   )r   Zis_complex_or_complex_tensorrf   r   r   r   r   y  r   r   )ZeroDivisionErrorr2   anyr   r   r   	int_dtype
is_complexr'   float64r^   emptyaranger   cast_if_needed)r   r   r   r"   r   Z
work_dtyperB   r   r   r   r   \  s*   
 r   Cc                C      |d u r	t  j}tj| |dS Nr   )r   r   r   r'   r   r_   r"   r   r   r   r   r   r        
r   	prototypec                 C  $   t j| |d}|d ur||}|S r   )r'   
empty_likereshape)r   r"   r   r   r_   rB   r   r   r   r        
r   
fill_valuec                C  sB   t | tr| f} |d u r|j}t | ttfs| f} tj| ||dS r   )r)   rV   r"   r*   r+   r'   full)r_   r   r"   r   r   r   r   r   r     s   
r   c                 C  s&   t j| ||d}|d ur||}|S r   )r'   	full_liker   )r   r   r"   r   r   r_   rB   r   r   r   r     s   	
r   c                C  r   r   )r   r   r   r'   onesr   r   r   r   r     r   r   c                 C  r   r   )r'   	ones_liker   r   r"   r   r   r_   rB   r   r   r   r     r   r   c                C  r   r   )r   r   r   r'   zerosr   r   r   r   r     r   r   c                 C  r   r   )r'   
zeros_liker   r   r   r   r   r     r   r   c                 C  s   |durRd| j  }|dkr| d| | j } |s#| jd dkr#| j} |  } d|j  }|dkr:|d| |j }|sF|jd dkrF|j}| }t| |fdd} | S )z$Prepare inputs for cov and corrcoef.Nrx   r   r   r   rN   )rO   viewr_   ZmTr   r<   )Zx_tensorZy_tensorrowvarZ
ndim_extrar   r   r   _xy_helper_corrcoef  s   

r   r   yOptional[ArrayLike]c          	      C  sf   |d us|d ur
t t| ||}|jtjko|j}|rtj}t||}t	|}|r1|
tj}|S r   )r^   r   r"   r'   float16is_cpufloat32r   r   corrcoefto)	rh   r   r   biasddofr"   Z	xy_tensoris_halfrB   r   r   r   r     s   	
r   mfweightsaweightsc          
      C  sr   t | ||} |d u r|dkrdnd}| jtjko| j}|r tj}t| |} tj| |||d}	|r7|		tj}	|	S )Nr   r   )Z
correctionr   r   )
r   r"   r'   r   r   r   r   r   covr   )
r   r   r   r   r   r   r   r"   r   rB   r   r   r   r   /  s   r   c                 C  s   t | |}t| |} t||}|dkr|jd d n|}|dkr0|jd d dkr0td| d d d f }|d d d d f }tjjj	|||d}|dd d f S )Nr   r   r   Zsamerx   z#mode='same' and even-length weights)padding)
r   r6   r   r   r_   r^   r'   nn
functionalZconv1d)r   vmodedtr   ZaavvrB   r   r   r   _conv_corr_implM  s   r   r   c                 C  s6   | j d |j d k r|| } }t|d}t| ||S )Nr   r   )r_   r'   flipr   r   r   r   r   r   r   convolved  s   
r   validc                 C  s   t |}t| ||S r   )r'   Zconj_physicalr   r   r   r   r   	correlateo  s   
r   weightsc                C  sF   |   dkr| jdtd} t j}tj| f|dd\} t	| ||S )Nr   r   safer    )
numelZ	new_emptyrV   r   r   r   r   r!   r'   bincount)rh   r   Z	minlengthr   r   r   r   r   w  s
   
r   	conditionc                C  s`   |d u |d u krt d| jtjkr| tj} |d u r'|d u r't| }|S t| ||}|S )Nz1either both or neither of x and y should be given)r1   r"   r'   boolr   r   )r   rh   r   rB   r   r   r   r     s   
c                 C  s   | j S r   )rO   r   r   r   r   rO     s   rO   c                 C  s
   t | jS r   )r*   r_   r   r   r   r   r_        
r_   c                 C  s   |d u r|   S | j| S r   )r   r_   )r   r9   r   r   r   size  s   
r   c                 C  s   t | j|}| |S r   )r   Zexpand_shaper_   r   )r   r9   r_   r   r   r   expand_dims  s   
r   c                 C  s2   |d u rt t| j}nt|| j}t| |S r   )r*   rangerO   r   normalize_axis_tupler'   r   )r   r9   r   r   r   r     s   r   c                 C  
   t | S r   )r'   flipudr   r   r   r   r     r   r   c                 C  r   r   )r'   fliplrr   r   r   r   r     r   r   r   r   c                 C  s   t || j}t| ||S r   )r   r   rO   r'   rot90)r   kaxesr   r   r   r     s   r   arrayc                 C     t j| |dS )N)r   )r'   broadcast_to)r   r_   r   r   r   r   r     r   r   )broadcast_shapes)r   argsc                 G  s
   t j| S r   )r'   broadcast_tensors)r   r   r   r   r   broadcast_arrays  r   r   xy)r   sparseindexingxic                   s   t |}|dvrtdd|   fddt|D }|dkrA|dkrA|d d	 d
d   |d< |d d d
d   |d< |sHtj| }| rQdd |D }t|S )N)r   Zijz.Valid values for `indexing` are 'xy' and 'ij'.r   c                   s6   g | ]\}}|  d | d  |d d   qS )N)rl   r   )r   )rg   irh   s0r   r   rj     s   6 zmeshgrid.<locals>.<listcomp>r   r   r   )r   rl   rx   )rl   r   c                 S  s   g | ]}|  qS r   r   rf   r   r   r   rj         )rm   r1   	enumerater   r'   r   r+   )r   r   r   r   rO   outputr   r   r   meshgrid  s   
r   c           	      C  s   t | } t| }d| }|rd}n
tj|f|  |d}t| D ])\}}tj||d|d | |f ||d d   }|rD||f }q|||< q|S )Nr   r   r   r   )r*   rm   r'   r   r   r   r   )	
dimensionsr"   r   r   r_   r-   r   dimidxr   r   r   indices  s    
r   c                 C  r~   r   )r'   trilr   r   r   r   r   r     rs   r   c                 C  r~   r   )r'   triur   r   r   r   r     rs   r   c                 C     |d u r| }t j| ||dS Noffset)r'   tril_indicesrb   r   r   r   r   r   r       r  c                 C  r  r  )r'   triu_indicesr  r   r   r   r    r  r  c                 C  .   | j dkr	tdtj| jd | jd |dS Nrx   zinput array must be 2-dr   r   r  )rO   r1   r'   r  r_   rR   r   r   r   r   tril_indices_from     
r  c                 C  r	  r
  )rO   r1   r'   r  r_   r  r   r   r   triu_indices_from  r  r  c                C  s,   |d u r| }t j| |f|d}t j||dS )Nr   )diagonal)r'   r   r   )r   Mr   r"   r   rZ   r   r   r   tri%  s   r  h㈵>:0yE>c                 C  8   t | |}t| |} t||}tj| ||||dS N)rtolatol	equal_nan)r   r6   r   r   r'   iscloser   rk   r  r  r  r"   r   r   r   r  6     r  c                 C  r  r  )r   r6   r   r   r'   allcloser  r   r   r   r  =  r  r  c                 C  s@   | j |j krdS | |k}|r|t| t|@ B }|  S NF)r_   r'   isnanallitem)a1a2r  Zcondr   r   r   _tensor_equalD  s   r#  r!  r"  c                 C  s   t | ||dS )Nr  )r#  )r!  r"  r  r   r   r   array_equalN  r   r%  c                 C  s4   z
t | |\}}W n
 ty   Y dS w t||S r  )r'   r   RuntimeErrorr#  )r!  r"  Za1_tZa2_tr   r   r   array_equivR  s   
r'          c                 C  sN   |   rtj| j|||d}tj| j|||d}|d|  S tj| |||dS )N)nanposinfneginfy              ?)r   r'   
nan_to_numrealimag)rh   r   r)  r*  r+  reZimr   r   r   r,  \  s
   r,  raiser   c                 C  sD   t j| |d\\} }t || j}td f| |df }| | }|S )NrN   .)r   r:   rP   rO   slice)r   r   r9   r4   r   r   rB   r   r   r   takek  s
   r2  c                 C  s0   t j| |d\\} }t || j}t| ||S NrN   )r   r:   rP   rO   r'   Ztake_along_dim)rR   r   r9   r   r   r   take_along_axisy  s   r4  c                 C  s   | | j}| | kr(| |  d |  }|d|f|j }| | k r<| }|d |  }| || d S Nr   r   )rY   r"   r   	unsqueezeexpandr_   rT   Zput_)r   r   rS   r   r   ratior   r   r   put  s   r9  c                 C  sf   t j| |d\\} }t || j}t||\}}t || j}t| |||}| 	|
| j d S r3  )r   r:   rP   rO   r'   r   r   r"   Zscatterr#   r   r_   )rR   r   rS   r9   rB   r   r   r   put_along_axis  s   r:  choicesc                   s>   t t j    fddt jD }| |d<  | dS )Nc                   s<   g | ]\}}t |d | |f d  j| d   qS )r   r   )r'   r   r   rO   )rg   r   r   r;  r   r   rj     s    *zchoose.<locals>.<listcomp>r   )r'   rQ   r   r   r_   squeeze)r   r;  r4   r   Zidx_listr   r<  r   choose  s   
r>  r$  arreturn_indexr  c                C  s8   t j| |d\\} }t || j}tj| |||d}|S )NrN   )return_inversereturn_countsr   )r   r:   rP   rO   r'   unique)r?  r@  rA  rB  r9   r  rB   r   r   r   rC    s   	rC  c                 C  s   t j| ddS )NTas_tuple)r'   nonzeror   r   r   r   rF    r   rF  c                 C  r   r   )r'   argwherer   r   r   r   rG    r   rG  c                 C  s   t | jddd S )NTrD  r   )r'   rT   rF  r   r   r   r   flatnonzero  s   rH  minmaxc                 C  r   r   )r'   clamp)r   rI  rJ  r4   r   r   r   clip  s   rL  repeatsr
   c                 C  r   r   )r'   Zrepeat_interleave)r   rM  r9   r   r   r   repeat  r   rN  Ac                 C  s   t |tr|f}t| |S r   )r)   rV   r'   tile)rO  Zrepsr   r   r   rP    s   
rP  c                 C  s   |d u r| S t |tr|f}|  } d}|D ]}||9 }|dk r$tdq|  dks/|dkr7tj|| jdS | |    }t| f| d | } t	| |S )Nr   r   z0all elements of `new_shape` must be non-negativer   )
r)   rV   rT   r1   r   r'   r   r"   rC   r   )r   Z	new_shapenew_sizeZ
dim_lengthrM  r   r   r   resize  s    

rR  c                 C  s,   t || j}t || j}t| |||S r   )r   rP   rO   r'   r  )r   r  axis1axis2r   r   r   r    s   r  c                 C  s    t j| |||djd|d}|S )N)Zdim1Zdim2rl   r   )r'   r  sum)r   r  rS  rT  r"   r4   rB   r   r   r   trace  s   rV  c                C  sB   |d u r	t  j}|d u r| }tj| ||d}||d |S )Nr   r   )r   r   r   r'   r   r  Zfill_)r   r  r   r"   r   r   zr   r   r   eye  s   	
rX  c                C  r   r   )r'   rX  )rb   r"   r   r   r   r   identity*  r   rY  c                 C  r~   r   )r'   diagr   r   r   r   r   rZ  .  rs   rZ  c                 C  r~   r   )r'   diagflatr[  r   r   r   r\  2  rs   r\  rx   c                 C  s   t | }|f| S r   )r'   r   )rb   rO   r   r   r   r   diag_indices6  s   

r]  c                 C  sH   | j dks	td| j}|dd  |d d krtdt|d | j S )Nrx   z input array must be at least 2-dr   rl   z/All dimensions of input must be of equal lengthr   )rO   r1   r_   r]  )rR   sr   r   r   diag_indices_from;  s   
r_  valc           
      C  s  | j dk r	td| dkr|s| | | S |j dkr"|d}| j dkrr| jd | jd k}|r5|sF|  }||d |   | S | j\}}t	|||d   }|| }|| }	|d |  | |	|d  | |f< | S t
| }|d | jd  | |< | S )Nrx   zarray must be at least 2-dr   r   )rO   r1   r   Zfill_diagonal_r6  r_   r  r#   r'   r   r_  )
r   r`  wrapZtallrZ  Zmax_Zmin_r   moddivr   r   r   fill_diagonalF  s,   





$rd  c                C  s   t | |\}}|jdkr| }|jdkr| }t||}|t jko*|jp*|j}|t jk}|r6t j	}n|r;t j
}t||}t||}t ||}|rW|t j}|S |r_|t j}|S Nr   )r'   r(   rO   rT   r   r6   r   r   r   r   uint8r   r   vdotr   )r   rk   Zt_aZt_br"   r   is_boolrB   r   r   r   rg  h  s*   


rg  c                 C  sP   t |ttfrdd |D }t| |}t| |} t||}tj| ||dS )Nc                 S  s    g | ]}t |tr|gn|qS r   r)   rV   )rg   axr   r   r   rj     s     ztensordot.<locals>.<listcomp>)dims)	r)   r+   r*   r   r6   r   r   r'   	tensordot)r   rk   r   target_dtyper   r   r   rl    s   rl  c                 C  sv   t | |}|tjk}|rtj}t| |} t||}| jdks&|jdkr+| | }nt| |}|r9|	tj}|S Nr   )
r   r6   r'   r   rf  r   r   rO   matmulr   )r   rk   r4   r"   rh  rB   r   r   r   dot  s   

rp  c                C  s   t | |}|tjko| jp|j}|tjk}|rtj}n|r!tj}t	| |} t	||}t
| |}|r=|tj}|S |rE|tj}|S r   )r   r6   r'   r   r   r   r   rf  r   r   innerr   )r   rk   r"   r   rh  rB   r   r   r   rq    s    
rq  c                 C  r~   r   )r'   outer)r   rk   r4   r   r   r   rr    rs   rr  rl   c                 C  s  |d ur|fd \}}}t || j}t ||j}t| |d} t||d}d}| jd dvs8|jd dvr<t|t| d j|d j}| jd dksU|jd dkra|d7 }t |t|}t	
| |}tj||d}	t | |} t ||}| d }
| d }| jd dkr| d	 }|d }|d }|jd dkr|d	 }|	jd
kr|	jd dkr|	d }|	d }|	d	 }| jd dkr|jd dkr|
| ||  |	d< |	S |jd dksJ || |d< |
 | |d< |
| ||  |d< nQ| jd dksJ |jd dkr#|| ||  |d< || |
|  |d< |
| ||  |d< n!|jd dks-J | | |d< || |d< |
| ||  |d< t|	d|S )Nr|   rl   zDincompatible dimensions for cross product
(dimension must be 2 or 3))rx   r|   ).r   )r|   r   ).r   ).rx   r   rx   .)r   rP   rO   r'   moveaxisr_   r1   r   rm   r   r6   r   r   )r   rk   ZaxisaZaxisbZaxiscr9   msgr_   r"   cpZa0r!  r"  Zb0b1b2Zcp0Zcp1Zcp2r   r   r   cross  s^   rx  r   )r4   r"   r   r   optimizec                   s:  ddl m} ddlm}m m}m}	m}
 |	|}||}| d ur)t| |s)t	d|dkr1t
dt|d t }|rG|d d d d d	 }n|d |dd  }} fd
d|D }|d u rdtj| n|}|tjkostdd |D }|rytj}|tjtjtjtjfv }|rtj}t|||}ddlm} zl| rtjjj}tjjj}|du rd}n	|du rdtjj_|tjj_|r|dd d	 }t|d	 dk}|r|d }t t!j"#t$||}|r|%| tj&| }n	tj&|g|R  }W | r|tjj_|tjj_n| r|tjj_|tjj_w || |}|
|S )Nr   )ndarray)maybe_copy_tonormalize_array_likenormalize_castingnormalize_dtypewrap_tensorsz'out' must be an arrayr   z#'order' parameter is not supported.r   rl   rx   c                   s   g | ]} |qS r   r   )rg   opr|  r   r   rj   -  r   zeinsum.<locals>.<listcomp>c                 s  s    | ]}|j V  qd S r   )r   )rg   tr   r   r   r   1  s    zeinsum.<locals>.<genexpr>)
opt_einsumTautoF)'Z_ndarrayrz  _normalizationsr{  r|  r}  r~  r  r)   r2   r^   strr   r6   r'   r   r  r   rf  int8int16int32int64r   r!   Ztorch.backendsr  Zis_availablebackendsZstrategyenabledrm   r+   	itertoolschainfrom_iterablern   rU   einsum)r4   r"   r   r   ry  Zoperandsrz  r{  r}  r~  r  Zsublist_formatZarray_operandsZ
subscriptsr7   rm  r   Zis_short_intr  Zold_strategyZold_enabledZsublistsZhas_sublistoutZ
sublistoutrB   r   r  r   r  
  sf   










r  c                 C  sN   | j jrtd| j  dtj| |d\\} }t|| j}|dk}| ||fS )Nzsorting z is not supportedrN   stable)r"   r   r^   r   r:   rP   rO   )rZ   r9   kindr   r  r   r   r   _sort_helperg  s   
r  c                 C  s*   t | |||\} }}tj| ||d}|jS N)r   r  )r  r'   sortrS   )r   r9   r  r   r  rB   r   r   r   r  r  s   r  c                 C  s$   t | |||\} }}tj| ||dS r  )r  r'   argsort)r   r9   r  r   r  r   r   r   r  y  s   r  leftsorterc                 C  s*   | j jrtd| j  tj| |||dS )Nzsearchsorted with dtype=)sider  )r"   r   r^   r'   searchsorted)r   r   r  r  r   r   r   r  ~  s   r  c                 C  s.   t || jd}t || jd}t| ||S )Nsourcedestination)r   r   rO   r'   rs  )r   r  r  r   r   r   rs    s   rs  c                 C  s*   t || j}t || j}t| ||S r   )r   rP   rO   r'   swapaxes)r   rS  rT  r   r   r   r    s   r  c                 C  s   | j }t||}|dk r||7 }d}d|  kr|d k s/n t|d| d|d |f ||k r7|d8 }||kr=| S ttd|}|| ||| | |S )Nr   z5'%s' arg requires %d <= %s < %d, but %d was passed inr   r   )	rO   r   rP   Z	AxisErrorr+   r   removeinsertr   )r   r9   r   rb   rt  r   r   r   r   rollaxis  s   

r  c                 C  s@   |d urt j|| jdd}t|ts|ft| }t| ||S )NT)Zallow_duplicate)r   r   rO   r)   r*   rm   r'   roll)r   shiftr9   r   r   r   r    s
   
r  c                 C  sX   |dkr| }|S |d u r|   }|S t|tr%| }|D ]}|  |}q|S |  |}|S )Nr   )r=  r)   r*   )r   r9   rB   rj  r   r   r   r=    s   


r=  c                 C  s"   t |dkr
|d n|}| |S r5  )rm   r   )r   Znewshaper   r   r   r   r     s   
r   c                 C  s:   |dv rt tt| j}n
t|dkr|d }| |S )N)r   Nr   r   r   )r*   reversedr   rO   rm   Zpermute)r   r   r   r   r   	transpose  s
   
r  c                 C  r   r   )r'   rT   )r   r   r   r   r   ravel  r   r  prependc                 C  s   t || j}|dk rtd| |dkr| S |d ur5t| j}|jdkr+|j| nd||< t||}|d urRt| j}|jdkrH|j| nd||< t||}tj| ||||dS )Nr   z#order must be non-negative but got r   )r9   r  rU   )	r   rP   rO   r1   r+   r_   r'   r   diff)r   rb   r9   r  rU   r_   r   r   r   r    s   

r  rW  c                 C  s    t | }|r|dt j  }|S )N   )r'   anglepi)rW  degrB   r   r   r   r    s   
r  c                 C  r   r   )r'   sincrh   r   r   r   r    r   r  )r9   
edge_orderfc                G  s  | j }t|}|d u rtt|}nt||}t|}t|}|dkr+dg| }nq|dkrBt|d s=|d j dkrB|| }nZ||krt	|}t
|D ]H\}	}
t|
}
|
j dkr]qN|
j dkrftdt|
| j||	  krutd|
jjs|
jjs|
 }
t|
}||d k r|d }|||	< qNntd|dkrtdg }td g| }td g| }td g| }td g| }| j}t|ttfv r|  } tj}t||D ]\}}| j| |d k rtd	tj| |d
}t|p|j dk}tdd||< td d||< tdd||< tdd ||< |r1| t| | t|  d|  |t|< nY|dd }|dd  }| |||   }|| ||  }||||   }dg| }d||< ||}||}||}|| t|  || t|   || t|   |t|< |dkrd||< d||< d||< |r|n|d }| t| | t|  | |t|< d||< d||< d||< |r|n|d }| t| | t|  | |t|< nd||< d||< d||< d||< |rd| }d| }d| }n&|d }|d }d| |  |||   }|| ||  }| |||   }|| t|  || t|   || t|   |t|< d||< d||< d||< d||< |r`d| }d| }d| }n%|d }|d }||||   }||  ||  }d| | |||   }|| t|  || t|   || t|   |t|< || td ||< td ||< td ||< td ||< q|dkr|d S |S )Nr   r   r   z&distances must be either scalars or 1dzGwhen 1d, distances must match the length of the corresponding dimensionzinvalid number of argumentsrx   z)'edge_order' greater than 2 not supportedzlShape of array too small to calculate a numerical gradient, at least (edge_order + 1) elements are required.r   rl   g       @g      g      g      ?g       g      ?)rO   r   Zndarrays_to_tensorsr*   r   r   rm   r   Z	is_scalarr+   r   r'   Z	as_tensorr1   r_   r"   is_floating_pointr   doubler  r  r2   r1  python_type_for_torchrV   r   r   rn   r   r   rU   )r  r9   r  varargsr   r   Zlen_axesrb   Zdxr   Z	distancesZdiffxZoutvalsZslice1Zslice2Zslice3Zslice4ZotypeZax_dxr4   Zuniform_spacingZdx1Zdx2r   rk   cr_   Zdx_0Zdx_nr   r   r   gradient  s   
$





*



.

$&
.

.


r  c                 C  sR   |   rtj| |d}|S |  r%ttj| j|dtj| j|d}|S | }|S )N)decimals)r  r'   roundr   complexr-  r.  )r   r  r4   rB   r   r   r   r    s   
r  d   c                 C  sJ   t | s| S |dkr|t | jj }t | j|k }| r#| jS | S re  )	r'   r   finfor"   Zepsabsr.  r  r-  )r   Ztolmaskr   r   r   real_if_close  s   
r  c                 C  r   r   )r'   r-  r   r   r   r   r-    r   r-  c                 C  s   |   r| jS t| S r   )r   r.  r'   r   r   r   r   r   r.    s   
r.  c                 C  s$   t | r
| jdkS t j| t jdS r   )r'   r   r.  r   r   r  r   r   r   	iscomplex     

r  c                 C  s$   t | r
| jdkS t j| t jdS r   )r'   r   r.  r   r   r  r   r   r   isreal  r  r  c                 C  r   r   r'   r   r  r   r   r   iscomplexobj  r   r  c                 C  s   t |  S r   r  r  r   r   r   	isrealobj  rs   r  c                 C  r   r   )r'   isneginfrh   r4   r   r   r   r    r   r  c                 C  r   r   )r'   isposinfr  r   r   r   r    r   r  c                 C  s   t j| S r   )r'   Zspeciali0r  r   r   r   r    rs   r  c                 C  s8   ddl m} z|| }| dkW S  ty   Y dS w )Nr   r  F)r  r|  r   	Exception)r   r|  r  r   r   r   isscalar
  s   r  c                 C     t  j}tj| d|dS NF)periodicr"   )r   r   r   r'   Zhamming_windowr  r"   r   r   r   hamming     
r  c                 C  r  r  )r   r   r   r'   Zhann_windowr  r   r   r   hanning  r  r  c                 C  s   t  j}tj| |d|dS )NF)betar  r"   )r   r   r   r'   Zkaiser_window)r  r  r"   r   r   r   kaiser"  s   
r  c                 C  r  r  )r   r   r   r'   Zblackman_windowr  r   r   r   blackman'  r  r  c                 C  r  r  )r   r   r   r'   Zbartlett_windowr  r   r   r   bartlett,  r  r  r7   c                  G  sz   d}d}| D ](}|j }t|rd}|js|jsd}nt|d }|d u r(tdt||}q|r7t	d | S t	d | S )NFr   Trx   z+can't get common type for non-numeric arrayr   )
r"   r  r  r   array_precisiongetr2   builtinsrJ  
array_type)r7   r   	precisionr   r  pr   r   r   common_typeC  s   r  
   binsc           
      C  s  |d urt d|d ur|jjrtd| jjp| jj }|d u p%|jj }|r,|  } |d ur7t|| j}t|t	j
rO|jdkrHt|}nt|| j}|d u rat	j| ||t|d\}}	nt	j| |||t|d\}}	|sw|rw| }|r}|	 }	||	fS )N3normed argument is deprecated, use density= insteadzcomplex weights histogram.r   )weightdensity)r   r  r  )r1   r"   r   r^   r  r  r   r   r)   r'   ZTensorrO   operatorindex	histogramr   long)
r   r  r   normedr   r  Zis_a_intZis_w_inthrk   r   r   r   r  Z  s0   

r  r   c           
      C  s   t | t |krtdzt |}W n ty   d}Y nw |dkr*|dkr*||g}t| |f|||||\}}	||	d |	d fS )Nz"x and y must have the same length.r   rx   r   )rm   r1   r2   histogramdd)
rh   r   r  r   r  r   r  r   r  er   r   r   histogram2d  s   
r  c                   sZ  |d urt dddlm}m} t ttfr| j n|  t	   j
js2 j
js2   t|tp@tdd |D  }|rX||}dd |D }	 fdd|D }|d urb|  }|d ur jd	d
}
t|
ddj }t| }t| j
}d|i}ni }tj ||fdt|i|\}}|rdd t||	D }||fS )Nr  r   )r|  normalize_seq_array_likec                 s  s    | ]}t |tV  qd S r   ri  rg   rk   r   r   r   r     r   zhistogramdd.<locals>.<genexpr>c                 S  s   g | ]}|j qS r   r   r  r   r   r   rj     s    zhistogramdd.<locals>.<listcomp>c                   s   g | ]	}t | jqS r   )r   r   r"   r  sampler   r   rj     s    r   )r   rx   rl   r  r  c                 S  s   g | ]
\}}t ||qS r   )r   r   )rg   ZbbZdtypr   r   r   rj     s    )r1   r  r|  r  r)   r+   r*   Tr'   r/   r"   r  r   r  rV   r  r  rT   tolistZaminmaxr;   r   r   r   r  r   rn   )r  r  r   r  r   r  r|  r  Zbins_is_arrayZbins_dtypesmmZw_kwdr  rk   r   r  r   r    s8   


"r  c                C  sd  ddl m} |  dkr|| jS | jtjkrtj}||S | jjrXttj}| jtj	kpK|j
| j  ko:|jkn  oK|j
| j  koI|jkn  }|rQtj	ntj}||S | jjrtjtjtjfD ]}t|}|j
|   krw|jkrn qd|} ||S qd||S tjtjtjtjtjfD ]}t|}|j
|   kr|jkrn q|} ||S q||S )Nr   )DType)Z_dtypesr  r   r"   r'   r   r   r  r   	complex64rI  r-  rJ  r.  
complex128r  r   r   rf  r  r  r  r  Ziinfo)r   r  r"   fiZfits_in_singler   iir   r   r   min_scalar_type  s<   
:


r  constant	pad_widthc                 K  sf   |dkrt |dd}t| j}||}t|| jdf}t|d	 }tj
jj| t||dS )Nr  Zconstant_valuesr   rx   r   )value)r^   r  r   r  r"   r'   r   rO   r   rT   r   r   padr*   )r   r  r   kwargsr  typr   r   r   r    s   r  )r   F)r   r	   r   r   r   r   )r   N)r   r   r   r	   r   r   r   r   )r%   r	   )NNr   )r   NNr   )r   r   )r=   r>   r4   r?   r"   r@   r   r   )r3   r>   r"   r@   r   r   )r   N)rM   r>   r4   r?   r"   r@   r   r   r   )rR   r	   rS   r	   )Fr   )ro   r	   )r   r	   rk   r	   r  )rh   r	   )r   TFNr   )r   r	   r   r	   r"   r@   )r   TNr   )r   Tr   Nr   )r"   r@   )NNr   N)
r   r   r   r   r   r   r"   r@   r   r   )Nr   )r"   r@   r   r   r   r   )Nr   FN)r   r	   r"   r@   r   r   r   r   )r   r	   r"   r@   r   r   r   r   )r   r	   r"   r@   r   r   r   r   )NT)NTNN)rh   r	   r   r   r"   r@   )NTFNNN)
r   r	   r   r   r   r   r   r   r"   r@   )r   )r   r	   r   r	   )r   rn  )r   r   rh   r	   )NN)r   r	   rh   r   r   r   )r   r	   )r   r	   )r   r   )r   r	   r   r   )r   r	   r   r   )r   r	   )rR   r	   )Nr   N)r"   r@   r   r   )r  r  F)r!  r	   r"  r	   )Tr(  NN)rh   r	   r   r   )NNr0  )r   r	   r   r	   r4   r?   r   r   )rR   r	   r   r	   )r0  )r   r   r   r	   rS   r	   r   r   )rR   r	   r   r	   rS   r	   )Nr0  )r   r	   r;  r>   r4   r?   r   r   )FFFN)r?  r	   r@  r   r  r   )NNN)r   r	   rI  r   rJ  r   r4   r?   )r   r	   rM  r
   )rO  r	   )r   r   r   )r   r   r   NN)r   r	   r"   r@   r4   r?   )Nr   Nr   )r   r	   )rx   )r   r	   r`  r	   )r   r	   rk   r	   r4   r?   )rl   rl   rl   N)rl   NN)r   r	   r   r   )r  N)r   r	   r   r	   r  r   )r   )r   rl   NN)r   r	   r  r   rU   r   )rW  r	   )r  r	   )r   r	   r4   r?   )r  )rh   r	   r4   r?   )r7   r	   )r  NNNN)r   r	   r  r	   r   r   )r   r   r   r   )r  )r   r	   r  r	   )__doc__
__future__r   r  r  r  typingr   r   r'    r   r   collections.abcr   r  r	   r
   r   r   r   r   r   r   r$   r(   r/   r0   r5   r8   r<   rC   rG   Z	row_stackrJ   rK   rL   rQ   rU   r]   rW   rX   rr   r`   rv   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rO   r_   r   r   r   r   r   r   r   r   r   r   rV   r   r   r   r  r  r  r  r  r  r  r#  r%  r'  r,  r2  r4  r9  r:  r>  rC  rF  rG  rH  rL  rN  rP  rR  r  rV  rX  rY  rZ  r\  r]  r_  rd  rg  rl  rp  rq  rr  rx  r  r  r  r  r  rs  r  r  r  r=  r   r  r  r  r  r  r  r  ZaroundZround_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  r  r  r  r   r   r   r   <module>   s`  $	


.	
		

	" H]
  1	/:%