U
    KcL6                    @   s(  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZmZ d dlmZmZmZmZmZmZmZ d dlZd dlmZ d dlmZ d dlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 dd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgZ4ej5Z5ej6j7Z7dd˄ Z8dd͜ddτZ9d dl:m;Z; e< Z=e=dddҜedӜddՄZ>e>e"j?dd Z@e>e"jAdd	 ZBe>e"jAdd
 ZCe>e"jAdd ZDe>e"jAdd ZEe>e"jAdd ZFe>e"jAdd ZGe>e"jHdd ZIe>e"jHdd ZJe;ejKjLjMe3 e*dߜddZMe>e"jAdd ZNe>e"jAdd ZOe>e"jAdd ZPe>e"jAdd ZQe>e"jAdd ZRe>e"jAdd ZSe>e"jAdd ZTe>e"jAdd ZUe>e"jAdd ZVe3 e1de"jWde*e%e*dddZXe*e%e*dddZYe*e*dddZZe>e"jHdd Z[e>e"jHe*e*dddZ\e*e*dddWZ]e>e"j^dde*e*ddd%Z_e>e"j^e*e*ddd&Z`e>e"j^e*e*dddZae>e"j^e*e*dddZbe>e"j^e*e*ddd'Zce>e"j^dde*e*ddd(Zde>e"jAejKjLjedd d) Zfe>e"jAdd* ZgejhjiZje>e"jAdd+ Zke>e"jAdd, Zle>e"jAdd- Zme>e"jAdd. Zne3 dde*eoeejp e*ddd	Zqe3 die*e ere*d
ddZse;ejKjLjte3 dje*ee% ee% ee% e*ddd/Zte*dddZue>e"jHeuddd0 Zve*e*ddd1Zwe*e*dddfZxe>e"jAdd2 Zye>e"jHdddd3 Zze>e"jAdd Z{e>e"jAe*e*ddd4Z|e>e"jHdd5 Z}e>e"jHdd6 Z~e>e"j^dd7 Ze>e"jAdd8 Ze>e"jAdd9 Ze>e"jAd d: Ze>e"jAd!d; Ze>e"jdde*e*dd"d<Ze>e"jAd#d= Ze>e"jAd$d> Ze>e"jHd%d@ Ze=ddddѐd&eed'd(d)Ze;ejKjLje3 e1d*e"jHddd+ee*e%f ee*e%f ee% d,d-dAZeeje"jAddѐd.Zeeje"jHd/Zeeje"jHejKjLjd0Zeeje"jHd/Zeeje"jHejKjLjd0Zeeje"jHd/Zee*e%f ee*e%f d*d1d2Zeee"jAdejKjLjd3Ze;ejKjLje3 dd4ee*e%f ee*e%f ee d5d6dIZeeje"j^dѐd7Zee*e%f ee*e%f e*d8d9d:Zeee"jejKjLjd0Ze3 ee*e%f ee*e%f e5d8d;dKZee*e%f ee*e%f d*d<d=Ze5e5e5d8d>d?Ze5e5e5d8d@dAZeeej"jHejKjLjd0Zeeje"jHejKjLjddѐdBZeeje"jHejKjLjddѐdBZeeje"jHejKjLjdd̐dBZeeje"jHejKjLjddѐdBZeeje"j^dѐd7Zeeje"j^dѐd7Ze*e*e*dCdDdEZeee"jWddejKjLjdFZeeje"jHddѐd.Zeeje"jAddѐd.Zeeje"jAddѐd.Zee*e*eeddGdHdIZdke*e*eeere*dLdMdXZe*e*d*dNdOZeee"jHejKjLjddѐdBZeeje"j^dѐd7Ze*e*d*dPdQZeee"j^ejKjLjd0Ze>e"j^ejKjLjde*ddRd\Ze*e*d*dSdTZeee"j^ejKjLjd0Ze*e*d*dUdVZeee"j^ejKjLjd0Zeeje"j^dѐd7Zeeje"jHd/Zeeje"jHd/Zeeje"jHd/Zeeje"j^dѐd7Zeeje"jWddѐd.Zeeje"jHejKjLjd0Zdd+ee*e%f ee*e%f ee% d,dWdiZe;ejKjLje3 e1d*e"jHddd+ee*e%f ee*e%f ee% d,dXdlZeeje"jAdd0Zee*e%f ee*e%f d*dYdZZeeej"jHdd0Ze;ejKjLjÃe3 e1d[e"jAdd\d]e*e*e*e%e*d^d_doZe;ejKjLjăe3 e1d`e"jHddle*ee+ ee+ e*dadbdpZe;ejKjLjŃe3 dme*e+e*dcdddeZe;ejKjLjƃe3 dne*e+e*dfdgdhZe;ejKjLjǃe3 e1d*e"jWddoe5ee+ ee+ didjdrZe;ejKjLjȃejɐdke*eje*dldmdsZd̐dne5e5d*dodtZe;ejKjLj̃e*e%ddpduZ̐dpe*eej eejp eer eej eej eer ererdq	drdsZedtdu Zejѐdqejejperereej dvdwdxZejѐdreejperereej dvdydzZejѐdsejperereej d{d|d}Zejѐdte5erereej d~ddZe5e֐dddZe*e*dddvZddddddde*eereree  ereejp ee5 e&e*d
ddZeZe;ejKjLjڃe3 due*ee  ere*d
ddwZeZe;ejKjLj܃e3 dve*ee  ere*d
ddzZe;ejKjLjރdwddde*eeeo eeeo  f ereejp ee5 e*ddd~Ze5e5dddZe;ejKjLjdxddde*eeeo eeeo  f eree5 e*dddZe;ejKjLjdydde*eeeo eeeo  f eree5 e*dddyZe;ejKjLjdzdde*ee  eree5 e*dddxZd{ddZe3 d|dde*ee  eer ereeo e*dddZe3 d}dde*eeeo eeeo  f eer ereeo e*dddZe;ejKjLjd~ddde*ee  ere*d
dd{Ze;ejKjLjjddddde*eeeo eeeo  f eer ereeo ddd|Ze;ejKjLjddde*ee  eer ereeo ddd}Ze;ejKjLje3 e1de"jHdd\d\de*e*e*e%e%e*dddZee*ee* f e*ee*ee*df f dddZeeoe*e*dddZee*ee* f e*ee*ee*df f dddZee*ee* f e*ee*ee*df f dddZde*e'e(eoe*dddZe'dӜddZejKjLjje7jejKjLjje7jee* dӜddZe*e'e*dddZe;ejKjLje3 e1de"jWdde,eoe*dddZe3 e,e*dddZe*e*dddZe;ejKjLjde*eeo e%e*dddZejdke5eje5dlddZe3 e,e*dddZe;ejKjLjd̐de5e5dddZe5e5e5d8ddZde*eoeoee*df dddZ de*eoeoe*dÜddZe;ejKjLje*ee*dŜddZe*e*dddZe*e*dddZe*eoeoeoe*dɜddZe5e eee5e5e5f d˜d̐d̈́Ze;ejKjLje5e'ee5 ee5 eee5e5e5f dΜddZe;ejKjLjd̐de*e*dddZe'e(eoeoeodќdҐdӄZ	e;ejKjLj
e5e5dddZ
e*ere*d՜d֐dׄZe*e'e*d؜ddZe*e*e*dڜdېd܄Ze;ejKjLje fe*e e e*dݜddZe;ejKjLjde*eoee*dddZe,ddddZe;ejKjLje3 de,eoe*dddZe3 dde*eoeejp e*dddZe3 e,e*dddZe3 e,e*dddZe*eoe'e*dddZe;ejKjLjde*eoe,dddZe;ejKjLje3 e)eoe)e)ddd Ze;ejKjLje)eoe)e)ddd!Ze;ejKjLje)eoe)ee%e)f ddd#Ze;ejKjLje)eoe)ee%e)f ddd$Ze;ejKjLje3 d\d+e)eoe)e)e%dddZd\d+e)eoe)e)e%dddZe;ejKjLjd̐de3 e)eoe)ddd"Ze;ejKjLjd̐dde*eeo e*dddZde*ee5e f eoee*df dddZ e*e ee*df dddZ!e*e ee*df dddZ"e;ejKjLj#d̐dde*eoeoeoe*dd dZ#e;ejKjLj$de*eoeoeoe*dddZ$e*e e,dddZ%e;ejKjLj&jd̐de*dddZ&e;ejKjLj'd̐de*eoeoe*dddZ'e'Z(e;ejKjLj)e*eoeoeod	d
dZ)e;ejKjLj*dddde*eoereejp ee5 e*dddZ*e;ejKjLj+d̐de*eoe*dddZ+e;ejKjLj,d̐de*e'e*d؜ddZ,e*e*e*dڜddZ-e*e*dddZ.e;ejKjLj/e3 dej0dddejdeejp ejeej erereje*dddZ/e;ejKjLj1ddddѐde*e'eejp eej eej ere*dddZ1e;ejKjLj2ddddѐde*e'e(eejp eej eej ere*dddZ2e;ejKjLj3e3 dej0dddѐdeejp ejeej erere*dddńZ3e;ejKjLj4dddddѐde*e'eejp eej eej erere*d d!d"Z4e;ejKjLj5e3 dej0dddѐdeejp ejeej erere*dd#dZ5e;ejKjLj6dddddѐde*e'eejp eej eej erere*d d$d%Z6e;ejKjLj7ddddѐde*e'eeoeerf eejp eej eej ere*d&d'd(Z7e;ejKjLj8dddddejɐd)e*eejp eej eej erereje*d*d+dZ8e;ejKjLj9jejKjLj9j:ejKjLj9j;ge3 ddej0dddѐde%ee% e%eejp ejeej erere*d,	d-dZ9e;ejKjLj<e3 ddej0ddѐd.e%e%e%eejp eej ejerere*d/	d0dZ<e;ejKjLj=e3 dddej0ddѐd.e%e%e%e%eejp eej ejerere*d2
d3dZ=eee* ed4d5dZ>ee*ed4d6dZ>e;ejKjLj>ee*ee* ee* f eee* d7d8dZ>e*eeoef eeoef e*d9d:dZ?e;ejKjLj@ddej0ddѐd;ee'ee' f e(eejp eej ejerere*d<d=dZ@e;ejKjLjAe3 ddej0dddѐdeoeeo eejp ejeej erere*d>d?dZAe3 dej0dddѐde'e%eejp ejeej erere*d@dAdZBdddddejɐdBe*e%eejp eej eej erereje*dC	dDdZCe
eCdѐdEZDe
eCd̐dEZEe;ejKjLjFe3 dddddd;eejp eej eej ereer e*dFdGdÄZFdej0ddѐde%eejp ejeej ere*dHdIdĄZGe;ejKjLjHde'eereoef eereoef ejpee*dKdLdǄZHe;ejKjLjIjJejKjLjIj5ge*e*e+dMdNdqZIde*e*eeererdLdOdȄZKe*e*erd8dPdɄZLe3d̐dQddde*eeeef  ee  ereejp e*dSdTdUZMe;ejKjLjNe*e*dVdWd?ZNdXdY ZOeOeZPeOeZQeOeZRe;ejKjLjSe3 de*eoe*dZd[dZSe;ejKjLjTe3 de*eoe*dZd\dZTeoeoeoeeoeoeof d]d^d_ZUeeoeoejpejerd`dadbZVe;ejKjLjWdejXej0dcdѐdeoeoeoejpejeere*dddedZWeoeoeoeeoeoeof d]dfdgZYe;ejKjLjZdejXej0dcdѐdeoeoeoejpejeere*dddhdZZd dl[Zd dl\Zd dl]Zd dl^ZdS (      N)Iterable)Enum)partialreducesingledispatchwraps)CallableListOptionaloverloadSequenceTupleUnion)checkDeviceLikeTypeDimsSequenceTypeDimsTypedtype_to_typeELEMENTWISE_TYPE_PROMOTION_KINDis_weakly_lesser_typeNumber
NumberTypeREDUCTION_OUTPUT_TYPE_KIND	ShapeType
StrideType
TensorLikeTensorLikeTypeTensorOrNumberLikeTypeTensorSequenceType)_maybe_convert_to_dtype_maybe_resize_out_safe_copy_out"elementwise_type_promotion_wrapper elementwise_unary_scalar_wrapperout_wrapperabsacosacoshasinhasinatanatanhbitwise_notceilconj_physicalcoscoshdigammaerferfinverfcexpexpm1exp2fillfloorfrac	index_add
index_add_
index_copyindex_copy_index_select
index_fillindex_fill_isfiniteisinfisnanisreali0lgammaloglog1plog2log10
nan_to_numnegpositive
reciprocalroundsigmoidsgnsignsignbitsinsincsinhsqrtsquaretantanhtracetruncaddatan2bitwise_andbitwise_left_shift
bitwise_orbitwise_right_shiftbitwise_xorcopysigndiveqfloat_powerfloor_dividefmaxfminfmodgcdgegt	heavisidehypotigammaigammacimagiscloselcmlelogical_andlogical_not
logical_orlogical_xorltmaximumminimummulne	nextafterpowrealrpow	remainderrsubrtruediv	rfloordivsubtrue_dividetrunc_divideaddcdivclampmasked_fillwhereclonecopy_toitemtoallamaxaminanymeanstd_meanvar_meansumsum_to_sizeprodvaraddr
atleast_1d
atleast_2d
atleast_3d
as_stridedbroadcast_shapesbroadcast_tensorsbroadcast_tocatchunkcolumn_stackconjconstant_pad_nd
contiguous
diag_embeddiagonaldsplitdstackexpand	expand_asflattenflipfliplrflipudhsplithstackmeshgridmovedimnarrownative_layer_normpermuteravelrepeatreshaperollrot90rsqrtstack	swap_axessqueezettensor_split	transposeunfold_copy	unsqueezeviewvsplitvstack	unflattenunbindtriutriltriu_indicestril_indicesarangeempty
empty_likeempty_stridedeyefull	full_likelinspacelogspaceones	ones_likerandnscalar_tensorzeros
zeros_likeuniformallcloseequalc                  G   s   t dd tdd | D }t|dkr,d S |D ]}t|ts0tq0dgttdd |D  }|D ]|}tddt| dD ]b}|| dkr|| dk rt	d	|| ||< qz|| dkrz|| || krzt
d
t|| dqzqb|S )Nc                 s   s"   | ]}t |tr|fn|V  qd S N)
isinstanceint.0x r   8/tmp/pip-unpacked-wheel-gikjz4vx/torch/_refs/__init__.py	<genexpr>"  s   z$_broadcast_shapes.<locals>.<genexpr>c                 S   s   | d k	S r   r   r   r   r   r   <lambda>$      z#_broadcast_shapes.<locals>.<lambda>r      c                 s   s   | ]}t |V  qd S r   len)r   shaper   r   r   r   3  s     z9Attempting to broadcast a dimension with negative length!z.Attempting to broadcast a dimension of length !)tuplefilterr   r   r   AssertionErrorr   maxrange
ValueErrorRuntimeErrorstr)Z_shapesshapesr   common_shapeidxr   r   r   _broadcast_shapes!  s6    
r  T)preserve_cpu_scalar_tensorsc                    s8   t tdd | fdd t fdd|D S )Nc                 S   s   t | tr| jS d S r   )r   r   r   r   r   r   r   r   J  r   z"_maybe_broadcast.<locals>.<lambda>c                    sn   | d krd S t | tr| S t | trRr6t| r6| S t| j sN|  S | S tdt	t
|  d d S )Nz#Unexpected type when broadcasting: r   )r   r   r   utilsis_cpu_scalar_tensorZ
same_shaper   r   r   r   type)r   r   )r  r  r   r   __maybe_broadcastM  s    


z+_maybe_broadcast.<locals>.__maybe_broadcastc                 3   s   | ]} |V  qd S r   r   r   )r
  r  r   r   r   _  s     z#_maybe_broadcast.<locals>.<genexpr>)r  mapr   )r  argsr   )r
  r  r  r   _maybe_broadcastG  s
    r  )register_decompositionF)aten_opdisable_meta
extra_meta)returnc                   s   t d fdd}|S )Nprimc                    sh   t  t ttddttd fdd}tkrLttjj	 j
d k	rdtd| |S )NaZtype_promoting_argstype_promotion_kindr  r  c                    s*   t | tstd d k	r" |  | S )Nz;Expected a tensor input for an elementwise unary operation!)r   r   r   r  )r  r  r   r   _refv  s    
z>_make_elementwise_unary_reference.<locals>.inner.<locals>._refr  )r   r$   r#   r"   r   infer_aten_opgetattrtorchopsaten__name__r  )r  r  r  r  r  r  r  r   inners  s    z0_make_elementwise_unary_reference.<locals>.inner)r   )r  r  r  r  r#  r   r"  r   !_make_elementwise_unary_referencel  s    r$  c                 C   s
   t | S r   )primsr%   r  r   r   r   r%     s    c                 C   s
   t | S r   )r%  r&   r  r   r   r   r&     s    c                 C   s
   t | S r   )r%  r'   r  r   r   r   r'     s    c                 C   s
   t | S r   )r%  r)   r  r   r   r   r)     s    c                 C   s
   t | S r   )r%  r(   r  r   r   r   r(     s    c                 C   s
   t | S r   )r%  r*   r  r   r   r   r*     s    c                 C   s
   t | S r   )r%  r+   r  r   r   r   r+     s    c                 C   s
   t | S r   )r%  r,   r  r   r   r   r,     s    c                 C   s
   t | S r   )r%  r-   r  r   r   r   r-     s    inputc                 C   s   t | js| S t| S r   )r  is_complex_dtypedtyper%  r.   r&  r   r   r   r.     s    c                 C   s
   t | S r   )r%  r/   r  r   r   r   r/     s    c                 C   s
   t | S r   )r%  r0   r  r   r   r   r0     s    c                 C   s
   t | S r   )r%  r1   r  r   r   r   r1     s    c                 C   s
   t | S r   )r%  r2   r  r   r   r   r2     s    c                 C   s
   t | S r   )r%  Zerf_invr  r   r   r   r3     s    c                 C   s
   t | S r   )r%  r4   r  r   r   r   r4     s    c                 C   s
   t | S r   )r%  r5   r  r   r   r   r5     s    c                 C   s
   t | S r   )r%  r6   r  r   r   r   r6     s    c                 C   s
   t | S r   )r%  r7   r  r   r   r   r7     s    za,r  )r  valuer  c                 C   s\   t | tstt |tstt| j}tt||sPd	t||}t
|t| |S )N=value argument of type {0} cannot be safely cast to type {1}!)r   r   r   r   r  r   r)  r   r	  formatr   r%  r8   )r  r*  python_typemsgr   r   r   r8     s     c                 C   s   t | |}t | | | S r   r%  r8   r   )r  r*  rr   r   r   fill_
  s    r1  r  c                 C   s   t | d}t | | | S Nr   r/  )r  r0  r   r   r   zero_  s    r3  c                 C   s
   t | S r   )r%  r9   r  r   r   r   r9     s    )r   r  c                 C   s    t tt| t| }t| |S r   )r   r9   r%   rS   r   )r   Ztrunc_xr   r   r   r:     s    c                 C   s0   t | tsttt| jdd  t| S )Nc                   S   s   dS )Nz#imag only supports complex tensors.r   r   r   r   r   r   %  r   zimag.<locals>.<lambda>)	r   r   r   r  r   r(  r)  r%  rt   r  r   r   r   rt   "  s    
 )r  c                 C   s0   t | jst | jr"t| S t| tjdS )Nr)  )	r  is_float_dtyper)  r(  r%  rB   r   r  boolr  r   r   r   rB   *  s    
c                 C   s<   t | jr&ttt| tt| S ttt| t	| S r   )
r  r(  r)  rz   rC   r   rt   ry   rD   rB   r  r   r   r   rC   5  s    c                    sF   t t  j  fdd t  jr8t tdS t tj	dS )Nc                      s   d j  S )Nz7Complex dtype is not supported for isposinf, got dtype r4  r   r  r   r   r   @  r   zisposinf.<locals>.<lambda>infr4  
r  r   r(  r)  r5  rg   floatr   r  r6  r  r   r  r   isposinf<  s    
r:  c                    sF   t t  j  fdd t  jr8t tdS t tj	dS )Nc                      s   d j  S )Nz7Complex dtype is not supported for isneginf, got dtype r4  r   r  r   r   r   K  r   zisneginf.<locals>.<lambda>z-infr4  r8  r  r   r  r   isneginfG  s    
r;  c                 C   s   t | | S r   )r%  r   r  r   r   r   rD   R  s    c                 C   s*   t | jrt| dkS tj| tjdS )Nr   r4  )r  r(  r)  r  rt   r   r6  r  r   r   r   rE   W  s    c                 C   s
   t | S r   )r%  Z	bessel_i0r  r   r   r   rF   b  s    c                 C   s
   t | S r   )r%  rG   r  r   r   r   rG   i  s    c                 C   s
   t | S r   )r%  rH   r  r   r   r   rH   r  s    c                 C   s
   t | S r   )r%  rI   r  r   r   r   rI   w  s    c                 C   s
   t | S r   )r%  rJ   r  r   r   r   rJ   |  s    c                 C   s
   t | S r   )r%  rK   r  r   r   r   rK     s    r4  )r  dimr)  r  c                C   s8   |p| j }t| j }t| |}t|t||dd |S NTkeepdim)r)  r  get_computation_dtyper   	logsumexp)r  r<  r)  result_dtypecomputation_dtypea_r   r   r   log_softmax  s    

rE  )r  r<  r?  r  c                 C   s   t | j|}t|ts|f}t | js6t | jrt| |dd}t	t
|tdkd|}|slt||n|}ttt| | ||d| }nttt| ||d}|S )NTr>  r7          )r  canonicalize_dimsndimr   r   r5  r)  r(  r   r   r%   r9  r%  r   rH   r   r5   )r  r<  r?  a_maxZa_max_squeezedresultr   r   r   rA    s    
 rA  rF  )r  nanposinfneginfr  c                 C   s   t | tstt| js&t| jr.t| S |d kr:d}|d krNt	| j}|d krbt
| j}tt| || }t| }tt| |}t|||}tt| t|}t|||}|S )NrF  )r   r   r   r  is_boolean_dtyper)  is_integer_dtyper   r%  Zmaximum_valueZminimum_valuer   rD   rT   r`   rC   r,   )r  rK  rL  rM  rJ  Zis_negZ	is_neginfZ	is_posinfr   r   r   rL     s     r  c                 C   s   | j tjkrd}t|d S )Nz%neg is not supported on bool tensors.)r)  r  r6  r   r  r.  r   r   r   	_neg_meta  s    rQ  )r  c                 C   s
   t | S r   )r%  rM   r  r   r   r   rM     s    c                 C   s*   t | tst| jtjkr&d}t|| S )Nz'positive does not support bool tensors.)r   r   r   r)  r  r6  r   rP  r   r   r   rN     s
    c                 C   s(   t | tstt| jr$t| S | S r   )r   r   r   r  r(  r)  r%  r   r  r   r   r   r     s    
c                 C   s
   t | S r   )r%  rO   r  r   r   r   rO     s    c                 C   s
   t | S r   )r%  rP   r  r   r   r   rP     s    c                 C   s
   t | S r   )r%  r   r  r   r   r   r     s    c                 C   s   t dtdtt| S Nr   )r   r^   r5   rM   r  r   r   r   rQ     s    c                 C   s6   t | jr*|  }t|dkd| | S |  S d S r2  )r  r(  r)  r%   r  r   rS   )r  Za_absr   r   r   rR     s    c                 C   s
   t | S r   )r%  rS   r  r   r   r   rS   
  s    c                 C   s
   t | S r   )r%  rT   r  r   r   r   rT     s    c                 C   s
   t | S r   )r%  rU   r  r   r   r   rU     s    c                 C   s&   t j|  } t| dkdt| |  S Nr   r   )mathpir  r   rU   r  r   r   r   rV     s    
c                 C   s
   t | S r   )r%  rW   r  r   r   r   rW   !  s    c                 C   s
   t | S r   )r%  rX   r  r   r   r   rX   &  s    c                 C   s
   t | | S r   )r   r  r   r   r   rY   +  s    c                 C   s
   t | S r   )r%  rZ   r  r   r   r   rZ   3  s    c                 C   s
   t | S r   )r%  r[   r  r   r   r   r[   8  s    c                 C   s
   t | S r   )r%  r]   r  r   r   r   r]   =  s    )r  has_outsupports_lhs_python_scalarsupports_rhs_python_scalarr  )r  r  c                   s   t d|dtttf tttf td fdd}|rDt |}|tkrfttjj	 j
dd }|d k	r~t||d| |S )	Nr  br  r  rZ  r  c                    s`   st | trtds,t |tr,tdt | trHt |trHtdt| |\} } | |S )NzaReceived a lhs Python scalar to an elementwise binary operation that does not accept lhs scalars!zaReceived a rhs Python scalar to an elementwise binary operation that does not accept rhs scalars!=Receive two Number inputs to an elementwise binary operation!)r   r   r   r  rY  r  rW  rX  r   r   r  L  s    z0_make_elementwise_binary_reference.<locals>._ref.r   r  )r"   r   Tensorr   r$   r  r  r  r  r   r!  splitr  )r  r  r  rV  rW  rX  r  r  r   r]  r   "_make_elementwise_binary_referenceB  s    



ra  rY  alpha)r  rZ  rc  c                C   s   t | trt |trtdt| |\} }|dk	rt | trB| jn|j}t|}tt	||szd
t	||}t|t||}t| |S )z/
    Reference implementation of torch.add
    r\  N=alpha argument of type {0} cannot be safely cast to type {1}!)r   r   r   r  r   r)  r  r   r   r	  r,  r%  r   r^   r  rZ  rc  r)  r-  r.  r   r   r   r^   s  s"    
 )r  rW  rX  )r  )r  r  c                 C   s|   t |tr(t | tr(t|| j| jd}n8t | tr`t |tr`| j|jkr`d| j|j}t|tt	|t
t| t| S )Nr)  device\Expected divisor (b) to be on the same device ({0}) as dividend (a), but it is found on {1}!)r   r   r_  r   r)  rg  r,  r   r   rT   rM   r%   r  rZ  r.  r   r   r   	_copysign  s      rj  )r  rW  r  )rounding_mode)r  rZ  rk  c                C   sL   |dkrt | |S |dkr$t| |S |dkr6t| |S d|}t|dS )z/
    Reference implementation of torch.div
    Nr]   r9   zPdiv expected rounding_mode to be one of None, 'trunc', or 'floor' but found {0}.)r   r   ri   r,  r   )r  rZ  rk  r.  r   r   r   rf     s    


)r  rW  r[  c                 C   s`   t | tst |tstt |trT|dkr2|  S |dkrB| |  S |dkrTt| S t| |S )N      ?g       @      ?)	r   r   r   r   r   r  rX   r%  r   rY  r   r   r   _pow  s    

rn  c                 C   s   t | trt |trtdt| |}|d k	s4tt|rFtj}ntj	}t | t
rl| j|krlt| |} t |t
r|j|krt||}t| |\} }t| |S )Nr\  )r   r   r   r  Zget_higher_dtyper   r(  r  Z
complex128float64r   r)  r%  to_dtyper  r   r  rZ  r)  r   r   r   rh     s    
c                    s0  t | tr&t |tr&t| } t|}nt |trNt | trNt|| j| jd}nt | trvt |trvt| |j|jd} nZt | trt |tr| j|jkr| jtdkrd| j|j}t|nt	j
|| jd}t | trt |tst| j t rt| |S t rt| |S td fdd d S )Nrf  cpurh  rg  Fc                      s
     dS )Nz not supported for floor_divider   r   r4  r   r   r   i  r   z_floor_divide.<locals>.<lambda>)r   r   r   r_  r)  rg  r  r,  r   r%  Z
device_putr   r  r5  _floor_divide_floatrO  _floor_divide_integerr   ri  r   r4  r   _floor_divideN  s,    
  


rv  c                 C   sb   t | |\} }| jjs"t| |S t| t|kt| |dk}t| |t	|| j S r2  )
r  r)  	is_signedr%  rf   r  rT   rx   rl   convert_element_type)r  rZ  offsetr   r   r   ru  l  s
    &ru  c           
      C   s   t | |}tt| ||}tt| dt|d}t|d}t||}t|t|d|}t|}t	t||d}t|t
|d|}t| |}td|j|jd}	tt|d|t|	|}tt|d||S )Nr   r   rm  rf  )rl   r   r   rd   r|   r   r`   r   r9   ro   r^   r   r)  rg  re   )
r  rZ  modrf   Zdifferent_signed_inputsZnon_zero_remaindermaskZ	floor_divZ	basic_divZzero_tensorr   r   r   rt  w  s    



rt  )r  r  rW  rX  )r'  valuesr  c                 C   s:   t | d}tt| dt| }t|dd}t|||}|S rS  )rg   rz   r|   rD   r   )r'  r|  Zinput_eq_zeroZinput_lt_zeroZzeros_and_onesoutputr   r   r   
_heaviside  s
    
r~  )r  rW  rX  r  )namer  rZ  rtolatolr  c                    sT   t  jjk fddt t dkfdd t dkfdd d S )Nc                      s   d  jjS )NzC{0}: Attempting to compare tensors of different dtypes {1} and {2}!)r,  r)  r   )r  rZ  r  r   r   r     s     z#_check_close_args.<locals>.<lambda>r   c                      s   d  S )Nz={0}: rtol must be greater than or equal to zero, but got {1}!r,  r   )r  r  r   r   r     s    c                      s   d  S )Nz={0}: atol must be greater than or equal to zero, but got {1}!r  r   )r  r  r   r   r     s    )r   r)  r   r  r  rZ  r  r  r   )r  r  rZ  r  r  r   _check_close_args  s    
r  h㈵>:0yE>)r  rZ  r  r  	equal_nanr  c           	      C   s   t d| |||d t| |}|rPt| js8t| jrPt|tt| t|}|dkrd|dkrd|S t| jst| jst	
| t } t	
|t }t|tt||}tt| |}t|tt|t||}|S )Nztorch.iscloser  r   )r  rg   r  r5  r)  r(  rz   rx   rD   r%  rx  r  get_default_dtyper^   r%   r   r   rB   rw   )	r  rZ  r  r  r  closeZallowed_errorZactual_errorrJ  r   r   r   ru     s     
 c                 C   s~   | j }|tjtjfk}|r6t| tj} t|tj}t| |}t|dkd|}t	t
| || }|sr|S t||S rS  )r)  r  Zint8Zint16r%  rx  int32rm   r   r%   rf   )r  rZ  r)  Zpromote_to_intgresr   r   r   _lcm9  s    r  c                 C   s0   t | js| dk} t |js(|dk}| |@ S r2  r  rN  r)  rY  r   r   r   _logical_andY  s
    r  c                 C   s   t | js| dkS |  S r2  r  r  r   r   r   ry   h  s    c                 C   s2   t | js| dk} t |js(|dk}t| |S r2  )r  rN  r)  rb   rY  r   r   r   _logical_orq  s
    r  c                 C   s0   t | js| dk} t |js(|dk}| |A S r2  r  rY  r   r   r   _logical_xor  s
    r  c                C   s$   t | trd}t|t|| |dS )Nz?Received a Number for the first argument, but expected a Tensorrb  )r   r   r   r   )r  rZ  rc  r.  r   r   r   r     s    
c                C   s   t | trt |trtdt| |\} }|dk	rt | trB| jn|j}t|}tt	||szd
t	||}t|t||}t| |S )z/
    Reference implementation of torch.sub
    r\  Nrd  )r   r   r   r  r   r)  r  r   r   r	  r,  r%  r   r   re  r   r   r   r     s"    
 c                 C   s0   t | }t |r t| |S tt| |S r   )r  Z	get_dtyperO  r%  rf   r]   rq  r   r   r   _trunc_divide  s    

r  )selftensor1tensor2r   r*  )r  r  r  r*  r  c                C   sP   |dk	r@| j }t|}tt||s@dt||}t|| || |  S )z3
    Reference implementation of torch.addcdiv
    Nr+  )r)  r  r   r   r	  r,  r   )r  r  r  r*  r)  r-  r.  r   r   r   r     s    
 )r  minr   )r  r  r   r  c                 C   s   |d kr|d krd}t ||d k	rPt| }tt| ||}t|| |} |d k	rt| }tt| ||}t|| |} | S )Nz+clamp called but both min and max are none!)r   r  rD   rb   rn   r   rw   )r  r  r   r.  Za_isnan	conditionr   r   r   r   1  s    

)r  r  r  c                 C   s   t j| |dS )N)r  r  r   )r  r  r   r   r   	clamp_minQ  s    r  )r  r   r  c                 C   s   t j| |dS )N)r   r  )r  r   r   r   r   	clamp_maxZ  s    r  predr  rZ  c                    s`   |dks|dkrt tj ||dd t jtjk fdd t ||\ }}t	 ||S ) NTallow_cpu_scalar_tensorsc                      s   d j  S )Nz#expected predicate to be bool, got r4  r   r  r   r   r   |  r   zwhere.<locals>.<lambda>)
NotImplementedErrorr  check_same_devicer   r)  r  r6  r  r%  r   r  r   r  r   r   i  s    

memory_format)r  r  r  c                C   s    t j| | j|d}t||  |S )N)requires_gradr  )r  r   r  r   )r  r  rJ  r   r   r   r     s      
)allow_cross_devicec                C   s4   |s(| j |j kr(d|j | j }t|t| |S )NzZAttempting to copy from device {0} to device {1}, but cross-device copies are not allowed!)rg  r,  r   r%  r   )r  rZ  r  r.  r   r   r   r     s     c                 C   s>   |   dkr$d|    d}t|t| j}|t| S )Nr   zCan't convert a tensor with z elements to a number!)numelr   r  r   r)  r%  r   )r  r.  number_typer   r   r   r     s
    )	r  rg  r)  copylayoutr  
pin_memorynon_blockingr  c                 C   s\   | oZ|d ks| j |koZ|d ks*| j|koZ|d ks<| j|koZ|d kpZ|tjkpZtj| |dS )Nr  )rg  r)  r  r  preserve_formatr  is_contiguous_for_memory_format)r  rg  r)  r  r  r  r  r  r   r   r   _to_will_alias  s    r  c                  O   s   t d S r   )r  )r  kwargsr   r   r   _to_dispatch  s    r  rg  r)  r  r  r  c                 C   s   | ||||d}|S Nr  r   rg  r)  r  r  r  r  r   r   r   
_to_device  s    	r  c                 C   s   t | ||||d}|S r  )r  rg  r  r   r   r   _to_device_str  s    	r  r)  r  r  r  c                 C   s   | |||d}|S )Nr  r   )r)  r  r  r  r  r   r   r   	_to_dtype  s    r  )otherr  r  r  c                 C   s(   | j }| j}| j}||||||d}|S )N)rg  r)  r  r  r  r  )rg  r)  r  )r  r  r  r  rg  r)  r  r  r   r   r   	_to_other  s    r  )r  	to_kwargsc                 C   s   ddddg}d|kr4t |d tr4t|d |d< |D ]v}||kr8|dkrZ|| tjks|dkr|| j| jjkr|| jr|| j| jjkst| |d || kr8|| q8d S )Nr)  rg  r  r  )	r   r   r  rg  r  r	  indexr  pop)r  r  Zoptions_to_checkkwr   r   r   canonicalize_to_arguments  s(    
r  c                 O   s   t |dkrt||}d|ks"tt| | t| f|r<| S d|krN|dnd}d|krd|dnd}|s|d| j| jkr|sd|krd|krd	|krt	| |d| jS t
j| f|}t||  |S )
Nr   r  r  Fr  r)  r  rg  r  )r   r  r   r  r  r  getr)  r%  rx  r  r   r   )r  r  r  r  r  rJ  r   r   r   r   *  s0    

	
)has_identityaccepts_dim_tupledimskeepdimsr)  out)
r  r  r  r  r  r  r)  r  output_dtype_kindr  c                   s  t  tst jdkr(td j|d k	rXt |ts>t|d k	rX||jkrXtd|srd ksrt tsrtt trft	 j
|s jdkpt fddD }	|	stdt ||\}
}t |
}||}|r. fdd	t jD }fd
d	t jD }t|||}|d k	r||d k	sFt|d k	rd||jkrdtdt||j
}t||dS |j|kr|d k	rt||}|S )N@   zYReceived a tensor with {0} dimensions, but only tensors with up to 64 dims are supported!z4dtype argument and out dtype must match in reductionr   c                 3   s   | ]} j | V  qd S r   r   r   ir  r   r   r   t  s     z_reduction.<locals>.<genexpr>zJreducing over zero-size dimension for reduction operation without identityc                    s"   g | ]}|kr j | nd qS r   r  r  r  r  r   r   
<listcomp>  s     z_reduction.<locals>.<listcomp>c                    s   g | ]}| kr|qS r   r   r  )r  r   r   r    s      z7Expected the dtype of reduction result and out to matchZ	copy_fromr   )r   r   r   rH  r   r,  r)  r   r  reduction_dimsr   py_allreduction_dtypesr%  rx  r   broadcast_in_dimr    r!   )r  r  r  r  r  r  r)  r  r  Zvalid_shaperC  rB  Za_convertedrJ  Zoutput_shapeZbroadcast_dimsr   r  r   
_reductionQ  s^    


   

r  c                 C   sR   t |tr|f}t| tj}ttt|||dd}| jtj	krNt
|tj	S |S )Nr<  r?  r   )r   r   r   r  r6  rg   r   ry   r)  uint8r%  rx  r  r<  r?  rD  rJ  r   r   r   r     s    
c                 C   s>   t | tj}tt|||dd}| jtjkr:t|tjS |S )Nr  F)	r   r  r6  r   r   r)  r  r%  rx  r  r   r   r   r     s
    )r)  r  )r  r<  r?  r)  r  r  c             	   C   s\   |d kr.t | js t | jr(tj}n| j}|dks>|g krBd }t| tj||||t	j
dS Nr   r  r  r)  r  r  )r  rN  r)  rO  r  int64r  r%  r   r   SAMEr  r<  r?  r)  r  r   r   r   r     s    	c                    s   t jddt t  j fdd t  jrRtdkrRt S  j	t t
tt
 fddttD  }tj |dd d	S )
NFvalidatec                      s   d d j  dS )Nzsum_to_size: size "z" is not expandable to size ""r  r   r  r   r   r   r     r   zsum_to_size.<locals>.<lambda>r   c                 3   s0   | ](}|  d kr j | d kr|V  qdS r   Nr  r  r  Zleading_dimsr   r   r   r     s    zsum_to_size.<locals>.<genexpr>T)r<  r?  r)  )r  extract_shape_from_varargsr   Zis_expandable_tor   Zis_same_shaper   r%  view_ofrH  r   r   r  r   )r  r   Zreduce_dimsr   r  r   r     s    

)r  r<  r?  r  r  c             	   C   s\   |d kr.t | js t | jr(tj}n| j}|dks>|g krBd }t| tj||||t	j
dS r  )r  rN  r)  rO  r  r  r  r%  r   r   r  r  r   r   r   r     s    	)r  c             
   C   s0   |dks|g krd }t | tj||d |dtjdS Nr   Fr  r  r)  r  r  r  )r  r%  r   r   r  r  r<  r?  r  r   r   r   r     s    	c             
   C   s0   |dks|g krd }t | tj||d |dtjdS r  )r  r%  r   r   r  r  r   r   r   r   '  s    	c                 C   s"   |d krt | tr| }d } | |fS r   )r   r6  )r<  unbiasedr   r   r   _dim_var_dispatch?  s    r  
correction)r  r<  r  r?  r  r  c             
   C   sV   t ||\}}t||}|dks*|g kr.d }t| ttj|d||d d dtjd}|S Nr   r  Tr  )	r  r  set_correctionr  r   r%  r   r   COMPLEX_TO_FLOAT)r  r<  r  r?  r  rJ  r   r   r   r   I  s    	
c             
   C   sv   t ||\}}t||}|dks*|g kr.d }t| tj\}}t| ttj	|d|||d dtjd}t
|}t||S r  )r  r  r  r  r   r  r  r   r%  r   rX   r   )r  r<  r  r?  r  Zopmath_dtyper)  rJ  r   r   r   stde  s(    	 
r  c          	   	      s
  |dks|g krd }|d kr" j }|d k	r<|j |kr<tdt tj|||d tjd}t|rhtdt	|t
rx|f}t j|} jdkrdnttj fdd|D d}t||}|d krȈ j n|}t||}|d k	rt	|tstt||j}t||d	S |S )
Nr   z%expected out dtype and dtype to matchr  z/result type should be floating point or complexr   r   c                 3   s   | ]} j | V  qd S r   r  r  r  r   r   r     s     zmean.<locals>.<genexpr>r  )r)  r   r  r%  r   r   ZKEEP_PROMOTED_TYPEr  rO  r   r   r  r   rH  r   operatorr   r   r   r   r   r    r!   )	r  r<  r?  r)  r  rJ  r  ZnelemrB  r   r  r   r     s:    
	

*


)r  r?  r  )r  r<  r  r?  r  c                C   s4   t ||\}}t| ||||d}t| ||}||fS Nr  )r  r  r   )r  r<  r  r?  r  smr   r   r   r     s    	c                C   s4   t ||\}}t| ||||d}t| ||}||fS r  )r  r   r   )r  r<  r  r?  r  vr  r   r   r   r     s    	)r  vec1vec2)betarc  )r  r  r  r  rc  r  c                   sP  t jdkfdd t jdkfdd jd jd tjrt ttt	fdd t tt t	fdd s rt
S t
dS t
 rt
n
t
dS nzt tttjfd	d t tt tj fd
d dkr4 t
 S   t
  S d S )Nr   c                      s   d j  dS )Nz*addr: Expected 1-D argument vec1, but got -DrH  r   )r  r   r   r     r   zaddr.<locals>.<lambda>c                      s   d j  dS )Nz*addr: Expected 1-D argument vec2, but got r  r  r   )r  r   r   r     r   r   c                      s   dt   S )Nzexpected bool/int beta but got r	  r   r  r   r   r     r   c                      s   dt   S )Nz expected bool/int alpha but got r  r   r  r   r   r     r   Fc                      s   dt   dj S Nzcannot safely convert z to r	  r)  r   )r  r  r   r   r     r   c                      s   dt   dj S r  r  r   )rc  r  r   r   r     r   )r   rH  r   r   r  rN  r)  r   r	  r   r  outerr   rz   r   )r  r  r  r  rc  r   )rc  r  r  r  r  r   r     sF    




.)argr  r  c                 G   s^   |st | tjjr| }nt | tjjr*t| f| }tdd |D }t|dkrV|S |d S )z5Reference implementation of :func:`torch.atleast_1d`.c                 s   s&   | ]}|j d kr|nt|dV  qdS r   r   N)rH  r   r   r  r   r   r   r   	  s     zatleast_1d.<locals>.<genexpr>r   r   )r   collectionsabcr   r   r   r   r  r  Zargs_r  r   r   r   r   	  s    
)at_least_fnr<  r  r  c                 C   s    | |}t |tstt||S r   )r   r   r   r   )r  r<  r  Zarg_r   r   r   _unsqueeze_atleast	  s    r  c                    sn   |st | tjjr| }nt | tjjr*t| f| }tttd t fdd|D }t	|dkrf|S |d S )z5Reference implementation of :func:`torch.atleast_2d`.r   c                 3   s$   | ]}|j d kr|n |V  qdS )   Nr  r  Zunsqueeze_atleast_1dr   r   r   )	  s     zatleast_2d.<locals>.<genexpr>r   )
r   r  r  r   r   r   r  r   r   r   r  r   r  r   r   	  s    
c                    sn   |st | tjjr| }nt | tjjr*t| f| }tttd t fdd|D }t	|dkrf|S |d S )z5Reference implementation of :func:`torch.atleast_3d`.r   c                 3   s$   | ]}|j d kr|n |V  qdS )   Nr  r  Zunsqueeze_atleast_2dr   r   r   8	  s     zatleast_3d.<locals>.<genexpr>r   r   )
r   r  r  r   r   r   r  r   r   r   r  r   r
  r   r   .	  s    
)r  sizestridestorage_offsetr  c                 C   s   t | |||S r   )r%  r   )r  r  r  r  r   r   r   r   <	  s    c                  G   s   t t|  S r   )r  Sizer  )r  r   r   r   r   B	  s    c                  G   s4   t | dkr"t| d ts"| d } tt| ddiS )Nr   r   r  F)r   r   r_  listr  tensorsr   r   r   r   F	  s    )r  r  r  c                 C   s8   t |t | j }tt|t | j| }t| ||S r   )r   r   r   r   r%  r  )r  r  startr  r   r   r   r   O	  s    r  )r  r<  r  c                 C   s   t | dkrd}t|| D ]}t|tstqtj| ddi t| d j|}t	| d j| t
dd | D }t |dkr| d }ztdd | D }W n tk
r   d}Y nX td|j|j|d	S t||S )
Nr   z3cat expects at least one tensor, but received zero!r  Fc                 s   s(   | ] }|j d kr| dks|V  qdS r   )rH  r  r   r   r   r   r   i	  s     
  zcat.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r   )r  r   r   r   r   r   o	  s     r   r)  rg  r  )r   r   r   r   r   r  r  canonicalize_dimrH  Zvalidate_idxr   r   	Exceptionr   r)  rg  r%  r   )r  r<  r.  tensorfilteredr   r  r   r   r   r   U	  s"    
)r  r  c                 C   s   t dd | D }t|dS )Nc                 s   s.   | ]&}|j d kr|n|| d fV  qdS r  )rH  r   r  r   r   r   r   r   {	  s    zcolumn_stack.<locals>.<genexpr>r   )r   r   r  Zaligned_tensorsr   r   r   r   y	  s    )r'  r  c                 C   s*   t | js| S | jr t| S t| S r   )r  r(  r)  Z	is_sparser  r.   r%  r   r&  r   r   r   r   	  s
    
)r'  padr*  r  c           
   	      sT  t td dkfdd | jttd }| t |kfdd | }tD ]r d  d   dk r|   |j    }d  dk rf| d|j  d   }qftdd D r| S td  }t|D ]b t d d       d   }t |dk fd	d |	| qt
| }tj|| j| j| j|d
}|dkr| jtjkrd}t||}|}	tD ]v d  d   dkr|	  |	j    }	d  dkr|	 d|	j  d   }	qt|	| |S )Nr  r   c                      s   dt   S )Nz1Length of pad must be even but instead it equals r   r   )r  r   r   r   	  r   z!constant_pad_nd.<locals>.<lambda>c                      s   dt  d  dS )Nz`Length of pad should be no more than twice the number of dimensions of the input. Pad length is z while the input has  dimensions.r   r   )l_inpr  r   r   r   	  r   r   c                 s   s   | ]}|d kV  qdS )r   Nr   )r   pr   r   r   r   	  s     z"constant_pad_nd.<locals>.<genexpr>c                	      s6   d    d  dd   d   d	S )NzThe input size z, plus negative padding z and r   zG resulted in a negative output size, which is invalid. Check dimension z of your input.r   r   )r  input_sizesl_diffr  pad_idxr   r   r   	  r   r)  rg  r  r  F)r   r   r   r   r   builtinsr   r   r  appendr  suggest_memory_formatr  r   r)  rg  r  r6  r8   r%  r   )
r'  r  r*  Zl_padZc_input	new_shapeZnew_dimr  r}  Zc_outputr   )r  r  r  r  r  r   r   r   	  sl    
"" 
  $c                C   s4   t |tjkdd  tj| |dr&| S tj| |dS )Nc                   S   s   dS )Nz@preserve memory format is unsupported by the contiguous operatorr   r   r   r   r   r   	  r   zcontiguous.<locals>.<lambda>r  )r   r  r  r  r  r   )r  r  r   r   r   r   	  s    c                 C   s(   t t| dkdd  t|  }t|dS )Nr   c                   S   s   dS )Nz%dstack expects a non-empty TensorListr   r   r   r   r   r   	  r   zdstack.<locals>.<lambda>r  )r   r   r   r   r  r   r   r   r   	  s    r  c              	      s   t |dkr&t|d tr&t|d }tt |t | jkdd  t |t | j }t|}t| jD ]R\} || }|| }t| kp dkp|dk fdd |dkr|n ||< qft	| t
| |tt|t | j| S )Nr   r   c                   S   s   dS )Nz3expand: the requested shape has too few dimensions!r   r   r   r   r   r   	  r   zexpand.<locals>.<lambda>r   c                      s   d  dS )Nz3expand: attempting to expand a dimension of length r   r   r   r   r   r   r   	  r   )r   r   r   r   r   r   r  	enumerater  validate_shaper%  r  r   )r  r   ry  shape_r  Z
offset_idxZrequested_lengthr   r   r   r   	  s,    

  c                 C   s   |  |jS r   )r   r   rY  r   r   r   r   
  s    )r  chunksr<  r  c           
      C   s   |dkrd |}t|t| j|}| j| }t|| }t|| }|| }g }t	|D ]}	|
t| ||	| | qb|dkr|
t| ||| | t|S )Nr   z)Expected at least one chunk, but got {0}!)r,  r   r  r  rH  r   rT  r-   r9   r   r#  r   r   )
r  r)  r<  r.  length
chunk_sizeZfull_chunksZtail_chunk_sizerJ  r  r   r   r   r   
  s    

r   )r  	start_dimend_dimr  c                 C   st   t | j|}t | j|}||kr2| jdkr2| S t| ||d \}}|d k	rbt| ||d S t| ||d S rS  )r  r  rH  r%  _collapse_view_helperZcollapse_viewZcollapse)r  r,  r-  r%  new_stridesr   r   r   r   *
  s    )r  r  r  c                 C   s@   t |tst |tstdt| j|}t| t	| |S )Nz!dims has to be a sequence of ints)
r   r   r  r   r  rG  rH  Zvalidate_no_repeating_dimsr%  revr  r   r   r   r   <
  s
    
c                 C   s   | j dk rtdt| dS )Nr  zInput must be >= 2-d.r  rH  r   r   r  r   r   r   r   F
  s    
c                 C   s   | j dk rtdt| dS )Nr   zInput must be >= 1-d.r  r1  r  r   r   r   r   N
  s    
)r  r<  r  r*  r  c                 C   s$   t | j|}tj| ||| |dS )Naxis)r  r  rH  r%  slice_in_dim)r  r<  r  r*  r   r   r   r   V
  s    )r  	norm_dimsepsr  c           	      C   s^   t | j}t| |}t|ts$ttj||ddd\}}t	|| }| | | }|||fS )a  Computes mean and 1/std of a tensor along norm_dims.

    Used as a helper function for normalization layers.

    Args:
        a (Tensor): input tensor
        norm_dims (DimsType): dimensions to normalize over
        eps (float): epsilon for numerical stability

    Returns:
        out (Tensor): normalized tensor.
        mean (Tensor): mean of the tensor along norm_dims.
        rstd (Tensor): 1/std of the tensor along norm_dims.
    FT)r<  r  r?  )
r  r@  r)  r   r   r   r   r  r   r   )	r  r5  r6  rC  Za_accZ
biased_varr   rstdr  r   r   r   
_normalize[
  s    
   
r8  )r'  normalized_shapeweightbiasr6  r  c                    s  t }t|dkfdd td kp8jtkfdd t d kp` jtk fdd tj|kojj| d  tkfdd  d k	r  d k	rЈ   j| }tt|j}t	||\}}	}
d kr d k	r|  }n>d k	r8 d kr8| }n d k	rX d k	rX|   }t
|j}jjdkrt
|	j}	t
|
j}
||	|
fS )Nr   c                      s   dt   S )NzzExpected normalized_shape to be at least 1-dimensional, i.e., containing at least one element, but got normalized_shape = r   r   )r9  r   r   r   
  s   z#native_layer_norm.<locals>.<lambda>c                      s   dt j d t   S )NzQExpected weight to be of same shape as normalized_shape, but got weight of shape  and normalized_shape = r   r   r   )r9  r:  r   r   r   
  s   c                      s   dt  j d t  S )NzMExpected bias to be of same shape as normalized_shape, but got bias of shape r=  r>  r   )r;  r9  r   r   r   
  s   c                      s&   dt  d t  d t  j S )NzGiven normalized_shape=z, expected input with shape z, but got input of size r>  r   )r'  r9  r   r   r   
  s   rr  )r   r  r   r   r   rH  r   r  r   r8  r%  rx  r)  rg  r	  )r'  r9  r:  r;  r6  Znormalized_ndimr3  r  r  r   r7  r   )r;  r'  r9  r:  r   r   w
  sJ    
	



c                 G   s    t | jt |}t| |S r   )r  rG  rH  Zextract_dims_from_varargsr%  r   )r  r  _permutationr   r   r   r   
  s
     )a_shapea_stride	dimensionr  stepc                    s   t | }t|  |dkr dn|   |dkr4dn|  }tk fdd tdkfdd g }g }tt| |D ]N\}	\}
}|	 kr||
  d  ||  q||
 || q| || ||fS )Nr   r   c                      s$   dt   d t  d t  S )Nz%Maximum size for tensor at dimension z is z but size is r<  r   )rB  max_sizer  r   r   r   
  s   z/_get_unfold_copy_shape_stride.<locals>.<lambda>c                      s   dt   d S )NzStep is z but must be > 0r<  r   )rC  r   r   r   
  r   )r   r  r  r   r&  zipr#  )r@  rA  rB  r  rC  Za_ndimZlast_stridenew_size
new_strideddim_sizeZ
dim_strider   )rB  rD  r  rC  r   _get_unfold_copy_shape_stride
  s.    




rJ  c              	   G   s<  t j|dd}t t|t| jkdd  t|dkrBt| S t|| j }dg| }| jD ]}|| q`t	dd t
||D }d|krtj|| j| j| jt | d	S |}t |}t|D ]"\}}t||||t|d\}}qtt|}	|	jd
d dd t
|	 \}
}| |}t|}||
}||S )NFr  c                   S   s   dS )Nzbrepeat: Number of dimensions of repeat dims can not be smaller than number of dimensions of tensorr   r   r   r   r   r   
  r   zrepeat.<locals>.<lambda>r   r   c                 s   s   | ]\}}|| V  qd S r   r   )r   Zpadded_sizeZrepeat_sizer   r   r   r   
  s   zrepeat.<locals>.<genexpr>r!  c                 S   s   | d S rR  r   )r   r   r   r   r     r   T)keyreverse)r  r  r   r   r   r  r   rH  r#  r   rE  r   r)  rg  r  r$  make_contiguous_strides_forr&  rJ  r   r  sortr   r   r   )r  Zrepeat_shapeZnum_new_dimensionsZpadded_shaperI  Ztarget_shapeZurtensor_shapeZurtensor_strider<  Zenumerated_strideZpermute_orderZsorted_strideZrepeat_xtensorZcloned_resultZpermuted_resultr   r   r   r   
  sN    



    



)r  
allow_copyr  c                G   s  t j|dd}t ||  }t| jt|kr:t| S |  dkrXt| |t 	|S | j
dkr| }|D ]}|dksztt|d}qj|S t|dkr| }| jD ]}|dkstt|d}q|S d}| }|D ]}||j
kr|dkst|j
d }t|||j| }|d }q||j| kr,|d }q|j| }|}	|| dkrb|	d }	||j|	  }q:|	|krt|||	d \}
}|
d kr|rt| |  S d| j|  |}t|t|||	}||krt|||}|d }q||j
k r|j| dkstt||}q|S )NFr  r   r   r   zOCannot view a tensor with shape {0} and strides {1} as a tensor with shape {2}!)r  r  Z
infer_sizer  r   r   r%  r  r   rM  rH  r   r   r   r   Z	split_dimr.  r   r,  r  r   r   )r  rO  r   Z_ar*  r  rD  last_dimaccumendr%  r/  r.  r   r   r   _reshape_view_helper&  sl    







  

rS  )r  r   r  c                 G   s   t | f|ddiS )NrO  TrS  r  r   r   r   r     s    )r  r  r  c                 C   s   |  | S r   )r   r  r  r  r   r   r   
reshape_as  s    rV  )r  shiftsr  r  c                 C   sZ  t | j|}t|ts|f}t|ts.|f}|  dkrBt| S t|}t|}|dksd|dkr|dkrttd|dkr|dkrt	
t	| |d| jS ||krtd| d| |dkst|dd }|dd }t	
| |d |d }t	
|||S |d }| j| }	|	|d  |	 }
t	| ||
|	|
 }t	| |d|
}t	||f|S )z/Reference implementation of :func:`torch.roll`.r   r   z`shifts` requiredz*shifts and dimensions must align. shifts: z, dims: N)r  rG  rH  r   r   r  r   r   r   r  r   r   r   r   r   r   r   )r  rW  r  Z
len_shiftsZlen_dimsZtail_shiftsZ	tail_dimsZfirst_dim_rolledr<  r  r  t0t1r   r   r   r     s:    


r   r   )r  kr  r  c                 C   s   t |dkrtdt | | jdk r8td| j t| j|}|d |d krrtd|d  d|d  |d }|dkrtt| |d f|d |d S |dkrt| |S |d	krtt| |d f|d |d S t| S d
S )z0Reference implementation of :func:`torch.rot90`.r  z2expected total rotation dims == 2, but got dims = z/expected total dims >= 2, but got total dims = r   r   z7expected rotation dims to be different, but got dim0 = z and dim1 =    r	  N)	r   r   rH  r  rG  r  r   r   r   )r  r[  r  r   r   r   r     s&    
$$c                 C   sP   | d j }tdt| D ]2}| | j |kstd| d| | j  d| qd S )Nr   r   z4stack expects each tensor to be equal size, but got z at entry 0and z
 at entry )r   r   r   r   )r  Zentry_shaper  r   r   r   _check_stack_inputs  s
    
r]  c                    s   t | dkstdt| d jd |  | d jk rtt|  t| d j}| t |  t	
|  }||S t	
 fdd| D |S )Nr   z$stack expects a non-empty TensorListr   c                    s   g | ]}|  qS r   )r   )r   r   Zwrapped_dimr   r   r    s     zstack.<locals>.<listcomp>)r   r   r  r  rH  r]  r  r   insertr  r   r   )r  r<  Zresult_sizesr  r   r^  r   r     s    
c                C   sb   |p| j }t| j }t| |}t|ts.tt||dd}t|| }tt	|t
||dd|S r=  )r)  r  r@  r   r   r   r   r   r5   r   r   )r  r<  r)  rB  rC  rD  rI  Za_expr   r   r   softmax  s    

 r`  c                 C   s@   t t| dkdd  t|  }|d jdkr6t|dS t|dS )Nr   c                   S   s   dS )Nz%hstack expects a non-empty TensorListr   r   r   r   r   r     r   zhstack.<locals>.<lambda>r   )r   r   r   rH  r   r  r   r   r   r     s
    
c                 C   s(   t t| dkdd  t|  }t|dS )Nr   c                   S   s   dS )Nz%vstack expects a non-empty TensorListr   r   r   r   r   r   %  r   zvstack.<locals>.<lambda>)r   r   r   r   r  r   r   r   r   #  s    )r  r<  sizesr  c                 C   s\   t | j|}t t|dkdd  | t| jd | t| t| j|d d   S )Nr   c                   S   s   dS )Nz"unflatten: sizes must be non-emptyr   r   r   r   r   r   -  r   zunflatten.<locals>.<lambda>r   )r  r  rH  r   r   r   r   r   )r  r<  ra  r   r   r   r   +  s    )r   r<  r  c                    sN   t | j  tt| jdkdd t t fddt	| | j   D S )Nr   c                   S   s   dS )Nz5dimension specified as 0 but tensor has no dimensionsr   r   r   r   r   r   6  r   zunbind.<locals>.<lambda>c                 3   s   | ]}t | V  qd S r   )r  r   )r   r  r<  r   r   r   9  s    zunbind.<locals>.<genexpr>)
r  r  rH  r   r   r   
IndexErrorr   r  r   )r   r<  r   rb  r   r   1  s    r   r<  r  r  c                 C   s   |   |||S r   )r   r>   rd  r   r   r   r=   >  s    c                    s`   t | j|}t  jdk fdd | jdkr<| dn| }td f|  f }|||< | S )Nr   c                      s   d j  dS Nz(Index should have dimension 1 or 0 (got )r  r   r  r   r   r   I  r   zindex_copy_.<locals>.<lambda>r   )r  rG  rH  r   r   slice)r   r<  r  r  yr  r   rg  r   r>   D  s    
r   r<  r  r*  c                 C   s   |   |||S r   )r   rA   rj  r   r   r   r@   R  s    c                    s   t tr6tjdkfdd |  | S t| j|}t jdk fdd td f|  f }| jdkr| 	dn| }||< | S )Nr   c                      s   d j  dS )Nz<Only supports 0-dimensional value tensor. Got a tensor with r  r  r   r  r   r   r   `  r   zindex_fill_.<locals>.<lambda>r   c                      s   d j  dS re  r  r   rg  r   r   r   g  r   )
r   r   r  r   rH  r   r>   rG  rh  r   )r   r<  r  r*  r  ri  r   )r  r*  r   rA   Y  s    


r   r<  r  r  rc  c                C   s   |   j||||dS )Nrb  )r   r<   rk  r   r   r   r;   p  s    
c                   s   t | j|}t jdkfdd  dkrjt | jt t t  fdd t	| }| jdkr~| 
dn| }td f| f }||  |7  < | S )Nr   c                      s   d j  dS re  r  r   rg  r   r   r     r   zindex_add_.<locals>.<lambda>c                      s   dt   d dS )Nzalpha argument of type z cannot be safely cast to type r   r  r   )rc  r-  r   r   r     r   r   )r  rG  rH  r   r   r)  r   r	  r%  r   r   rh  )r   r<  r  r  rc  ri  r  r   )rc  r  r-  r   r<     s     
)r   r<  r  c                    sf   t | j|}t  jdk fdd | jdkrJ| d  d S td f|  f }| | S )Nr   c                      s   d j  dS re  r  r   rg  r   r   r     r   zindex_select.<locals>.<lambda>r   )r  rG  rH  r   r   r   r   rh  )r   r<  r  r  r   rg  r   r?     s    

)r  r<  r  c                    s   |d k	r`t  j|}t jdkr:|dks0tt S  j| dkrRt S t |fS t	 fddt
t jD }t |S )Nr   r   c                 3   s    | ]} j | d kr|V  qdS r  r  )r   r  r  r   r   r     s      zsqueeze.<locals>.<genexpr>)r  r  rH  r   r   r   r%  r  r   r   r   )r  r<  r  r   r  r   r     s    

 )r  indices_or_sectionsr<  r  c              	   C   s  t | j|}| jdkr$d}t|t|trr|jjdksNd|j}t||j	t
jkrrd}d|j	 t|t|tst|tr@|jdkr@t|tr|n| }|dkrd|}t|g }| j| }t|| }|| }	d}
t|D ]B}||	k r
|d n|}tj| |
|
| |d	}|| |
| }
qt|S |}t|tr||jdkrtd
}d|j t|| }g }d}
|D ]"}|tj| |
||d	 |}
q|tj| |
| j| |d	 t|S d S )Nr   zXtensor_split: received a rank zero tensor, but expected a tensor of rank one or greater!rr  z_tensor_split: if indices_or_sections is a tensor it must be on the CPU, but received one on {0}zJtensor_split: if indices_or_sections is a tensor it must have long dtype, z  but received one with dtype {0}zDtensor_split: number of sections must be greater than 0, but was {0}r   r2  zStensor_split: non-scalar indices_or_sections tensors must have only one dimension, z)but received a tensor with {0} dimensions)r  r  rH  r   r   r   rg  r	  r,  r)  r  longr   r   r   r   rT  r9   r   r%  r4  r#  r   tolist)r  rl  r<  Z_dimr.  sectionssplitsrI  Zmin_split_sizeZnum_splits_one_extraZ	start_idxZ	split_idx
split_sizer  indicesr   r   r   r   r     st    





)r  rl  r  c                    s   t  jdk fdd  jdkr&dndttrpt dkoR j  dk fdd t S t tttffddtd }t |S )Nr   c                      s   dt  j d S )NzPtorch.hsplit requires a tensor with at least 1 dimension, but got a tensor with  dimensions!r   rH  r   r  r   r   r     s
    zhsplit.<locals>.<lambda>r   c                      s.   dt  d t  j  d t  d S )Nz0torch.hsplit attempted to split along dimension z , but the size of the dimension $ is not divisible by the split_size r   r>  r   )r  r<  rq  r   r   r     s    c                      s   dt   S )Nzhsplit(): received an invalid combination of arguments. Expected indices_or_sections to be of type int, list of ints or tuple of ints but got type r  r   rl  r   r   r   *  s    exc_type	r   rH  r   r   r   r   r  r   	TypeErrorr  rl  Zsplit_sizesr   )r  r<  rl  rq  r   r     s&    



c                    s   t  jdk fdd ttr\t dko@ jd  dk fdd t dS t tttffddtd }t |dS )Nr  c                      s   dt  j d S )NzPtorch.vsplit requires a tensor with at least 2 dimension, but got a tensor with rs  rt  r   r  r   r   r   <  s
    zvsplit.<locals>.<lambda>r   c                      s"   dt  jd  d t  d S )NzRtorch.vsplit attempted to split along dimension 0 , but the size of the dimension r   ru  r   r>  r   )r  rq  r   r   r   F  s    c                      s   dt   S )Nzvsplit(): received an invalid combination of arguments. Expected indices_or_sections to be of type int, list of ints or tuple of ints but got type r  r   rv  r   r   r   S  s    rw  ry  r{  r   )r  rl  rq  r   r   7  s$    



)r  ry  dim1dim2r  c           
         sD  |   }tj |d tj|dt k fdd |  }|dkrrtt|    |   | d}n$tt|    | |   d}|dkr|dkr|||    7 }n|||     8 } fddt	|  D }|
|  fddt	|  D }|
|    |     | j|||d}	|	S )	z4
    Reference implementation of torch.diagonal
    )r  rankc                      s   d  d S Nz(diagonal dimensions cannot be identical z, r   r   r|  r}  r   r   r   n  r   zdiagonal.<locals>.<lambda>r   c                    s    g | ]\}}| fkr|qS r   r   r   r  r  r  r   r   r  ~  s      zdiagonal.<locals>.<listcomp>c                    s    g | ]\}}| fkr|qS r   r   r  r  r   r   r    s      )r  r  r  )r<  r  r  r   r  r   r  r  r  r&  r#  r   )
r  ry  r|  r}  Znum_dimsr  Z	diag_sizera  stridesrJ  r   r  r   r   _  s*    
 &$
)r   ry  r|  r}  r  c                    sN   kr   | }| j d }tj| d tj|dt k fdd | d|dkrt| j}t||d< t	j
|| j| jdd}|dkr|| fn| |f}t	j|dd	} t|7 |  d} t	j| jt	jd
}t	j|| | jt	jd
}	||	dk}
 fddtt| jD }|
|}
t|
| S )z6
    Reference implementation of torch.diag_embed
    r   )r~  r  c                      s   d  d S r  r   r   r  r   r   r     r   zdiag_embed.<locals>.<lambda>r   r   Fr  rb  )rg  r)  c                    s    g | ]}| fkrnd qS r  r   r  r|  r}  rP  r   r   r    s     zdiag_embed.<locals>.<listcomp>)rH  r  r  r   r  r  r   r"  r%   r  r   r)  rg  r   r   r   r   r  r   r   r   mask_tensor)r   ry  r|  r}  r~  Zt_shapezpairZa_rangeZb_rangecondZ
cond_shaper   r  r   r     s<    

 

    
)r  ro  r  c                 C   sl   | j dk rtd| j  dt|tr`|dks@| jd | dkr`tdd| jd  d| d	 t| |dS )
Nr	  zPtorch.dsplit requires a tensor with at least 3 dimension, but got a tensor with rs  r   r  z9torch._refs.dsplit attempted to split along dimension 2, zbut the size of the dimension ru  r   )rH  r   r   r   r   r   )r  ro  r   r   r   r     s    
$c                 C   s8   | j dkrtd| j  dt| d| j dk r2dndS )Nr  z7t() expects a tensor with <= 2 dimensions, but self is Dr   r   )rH  r   r  r   r  r   r   r   r     s
    
)r  dim0r|  r  c                 C   s^   t | j||f\}}| jdks(||kr2t| S ttd| j}|||< |||< t| |S )Nr   r   )	r  rG  rH  r%  r  r  r   r  r   )r  r  r|  Z_dim0Z_dim1r?  r   r   r   r     s    
)r  rB  r  rC  c                 C   s&   t | j|  |||\}}| ||S r   )rJ  r   r  r   )r  rB  r  rC  rF  rG  r   r   r   r     s        )r?  r)  r  c          
      C   s   | j }t||}|dkr2t| dd|||dS | |d } tj| j| | jd}|d|k}t	|| d D ]}|d}qtt
|| }	t|	||||dS )Nr   )r<  r?  r)  r  r   rs  r   )rH  r  r  r   r   r  r   r   rg  r   r  )
r  r<  r?  r)  r  rH  Zrgr{  _Zmasked_ar   r   r   cumsum  s    r  c                 C   s(   | j d }t||}tj| |f|dS )Nr   r  )rH  r  r  r%  Zexpand_dims)r  r<  rH  r   r   r   r     s    
c                 G   s   t | f|ddiS )NrO  FrT  r  r   r   r   r     s    c                 C   s   |  | S r   )r   r  rU  r   r   r   view_as#  s    r  c                 C   s
   t | dS )N)r   )r   r  r   r   r   r   (  s    r)  r  rg  r  r  r  )r)  r  rg  r  r  r  r  c              	      s   t  tjkdd  t|} tjkr4t|}n8 tjkrJt|}n"t  tj	k fdd t
|}tj||| ||||dS )Nc                   S   s   dS )Nz8torch.empty: the Preserve memory format is not supportedr   r   r   r   r   r   9  r   zempty.<locals>.<lambda>c                      s   d  dS )Nz/torch.empty: received an unknown memory format r   r   r   r  r   r   r   E  r   r)  r  rg  r  r  )r   r  r  r  r  contiguous_formatrM  Zchannels_last_3dZ!make_channels_last_3d_strides_forZchannels_lastZ!make_channels_last_2d_strides_forr   )r)  r  rg  r  r  r  r   r  r   r  r   r   ,  s.    




r)  r  rg  r  )r  r  r)  r  rg  r  r  c                C   sJ   |d kr| j n|}|d kr | jn|}|d kr2| jn|}tj|||||dS )Nr)  rg  r  r  )r)  r  rg  r  r   )r  r  r)  r  rg  r  r   r   r   	new_emptyT  s    r  )r  r  r  r)  r  rg  r  r  c                C   sL   |dkr| j n|}|dkr | jn|}|dkr2| jn|}tj||||||dS )zD
    Reference implementation of torch.Tensor.new_empty_strided
    Nr  )r)  r  rg  r  r   )r  r  r  r)  r  rg  r  r   r   r   new_empty_stridedl  s    r  r  )r)  r  rg  r  r  r  c              	   G   s@   t |}| d krt } tj|| tjkr.dnd| ||||dS NFr   r  r  r  r  r  r   r6  r)  r  rg  r  r  r  r   r   r   r     s    

)r  r  r)  r  rg  r  r  r  c             	   C   s\   |d kr| j n|}|d kr | jn|}|d kr2| jn|}tj||tjkrJdnd|||||dS r  r)  r  rg  r  r   r6  r  r  r)  r  rg  r  r  r   r   r   	new_zeros  s    r  c              	   G   s@   t |}| d krt } tj|| tjkr.dnd| ||||dS NTr   r  r  r  r   r   r   r     s    

c             	   C   s\   |d kr| j n|}|d kr | jn|}|d kr2| jn|}tj||tjkrJdnd|||||dS r  r  r  r   r   r   new_ones  s    r  )r  r  
fill_valuer)  r  rg  r  r  c                C   sL   |d kr| j n|}|d kr | jn|}|d kr2| jn|}tj||||||dS )Nr  )r)  r  rg  r  r   )r  r  r  r)  r  rg  r  r   r   r   new_full  s    r  )r)  rg  r  r  r  r  )r  r)  rg  r  r  r  r  r  c             	   C   s~   |d kr| j n|}|d kr | jn|}|d kr2| jn|}|tjkrZtj| j||||||dS t| }tj	| j||||||dS )Nr  r  )
r)  r  rg  r  r  r   r   r  Z"compute_elementwise_output_stridesr   )r  r)  rg  r  r  r  r  r  r   r   r   r   
  s.    

)	r  rR  rC  r)  r  rg  r  r  r  c                C   s:   t | t | |d kr$| }d} tj| |||||dS )Nr   r  )r  check_layoutcheck_pin_memoryr%  r   )r  rR  rC  r)  r  rg  r  r  r   r   r   r   4  s    

)r)  rg  r  r  r  )	r  rR  stepsr)  rg  r  r  r  r  c                C   s  |d krt  }tj|r@t| tr.t| } t|tr@t|}tdd | ||fD r\t	t| t
spt|t
rtttt|tdd td t|tstt|dkdd  ||||d}|dkrt jdd
|i|}	n|dk rt jd| fd
|i|}	n| |kr$t j|f| fd
|i|}	ntj|rt| trJt|tsNt||  }
|| krddnd}|d }tt j| | || | |
fd
t ji|| |}	n@||  |d  }|d }tt j| || |fd
t ji||}	|	S )Nc                 s   s   | ]}t |tV  qd S r   )r   complex)r   r  r   r   r   r   r  s     zlinspace.<locals>.<genexpr>c                   S   s   dS )Nzsteps must be int, not floatr   r   r   r   r   r   x  r   zlinspace.<locals>.<lambda>rw  r   c                   S   s   dS )Nz$number of steps must be non-negativer   r   r   r   r   r   |  r   )r  rg  r  r  r  r)  r   r  r   r  )r  r   )r  r  r%  r  rO  r   r9  r   py_anyr  r  r   r   rz  r   rp  r   r  ro  )r  rR  r  r)  rg  r  r  r  Zfactory_kwargsretZstep_size_x_denomr6  ZdenomZ	step_sizer   r   r   r   Y  s|    




  
   )
r  rR  r  baser)  rg  r  r  r  r  c          
   
   C   s   |d krt  }tj|r@t| tr.t| } t|tr@t|}t|trNt	|dk rZt
t j| ||t j||||d}	tt ||	|S )Nr   r  )r  r  r%  r  rO  r   r9  r   r  r   r  r   ro  rp  r   )
r  rR  r  r  r)  rg  r  r  r  r  r   r   r   r     s*    


r  indexingc                 C   s   d S r   r   r  r   r   r   r     s    c                 G   s   d S r   r   )r  r  r   r   r   r     s    )r  r  r  c                    s  t |d tst |d tr8t|dks,tt|d }ttdd |D dd  tt|dkdd  tt|d D ]H}t|| j||d  jkdd  t|| j	||d  j	kd	d  qzd
} dkrt|dk}|r|d |d f|dd  }nt dk fdd g }|D ]Ht t
s0ttjdkpFjdkfdd |  qg }t|D ]F\}t t
stjdkrd|t||f qr|r|d |d  |d< |d< |S )Nr   r   c                 s   s   | ]}t |tV  qd S r   )r   r   r  r   r   r   r     s     zmeshgrid.<locals>.<genexpr>c                   S   s   dS )Nz)meshgrid expects its inputs to be tensorsr   r   r   r   r   r     r   zmeshgrid.<locals>.<lambda>c                   S   s   dS )Nz'meshgrid expects a non-empty TensorListr   r   r   r   r   r     r   c                   S   s   dS )Nz3meshgrid expects all tensors to have the same dtyper   r   r   r   r   r     r   c                   S   s   dS )Nz4meshgrid expects all tensors to have the same devicer   r   r   r   r   r     r   FZxyr  Zijc                      s
   d  S )NzDtorch.meshgrid: indexing must be one of "xy" or "ij", but received: r   r   )r  r   r   r     s    c                      s
   d  S )NzEtorch.meshgrid: Expected 0D or 1D tensor in the tensor list but got: r   r   r  r   r   r     r   r  )r   r  r   r   r   r   r  r   r)  rg  r   rH  r#  r  r&  r   r%  r  )r  r  r  Zswap_first_and_second_tensorsZresult_shapeZgridsr   )r  r   r   r     sV    


)r'  sourcedestinationr  c                    s@  t tkrft  tkr$ f ttt k fdd | j}ttj|d}ttj| d}t|}t|}tt|t|kfdd tt|t|k fdd t	t
||}g }	d}
t|D ]L}||}|dk	r|	| q|
|kr|
d7 }
q|	|
 |
d7 }
qt| t|	}|S )	z3
    Reference implementation of torch.movedim
    c                      s   d d  dS )Nz5movedim: Invalid source or destination dims: source (z> dims) should contain the same number of dims as destination (z dims)r   r   r  r  r   r   r   .  s    zmovedim.<locals>.<lambda>)r~  rr  c                      s
   d  S )Nz"movedim: repeated dim in `source` r   r   )r  r   r   r   >  r   c                      s
   d  S )Nz'movedim: repeated dim in `destination` r   r   )r  r   r   r   B  r   r   Nr   )r	  r   r  r   r   rH  r   rG  setdictrE  r   r  r#  r  r   )r'  r  r  r~  ssZdsZsssZdssr  r  siZdir  rJ  r   r  r   r     sD    	






)r)  rg  r  r  r  )r   r  r)  rg  r  r  r  r  c                C   s\   t | t | t | } |d kr.t n|}|d krDtdn|}tj| ||||dS )Nrr  r  )	r  r  r  r  r  r  rg  r%  r   )r   r  r)  rg  r  r  r  r   r   r   r   [  s    


)nr  r)  r  rg  r  r  r  c                   s    dkr t dkfdd t  dk fdd tjtj|dd}tj tj|dd}|d|k}	|tjkr||	S tjd	||||dd
}
t|	|
dS dS )z/
    Reference implementation of torch.eye
    Nr   c                      s
   d  S )Nz%n must be greater or equal to 0, got r   r   )r  r   r   r     r   zeye.<locals>.<lambda>c                      s
   d  S )Nz%m must be greater or equal to 0, got r   r   )r  r   r   r     r   Fr  r   r  r  )r   r  r   r  r   r6  r   r   )r  r  r)  r  rg  r  r  Zrange_nZrange_mr  Zoner   )r  r  r   r   w  s$    
)r   r  r)  r  rg  r  r  r  c                C   s   t | |||||d}t||S )Nr  )r   r8   )r   r  r)  r  rg  r  r  er   r   r   r     s    r)  r  rg  r  r  r  )	r  r  r)  r  rg  r  r  r  r  c          	   	   C   s"   t j| ||||||d}t||S )Nr  )r  r   r8   )	r  r  r)  r  rg  r  r  r  r  r   r   r   r     s    	)r  )r)  rg  r  r  r  r  c                 G   sP   t |d kdd  t|}t| } t|}t|}tj|dd| ||dS )Nc                   S   s   dS )Nz&pin_memory parameter is not supported!r   r   r   r   r   r     r   zrandn.<locals>.<lambda>rF  rl  )r   r  r)  rg  r  )r   r  r  Zdtype_or_defaultZdevice_or_defaultZlayout_or_defaultr%  normal)r)  rg  r  r  r  r   r(  r   r   r   r     s    



)r  r)  r  rg  r  r  c                C   sT   t | t | |d k	r |nt t| }|d k	r:|ntd}tj| ||dS )Nrr  rf  )	r  r  r  Ztype_to_dtyper	  r  rg  r%  r   )r  r)  r  rg  r  r   r   r   r     s
    

rl  )r   lowhighr)  rg  r  c                C   sp   t |  t|tttfstt|tttfs2tt|}t|}t|tjsRtt 	|}t
j| ||||dS )N)r  r  r)  rg  )r  r'  r   r6  r   r9  r   r  r)  Zcanonicalize_devicer%  r   )r   r  r  r)  rg  r   r   r   r     s    	

)r  r{  r*  c                    s   t | j t|tr t|}n\|jtdkfdd t| jjdkpT|j| jkdd  t |j}t 	|r||
 }|tkrtt |  fdd t|trt| || S t|tstt|t|| j| S )Nr   c                      s   d  dS )Nz@only supports a 0-dimensional value tensor, but got tensor with z
 dimensionr   r   )
value_ndimr   r   r   (  r   zmasked_fill.<locals>.<lambda>Zcudac                   S   s   dS )Nz,Expected `value` to be on same device as `a`r   r   r   r   r   r   -  r   c                      s   d  dS )Nzcould not convert to type z without overflowr   r   )r-  r   r   r   :  r   )r  r   r)  r   r   r	  rH  r   rg  r  r   r  r   r  r   r   r   r%  rp  )r  r{  r*  Z
value_typer   )r-  r  r   r     s0    






c              
   C   s4   t d| |||d tttj| ||||d S )z4
    Reference implementation of torch.allclose
    ztorch.allcloser  )r  r  r  )r  r6  r  r   ru   r   )r  rZ  r  r  r  r   r   r   r   G  s    
c                 C   st   t j| |dd t | | | j|jkr,dS t| j|jD ]\}}||kr: dS q:|  dkrbdS ttt	| |S )NFr  r   T)
r  r  Zcheck_same_dtyperH  rE  r   r  r   r   rg   )r  rZ  r   ri  r   r   r   r   Y  s    )Zexact_dtypefro)r'  r  r<  r?  r)  r  c                C   s   |dkr&|d ks.t |ts.t|dks.|d kr2d}t |trB|g}t |trx|d krbtt| j}tjj	| ||||dS tjj
| ||||dS d S )Nr  r  r4  )r   r   r   r   r   r   rH  r  ZlinalgZmatrix_normZvector_norm)r'  r  r<  r?  r)  r   r   r   norml  s$    


r  )r  r  c                 C   s(   t | jdkdd  tt| dS )Nr  c                   S   s   dS )Nz6expected a matrix, but got tensor with dim {self.ndim}r   r   r   r   r   r     r   ztrace.<locals>.<lambda>r   )r  r   rH  r  r   Zdiag)r  r   r   r   r\     s
     c                    s*   t ttf t ttf td fdd}|S )Nr[  c                    s
    || S r   r   rY  base_opr   r   rop  s    z_make_r_binary_op.<locals>.rop)r   r   r   )r  r  r   r  r   _make_r_binary_op  s
    

r  )r  r   r  c                 C   sd   t | jdkdd  | jdd  \}}tj|| jddtj|| jdd |k}t || S )Nr  c                   S   s   dS )Nz2triu: input tensor must have at least 2 dimensionsr   r   r   r   r   r     r   ztriu.<locals>.<lambda>r  rs  r   	r  r   rH  r   r  r   rg  r   r  r  r   hwr{  r   r   r   r     s     c                 C   sd   t | jdkdd  | jdd  \}}tj|| jddtj|| jdd |k}t || S )Nr  c                   S   s   dS )Nz2tril: input tensor must have at least 2 dimensionsr   r   r   r   r   r     r   ztril.<locals>.<lambda>r  rs  r   r  r  r   r   r   r     s     )rowcolry  r  c           
      C   s   | dks|dkrdS |dkr*t |d| nt| | dk}tdt || | }tdt | | | }|| d }|| | d }|| }td|| }	||	|fS )Nr   r   r   r   r   r  )r  r   r   )
r  r  ry  m_first_rowZ
m_last_rowZ	n_row_allZn_row_trapezoidtrapezoid_sizeZdiff_rowrectangle_sizer   r   r   _get_tril_sizes  s    &r  r  r  r  r)  r  r  c                    sP   t dkfdd t  dk fdd t tjtjfkfdd d S )Nr   c                      s
   d  S )Nzrow must be non-negative, got r   r   )r  r   r   r     r   z_trilu_checks.<locals>.<lambda>c                      s
   d  S )Nzcol must be non-negative, got r   r   )r  r   r   r     r   c                      s   d d  dS )Nr  z" not implemented for ''r   r   )r)  r  r   r   r     r   )r   r  r  r  r  r   )r  r)  r  r  r   _trilu_checks  s    r  rr  )r  r  ry  r)  r  rg  r  r  c                C   s
  t d| |||| t| ||\}}}	td| }
ttj|||d}|d|tjd}|	d }t| t|| d|   }t|d|	 d | | d  }t	
||
 |}t	
||}|d||d}|| ||	 d |
  }|| }tt||ft||ffS )Nr   r   r  rg  r  r4  rm  r  r   )r  r  r   r   r  r   ro  r9   rX   r%  rp  r   r   )r  r  ry  r)  r  rg  r  r  r  r  
row_offset	arange_kwxs1rZ  	row_inds1	col_inds1xs2	row_inds2	col_inds2r   r   r   r     s*       ""c           
      C   s|   | dks|dkrdS |dkr*t d|| n|}t dt| | | }t| ||d \}}}| | ||  }|| }	|	||fS )Nr   r  r   )r   r  r  )
r  r  ry  r  r  Ztrapezoid_size_trilZrectangle_size_trilr  Z	triu_sizer  r   r   r   _get_triu_sizes  s    r  c                C   s  t d| |||| t| ||\}}}	td|}
ttj|||d}|d||d}|| }|| }|d|tjd}d|	 }t| t|| d|   }t|d|	 d | | d  }t	
||}t	
||}|r|||  }||
 }tt||ft||ffS )	Nr   r   r  r4  g      r  r   rm  )r  r  r   r   r  r   ro  r9   rX   r%  rp  r   r   )r  r  ry  r)  r  rg  r  r  r  r  
col_offsetr  r  r  r  r  rZ  r  r  r   r   r   r     s0    
   "")F)rF  NN)r  r  F)NN)N)N)NN)NNNNNFF)FFN)FFN)FFN)FFN)NF)NF)NF)NF)NF)NF)NN)NNF)NNF)NF)N)NNF)r   )r   )r   )r   )r   r   )r   rZ  )r   )r   )N)r   )r   r   r   )r   r  r   )r   Nr   )r  )N)rF  rl  )r  r  F)r  NF)r   )r   )r   )r   (_  r"  r  rT  r  warningscollections.abcr   enumr   	functoolsr   r   r   r   typingr   r	   r
   r   r   r   r   r  Ztorch._primsZ_primsr%  Ztorch._prims_commonZ_prims_commonr  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ztorch._prims_common.wrappersr   r    r!   r"   r#   r$   __all__r_  Z_CZDispatchKeyr  r  Ztorch._decompr  objectr  r$  r  r%   ZINT_TO_FLOATr&   r'   r)   r(   r*   r+   DEFAULTr,   r-   r  r   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   Z	NO_OPMATHr8   r1  r3  r9   r:   rt   ZALWAYS_BOOLrB   rC   r:  r;  rD   rE   Z
special_i0rF   rG   specialZmultigammalnZmvlgammarH   rI   rJ   rK   r   r)  rE  r6  rA  rL   rQ  rM   rN   r   rO   rP   r   rQ   rR   rS   rT   rU   rV   rW   rX   ZBOOL_TO_LONGrY   rZ   r[   r]   ra  r^   r_   r`   Z
shift_leftra   rb   Zshift_right_arithmeticrc   rd   rj  re   rf   r   rg   rn  r   rh   rv  ru  rt  ri   rj   rk   rl   rm   rn   ro   r~  rp   rq   rr   rs   r9  r  ru   r  rv   rw   r  rx   ry   r  rz   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  registerr  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   defaultZpy_implZCompositeImplicitAutogradZMetar   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r8  r   r   rJ  r   rS  r   rV  r   r   r   r]  r   r`  r   r   r   r   r=   r>   r@   rA   r;   r<   r?   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r   r   Zstridedr  r  r   r  r   r  r  r   r   r  Z
start_stepr   r   r   r   r   r   r   r   r   r   r   r   r   r   ZScalarr   r   r  r\   r  r   r   r   r   r   r  r  r   rm  r  r   Ztorch._refs.fftZtorch._refs.linalgZtorch._refs.nn.functionalZtorch._refs.specialr   r   r   r   <module>   s  $H   p&&




















    	1

!
 




	

8
 
					   +
 	



!
 
	   

              +B      
      )  	4   
      	  L !(	  F	    &8p  -    	 	   
   
"
N , (  )  6&)  O&C

<( ,  
  
  &)&)


