o
    ZhD                    @   s<  d dl Z d dlZ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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 d dlZd dlmZ d dlmZ d dlm  m Z! d dlm"Z"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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? g d	Z@ejAZAejBjCZCejDjEjFZFd
d ZGdd ZHdd ZIddddZJd dlKmLZL eM ZNeNddddefddZOdd ZPdd ZQeOe*jRdddd  ZSeOe*jTd!d" ZUeOe*jTd#d$ ZVeOe*jTd%d& ZWeOe*jTd'd( ZXeOe*jTd)d* ZYeOe*jTd+d, ZZeOe*j[d-d. Z\eOe*j[ddd/d0 Z]eLeFj^d1e6fd2d3Z^eLeFj_e? d1e6fd4d5Z_eOe*jTd6d7 Z`eOe*jTd8d9 ZaeOe*jTd:d; ZbeOe*jTd<d= ZceOe*jTd>d? ZdeOe*jTd@dA ZeeOe*jTdBdC ZfeOe*jTdDdE ZgeOe*jTdFdG Zhe? e=dHe*jidIdJe6dKe0de6fdLdMZjdJe6dKe0de6fdNdOZkeLeFjle? d1e6de6fdPdQZleOe*j[dddRdS ZmeOe*j[dddTe6de6fdUdVZndJe6de6fdWdXZoeOe*jpddYdJe6de6fdZd[ZqeOe*jpdJe6de6fd\d]ZreOe*jpdddJe6de6fd^d_ZseOe*jpdddJe6de6fd`daZteOe*jpdJe6de6fdbdcZuePejvjwddZxeOe*jpddYdJe6de6fdedfZyeOe*jTeFjzdYdgdh ZzeOe*jTdidj Z{eOe*jTdkdl Z|eOe*jTdmdn Z}eOe*jTdodp Z~eOe*jTdqdr Ze? 	ddJe6dsedteej de6fdudvZeLeFje? e=dwe*jTdI	ddxe6dse(dyede6fdzd{ZeLeFje? 	|		ddJe6d}ee0 d~ee0 dee0 de6f
ddZdJe6fddZeOe*j[eddd ZdJe6de6fddZdJe6de6fddZeOe*jTdd ZeLeFje? e=de*j[dId ddJe6dede6fddZeOe*jTdd ZeOe*jTdJe6de6fddZeOe*j[dddd ZeOe*j[dddd ZeOe*jpdddd ZeOe*jTdd ZeOe*jTdd ZeOe*jTdd ZeOe*jTdd ZeOe*jddYdJe6de6fddZeOe*jTdd ZeOe*jTdd ZeOe*j[dddd Zdxe6de6fddZeNddddddfdefddZeLeFje? e=de*j[dIdddJee6e0f dee6e0f dee0 fddZee*jTddddd Zee*j[ddJe6de6de6fddZee*j[ddJe6de6de6fddZee*j[ddJe6de6de6fddZee*j[ddJe6de6de6fddZee*j[ddJe6de6de6fddÄZee*jTddčdJee6e0f dee6e0f fddƄZeLeFje? ddǜdJee6e0f dee6e0f dee fddʄZee*jpddčdJe6de6de6fdd̄Zee*jddJee6e0f dee6e0f de6fdd΄Ze? dJee6e0f dee6e0f deAfddЄZeej*j[dddэdJee6e0f dee6e0f fddӄZdJeAdeAdeAfddՄZdJeAdeAdeAfddׄZee*j[ddddJe6de6de6fddلZee*j[ddddJe6de6de6fddۄZee*j[ddddJe6de6de6fdd݄ZeLeFje?dd߃dxe6dee6e6f fddZee*j[ddddJe6de6de6fddZee*jpddčdJe6de6de6fddZee*jpddčdJe6de6de6fddZee*j[dddd1e6de6de6fddZee*j[ddddJe6de6de6fddZee*jTddddJe6de6de6fddZee*jTddddJe6de6de6fddZdedJe6de6dededdfddZ			ddJe6de6dededede6fddZee*j[ddddJe6de6fddZee*jpddčdJe6de6de6fddZee*j[ddddJe6de6de6fdd Zee*j[ddddJe6de6de6fddZee*jpddJe6de6fddZeOe*jpdJe6fddZee*jpddJe6de6fddZee*jpddJe6de6fd	d
Zee*jpddčdJe6de6de6fddZee*j[ddJe6de6de6fddZee*j[ddJe6de6de6fddZee*j[dddJe6de6de6fddZee*jpddčdJe6de6de6fddZee*jiddddJe6de6de6fddZee*j[ddJe6de6de6fddZeLeFjʃe? 	ddJee6e0f dee6e0f de0fddZeLeFj˃e? e=de*j[dIdddJee6e0f dee6e0f de0fddZee*jTdddd dJe6de6de6fd!dZeLeFj̓e? e=de*jTdIdJee6e0f dee6e0f fd"d#Zeej*j[ddd$dJee6e0f dee6e0f fd%d&ZeLeFjσe? e=d'e*jTdIdd(dxe6d)e6d*e6dKe0de6f
d+d,ZeLeFjЃe? e=d'e*j[dIdd(dxe6d)e6d*e6dKe0de6f
d-d.ZeLeFjуe? e=d/e*j[dI		ddJe6d0ee7 d1ee7 de6fd2d3ZeLeFj҃e? 	ddxe6d0ee7 de6fd4d5ZeLeFjӃe? 	ddxe6d1ee7 de6fd6d7ZeLeFjԃe? e=de*jidI		dd8eAdJee7 dee7 fd9d:ZeLeFjՃe? ej֐d;dJe6d<ejde6fd=d>Zdd?dJeAdeAfd@dAZeLeFjكdJe6de0fdBdCZ							ddJe6dDee% dteej dEee dFeej d<eej dGee dHedefdIdJZedKdL Zej			ddDejdtejdHedEed<eej deeef fdMdNZej			ddDedtejdHedEed<eej deeef fdOdPZej			ddtejdHedEed<eej deeef f
dQdRZej			ddSeAdHedEed<eej deeef f
dTdUZdJeAdVefdWdXZdJe6de6fdYdZZddddddd[dJe6d\ed]ed^ed_ee( d`edteej daeeA dbe2de6fdcddZdedf ZeLeFje? 		ddJe6dsee( dyede6fdgdhZeLeFje? 		ddJe6dsee( dyede6fdidjZeLeFjjeFjjg		ddddkdJe6dseee eee  f dyedteej daeeA de6fdldmZdJeAdeAfdndoZeLeFj		ddddkdJe6dseee eee  f dyedaeeA de6f
dpdqZeLeFj		dddrdJe6dsee( dyedaeeA de6f
dsdtZeLeFj		dddrdJe6dsee( dyedaeeA de6f
dudvZddwdxZeLeFje? 			dddydJe6dsee( dzee dyed{ee0 de6fd|d}ZeLeFje? 			dddydJe6dseee eee  f dzee dyed{ee0 de6fd~dZeLeFj		ddddkdJe6dsee( dyede6fddZeLeFje?dd	ddddddJe6dsee( dzee dyed{ee0 f
ddZeLeFje?dd			dddydJe6dsee( dzee dyed{ee0 f
ddZeLeFje? e=de*j[dIddddxe6de6de6de0de0de6fddZdee6e	e6 f de6dee6ee6df f fddZdedsede6de6fddZdee6e	e6 f de6dee6ee6df f fddZdee6e	e6 f de6dee6ee6df f fddZ	ddJe6de3de4dee de6f
ddZeLeFje? 	dd1e6de6de3de4dee de6fddZde3fddZeFj jeCjeFj jeCjdee6 fddZ dJe6de3de6fddZeLeFje? e=de*jidIdde8dsede6fddZe? de8de6fddZd1e6de6fddZeLeFj	e? 	 dd1e6dee dKe0de6fddZ	ej
d;dJeAd<ejdeAfddZe? de8de6fddZeLeFjdJeAdeAfddZdJeAdeAdeAfddZddJe6dedsedee6df fddZddJe6dedede6fdÐdĄZeLeFje? dJe6d_e'de6fdŐdƄZdJe6de6fdǐdȄZdJe6de6fdɐdʄZdJe6dsedeee6f dede6f
d͐d΄ZdJeAde(dedeeAeAeAf fdѐd҄ZdTe6dee de6fdԐdՄZeLeFjjd1eAdeeA deeA dedededededeeAeAeAf fdܐd݄ZeLeFje?dddރd1eAde3deeA deeA dedeeAeAeAf fddZejjeFjjdd ZeLeFjdJe6de6fddZeLeFje? d1e6de1dsede1de6f
ddZeFjj eCj									dd1eAdedee dee deeA dedededee dee dee deAfddZeFj!jeCj								dd1eAdedee dee deeA dededee dee deAfddZ!de3de4dededef
ddZ"eLeFj#e? dJeAdeAfdd Z#dJe6dede6fddZ$dJe6de3de6fddZ%dxe6dSe6de6fddZ&eLeFj'e? ddJe6d
e(d_e(de6fddZ'eLeFj(e? 	ddJe6ded_e'de6fddZ(de8ddfddZ)eLeFj*e? dde8dsede6fddZ*e? 	ddJe6dsedteej de6fddZ+e? de8de6fddZ,e? de8de6fddZ-dJe6dsede3de6fddZ.eLeFj/dde6dsede8fdd Z/e? dTe5dsed!e5d"e5fd#d$Z0dTe5dsed!e5d"e5fd%d&Z1eLeFj2e? dTe5dsed!e5dKee0e5f fd'd(Z2eLeFj3dTe5dsed!e5dKee0e5f fd)d*Z3dTe5dsed!e5dKee0e5f d+ef
d,d-Z4e? dddTe5dsed!e5d"e5de0f
d.d/Z5eLeFj6e? dTe5dsed!e5fd0d1Z6eLeFj7j8ddJe6dsee( de6fd2d3Z7eLeFj9	 ddxeAd4ee dsedeeA fd5d6Z9	 ddJe6d7eeAe(f dsedee6df fd8d9Z:dJe6d7e(dee6df fd:d;Z;dJe6d7e(dee6df fd<d=Z<eLeFj=j>e? 	 ddxe6d>ede6fd?d@Z=eLeFj?e? 	 	 	d d1e6de6d>edAedBede6fdCdDZ?eLeFj@	 	 	d dxe6d>edAedBede6f
dEdFZ@eLeFjAe? 	 	G	d!de6d>edAedBede6f
dHdIZAeLeFjBe? dee6 de6fdJdKZCdee6 de6fdLdMZBdJe6dNe(de8fdOdPZDeLeFjEjdJe6fdQdZEdJe6de6fdRdSZFeLeFjGdJe6de6fdTdUZGeLeFjHdJe6dVedAede6fdWdXZHeHZIeLeFjJdxe6dededede6f
dYdZZJeLeFjKe? dxe6dededefd[d\ZKdddkdJe6dsedteej daeeA de6f
d]d^ZLeLeFjMdddkdJe6dsedteej daeeA de6f
d_d`ZMeLeFjNdddkdJe6dsedteej daeeA de6f
dadbZNeLeFjOdJe6dsede6fdcddZOeLeFjPjdJe6de3de6fdedfZPdxe6dSe6de6fdgdhZQdJe6de6fdidjZRe? 	ddJejAdkejAdsee dejAfdldmZSe? dejTdddej
dndteej dFejڐdDee% doedGed<ejde6fdpdqZUe? dejTdddfdteej dFejڐdDee% doedGede6fdrdsZVeLeFjWe? dddddtdJe6de3dteej dFeej dDee% dGede6fdudvZWeLeFjXe? dddddtdJe6de3de4dteej dFeej dDee% dGede6fdwdxZXeLeFjYje? dejTddddydteej dFejڐdDee% dGedoede6fdzd{ZYeLeFjZe? ddddddydJe6de3dteej dFeej dDee% dGedoede6fd|d}ZZeLeFj[je? dejTddddydteej dFejڐdDee% dGedoede6fd~dZ[eLeFj\e? ddddddydJe6de3dteej dFeej dDee% dGedoede6fddZ\eLeFj]e? dddddtdJe6de3de0dteej dFeej dDee% dGede6fddZ]eLeFj^e? dddddej֐ddJe6dteej dDee% dFeej dGedoed<ejde6fddZ^eLeFj_j`eFj_jage? 	 		d"dejTddddyde0dee0 de0dteej dFejڐdDee% dGedoede6fddZ_eLeFjbe? e=de*j[dIdeAdeAdeeAe0f fddZbeLeFjce? ddejTddddee0e6f dee0e6f de0dteej dDee% dFejڐdGedoede6fddZceLeFjde? 	d#ddejTddddee0e6f dee0e6f de0de0dteej dDee% dFejڐdGedoede6fddZdede	e6 defddZeede6defddZeeLeFjedee6ee6 ee6 f dedee6 fddZed1e6deee'f deee'f de6fddZfeLeFjge? ddejTddddee3ee3 f de4dteej dDee% dFejڐdoedGede6fddZgeLeFjhe? 	ddejTddddydedee dteej dFejڐdDee% dGedoede6fddZheLeFjijeFjij>ge? dejTddddyde3de0dteej dFejڐdDee% dGedoede6fddZidddddej֐ddJe6de0dteej dFeej dDee% dGedoed<ejde6fddZjeLeFjke? dddddej֐ddJe6dteej dFeej dDee% dGedoed<ejde6fddZkeLeFjle? dddddej֐ddJe6dteej dFeej dDee% dGedoed<ejde6fddZleLeFjmje? dddddddteej dDee% dFeej doedGede6fddZmdejTdddtdJe0dteej dFejڐdDee% dGede6fddZn	|	d$de3deeeef deeeef dtejdDe%de6fddZoeLeFjpe? dJe6de6dKe7fddZpeLeFjqdJe6de6dKe7de6fddZq			ddJe6de6dedededefddZrdJe6de6defddZseLeFjte?dd			d%ddÜd1e6deeeef  dsee( dyedteej de6fdĐdńZteLeFjue? dxe6de6fdƐdǄZudȐdɄ ZvevẽZweveZxeveZyeLeFjze? ddJe6dFede6fdʐd˄ZzeLeFj{e? ddJe6dFede6fd̐d̈́Z{deded>edeeeef fdАdфZ|dedededtejdFejڐdGefdҐdӄZ}eLeFj~e? 	 dejejTdddtdeded>edtejdFejڐdDe%dGede6fdՐdքZ~deded>edeeeef fdאd؄ZeLeFje? 	 dejejTdddtdeded>edtejdFejڐdDe%dGede6fdِdڄZeLeFje?dddddۜdJe7de6dedefdߐdZeLeFje? e=dwe*j[dId&ddZeLeFje? e=dwe*j[dId'ddZeLeFje? e=dwe*j[dIdddZeLeFje? e=dwe*j[dId(ddZeLeFje? e=de*j[dI	 		d&ddddddddZeLeFjdddddZeOe*jTdxe6fddZeOe*jTdxe6fddZeLeFje? ddsee( fddZdd Zdd ZeLeFje? ee=de*j[dIdd ZeLeFje? ee=de*j[dIdd ZeLeFje? dTe6de6dsed!efd dZeQeSZeQeUZeQeVZeQeZeQeЃZeQeσZeQeWZeQeXZeQeYZeQeZZeQeZeQeZeQeZeQe\ZeQeZeQeZeQeZeQe]ZeQeуZeQe҃ZeQeӃZeQe_ZeQeZeQe`ZeQeaZeQeMZeQeNZeQeZeQebZeQeZeQeZeQecZeQeeZeQedZeQefZeQehZeQegZeQeZeQemZeQeZeQeZeQenZeQeZeQeZeQeZeQeZeQeZeQeZeQeZeQezZeQeZeQeZeQebZeQe{ZeQeZeQe}ZeQe~ZeQe|ZeQeZeQeZeQeZeQeZeQeÃZeQeƃZeQexZeQeZeQeǃZeQeZeQeȃZeQeZeQeZeQeZeQeɃZeQeZeQeZeQeZeQeZeQeZeQeZeQeZeQeZeQeZeQe˃ZeQeZeQeZeQe{ZeQezZeQẽZeQeZeQe̓ZeQeZeQeZeQeZeQeZeQelZeeFjGZeeFjZeeFj@ZeeFjZeeFjZeeFj7ZeeFjZeeFjEZeeFjHZeeFj/ZeeFjOZeeFjPZdd Zdd Zdd Zdejd	ee7e8f fd
dZ	dddZ ddddddd"Zd dlZd dlZd dlZd dlZd dlZdS ()      N)IterableSequence)Enum)partialreducesingledispatchwraps)AnyCallablecastOptionaloverloadUnion)	sym_floatsym_int)BoolLikeDeviceLikeTypeDimDimsSequenceTypeDimsTypedtype_to_typeELEMENTWISE_TYPE_PROMOTION_KIND	FloatLikeFloatWithoutSymFloatIntLikeis_weakly_lesser_typeNumber
NumberTypeRealNumberType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count_nonzerodeg2raddigammaerferfinverfcexpexpm1exponentialexp2fillfill_floorfrac	geometric	index_add
index_copyindex_copy_index_select
index_fillindex_fill_isfiniteisinfisposinfisneginfisnanisreali0lerplgammaloglog1plog2log10
log_normallog_softmaxmvlgammanormnormal
nan_to_numnegpositiverad2deg
reciprocalroundsigmoidsgnsignsignbitsinsincsinhsoftmaxsqrtsquaretantanhtracetruncaddatan2bitwise_andbitwise_left_shift
bitwise_orbitwise_right_shiftbitwise_xor	clamp_min	clamp_maxcopysigndiveqfloat_powerfloor_dividefmaxfminfmodgcdgegt	heavisidehypotigammaigammacimagiscloselcmle	logaddexp
logaddexp2logical_andlogical_not
logical_orlogical_xor	logsumexpltmaximumminimummulne	nextafterpowrealrpow	remainderrsubrtruediv	rfloordivsubtrue_dividetrunc_dividexlogyaddcdivaddcmulclampmasked_fillmasked_fill_whereclonecopy_toitemtoallamaxaminanycumsumcumprodmeandotvdotstdstd_meansumsum_to_sizeprodvarvar_meanaddralias
alias_copy
atleast_1d
atleast_2d
atleast_3d
as_stridedas_strided_copyas_strided_scatter
block_diagbroadcast_shapesbroadcast_tensorsbroadcast_tocatchunkcolumn_stackconjconstant_pad_nd
contiguous
diag_embeddiagdiagonaldiagonal_copydiagonal_scatterdsplitdstackexpand	expand_asexpand_copyflattenflipfliplrflipudhsplithstackmeshgridmovedimnarrownarrow_copynative_group_normnative_layer_normpermutepermute_copyravelrepeatreshape
reshape_asrollrot90rsqrtsplit_with_sizesstack	swap_axessqueezesqueeze_copytt_copyTtake_along_dimtensor_split	transposetranspose_copyunbind_copyunfoldunfold_copy	unsqueezeunsqueeze_copyviewview_as	view_copyvsplitvstackview_as_complex	unflattenunbindtriutriltriu_indicestril_indicesarangecauchyempty
empty_likeempty_permutedempty_stridedeyefull	full_likelinspacelogspace	new_emptynew_empty_stridednew_fullnew_ones	new_zerosones	ones_likerandnscalar_tensorzerozeros
zeros_likeallcloseequal	bucketize
is_complexrenormstftistftc                 C   s   | d u p| j dkS )Nhputypedevice r3  C/var/www/auris/lib/python3.10/site-packages/torch/_refs/__init__.pyis_noncontiguous_supportedn     r5  c                 C   sB   d }ddl m} | D ]}t||r|j} nq
t|s| }|S )Nr   )
FakeTensor)Ztorch._subclasses.fake_tensorr7  
isinstanceZfake_devicer5  r   )Zinput_tlistoutputr2  r7  r   r3  r3  r4  handle_noncontiguous_outputsr  s   
r:  c               	      s  ddl m} tdd tdd | D }t|dkrd S |D ]	tts'J qdgttdd |D  t	|D ]E\ t
d	d	t d	D ]6| dkrb dk r[td
 < qG| dkr}t  k fdd qGq9S )Nr   guard_size_obliviousc                 s   s$    | ]}t |tr|fn|V  qd S Nr8  r   .0xr3  r3  r4  	<genexpr>  s
    
z$_broadcast_shapes.<locals>.<genexpr>c                 S   s   | d uS r=  r3  rA  r3  r3  r4  <lambda>  s    z#_broadcast_shapes.<locals>.<lambda>   c                 s   s    | ]}t |V  qd S r=  len)r@  shaper3  r3  r4  rB        z9Attempting to broadcast a dimension with negative length!c                
      s&   d  d d  d d 
S )Nz.Attempting to broadcast a dimension of length z at z ! Mismatching argument at index z had z0; but expected shape should be broadcastable to r3  r3  Zarg_idxcommon_shapeidxrH  r3  r4  rD    s    )%torch.fx.experimental.symbolic_shapesr<  tuplefilterrG  r8  r   r   max	enumeraterange
ValueErrortorch_check)Z_shapesr<  shapesr3  rK  r4  _broadcast_shapes  s8   rX  T)preserve_cpu_scalar_tensorsc                    s8   t dd |D  fdd t fdd|D S )Nc                 s   s$    | ]}t |tr|jnd V  qd S r=  )r8  r"   rH  r@  r   r3  r3  r4  rB    s   " z#_maybe_broadcast.<locals>.<genexpr>c                    sj   | d u rd S t | tr| S t | tr)rt| r| S t| j s'|  S | S tdt	t
|  d )Nz#Unexpected type when broadcasting: !)r8  r   r"   utilsZis_cpu_scalar_tensorZ
same_shaperH  r   RuntimeErrorstrr0  )rA  rH  )rL  rY  r3  r4  __maybe_broadcast  s   


z+_maybe_broadcast.<locals>.__maybe_broadcastc                 3   s    | ]} |V  qd S r=  r3  r?  )r_  rL  r3  r4  rB        )rX  rO  )rY  argsr3  )r_  rL  rY  r4  _maybe_broadcast  s
   rb  )register_decompositionF)aten_op
extra_metaexact_dtypereturnc                   s   dt f fdd}|S )Nprimc                    sh   t  tdttdddtdtf fdd}tu r(t  jd ur2t	| |S )Nrf  aZtype_promoting_argstype_promotion_kindrk  rg  c                    s$    d ur |  | }t | g|S r=  )r:  )rk  r9  )re  rh  r3  r4  _ref  s   z>_make_elementwise_unary_reference.<locals>.inner.<locals>._ref)
r   r+   r*   r)   r#   infer_aten_opr\  get_aten_op__name__rc  rh  rn  rd  rf  re  rm  rh  r4  inner  s    z0_make_elementwise_unary_reference.<locals>.innerr
   )rm  rd  re  rf  ru  r3  rs  r4  !_make_elementwise_unary_reference  s   rw  c                    s(    fdd}||_ t jjd |_|S )a%  
    This function defines an alias of another function and sets its __name__ argument.
    It also sets its __module__ argument to the module of the caller.
    Note that when naively doing `alias = fn`, we have that `alias.__name__ == "fn"`, and
    `alias.__module__ == fn.__module__`.
    c                     s    | i |S r=  r3  ra  kwargsfnr3  r4  _fn     z_make_alias.<locals>._fnrq  )rq  inspectcurrentframef_back	f_globals
__module__)r{  namer|  r3  rz  r4  _make_alias  s   r  c                    sd   t   fdd} j d}||_ttt||}ddlm} | j}||vr0|| |S )z
    Given a function with out variant (i.e. using `out_wrapper()), it returns its in-place variant
    See https://github.com/pytorch/pytorch/wiki/Developer-FAQ#how-do-in-place-operations-work-in-pytorch
    c                    s    | g|R d| i|S )Noutr3  )rk  ra  ry  rz  r3  r4  r|  	  s   z_make_inplace.<locals>._fn_r   )	getmodule)	r   rq  rc  getattratenr~  r  __all__append)r{  r|  Zinplace_namer  Z_allr3  rz  r4  _make_inplace  s   

r  ri  c                 C   
   t | S r=  )primsr,   rj  r3  r3  r4  r,        
r,   c                 C   r  r=  )r  r-   rj  r3  r3  r4  r-   #     
r-   c                 C   r  r=  )r  r.   rj  r3  r3  r4  r.   (  r  r.   c                 C   r  r=  )r  r0   rj  r3  r3  r4  r0   -  r  r0   c                 C   r  r=  )r  r/   rj  r3  r3  r4  r/   2  r  r/   c                 C   r  r=  )r  r1   rj  r3  r3  r4  r1   7  r  r1   c                 C   r  r=  )r  r2   rj  r3  r3  r4  r2   <  r  r2   c                 C   r  r=  )r  r3   rj  r3  r3  r4  r3   A  r  r3   c                 C   r  r=  )r  r4   rj  r3  r3  r4  r4   F  r  r4   inputc                 C   s   t | jS r=  )r\  is_complex_dtypedtyper  r3  r3  r4  r*  N     r*  c                 C   s   t | js| S t| S r=  )r\  r  r  r  r5   r  r3  r3  r4  r5   S  s   
r5   c                 C   r  r=  )r  r6   rj  r3  r3  r4  r6   [  r  r6   c                 C   r  r=  )r  r7   rj  r3  r3  r4  r7   `  r  r7   c                 C   r  r=  )r  r:   rj  r3  r3  r4  r:   e  r  r:   c                 C   r  r=  )r  r;   rj  r3  r3  r4  r;   j  r  r;   c                 C   r  r=  )r  Zerf_invrj  r3  r3  r4  r<   o  r  r<   c                 C   r  r=  )r  r=   rj  r3  r3  r4  r=   t  r  r=   c                 C   r  r=  )r  r>   rj  r3  r3  r4  r>   y  r  r>   c                 C   r  r=  )r  r?   rj  r3  r3  r4  r?   ~  r  r?   c                 C   r  r=  )r  rA   rj  r3  r3  r4  rA     r  rA   za,rl  rk  valuec                 C   sb   t | tsJ t |tsJ t| j}tt||s+dt| d| d}t|t	
| |S Nzvalue argument of type  cannot be safely cast to type r[  )r8  r"   r   r\  r   r  r   r0  rT  r  rB   )rk  r  python_typemsgr3  r3  r4  rB     s   rB   c                 C   s   t | |}t | | | S r=  )r  rB   r   )rk  r  rr3  r3  r4  rC     s   rC   c                 C   r  r=  )rU  r&  r  r3  r3  r4  r$    s   
r$  c                 C   r  r=  )r  rD   rj  r3  r3  r4  rD     r  rD   rA  c                 C   s*   t t t | t | }t | |S r=  )rU  r   rD   r,   rg   r   )rA  Ztrunc_xr3  r3  r4  rE     s   rE   c                 C   s0   t | tsJ tt| jdd  t| S )Nc                   S      dS )Nz#imag only supports complex tensors.r3  r3  r3  r3  r4  rD        zimag.<locals>.<lambda>)	r8  r"   rU  rV  r\  r  r  r  r   rj  r3  r3  r4  r     s
   
r   )rd  c                 C   s0   t | jst | jrt| S t| tjdS )Nr  )	r\  is_float_dtyper  r  r  rM   r!  rU  boolrj  r3  r3  r4  rM     s   
rM   c                 C   sZ   t | jrttt| tt| S t | jr%t	| t
dkS tj| tjdS )Ninfr  )r\  r  r  rU  r   rN   r   r   r  r,   floatr&  r  rj  r3  r3  r4  rN     s
    rN   c                    F   t t j  fdd t jr tdkS t j t jdS )Nc                         d j  S )Nz7Complex dtype is not supported for isposinf, got dtype r  r3  rj  r3  r4  rD        zisposinf.<locals>.<lambda>r  r  	rU  rV  r\  r  r  r  r  r&  r  rj  r3  rj  r4  rO        
rO   c                    r  )Nc                      r  )Nz7Complex dtype is not supported for isneginf, got dtype r  r3  rj  r3  r4  rD    r  zisneginf.<locals>.<lambda>z-infr  r  rj  r3  rj  r4  rP     r  rP   c                 C   s   t | | S r=  r  r   rj  r3  r3  r4  rQ     r  rQ   r\   c                 C   s*   t | jrt| dkS tj| tjdS )Nr   r  )r\  r  r  rU  r   r!  r  rj  r3  r3  r4  rR     s   rR   c                 C   r  r=  )r  Z	bessel_i0rj  r3  r3  r4  rS        
rS   c                 C   r  r=  )r  rU   rj  r3  r3  r4  rU     r  rU   c                 C   r  r=  )r  rV   rj  r3  r3  r4  rV     r  rV   c                 C   r  r=  )r  rW   rj  r3  r3  r4  rW     r  rW   c                 C   r  r=  )r  rX   rj  r3  r3  r4  rX     r  rX   c                 C   r  r=  )r  rY   rj  r3  r3  r4  rY      r  rY   dimr  c                 C   s6   |p| j }t|}t| |}t|t||dd |S )NTkeepdim)r  r\  get_computation_dtyper&   r   )rk  r  r  result_dtypecomputation_dtypea_r3  r3  r4  r[   &  s   


r[   selfr  r  c                 C   s   t |ts|f}|  dkrtt| || S tjt| |dd}t	||
 tdkd}|r6|nt||}tt| | ||}| |S )Nr   Tr  r  )r8  r   numelrU  r   r>   rV   r   r   r   r,   r  r   rs   )r  r  r  ZmaxesZmaxes_squeezedresultr3  r3  r4  r   2  s   
	r           nanposinfneginfc                 C   s   t | tsJ t| jst| jr|  S |d u rd}|d u r(t| jj	}|d u r3t| jj
}tt| || }tt| ||}tt| ||}|S )Nr  )r8  r"   r\  is_boolean_dtyper  is_integer_dtyper   rU  finforQ  minr   rQ   rP   rO   )rk  r  r  r  r  r3  r3  r4  r_   F  s   r_   c                 C   s   t | jt judd  d S )Nc                   S   r  )NzNegation, the `-` operator, on a bool tensor is not supported. If you are trying to invert a mask, use the `~` or `logical_not()` operator instead.r3  r3  r3  r3  r4  rD  e     z_neg_meta.<locals>.<lambda>)rU  rV  r  r  rj  r3  r3  r4  	_neg_metab  s   
r  )re  c                 C   r  r=  )r  r`   rj  r3  r3  r4  r`   m  r  r`   c                 C   s*   t | tsJ | jtju rd}t|| S )Nz'positive does not support bool tensors.)r8  r"   r  rU  r  r]  )rk  r  r3  r3  r4  ra   v  s
   ra   c                 C   s(   t | tsJ t| jrt| S | S r=  )r8  r"   r\  r  r  r  r   rj  r3  r3  r4  r     s   
r   c                 C   r  r=  )r  rc   rj  r3  r3  r4  rc     r  rc   rj  )decimalsr  c                C   s>   |dkr	t | S d| }d|  }t t t | ||S )Nr   
   )r  rd   r   )rk  r  Zten_powZten_neg_powr3  r3  r4  rd     s
   

rd   c                 C   r  r=  )r  r   rj  r3  r3  r4  r     r  r   c                 C   s   t dtdtt| S )NrE  )r   rs   r>   r`   rj  r3  r3  r4  re     s   re   c                 C   s2   t | jr|  }t|dkd| | S |  S Nr   )r\  r  r  r,   rU  r   rg   )rk  Za_absr3  r3  r4  rf     s   rf   c                 C   r  r=  )r  rg   rj  r3  r3  r4  rg     r  rg   c                 C   r  r=  )r  rh   rj  r3  r3  r4  rh     r  rh   c                 C   r  r=  )r  ri   rj  r3  r3  r4  ri     r  ri   c                 C   s&   t j|  } t| dkdt| |  S Nr   rE  )mathpirU  r   ri   rj  r3  r3  r4  rj     s   
rj   c                 C   r  r=  )r  rk   rj  r3  r3  r4  rk     r  rk   c                 C   r  r=  )r  rm   rj  r3  r3  r4  rm     r  rm   c                 C   s
   t | | S r=  )r   rj  r3  r3  r4  rn     r  rn   c                 C   r  r=  )r  ro   rj  r3  r3  r4  ro     r  ro   c                 C   r  r=  )r  rp   rj  r3  r3  r4  rp     r  rp   c                 C   r  r=  )r  rr   rj  r3  r3  r4  rr     r  rr   c                    s   | j  tt  fdd |  }tt|dkdd  t|d dkdd  |  }t|d dkd	d  |d d }tt	d
d |D dd  t| 
 d dkdd  t| t dS )Nc                      
   d  S )Nz^view_as_complex is only supported for floating pointtensors, but got a tensor of scalar type: r3  r3  Zinput_dtyper3  r4  rD    s    z!view_as_complex.<locals>.<lambda>r   c                   S   r  )Nz-Input tensor must have one or more dimensionsr3  r3  r3  r3  r4  rD    r  rJ     c                   S   r  )Nz+Tensor must have a last dimension of size 2r3  r3  r3  r3  r4  rD     r  rE  c                   S   r  )Nz/Tensor must have a last dimension with stride 1r3  r3  r3  r3  r4  rD    r  c                 s   s    | ]	}|d  dkV  qdS )r  r   Nr3  )r@  strider3  r3  r4  rB  
  s    z"view_as_complex.<locals>.<genexpr>c                   S   r  )NzCTensor must have a stride divisible by 2 for all but last dimensionr3  r3  r3  r3  r4  rD    r  c                   S   r  )Nz0Tensor must have a storage_offset divisible by 2r3  r3  r3  r3  r4  rD    r  )r  rU  rV  r\  r  sizerG  r  builtinsr   storage_offsetr  Zview_element_typecorresponding_complex_dtyper   )r  sizesZold_stridesdimsr3  r  r4  r	    sB   




r	  c           	   	      s$   dt f fdd}|S )Nrh  c                    s   d u r j t tdddtttf dtttf dtf fdd}r1t |}|_ tu r>t	 d urJrJt
| |S )Nrk  brl  rk  r  rg  c                    s   t p	t| t  fdd t pt|t  fdd t p.t| to-t|t  fdd t| |\} }| |}t| |g|S )Nc                      
     dS )Nzc: Received a lhs Python scalar to an elementwise binary operation that does not accept lhs scalars!r3  r3  r  r3  r4  rD  0     
 zQ_make_elementwise_binary_reference.<locals>.inner.<locals>._ref.<locals>.<lambda>c                      r  )Nzc: Received a rhs Python scalar to an elementwise binary operation that does not accept rhs scalars!r3  r3  r  r3  r4  rD  5  r  c                      r  )Nz?: Receive two Number inputs to an elementwise binary operation!r3  r3  r  r3  r4  rD  ;  r  )rU  _check_valuer8  r   rb  r:  )rk  r  r9  )r  rh  supports_lhs_python_scalarsupports_rhs_python_scalarsupports_two_python_scalarsr3  r4  rn  %  s    	



z?_make_elementwise_binary_reference.<locals>.inner.<locals>._ref)rq  r   r)   r   Tensorr   r+   ro  r\  rp  rc  rr  rd  has_outr  should_register_decompositionr  r  r  rm  rt  r4  ru     s,   


z1_make_elementwise_binary_reference.<locals>.innerrv  )	rm  rd  r  r  r  r  r  r  ru  r3  r  r4  "_make_elementwise_binary_reference  s    
,r  r  alphar  r  c                C   s   t | |\} }|durFt| tr| jn|j}t|}|tkr6tt||s6dt| d| d}t	|t|trBt
||}n|| }t
| |}t| |g|S )z/
    Reference implementation of torch.add
    Nalpha argument of type r  r[  )rb  r8  r"   r  r\  r   r  r   r0  rT  r  r   rs   r:  rk  r  r  r  r  r  r9  r3  r3  r4  rs   P  s   

rs   )rm  r  r  c                 C      t | |S r=  )r  rt   r  r3  r3  r4  rt   s     rt   )rm  c                 C   r  r=  )r  ru   r  r3  r3  r4  ru   |     ru   c                 C   r  r=  )r  Z
shift_leftr  r3  r3  r4  rv     r  rv   c                 C   r  r=  )r  rw   r  r3  r3  r4  rw     r  rw   c                 C   r  r=  )r  Zshift_right_arithmeticr  r3  r3  r4  rx     r  rx   c                 C   r  r=  )r  ry   r  r3  r3  r4  ry     r  ry   )rm  r  c                 C   s   t |trt | trt|| j| jd}nt | tr3t |tr3| j|jkr3d| j d|j d}t|tt|t	t
| t
| S )Nr  r2  /Expected divisor (b) to be on the same device (&) as dividend (a), but it is found on r[  )r8  r   r  r#  r  r2  r]  r   rh   r`   r,   rk  r  r  r3  r3  r4  r|     s    r|   )rounding_moder  c                C   sJ   |du r	t | |S |dkrt| |S |dkrt| |S d| d}t|)z/
    Reference implementation of torch.div
    Nrr   rD   zLdiv expected rounding_mode to be one of None, 'trunc', or 'floor' but found .)r   r   r   rT  )rk  r  r  r  r3  r3  r4  r}     s   


r}   c                 C   r  r=  )r  r~   r  r3  r3  r4  r~        r~   c                 C   s   t | tst |tsJ t |tr+|dkr|  S |dkr!| |  S |dkr*t| S n$t | trO| dkr:t|dS | dkrOt|j	sJt
|j	rOt|S t| |S )N      ?g       @      ?T)r8  r#   r   r   rU  rm   rB   r\  r  r  r  rA   r  r   r  r3  r3  r4  r     s&   





r   c                 C   sx   t | trt |trtdt| |}|d usJ t|r#tj}ntj}t	| |} t	||}t
| |\} }t| |S )Nz=Receive two Number inputs to an elementwise binary operation!)r8  r   rT  r\  Zget_higher_dtyper  rU  Z
complex128float64r&   rb  r   rk  r  r  r3  r3  r4  r     s   



r   )rm  r  r  c                    s2  t | trt |trt| } t|}nWt |tr't | tr't|| j| jd}nCt | tr;t |tr;t| |j|jd} n/t | trjt |trj| j|jkrj| jtdkrbd| j d|j d}t|tj	|| jd}t | trtt |tsvJ | j t
 rt| |S t
 rt| |S td fdd	 d S )
Nr  cpur  r  r[  r1  Fc                      r  )Nz not supported for floor_divider3  r3  r  r3  r4  rD  A  r  zfloor_divide.<locals>.<lambda>)r8  r   r#  r  r  r2  rU  r]  r  Z
device_putr\  r  _floor_divide_floatr  _floor_divide_integerrV  r  r3  r  r4  r   #  s&   	
 



r   c                 C   s`   t | |\} }| jjst| |S t| t|kt| |dk}t| |t	|| j S r  )
rb  r  	is_signedr  r}   rU  rh   r   r   r&   )rk  r  offsetr3  r3  r4  r  D  s
   &r  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   rE  r  r  )r   r   r   ry   r   r   ru   r   rD   r   rs   r#  r  r2  r|   )
rk  r  modr}   Zdifferent_signed_inputsZnon_zero_remaindermaskZ	floor_divZ	basic_divZzero_tensorr3  r3  r4  r  O  s   



r  c                 C   r  r=  )r  r   r  r3  r3  r4  r   h  r  r   c                 C   r  r=  )r  r   r  r3  r3  r4  r   q  r  r   c                 C   r  r=  )r  r   r  r3  r3  r4  r   z  r  r   Zmantissaexponentc                 C   s   t jt| S r=  )rU  Zreturn_typesfrexpr  r  r3  r3  r4  r    s   r  c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   valuesc                 C   sF   t | d}t t | dt | }t |dd}t |||}|S r  )rU  r~   r   r   rQ   r   )r  r  Zinput_eq_zeroZinput_lt_zeroZzeros_and_onesr9  r3  r3  r4  r     s
   r   c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   r  rtolatolc                    sX   t  jjk fdd t dkfdd t dkfdd d S )Nc                      s    d j  dj  dS )Nz4: Attempting to compare tensors of different dtypes  and r[  r  r3  )rk  r  r  r3  r4  rD        z#_check_close_args.<locals>.<lambda>r   c                      s     d dS )Nz6: rtol must be greater than or equal to zero, but got r[  r3  r3  )r  r  r3  r4  rD        c                      s    d  dS )Nz6: atol must be greater than or equal to zero, but got r[  r3  r3  )r  r  r3  r4  rD    r  )rU  r  r  rV  r  rk  r  r  r  r3  )rk  r  r  r  r  r4  _check_close_args  s   
r  h㈵>:0yE>	equal_nanc           	      C   s   t d| |||d t| |}|r(t| jst| jr(t|tt| t|}|dkr2|dkr2|S t| jsNt| jsNt	
| t } t	
|t }t|tt||}tt| |}t|tt|t||}|S )Nztorch.iscloser  r   )r  r~   r\  r  r  r  r   r   rQ   r  convert_element_typerU  get_default_dtypers   r,   r   r   rM   r   )	rk  r  r  r  r  closeZallowed_errorZactual_errorr  r3  r3  r4  r     s   
r   c                 C   s~   | j }|tjtjfv }|rt| tj} t|tj}t| |}t|dkd|}t	t
| || }|s9|S t||S r  )r  rU  Zint8Zint16r  r  int32r   r   r,   r}   )rk  r  r  Zpromote_to_intgresr3  r3  r4  r     s   r   c                 C   r  r=  )r  r   r  r3  r3  r4  r      r  r   c           
      C   s  t | t |k}t || |}t ||| }t t t t | t | t |k}t| js;t|jrxt |dk }t ||t 	t 
|t 
| }t |||t t 
||  }t |}	t |	ttdtd|S t || |t t 
||  S )Nr   r  )rU  r   r   r   r   rM   r\  r  r  rV   r>   rW   rQ   complexr  )
rk  r  r  max_min_inf_maskZneg_min_maskZinf_valsZnon_nan_valsZnan_maskr3  r3  r4  r   (  s"   &
"r   c                 C   s   t t| jpt|j dd  | |k}t || |}t ||| }t t | | |k}dt	d }|t 
t || |  }t || |S )Nc                   S   r  )Nz)logaddexp2 doesn't support complex dtypesr3  r3  r3  r3  r4  rD  M  r  zlogaddexp2.<locals>.<lambda>r  r  )rU  rV  r\  r  r  r   r   rN   r  rV   rW   rA   )rk  r  r  r
  r  r  Z	inv_log_2r  r3  r3  r4  r   E  s   r   c                 C   s0   t | js
| dk} t |js|dk}| |@ S r  r\  r  r  r  r3  r3  r4  r   Y  
   r   c                 C   s   t | js
| dkS |  S r  r  rj  r3  r3  r4  r   d  s   r   c                 C   s2   t | js
| dk} t |js|dk}t| |S r  )r\  r  r  rw   r  r3  r3  r4  r   k  s
   
r   c                 C   s0   t | js
| dk} t |js|dk}| |A S r  r  r  r3  r3  r4  r   w  r  r   c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   )rm  r  c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   c                 C   r  r=  r  r  r3  r3  r4  r     r  r   c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   c                 C   r  r=  )r  r   r  r3  r3  r4  r     r  r   rE  c                 C   s&   t | trd}t|tj|| |dS )Nz?Received a Number for the first argument, but expected a Tensorr  )r8  r   rT  rU  r   )rk  r  r  r  r3  r3  r4  r     s   
r   c                C   s   t | |\} }t| tr%t|tr%tt| j o t|j dd  |dkrat| tr1| jn|j}t|}t	t
||sPdt
| d| d}t|t|tjr]t||}n|| }t| |}t| |g|S )z/
    Reference implementation of torch.sub
    c                   S   r  )NzwSubtraction, the `-` operator, with two bool tensors is not supported. Use the `^` or `logical_xor()` operator instead.r3  r3  r3  r3  r4  rD    r  zsub.<locals>.<lambda>rE  r  r  r[  )rb  r8  r"   rU  rV  r\  r  r  r   r   r0  rT  r  r  r   r   r:  r  r3  r3  r4  r     s"   
r   r   )rm  r  rd  r  c                 C   r  r=  )r  r}   r  r3  r3  r4  r     s   c              
   C   s   t t| tpt|tdd  t|tr$t| tr$t| |j|jd} nt| tr7t|tr7t|| j| jd}t| ts>J t|tsEJ t t 	| ddt 
| t |}t t |td|S )Nc                   S   r  )Nz/Expected either argument a or b to be a Tensor"r3  r3  r3  r3  r4  rD  	  r  zxlogy.<locals>.<lambda>r  r   r  )rU  rV  r8  r"   r   r#  r  r2  r   r~   r   rV   rQ   r  )rk  r  rhsr3  r3  r4  r      s   $r   )rm  rd  r  c                 C   s0   t | }t |rt| |S tt| |S r=  )r\  Z	get_dtyper  r  r}   rr   r  r3  r3  r4  r     s   

r   )r  tensor1tensor2r  r  r  c                   sJ   dur| j }t| ttt  fdd | | |  S )z3
    Reference implementation of torch.addcdiv
    Nc                         dt  d  dS r  r/  r3  r  r  r3  r4  rD  B      zaddcdiv.<locals>.<lambda>r  r\  r   rU  r  r   r0  r  r  r  r  r  r3  r  r4  r   -     
r   c                   sJ   dur| j }t| ttt  fdd | | |  S )z3
    Reference implementation of torch.addcmul
    Nc                      r  r  r/  r3  r  r3  r4  rD  ]  r  zaddcmul.<locals>.<lambda>r  r  r3  r  r4  r   H  r  r   )rk  r  rQ  r  rQ  c                 C   s   |d u r|d u rd}t ||d ur(t| }tt| ||}t|| |} |d urBt| }tt| ||}t|| |} | S )Nz+clamp called but both min and max are none!)rT  rU  rQ   rw   r   r   r   )rk  r  rQ  r  Za_isnan	conditionr3  r3  r4  r   c  s   

r   c                 C      t j| |dS )N)r  rU  r   )r  r  r3  r3  r4  rz        rz   c                 C   r  )N)rQ  r  )r  rQ  r3  r3  r4  r{     r  r{   predc                    sb   |du s|du r
t tj ||dd t jtju  fdd t ||\ }}t	 ||S ) NTallow_cpu_scalar_tensorsc                      r  )Nz#expected predicate to be bool, got r  r3  r  r3  r4  rD    r  zwhere.<locals>.<lambda>)
NotImplementedErrorr\  check_same_devicerU  rV  r  r  rb  r  r   )r  rk  r  r3  r!  r4  r     s   

r   memory_formatr%  c                C   s   t j| |d}|S Nr$  )r  r   )rk  r%  r  r3  r3  r4  r     s   r   )allow_cross_devicec                C   s:   |s| j |j krd|j  d| j  d}t|t| |S )NzAttempting to copy from device z to device z*, but cross-device copies are not allowed!)r2  r]  r  r   )rk  r  r'  r  r3  r3  r4  r     s   r   c                 C   s>   |   dkrd|    d}t|t| j}|t| S )NrE  zCan't convert a tensor with z elements to a number!)r  rT  r\  r   r  r  r   )rk  r  number_typer3  r3  r4  r     s
   r   r2  copylayout
pin_memorynon_blockingc                 C   s\   | o-|d u p| j |ko-|d u p| j|ko-|d u p| j|ko-|d u p-|tjkp-tj| |dS r&  )r2  r  r*  rU  preserve_formatr\  is_contiguous_for_memory_format)rk  r2  r  r)  r*  r%  r+  r,  r3  r3  r4  _to_will_alias  s   r/  c                  O   s   t r=  )r"  rx  r3  r3  r4  _to_dispatch     r0  c                 C   s   | ||||d}|S N)r2  r  r,  r)  r%  r3  r2  r  r,  r)  r%  ry  r3  r3  r4  
_to_device  s   	r4  c                 C   s   t | ||||d}|S r2  )rU  r2  r3  r3  r3  r4  _to_device_str  s   	r5  c                 C   s   | |||d}|S )N)r  r,  r)  r%  r3  )r  r,  r)  r%  ry  r3  r3  r4  	_to_dtype  s   r6  otherc                 C   s(   | j }| j}| j}||||||d}|S )N)r2  r  r*  r,  r)  r%  )r2  r  r*  )r7  r,  r)  r%  r2  r  r*  ry  r3  r3  r4  	_to_other)  s   r8  	to_kwargsc                 C   s   g d}d|v rt |d trt|d |d< |D ];}||v rU|dkr+|| tju sP|dkrF|| j| jjkrF|| jrP|| j| jjksPt| |d || krU|| qd S )N)r  r2  r*  r%  r2  r%  )	r8  r^  rU  r2  r-  r0  indexr  pop)rk  r9  Zoptions_to_checkkwr3  r3  r4  _canonicalize_to_argumentsA  s   
r=  c                 O   s   t |dkrt|i |}d|vsJ t| | t| fi |r"| S d|v r+|dnd}d|v r6|dnd}|sD|d| j| jkr]|s]d|vr]d|vr]d	|vr]t| |d| jS t	j
| fi |}t||  |S )
Nr   r+  r)  Fr,  r  r%  r2  r*  )rG  r0  r=  r/  r;  getr  r  r  rU  r  r   )rk  ra  ry  r)  r,  r  r3  r3  r4  r   Y  s(   

r   )has_identityaccepts_dim_tupler  keepdimsr  r  rh  r?  r@  r  rA  r  output_dtype_kindc                   s  t  tsJ  jdkrtd j d|d ur-t |ts J |d ur-||jkr-td|s:d u s:t ts:J t trBft j|sb jdkp[t	
 fddD }	|	sbtdt ||\}
}t |
 | }|r fd	d
t jD }fdd
t jD }t|||}|d ur|d usJ |d ur||jkrtdt||j}t||dS |j|kr|d urt||}|S )N@   zReceived a tensor with z? dimensions, but only tensors with up to 64 dims are supported!z4dtype argument and out dtype must match in reductionr   c                 3       | ]} j | V  qd S r=  rH  r@  irj  r3  r4  rB    r`  z_reduction.<locals>.<genexpr>zJreducing over zero-size dimension for reduction operation without identityc                    s"   g | ]}|vr j | nd qS rE  rE  rF  rk  r  r3  r4  
<listcomp>  s   " z_reduction.<locals>.<listcomp>c                    s   g | ]}| vr|qS r3  r3  rF  )r  r3  r4  rJ        z7Expected the dtype of reduction result and out to matchZ	copy_fromr   )r8  r"   ndimr]  r  r   r\  reduction_dimsrH  r  r   reduction_dtypesr&   rS  r  broadcast_in_dimr'   r(   r  )rk  rh  r?  r@  r  rA  r  r  rB  Zvalid_shaper  r  r  Zoutput_shapebroadcast_dimsr3  rI  r4  
_reduction  sV   


"

rR  c                    sp   t t j}t  di }t | t dd fdd
} j d}||_|j| tt t|| |S )zk
    Given a view function (e.g. torch.diagonal) generates its copy variant (e.g. torch.diagonal_copy)
    __annotations__Nr  c                    s.    |d| i|}| d ur|S t dd |S )Nr  c                 S   s   | j tjdS r&  )r   rU  contiguous_formatrC  r3  r3  r4  rD        z3_make_copy_from_view.<locals>._fn.<locals>.<lambda>)pytreeZtree_map)r  ra  ry  r  rz  r3  r4  r|    s   z!_make_copy_from_view.<locals>._fnZ_copy)r  r  rq  r+   r   rS  updaterc  )r{  Zaten_fnannotationsr|  Z	copy_namer3  rz  r4  _make_copy_from_view  s   

rZ  c                 C   s:   t t jt | ||d}| jt jkr|jt jd}|S )Nr  r  )rU  r   r   r  uint8r   )rk  r  r  r  r3  r3  r4  r     s   r   c                 C   sb   t | tj}t|ttfrt|dkr| }n
|j||d	d}| j
tju r/t|tjS |S )Nr   )r  r  F)r&   rU  r  r8  listrO  rG  r   r   r   r  r[  r  r  )rk  r  r  r  r  r3  r3  r4  r     s   
r   )r  r  c             	   C   l   |d u r|d ur|j }nt| j st| j rtj}n| j }|dks'|g kr)d }t| tj||||t	j
dS Nr3  r  rA  r  r  rB  )r  r\  r  r  rU  int64rR  r  r   r   SAMErk  r  r  r  r  r3  r3  r4  r     "   	r   c                    s   t jddtt  j fdd t  jr)tdkr)t	 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 ""rE  r3  rk  rH  r3  r4  rD  !	  s    zsum_to_size.<locals>.<lambda>r   c                 3   s2    | ]}|  d kr j | d kr|V  qdS rE  NrE  rF  rk  Zleading_dimsrH  r3  r4  rB  (	  s    zsum_to_size.<locals>.<genexpr>T)r  r  r  )r\  extract_shape_from_varargsrU  rV  Zis_expandable_torH  Zis_same_shaperG  r  view_ofrM  rO  rS  r   )rk  rH  reduce_dimsr3  ri  r4  r   	  s   

r   c             	   C   r]  r^  )r  r\  r  r  rU  r`  rR  r  r   r   ra  rb  r3  r3  r4  r   0	  rc  r   rT  c             
   C   0   |dks|g kr
d }t | tj||d |dtjdS Nr3  Fr  rA  r  r  r?  rB  )rR  r  r   r   ra  rk  r  r  r  r3  r3  r4  r   N	     	r   c             
   C   rm  rn  )rR  r  r   r   ra  rp  r3  r3  r4  r   f	  rq  r   c                 C   s"   |d u rt | tr| }d } | |fS r=  )r8  r  )r  unbiasedr3  r3  r4  _dim_var_dispatch~	  s   rs  
correctionrr  ru  c             
   C   sV   t ||\}}t||}|dks|g krd }t| ttj|d||d d dtjd}|S )Nr3  rt  Tro  )	rs  r\  set_correctionrR  r   r  r   r   COMPLEX_TO_FLOAT)rk  r  rr  r  ru  r  r3  r3  r4  r   	  s   

r   c          	      C   sh   t ||\}}t||}t| tj\}}t| |} tj| |||d}t	|}|d us/J t||S N)ru  r  )
rs  r\  rv  rO  r   rw  r&   rU  r   rm   )	rk  r  rr  r  ru  opmath_dtyper  a_vara_stdr3  r3  r4  r   	  s   



r   c          	   	      s  |dks|g kr
d }d u r j t tj||d tjd}tt	p+t
fdd t|tr;|f}t j|} jdkrIdnttj fdd|D d}t||}d u rc j n}t||}|d urt|tsuJ t||j}t||d	S |S )
Nr3  r_  c                      s   dd u rdnd d  S )Nz&mean(): could not infer output dtype. ZInputr   z> dtype must be either a floating point or complex dtype. Got: r3  r3  )r  
orig_dtyper3  r4  rD  	  s
   zmean.<locals>.<lambda>r   rE  c                 3   rD  r=  rE  rF  rj  r3  r4  rB  	  r`  zmean.<locals>.<genexpr>rL  )r  rR  r  r   r   ZKEEP_PROMOTED_TYPErU  rV  r\  r  r  r8  r   rN  rH  rM  r   operatorr   r   r&   r"   r'   r(   )	rk  r  r  r  r  r  r  Znelemr  r3  )rk  r  r|  r4  r   	  s<   
	
*

r   Zout0Zout1)rr  r  ru  c                C   s|   t ||\}}t||}t| tj\}}| j}t| |} tj	| |||d\}}	t
|}
|d us4J t|
|t|	|fS rx  )rs  r\  rv  rO  r   rw  r  r&   rU  r   rm   )rk  r  rr  r  ru  ry  r  Zoriginal_dtyperz  Za_meanr{  r3  r3  r4  r   	  s   


r   c                C   s4   t ||\}}t| ||||d}t| ||}||fS )Nrt  )rs  r   r   )rk  r  rr  r  ru  vmr3  r3  r4  r   
  s   
r   )r  vec1vec2)betar  r  r  r  c                   s  t jdkfdd t jdkfdd  dfdffD ]#\}t|trEt tjo>tjo>tjfdd q"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 S t dS t t
ttjfdd t t
t tj fdd dkrˈ t  S   t   S )NrE  c                         d j  dS )Nz*addr: Expected 1-D argument vec1, but got -DrM  r3  )r  r3  r4  rD  $
  rV  zaddr.<locals>.<lambda>c                      r  )Nz*addr: Expected 1-D argument vec2, but got r  r  r3  )r  r3  r4  rD  (
  rV  r  r  c                         d  dS )NzBoolean z$ only supported for Boolean results.r3  r3  )arg_namer3  r4  rD  0
  r  r   c                         dt   S )Nzexpected bool/int beta but got r/  r3  r  r3  r4  rD  7
  rV  c                      r  )Nz expected bool/int alpha but got r/  r3  r  r3  r4  rD  ;
  rV  Fc                         dt   dj S Nzcannot safely convert z to r0  r  r3  )r  r  r3  r4  rD  G
  r  c                      r  r  r  r3  )r  r  r3  r4  rD  K
  r  )rU  rV  rM  r8  r  r\  r  r  r   rH  r   r0  intouterr  r   r   )r  r  r  r  r  argr3  )r  r  r  r  r  r  r4  r   
  s^   








r   r  ra  .c                 G   s^   |st | tjjr| }nt | tjjrJ | f| }tdd |D }t|dkr+|S |d S )z5Reference implementation of :func:`torch.atleast_1d`.c                 s   s(    | ]}|j d kr|nt|dV  qdS )rE  r   N)rM  r  r@  rk  r3  r3  r4  rB  ^
  s   & zatleast_1d.<locals>.<genexpr>rE  r   )r8  collectionsabcr   rO  rG  r  ra  args_r  r3  r3  r4  r   U
  s   
r   at_least_fnc                 C   s    | |}t |tsJ t||S r=  )r8  r"   r  )r  r  r  Zarg_r3  r3  r4  _unsqueeze_atleastd
  s   
r  c                    sn   |st | tjjr| }nt | tjjrJ | f| }tttd t fdd|D }t|dkr3|S |d S )z5Reference implementation of :func:`torch.atleast_2d`.r   c                 3   &    | ]}|j d kr|n |V  qdS )r  Nr  r  Zunsqueeze_atleast_1dr3  r4  rB  w
     $ zatleast_2d.<locals>.<genexpr>rE  )	r8  r  r  r   r   r  r   rO  rG  r  r3  r  r4  r   m
     
r   c                    sn   |st | tjjr| }nt | tjjrJ | f| }tttd t fdd|D }t|dkr3|S |d S )z5Reference implementation of :func:`torch.atleast_3d`.rJ  c                 3   r  )   Nr  r  Zunsqueeze_atleast_2dr3  r4  rB  
  r  zatleast_3d.<locals>.<genexpr>rE  r   )	r8  r  r  r   r   r  r   rO  rG  r  r3  r  r4  r   |
  r  r   r  r  r  c                 C   s$   |d ur|n|   }t| |||S r=  )r  r  r   )rk  r  r  r  storage_offset_intr3  r3  r4  r   
  s   r   srcc                 C   s"   |d u rdn|}t | ||||S r  )r  r   )r  r  r  r  r  r  r3  r3  r4  r   
  s   	r   c                  G   s   t t|  S r=  )rU  SizerX  )rW  r3  r3  r4  r   
  r}  r   c                  G   s4   t | dkrt| d ts| d } tt| ddiS )NrE  r   rY  F)rG  r8  r  r\  rb  tensorsr3  r3  r4  r   
  s   r   c                 C   s8   t |t | j }tt|t | j| }t| ||S r=  )rG  rH  rO  rS  r  rP  )rk  r  startr  r3  r3  r4  r   
  s   r   r  r  c           
         s  dd }t | dkrd}t|| D ]	}t|tsJ qtj| ddi ddlm} d  t| D ]%\ d u r@j	dkr? q0j	dkrUt
j	 j	k fd	d
 q0 d u r^| d   j}g }t| D ];\}t |t |jkr|j	dks{J t
||jd dk fdd
 qg|j	dkr||jd dkrqg|| qg|| }t |dkr| d zttdd | D }	W n ty   d}	Y nw tdjj|	|dS t|d j	|}t|d j	| t||j|dS )Nc                 S   sX   d }| D ]}t |}|tjkr|  S |d ur!||kr!tj  S |}q|d us*J |S r=  )r\  suggest_memory_formatrU  rU  )inputsformatr   fr3  r3  r4   cat_compute_output_memory_format
  s   


z-cat.<locals>.cat_compute_output_memory_formatr   z3cat expects at least one tensor, but received zero!r   Fr;  rE  c                      s   d j  dj  d dS )N6Number of dimensions of tensors must match.  Expected z-D tensors, but got z-D for tensor number  in the listr  r3  )examplerG  r   r3  r4  rD  
  s    zcat.<locals>.<lambda>c                      s   d j  d dS )Nr  z*-D tensors, but got 1-D for tensor number r  r  r3  )r  
tensor_idxr3  r4  rD  	  s
    c                 s       | ]}|j V  qd S r=  )requires_gradr?  r3  r3  r4  rB         zcat.<locals>.<genexpr>r   r  r2  r  r%  r$  )rG  rT  r8  r"   r\  r#  rN  r<  rR  rM  rU  rV  rH  r  r  r   	Exceptionr  r  r2  canonicalize_dimZvalidate_idxr  r   r   )
r  r  r  r  tensorr<  rH  filteredr%  r  r3  )r  rG  r   r  r4  r   
  sh   


r   c                 C   s   t dd | D }t|dS )Nc                 s   s0    | ]}|j d kr|n|| d fV  qdS rh  )rM  r   r  r?  r3  r3  r4  rB  5  s     
zcolumn_stack.<locals>.<genexpr>rE  )rO  r   r  Zaligned_tensorsr3  r3  r4  r   3  s   
r   c                 C   s*   t | js| S | jrt| S t| S r=  )r\  r  r  Z	is_sparserU  r5   r  r   r  r3  r3  r4  r   ;  s
   

r   padc           
   	      sR  t td dkfdd | jttd }| t |kfdd | }tD ]9 d  d   dk rV|   |j    }d  dk rn| d|j  d   }q5tdd D r}| S t	d  }t|D ]1 t d d       d   }t |dk fd	d |
| qt| }t j|| j| j| j|d
}|dkr| jt jkrd}t ||}|}	tD ]: d  d   dkr|	  |	j    }	d  dkr |	 d|	j  d   }	qt|	| |S )Nr  r   c                      r  )Nz1Length of pad must be even but instead it equals rF  r3  )r  r3  r4  rD  K  rV  z!constant_pad_nd.<locals>.<lambda>c                      r  )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.rF  r3  )l_inpr  r3  r4  rD  V  s
    rE  c                 s   s    | ]}|d k V  qdS )r   Nr3  )r@  pr3  r3  r4  rB  m  rI  z"constant_pad_nd.<locals>.<genexpr>c                	      s6   d    d  dd   d   d	S )NzThe input size z, plus negative padding r  rE  zG resulted in a negative output size, which is invalid. Check dimension z of your input.r3  r3  )rG  input_sizesl_diffr  pad_idxr3  r4  rD  w  s    
r  F)rU  rV  rG  rH  rS  r   r  r   r   r\  r  r\  r  r  r  r2  r  r  rB   r  r   )
r  r  r  Zl_padZc_input	new_shapeZnew_dimr%  r9  Zc_outputr3  )rG  r  r  r  r  r  r4  r   D  sl   
"  
 r   c                C   s6   t |t jkdd  tj| |dr| S t j| |dS )Nc                   S   r  )Nz@preserve memory format is unsupported by the contiguous operatorr3  r3  r3  r3  r4  rD    r  zcontiguous.<locals>.<lambda>r$  )rU  rV  r-  r\  r.  r   )rk  r%  r3  r3  r4  r     s   r   c                 C   s*   t t| dkdd  t|  }t|dS )Nr   c                   S   r  )Nz%dstack expects a non-empty TensorListr3  r3  r3  r3  r4  rD    r  zdstack.<locals>.<lambda>r  )rU  rV  rG  r   r   r  r3  r3  r4  r        
r   c              	      s   ddl m} t|dkrt|d trt|d }tt|t| jkdd  t|t| j }t	|}t
| jD ].\} || }|| }t|| kpW| dkpW|dk fdd |dkrd|n ||< q:t| t| |tt|t| j| S )Nr   r;  rE  c                   S   r  )Nz3expand: the requested shape has too few dimensions!r3  r3  r3  r3  r4  rD    r  zexpand.<locals>.<lambda>rJ  c                      r  )Nz3expand: attempting to expand a dimension of length r[  r3  r3  rC  r3  r4  rD    r  )rN  r<  rG  r8  r   rO  rU  rV  rH  r\  rR  r\  validate_shaper  rP  rS  )rk  rH  r<  r  shape_rM  Z
offset_idxZrequested_lengthr3  rC  r4  r     s0   


r   c                 C   s   |  |jS r=  )r   rH  r  r3  r3  r4  r     s   r   chunksc                    s   |dkrd| d}t |t j j }t|| t| }| } fddt|D }|dkrI|	t
 | | t|S )Nr   z%Expected at least one chunk, but got r[  c                    s   g | ]}t  | qS r3  )r   rF  rk  
chunk_sizer  r3  r4  rJ    s    zchunk.<locals>.<listcomp>)rT  r\  r  rM  rH  r  r4   rD   rS  r  r   rO  )rk  r  r  r  lengthZfull_chunksZtail_chunk_sizer  r3  r  r4  r     s   
r   rJ  	start_dimend_dimc                 C   sh   t | j|}t | j|}||kr| jdkr| S t| ||\}}|d ur-t| ||S t| ||S r  )r\  r  rM  r  _collapse_view_helperZcollapse_viewZcollapse)rk  r  r  r  _new_stridesr3  r3  r4  r     s   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)
r8  rO  r\  rT  r\  canonicalize_dimsrM  Zvalidate_no_repeating_dimsr  revrI  r3  r3  r4  r      s
   
r   c                 C      | j dk r	tdt| dS )Nr  zInput must be >= 2-d.rH  rM  r]  r   rj  r3  r3  r4  r        

r   c                 C   r  )NrE  zInput must be >= 1-d.r  r  rj  r3  r3  r4  r     r  r   r  r  c                    s  t trt dkotjdd   t	t
t|  dkdd  tdkdd  t| j|}| | tt  koM k fdd dk r]  t  k fdd t| j}||< | ||  |  | |  S )Nr   c                   S   r  )Nz'start must be an 0-dim integral Tensor.r3  r3  r3  r3  r4  rD  #  r  znarrow.<locals>.<lambda>c                   S   r  )Nz-narrow() cannot be applied to a 0-dim tensor.r3  r3  r3  r3  r4  rD  '  r  c                   S   r  )Nz&narrow(): length must be non-negative.r3  r3  r3  r3  r4  rD  (  r  c                      s   d   d  d dS )Nz0start out of range (expected to be in range of [, z], but got )r3  r3  )
dim_lengthr  r3  r4  rD  .  r  c                      s   d d d  dS )Nzstart (z) + length (z) exceeds dimension size (z).r3  r3  r  r  r  r3  r4  rD  4  rK  )r8  r"   rU  rV  r  r\  r  r  r   r   r  r  rM  r  _check_with
IndexErrorr\  rH  r   r  r  )rk  r  r  r  r  r3  r  r4  r     s6   




r   	norm_dimsepsc           	      C   sl   t | j|}t | j}t| |}t|tsJ 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  rr  r  )r\  r  rM  r  r  r&   r8  r"   rU  r   r   )	rk  r  r  r  Za_accZ
biased_varr   rstdr  r3  r3  r4  
_normalize=  s   


r  
dimensionsc                 C   s   t |D ]}t| |} q| S r=  )sortedrU  r  )rA  r  r  r3  r3  r4  _unsqueeze_multiple[  s   r  weightbias
batch_sizenum_channelsflattened_inner_size
num_groupsc                    s  t  jdk fdd t | dk fdd ddg}t  || |g}	t|	||\}
}}|
 j}
dgttd j }d }|d urQt	||}d }|d ur\t	||}|d urd|
| }
|d url|
| }
t
|
 j}
t
| j}t
| j}t ||}t ||}|
||fS )Nr  c                      r  )Nz=Expected at least 2 dimensions for input tensor but received r  r3  r  r3  r4  rD  n  r  z#native_group_norm.<locals>.<lambda>r   c                      s   dd j  d  S )NzDExpected number of channels in input to be divisible by num_groups, zbut got input of shape z and num_groups = rE  r3  r  r  r3  r4  rD  r  s    r  )rU  rV  rM  r   r  r  rH  r\  rS  r  r&   r  r   )r  r  r  r  r  r  r  r  rN  Zinput_reshapedr  r   r  rQ  Zunsqueeze_biasZunsqueeze_weightr3  r  r4  r   a  s@   




r   Zout2normalized_shapec                    s  t }t|dkfdd td u pjtkfdd t d u p0 jtk fdd tj|koLjj| d  tkfdd  d ur`  d urh   j| }tt|j}t	||\}}	}
d u r d ur|  }nd ur d u r| }nd ur d ur|   }t
|j}jjdv rt
|	j}	t
|
j}
||	|
fS )NrE  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^  r3  )r  r3  r4  rD    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^  rH  r3  )r  r  r3  r4  rD        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  r3  )r  r  r3  r4  rD    r  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  r3  )r  r  r3  r4  rD    s    )r  Zmtia)rG  rU  rV  rH  rO  rM  r   r\  rS  r  r&   r  r2  r0  )r  r  r  r  r  Znormalized_ndimZaxisrN  r  r   r  r3  )r  r  r  r  r4  r     sJ   	
	




r   c                 O   s   t | S r=  )r   )Z	fake_modefuncra  ry  r3  r3  r4  native_layer_norm_fake  s   r  c                 G   s    t | jt |}t| |S r=  )r\  r  rM  Zextract_dims_from_varargsr  r   )rk  r  _permutationr3  r3  r4  r     s   r   r  maxnormc           	         s  t t|t dd  t |dkdd  t t t dd  t  dk fdd | jt dkfdd t|}tt}||= t	| j
}|| j
krct jj| ||d	|d
}n
t jj| ||d	d}d}t | k ||  d}|| j
krt|| j
}| |  S )Nc                   S   r  )Nzrenorm: p must be real-valuedr3  r3  r3  r3  r4  rD    r  zrenorm.<locals>.<lambda>r   c                   S   r  )Nz'renorm: non-positive norm not supportedr3  r3  r3  r3  r4  rD    r  c                   S   r  )Nz#renorm: maxnorm must be real-valuedr3  r3  r3  r3  r4  rD    r  c                      r  )Nz,renorm: expected maxnorm to be >= 0 but got r3  r3  )r  r3  r4  rD    r  rE  c                      r  )Nz/renorm: input needs at least 2 dimensions, got  dimensionsr3  r3  r  r3  r4  rD    r  T)r  r  r  gHz>r  )rU  rV  r8  r	  rM  r\  r  r\  rS  r  r  linalgvector_normr   r  r  r   )	r  r  r  r  rl  Zacc_typer]   r  Znorm_factorr3  )r  rM  r4  r+    s6   



r+  reflectn_fft
hop_length
win_lengthwindowcenterpad_mode
normalizedonesidedreturn_complexalign_to_windowc                    s$  t d u pjjkfdd t | p|
d u d |d ur$|nd  |d ur.|n|	d u rI pAd uoAtj}t |d n|	}t tjpXtjdd  t dj  koidkn  d	d  j}|dkr|	d
|rdj }d }g t
d|j}t|||g| |d  dt d
  k okn  fdd t  d
k fdd t d
  k oڈkn  fdd t d u pjfkfdd k rd u r
t jjjd d }t| | gjd d|s9|
r9 d }t||g|d urB tj}|d urO|n| }|rWdnd }|rot | dd  t jjd|d}n	t jjd|d}|dd |dkr|d
}|r|S t |S )Nc                         d j  dj   S )NzAstft input and window must be on the same device but got self on  and window on r1  r3  r  r  r3  r4  rD  $     

zstft.<locals>.<lambda>z6stft only supports align_to_window for center = False.   zstft requires the return_complex parameter be given for real inputs, and will further require that return_complex=True in a future PyTorch release.c                   S   r  )Nz:stft expected a tensor of floating point or complex valuesr3  r3  r3  r3  r4  rD  A  r  rE  r  c                   S   r  )Nzstft expected a 1D or 2D tensorr3  r3  r3  r3  r4  rD  C  r  r   r  c                         d  d S )Nzstft expected 0 < n_fft <= z, but got n_fft=r3  r3  )r  r  r3  r4  rD  S  r  c                      r  )Nz0stft expected hop_length > 0 but got hop_length=r3  r3  )hop_length_r3  r4  rD  W  r  c                      r  )Nz9stft expected 0 < win_length <= n_fft but got win_length=r3  r3  )win_length_r3  r4  rD  [  r  c                      s   d  ddj   S )Nz8expected a 1D window tensor of size equal to win_length=r  zbut got window with size rE  r3  )r  r  r3  r4  rD  _  r  r  rJ  )	dimensionr  steporthoc                   S   r  )Nz9Cannot have onesided output if window or input is complexr3  r3  r3  r3  r4  rD  x  r  r  r]   )rU  rV  r2  r*  r\  r  r  r  rM  r  	itertoolsr   rH  r  r  r  r  r   r   r   fftZrfftZ
transpose_Zsqueeze_Zview_as_real)r  r  r  r  r  r  r  r  r  r  r  Zreturn_complex_original_ndimZ
extra_dimsZ
pad_amountZextended_shapeleftZinput_pad_amountZcomplex_fftr]   r  r3  )r  r  r  r  r  r  r4  r,    s   &









r,  c
                    s  t d u pj jk fdd |d ur|n|d }
|d ur#|n|}t t j fdd  d} d}||
|d   }t   dkd	d  t d
 j  ko^dkn   fdd |d urm|n||k}|rt |d
 d |kdd  n
t ||kdd  t d|
  k o|kn  dd  t d|  k o|kn  dd  t d u pj	|fkdd  d u rt
 j}t j|| jd}n}||kr|| d
 }t|||| | fd} j} jd
kr d  dd
 |rdnd }|	rt | dd  t jj d|d n*t d u p*tj dd  |s> jdd|d
 d d t jj d|d  d
|ksQJ  |dd|g }tj||d|fd||
d}tj|d
d||f|d|fd||
d}||dksJ ||dksJ |r|d
 nd}|d ur|| }n|r||d
  }n|}td|| }|jd||d}|jd||d}|| }|d
kr|d}||krtd t|d|| fd}|S )Nc                      r  NzBistft input and window must be on the same device but got self on r  r1  r3  r  r3  r4  rD    r  zistft.<locals>.<lambda>r  c                      s   d j  dj   S r  r1  r3  r  r3  r4  rD    s   rJ  rE  r   c                   S   r  )Nz"istft input tensor cannot be emptyr3  r3  r3  r3  r4  rD    r  r  r  c                      r  )Nz8istft expected a tensor with 2 or 3 dimensions, but got r  r3  r  r3  r4  rD    r  c                   S   r  )Nzistft expected the frequency dimension (3rd to the last) of the input tensor to match n_fft / 2 + 1 when onesided=True, but got {fft_size}r3  r3  r3  r3  r4  rD    r  c                   S   r  )N)zistft expected the frequency dimension (3rd to the last) of the input tensor to match n_fft when onesided=False, but got {fft_size}r3  r3  r3  r3  r4  rD    r  c                   S   r  )Nz+istft expected 0 < hop_length <= win_lengthr3  r3  r3  r3  r4  rD    r  c                   S   r  )Nz&istft expected 0 < win_length <= n_fftr3  r3  r3  r3  r4  rD    r  c                   S   r  )NzDInvalid window shape. window has to be 1D and length of `win_length`r3  r3  r3  r3  r4  rD    r  r  r  c                   S   r  )Nz9cannot have onesided output if window or input is complexr3  r3  r3  r3  r4  rD    r  r  c                   S   r  )Nz:Complex windows are incompatible with return_complex=Falser3  r3  r3  r3  r4  rD    r  )r  r  r  )r  r  r  r  zThe length of signal is shorter than the length parameter. Result is being padded with zeros in the tail. Please check your center and hop_length settings)rU  rV  r2  r\  r  r  r  r  rM  rH  Zcorresponding_real_dtyper   r  r   r  r   r  Zifftr   Zirfftr  Zunfold_backwardr   r   rQ  r   warningswarn)r  r  r  r  r  r  r  r  r  r  r  r  Zn_framesZfft_sizeZexpected_output_signal_lenZ	onesided_Z
real_dtypeZwindow_r  r  r]   Zy_tmpyZwindow_envelopr  endr3  r  r4  r-    s   










r-  a_shapea_strider   r  c           	         s   t | }tj||dd |dkrdn|   |dkrdn|  }tk fdd tdkfdd t| }t|}| ||  |k rd|    d | < |   9  < ||fS )NT)Zwrap_scalarr   rE  c                      s   d  d d S )Nz%Maximum size for tensor at dimension z is z but size is r3  r3  )r  max_sizer  r3  r4  rD  &  r  z*_get_unfold_shape_stride.<locals>.<lambda>c                      r  )NzStep is z but must be > 0r3  r3  r  r3  r4  rD  +  r  )rG  r\  r  rU  rV  r\  r  )	r  r  r   r  r  Za_ndimZlast_striderH  stridesr3  )r  r  r  r  r4  _get_unfold_shape_stride  s(   


r  c              	   G   s>  t j|dd}tt|t| jkdd  t|dkr!t| S t|| j }dg| }| jD ]}|| q0t	dd t
||D }d|v rXtj|| j| j| jt | d	S |}t |}t|D ]\}}t||||t|d\}}qctt|}	|	jtdd
d t
|	 \}
}| |}t|}||
}||S )NFrd  c                   S   r  )Nzbrepeat: Number of dimensions of repeat dims can not be smaller than number of dimensions of tensorr3  r3  r3  r3  r4  rD  >  r  zrepeat.<locals>.<lambda>r   rE  c                 s   s    | ]	\}}|| V  qd S r=  r3  )r@  Zpadded_sizeZrepeat_sizer3  r3  r4  rB  I  s
    
zrepeat.<locals>.<genexpr>r  T)keyreverse)r\  rj  rU  rV  rG  rH  r   rM  r  rO  zipr  r  r2  r  r  make_contiguous_strides_forrR  r  rQ  r\  sortr}  
itemgetterr   r   r   )rk  Zrepeat_shapeZnum_new_dimensionsZpadded_shapedim_sizeZtarget_shapeZurtensor_shapeZurtensor_strider  Zenumerated_strideZpermute_orderZ_sorted_strideZrepeat_xtensorZcloned_resultZpermuted_resultr3  r3  r4  r   8  sF   








r   
allow_copyc                   s  ddl m}m} tj|dd}t||  }||  dkr(t| |t|S | j	dkrJ| }|D ]}|dks9J t
|d}q1|| u rHt| S |S t|dkrn| }| jD ]}|dks]J t|d}qU|| u rlt| S |S |  rt|dkr| j	dkrt| |  gdgS t|dkr| j	dkr|d }|d }t| ||g|dgS d|  |D ]} j	kr|dksJ  j	d }	t |	 j|	  d q|| j krۈd q j }
}||
| dkr|d }|
 j|  }
||
| dks|kr4t |\}}|d u r.|rt| |  S d| j d	|   d
| d}t|t | ||
|krBt | d q j	k rht j dk fdd t   j	k sM | u rrt| S  S )Nr   )r<  sym_eqFrd  rE  rJ  r  z Cannot view a tensor with shape z and strides z as a tensor with shape r[  c                      s   d d j   S )Nza.size(z) expected to be 1 but got rE  r3  r  rM  r3  r4  rD    r  z&_reshape_view_helper.<locals>.<lambda>)rN  r<  r  r\  rj  Z
infer_sizer  r   r  rM  r  r  rk  rG  rH  r   Zis_contiguousrU  Z	split_dimr  r   r  rT  r   rV  )rk  r  rH  r<  r  Z_ar  dim0dim1last_dimaccumr  r  r  r  r3  r  r4  _reshape_view_helperr  s   












r"  rH  c                 G      t | g|R ddiS )Nr  Tr"  rg  r3  r3  r4  r        r   c                 C      |  | S r=  )r   r  r  r7  r3  r3  r4  r     r}  r   r3  shiftsc                 C   sz  t | j|}t|ts|f}t|ts|f}|  dkr!|  S |  dkr7t|dkr7t	d|d  dt|}t|}|dksG|dkr|dkrOt
d|dkre|dkrett| |d| jS ||krst
d| d| |dksyJ |dd }|dd }t| |d f|d }t|||S |d }| j| }	|	|d  |	 }
tj|	| jd	}| |t|
| |	S )
z/Reference implementation of :func:`torch.roll`.r   zDimension specified as z but tensor has no dimensionsrE  z`shifts` requiredz*shifts and dimensions must align. shifts: z, dims: Nr1  )r\  r  rM  r8  r   r  r   r  rG  r  r]  rU  r   r   r  rH  r  r2  rJ   r   )rk  r(  r  Z
len_shiftsZlen_dimsZtail_shiftsZ	tail_dimsZfirst_dim_rolledr  r  r  rM  r3  r3  r4  r     s@   


r   r   rE  kc                 C   s   t |dkrtdt | | jdk rtd| j t| j|}|d |d kr9td|d  d|d  |d }|dkrStt| |d f|d |d S |dkr]t| |S |d	krstt| |d f|d |d S | jtj	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   rE  z7expected rotation dims to be different, but got dim0 = z and dim1 = r  r  r$  )
rG  r]  rM  r\  r  rU  r   r   r   rU  )rk  r*  r  r3  r3  r4  r   .  s&   
$$r   c                 C   sP   | d j }tdt| D ]}| | j |ks%J d| d| | j  d| qd S )Nr   rE  z4stack expects each tensor to be equal size, but got z at entry 0 and z
 at entry )rH  rS  rG  )r  Zentry_shaperG  r3  r3  r4  _check_stack_inputsN  s   
r+  c                    s   t | dks
J dt| d jd |  | d jk r:t|  t| d j}| t |  t	|  }|
|S t	 fdd| D |S )Nr   z$stack expects a non-empty TensorListrE  c                    s   g | ]}|  qS r3  )r  rZ  Zwrapped_dimr3  r4  rJ  e  r  zstack.<locals>.<listcomp>)rG  r\  r  rM  r+  r\  rH  insertrU  r   r  )r  r  Zresult_sizesr  r3  r,  r4  r   W  s   
r   c                 C   sh   |p| j }t|}t| |}|  dkrt|}nt||dd}t|| }tt|t||dd|S )Nr   Tr  )	r  r\  r  r&   r  r>   r   r   r   )rk  r  r  r  r  r  Za_expZa_maxr3  r3  r4  rl   i  s   



rl   c                 C   sB   t t| dkdd  t|  }|d jdkrt|dS t|dS )Nr   c                   S   r  )Nz%hstack expects a non-empty TensorListr3  r3  r3  r3  r4  rD    r  zhstack.<locals>.<lambda>rE  )rU  rV  rG  r   rM  r   r  r3  r3  r4  r   }  s
   

r   c                 C   s*   t t| dkdd  t|  }t|dS )Nr   c                   S   r  )Nz%vstack expects a non-empty TensorListr3  r3  r3  r3  r4  rD    r  zvstack.<locals>.<lambda>)rU  rV  rG  r   r   r  r3  r3  r4  r    r  r  r  c                 C   s\   t | j|}tt|dkdd  | t| jd | t| t| j|d d   S )Nr   c                   S   r  )Nz"unflatten: sizes must be non-emptyr3  r3  r3  r3  r4  rD    r  zunflatten.<locals>.<lambda>rE  )	r\  r  rM  rU  rV  rG  r  rO  rH  )rk  r  r  r3  r3  r4  r
    s   6r
  r   c                    sp   ddl m} t| j  tt| jdkdd  || j  dkr%dS t	 fddt
| | j   D S )Nr   r;  c                   S   r  )Nz5Dimension specified as 0 but tensor has no dimensionsr3  r3  r3  r3  r4  rD    r  zunbind.<locals>.<lambda>r3  c                 3   s    | ]	}t | V  qd S r=  )rU  r   )r@  sr  r3  r4  rB    s    
zunbind.<locals>.<genexpr>)rN  r<  r\  r  rM  rU  Z_check_indexrG  rH  rO  r   )r   r  r<  r3  r/  r4  r    s   r  r:  r  c                 C   s   | j tjd|||S r&  )r   rU  rU  rI   )rA  r  r:  r  r3  r3  r4  rH     s   rH   c                    s`   t | j|}t jdk fdd | jdkr| dn| }td f|  f }|||< | S )NrE  c                      r  Nz(Index should have dimension 1 or 0 (got r  r  r3  r:  r3  r4  rD    rV  zindex_copy_.<locals>.<lambda>r   )r\  r  rM  rU  rV  r  slice)rA  r  r:  r  r  rM  r3  r1  r4  rI     s   
rI   c                 C      t | |||ddS )NFinplace_index_fillrA  r  r:  r  r3  r3  r4  rK     s   rK   c                 C   r3  )NTr4  r6  r8  r3  r3  r4  rL     s   rL   r5  c                   s   t  jdk fdd ttr t jdkfdd nt j| j| j| jd| jdk}|r8| 	dn| }t
|j}  ||< ||rOtjnt j}||| }	|r]| S |rf|	d }	|	 |  krzt | }
|
|	 |
}	|	S )NrE  c                      r  r0  r  r3  r1  r3  r4  rD    rV  z_index_fill.<locals>.<lambda>r   c                      r  )Nz<Only supports 0-dimensional value tensor. Got a tensor with r  r  r3  r  r3  r4  rD    s    )r  r*  r2  )rU  rV  rM  r8  r"   r#  r  r*  r2  r  r\  rH  r  r   r  rI   rH   r   r   r  r  copy_)rA  r  r:  r  r5  Zzero_dimr  rH  rH   r  Znew_outr3  )r:  r  r4  r7    s>   







r7  c                C   s   | j tjdj||||dS )Nr$  r  )r   rU  rU  Z
index_add_)rA  r  r:  r  r  r3  r3  r4  rG     s   
rG   c                    s|   t | j|}t jdk fdd  jdkr d | jdkr0t| d |  S t	d f|  f }| | S )NrE  c                      r  r0  r  r3  r1  r3  r4  rD    rV  zindex_select.<locals>.<lambda>r   )
r\  r  rM  rU  rV  r  r  rH   r   r2  )rA  r  r:  rM  r3  r1  r4  rJ     s   



rJ   c                    s  ddl m |d u r#tdd t jD }|rt |S t S  j}t	
||}t|tr4|fn|}|dkrKt|dksF|dksFJ t S t fdd|D }t|dkrbt S t|dkrnt |S t|}t|dd	}|D ]}t | qz S )
Nr   r;  c                 s   s     | ]\}}|d kr|V  qdS rh  r3  )r@  rM  r  r3  r3  r4  rB  $  s    zsqueeze.<locals>.<genexpr>r  c                 3   s&    | ]} j | d kr|V  qdS rh  rE  )r@  drk  r<  r3  r4  rB  0  r  rE  T)r  )rN  r<  rO  rR  rH  r  r   rk  rM  r\  r  r8  r   rG  r\  r  )rk  r  r  rM  Z	dims_listrG  r3  r;  r4  r     s(   

r   split_sizesc                    s   t tD ]}t| dd  qtttj  k fdd g }	 }D ]!}t
j}|| < || | |   |  }q0|S )Nc                   S   r  )NzCsplit_with_sizes expects split_sizes have only non-negative entriesr3  r3  r3  r3  r4  rD  E  r  z"split_with_sizes.<locals>.<lambda>c                      s   dt  dj   S )NzSplit sizes add up to z but got the tensor's size of )r  r   rH  r3  r  r  r<  r3  r4  rD  J  s    )rS  rG  rU  Z_check_is_sizer  rT  r  r   rH  r  r\  r  r   r  )r  r<  r  rG  Zsplitsr  
split_sizer  r3  r=  r4  r   <  s$   
r   indices_or_sectionsc                    s  t | j|}| jdkrd}t|t|tr7|jjdks'd|j }t||jt	j
kr7d|j }t|t|tsFt|tr|jdkrt|trM|n| }|dkr^d| }t|| j| }t|| }|| }g }	t|D ]}
|
|k r~|d n|}|	| qtttj| |	|dS | t|tr|jdkrd	|j d
}t||  dgt  | j| g   fddtt d D }	ttj| |	|dS )Nr   zXtensor_split: received a rank zero tensor, but expected a tensor of rank one or greater!r  z\tensor_split: if indices_or_sections is a tensor it must be on the CPU, but received one on zgtensor_split: if indices_or_sections is a tensor it must have long dtype,  but received one with dtype zAtensor_split: number of sections must be greater than 0, but was rE  r/  zntensor_split: non-scalar indices_or_sections tensors must have only one dimension, but received a tensor with r  c                    s    g | ]} |d    |  qS rH  r3  rF  indicesr3  r4  rJ         z tensor_split.<locals>.<listcomp>)r\  r  rM  rT  r8  r"   r2  r0  r  rU  longr   r   r   rH  r  rD   rS  r  rO  r  r   tolistr\  rG  )rk  r?  r  Z_dimr  sectionsr  Zmin_split_sizeZnum_splits_one_extrar<  Z	split_idxr>  r3  r@  r4  r   \  sf   







r   c                    s   t  jdk fdd  jdkrdndttr:t dko+ j  dk fdd t S t ttt	ffdd }t |S )NrE  c                         dt  j d S )NzPtorch.hsplit requires a tensor with at least 1 dimension, but got a tensor with  dimensions!r^  rM  r3  rj  r3  r4  rD    
   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  r3  )rk  r  r>  r3  r4  rD    s   c                      r  )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/  r3  r?  r3  r4  rD       
rU  rV  rM  r8  r   rH  r   _check_typer\  rO  rk  r?  r<  r3  )rk  r  r?  r>  r4  r     s$   


	r   c                    s   t  jdk fdd ttr0t dko" jd  dk fdd t dS t ttt	ffdd }t |dS )Nr  c                      rF  )NzPtorch.vsplit requires a tensor with at least 2 dimension, but got a tensor with rG  rH  r3  rj  r3  r4  rD    rI  zvsplit.<locals>.<lambda>r   c                      s   d j d  d dS )NzQtorch.vsplit attempted to split along dimension 0, but the size of the dimension r   rJ  r[  rE  r3  )rk  r>  r3  r4  rD    s
   c                      r  )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/  r3  rK  r3  r4  rD    rL  rM  rO  r3  )rk  r?  r>  r4  r    s"   


	r  r  c                    s@   |    t dv  fdd  dkrt| |S t| |S )N)rE  r  c                      r  )Nz'diag(): Supports 1D or 2D tensors. Got Dr3  r3  r  r3  r4  rD    r  zdiag.<locals>.<lambda>rE  )r  rU  rV  r   r   )r  r  r3  r  r4  r     s   r   r  dim2c                    sD   t | }|||| t jjk fdd t  |S )Nc                         dj  d j  S )NzCexpected src to have a size equal to the diagonal of the input.Got z for a diagonal of shape rE  r3  r   r  r3  r4  rD    
    z"diagonal_scatter.<locals>.<lambda>)r\  Zclone_preserve_stridesr   rU  rV  rH  r   )r  r  r  r  rQ  r  r3  rS  r4  r     s   
	

r   c           
         sF  |   }tj |d tj|dt k fdd |  }|dkr:tt|    |   | d}ntt|    | |   d}|dkri|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
    )rM  rankc                      r  Nz(diagonal dimensions cannot be identical r  r3  r3  r  rQ  r3  r4  rD  (  r  zdiagonal.<locals>.<lambda>r   c                        g | ]\}}| fvr|qS r3  r3  r@  rG  r.  rW  r3  r4  rJ  8  rB  zdiagonal.<locals>.<listcomp>c                    rX  r3  r3  rY  rW  r3  r4  rJ  ;  rB  )r  r  r  )r  r\  r  rU  rV  r  rQ  r  r  r  rR  r  r   )
r  r  r  rQ  Znum_dimsr  Z	diag_sizer  r  r  r3  rW  r4  r     s(   
&$
r   r	  c                    sT  | j d }tj| d tj|d kr  | }t k fdd | d|dkrft| j}t	||d< tj
|| j| jdd}|dkrT|| 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
    rE  )rU  rM  c                      r  rV  r3  r3  rW  r3  r4  rD  Z  r  zdiag_embed.<locals>.<lambda>rJ  r   Fr  r2  r  r/  r2  r  c                    s    g | ]}| fv rnd qS rH  r3  rF  r  rQ  r   r3  r4  rJ  u  rB  zdiag_embed.<locals>.<listcomp>)rM  r\  r  rU  rV  r  r\  rH  r  r,   r%  r  r2  r   r  r   r  r`  rS  rG  r   mask_tensorr   )r   r  r  rQ  rU  Zt_shapezpairZa_rangeZb_rangecondZ
cond_shaper3  r\  r4  r   C  s4   



 
r   c           	         s   dd | D }t dd |D }|d j g }d}t|D ]R\t dkfdd tj k fd	d j\}}tj||f j	d
}tj||| | f j	d
}|tj
||fddg7 }||7 }qtj
|ddS )z6
    Reference implementation of torch.block_diag
    c                 S   s(   g | ]}|  d kr|d dn|qS )rE  rJ  )r  r  r@  r  r3  r3  r4  rJ    s    z(_block_diag_iterable.<locals>.<listcomp>c                 s   s    | ]}|j d  V  qdS rh  rE  ra  r3  r3  r4  rB    r`  z'_block_diag_iterable.<locals>.<genexpr>r   r  c                      s   d  d   dS )Nz5Input tensors must have 2 or fewer dimensions. Input z has r  r/  r3  )rG  r  r3  r4  rD    s
    z&_block_diag_iterable.<locals>.<lambda>c                      s   d  d dj  dS )NzCInput tensors must all be on the same device. Input 0 is on device z and input z is on device r  r1  r3  r2  rG  r  r3  r4  rD    s    r[  rE  r/  )r  r   r2  rR  rU  rV  r  rH  r%  r  r   )	r  Z
tensors_2dZncolsr  Z	col_startrowcolr  rightr3  rb  r4  _block_diag_iterable}  s0   



rf  c                  G   s   t | S )z
    This is used as an input to PythonRefInfo. `torch.block_diag`
    expects arguments splatted, but `aten.block_diag` expects only
    one argument that is a list of Tensors.
    )rf  r  r3  r3  r4  r     s   r   rE  c                 C   sl   | j dk rtd| j  dt|tr0|dks | jd | dkr0t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 rG  r   r  z3torch.dsplit attempted to split along dimension 2, zbut the size of the dimension rJ  r[  )rM  r]  r8  r   rH  r   )rk  rE  r3  r3  r4  r     s   
$r   c                 C   s:   | j dkrtd| j  dt| d| j dk rdS dS )Nr  z7t() expects a tensor with <= 2 dimensions, but self is rP  r   rE  )rM  r]  rU  r   rj  r3  r3  r4  r     s
   
c                 C   s   t | jdv dd  |  S )N)r   r  c                   S   r  )NzcThe use of `x.T` on tensors of dimension other than 0 or 2 to reverse their shape is not supported.r3  r3  r3  r3  r4  rD    r  zT.<locals>.<lambda>)rU  rV  rM  r   rj  r3  r3  r4  r     s
   r   c                 C   r  r=  )r  rk  rj  r3  r3  r4  r     r  r   r  c                 C   s`   t | j||f\}}| jdks||krtj| S ttd| j}|||< |||< t	| |S )NrE  r   )
r\  r  rM  r  r   defaultr\  rS  rU  r   )rk  r  r  Z_dim0Z_dim1r  r3  r3  r4  r     s   r   c                 C   s&   t | j|  |||\}}| ||S r=  )r  rH  r  r   )r  r   r  r  rH  r  r3  r3  r4  r     s   r   c                 C   s   |  |||jtjdS r&  )r   r   rU  rU  )r  r   r  r  r3  r3  r4  r    s   r  c                C   s   |j }t||}|dkr| |dd||dS ||d }tj|j| |jd}|d|k}t|| d D ]}	|d}q9t	|||}
| |
|||dS )Nr   )r  r  r  rE  r1  rJ  )
rM  r\  r  r  rU  r  rH  r2  rS  r   )r  initrk  r  r  r  rM  rgr  r  Zmasked_ar3  r3  r4  _cumsumprod_common  s   rj  c                C      t td| |||dS )Nr   r  rh  rk  r  r  r  )rj  r   rk  r  r  r  r3  r3  r4  r        r   c                C   rk  )NrE  rl  )rj  r   rm  r3  r3  r4  r   $  rn  r   c                 C   s(   | j d }t||}tj| |f|dS )NrE  r  )rM  r\  r  r  Zexpand_dims)rk  r  rM  r3  r3  r4  r  0  s   
r  c                 G   r#  )Nr  Fr$  rg  r3  r3  r4  r  =  s   r  c                 C   r&  r=  )r  r  r'  r3  r3  r4  r  C  r}  r  c                 C   s
   t | dS )N)rJ  )r   rj  r3  r3  r4  r   H  s   
r   rA  c                    s   t  jjk fdd t tjfdd |d u r.t  dddS t j	}
|||< t|
 }t|}tj	} 
|||< t| 
 }t |}t |||S )Nc                      s   d j  dj  dS )Nz]torch.take_along_dim(): input and indices should have the same number of dimensions, but got z dimensions for input, and z dimensions for indicesr  r3  rk  rA  r3  r4  rD  T  s
   z take_along_dim.<locals>.<lambda>c                      r  )Nz?torch.take_along_dim(): dtype of indices should be int but got z insteadr  r3  r@  r3  r4  rD  ]  s   rJ  r   )rU  rV  rM  r\  r  r  gatherr  r\  rH  r  Zinfer_size_shapesr   )rk  rA  r  Z
self_sizesZbroadcast_shapeZindices_broadcastZindices_sizesZself_broadcastr3  ro  r4  r   N  s&   
	





r   r  r*  r2  r  r+  r%  r  c              	      s   t  t jkdd  t|} t jkrt|}n t jkr&t|}nt  t j	k fdd t
|}t j||| ||||dS )Nc                   S   r  )Nz8torch.empty: the Preserve memory format is not supportedr3  r3  r3  r3  r4  rD    r  zempty.<locals>.<lambda>c                      r  )Nz/torch.empty: received an unknown memory format r[  r3  r3  r$  r3  r4  rD    r  r  r*  r2  r+  r  )rU  rV  r-  r\  rj  rU  r  Zchannels_last_3dZ!make_channels_last_3d_strides_forZchannels_lastZ!make_channels_last_2d_strides_forr  )r  r*  r2  r  r+  r%  rH  r  r3  r$  r4  r  s  s.   





r  c                 C   s   t j| ||||dS )NrZ  )r  r  )rH  Zphysical_layoutr  r*  r2  r  r+  r3  r3  r4  r    s   
r  r  r*  r2  r+  c                C   sJ   |d u r| j n|}|d u r| jn|}|d u r| jn|}tj|||||dS )Nr  r2  r+  r*  )r  r*  r2  rU  r  )rk  r  r  r*  r2  r+  r3  r3  r4  r    s   r  c                C   sL   |du r| j n|}|du r| jn|}|du r| jn|}tj||||||dS )zD
    Reference implementation of torch.Tensor.new_empty_strided
    Nrt  )r  r*  r2  rU  r  )rk  r  r  r  r*  r2  r+  r3  r3  r4  r    s   r  rr  c              	   G   @   t |}| d u rt } tj|| tjkrdnd| ||||dS NFr   rr  r\  rj  rU  r  r  r  r  r*  r2  r+  r  r  r3  r3  r4  r%       

r%  c             	   C   b   |d u r| j n|}|d u r| jn|}|d u r| jn|}tj||p"| j tjkr(dnd|||||dS rv  r  r*  r2  rU  r  r  rk  r  r  r*  r2  r+  r  r3  r3  r4  r       r  c              	   G   ru  NTrE  rr  rw  rx  r3  r3  r4  r     ry  r   c             	   C   rz  r~  r{  r|  r3  r3  r4  r  2  r}  r  
fill_valuec                C   sL   |d u r| j n|}|d u r| jn|}|d u r| jn|}tj||||||dS )Nrs  )r  r*  r2  rU  r  )rk  r  r  r  r*  r2  r+  r3  r3  r4  r  M  s   r  )r  r2  r*  r+  r  r%  c             	   C   s~   |d u r| j n|}|d u r| jn|}|d u r| jn|}|tjkr-tj| j||||||dS t| }tj	| j||||||dS )Nrq  rr  )
r  r*  r2  rU  r-  r  rH  r\  Z3compute_elementwise_output_logical_to_physical_permr  )rk  r  r2  r*  r+  r  r%  Zlogical_to_physical_permr3  r3  r4  r  g  s0   
r  r  c                   s  t | t | tt |}ttrJ t tr J ttr'J  d u r/ dtdkdd  dkrHt kdd  ndk rVt kdd  dd }t|oc|  fdd t|fd	d  f}	t	
d
d |	D }
|d u r|
rtjnt }t |}|s|
rt}t }t}|tjks|
rt|dkt|dk  }|| | | | }n	t   }|rtj||||||dS tj|ddtj|dd}|
rtjnt ||}t||}|  }t||}|r|d |S )Nr   c                   S   r  )Nzstep must be nonzeror3  r3  r3  r3  r4  rD    r  zarange.<locals>.<lambda>c                   S   r  Nz7upper bound and lower bound inconsistent with step signr3  r3  r3  r3  r4  rD    r  c                   S   r  r  r3  r3  r3  r3  r4  rD    r  c                 S   s   t | t p
t| S r=  )r8  r   r  rM   rC  r3  r3  r4  	is_finite  r%  zarange.<locals>.is_finitec                      s   d d  S )Nzunsupported range: z -> r3  r3  )r  r  r3  r4  rD    r  c                      r  )Nzstep must be finite but got r3  r3  r  r3  r4  rD    r  c                 s       | ]}t |tV  qd S r=  r>  r@  r  r3  r3  r4  rB    r`  zarange.<locals>.<genexpr>)r  r  r  r2  r  rE  FT)r\  check_layoutcheck_pin_memoryrU  r2  device_or_defaultr8  r	  rV  r  r   r`  r  r  r   r  r  r4   r  iotarC  Zget_acc_typer&   requires_grad_)r  r  r  r  r*  r2  r+  r  r  ra  Zinteger_args
is_integerZxstartZxendZxsteprf   r  r:  r  r  r3  )r  r  r  r4  r    s   




	



r  )r  r  r  c           	      C   s   | |g}t |tr| d|}n|| t |tsJ | dk}t||d |}t||| }|||   | }tj	t
|  }| |krMt||}t||S )Nr3  r  rE  )r8  r   r  r  r  r,   rU  r   r\  Z"compute_elementwise_output_stridesrb  r  r  Zcopy_stridedr:  )	r  r  r  r  r  Zcoeffbaser9  r  r3  r3  r4  rT     s   


rT   )r  r2  r*  r+  r  stepsc             	      s.  t trt dkdd  ttjt tr.t dkdd  ttjtdd fD rXt	
t  d u rI ntt	 fdd np]t t tjsfJ tt tfdd t ts|J tdkd	d  ||||d
}dkrtjddi|S dkrt trtjffdi|}	tjjj|	S tjffdi|S tjdfi |}
t	st	rtjn}t	|
tj|\}}tt|d} d  }t|
d k |||
  ||d |
   }t|S )Nr   c                   S   r  Nz:linspace only supports 0-dimensional start and end tensorsr3  r3  r3  r3  r4  rD  &  r  zlinspace.<locals>.<lambda>c                   S   r  r  r3  r3  r3  r3  r4  rD  ,  r  c                 s   r  r=  r8  r	  r  r3  r3  r4  rB  0  r`  zlinspace.<locals>.<genexpr>c                      r  )Nzlinspace(): inferred dtype z& can't be safely cast to passed dtype r3  r3  )default_complex_dtyper  r3  r4  rD  9  r  c                      s*   dt j dt  j dt j dS )Nz4received an invalid combination of arguments - got (r  r  )r0  rq  r3  )r  r  r  r3  r4  rD  B  s    c                   S   r  )Nz$number of steps must be non-negativer3  r3  r3  r3  r4  rD  F  r  )r*  r2  r+  r  r  r  rE  r  r  )r  r   )r8  r#   rU  rV  r  r&   r  r  r   r\  r  r  r  r  rN  r   r  r  opsr  r)  rg  r  r  r  r`  rO  r   ra  r   r   )r  r  r  r  r2  r*  r+  r  Zfactory_kwargsZempty_tensorri  Z	dtype_redr  r  Zcast_rgr  r  r3  )r  r  r  r  r  r4  r    sx   






r  r  r  c             
   C   s  |d u rt  }tj|rNt| trt| } nt| tr.t 	| 
 dkdd  t| |} t|tr8t|}nt|trNt 	|
 dkdd  t||}tdd | ||fD rgtt  }	|	}d }
nt j}
t|trqJ |dk rwtt j| |||
||||d}tt |||S )Nr   c                   S   r  Nz:logspace only supports 0-dimensional start and end tensorsr3  r3  r3  r3  r4  rD    r  zlogspace.<locals>.<lambda>c                   S   r  r  r3  r3  r3  r3  r4  rD    r  c                 s   r  r=  r  r  r3  r3  r4  rB    r`  zlogspace.<locals>.<genexpr>rr  )rU  r  r  r\  r  r8  r   r   r#   rV  r  r&   r  r   r  r  r	  r"  r  r   )r  r  r  r  r  r2  r*  r+  r  r  Z_dtyperetr3  r3  r4  r  p  sP   










r  indexingc                 C      d S r=  r3  )r  r  r3  r3  r4  r     r1  r   c                 G   r  r=  r3  )r  r  r3  r3  r4  r     r1  c                    s  t |d ttfrt|dksJ t|d }ttdd |D dd  tt|dkdd  tt|d D ]&}t|| j	||d  j	kdd  t|| j
||d  j
kd	d  q;d
} dkrt|dk}|r|d |d g|dd  R }nt dk fdd g }|D ]"t tsJ tjdkpjdkfdd |  qg }t|D ] \}t tsJ jdkrΈd|t||f q|r|d |d |d< |d< |S )Nr   rE  c                 s   r  r=  r8  r"   r  r3  r3  r4  rB    r`  zmeshgrid.<locals>.<genexpr>c                   S   r  )Nz)meshgrid expects its inputs to be tensorsr3  r3  r3  r3  r4  rD    r  zmeshgrid.<locals>.<lambda>c                   S   r  )Nz'meshgrid expects a non-empty TensorListr3  r3  r3  r3  r4  rD    r  c                   S   r  )Nz3meshgrid expects all tensors to have the same dtyper3  r3  r3  r3  r4  rD    r  c                   S   r  )Nz4meshgrid expects all tensors to have the same devicer3  r3  r3  r3  r4  rD    r  FZxyr  Zijc                      r  )NzDtorch.meshgrid: indexing must be one of "xy" or "ij", but received: r3  r3  )r  r3  r4  rD    s   c                      r  )NzEtorch.meshgrid: Expected 0D or 1D tensor in the tensor list but got: r3  r3  )r   r3  r4  rD    r  rH  )r8  r\  rO  rG  rU  rV  r  r   rS  r  r2  r"   rM  r  r  rR  r  r  rP  )r  r  rG  Zswap_first_and_second_tensorsZresult_shapeZgridsr3  )r  r   r4  r     sX   



sourcedestinationc                    s@  t tu r	ft  tu 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 ]&}||}|dur|	| qo|
|v r|
d7 }
|
|v s|	|
 |
d7 }
qot| t|	}|S )	z3
    Reference implementation of torch.movedim
    c                      s   dt  dt   dS )Nz5movedim: Invalid source or destination dims: source (z> dims) should contain the same number of dims as destination (z dims)r\  r3  r  r  r3  r4  rD    s
   zmovedim.<locals>.<lambda>)rU  rA  c                         dt   dS )Nz#movedim: repeated dim in `source` (r  r  r3  )r  r3  r4  rD    r  c                      r  )Nz(movedim: repeated dim in `destination` (r  r  r3  )r  r3  r4  rD     r  r   NrE  )r0  r  rU  rV  rG  rM  rO  r\  r  setdictr  rS  r>  r  r   )r  r  r  rU  ssZdsZsssZdssr  r  siZdir.  r  r3  r  r4  r     sF   	




r   )r  r2  r*  r  r+  r  c                C   s\   t | t | t | } |d u rt n|}|d u r"tdn|}tj| ||||dS )Nr  rZ  )	r\  r  r  rj  rU  r  r2  r  r  )rH  r  r  r2  r*  r  r+  r3  r3  r4  r  9  s   


r  nr  c                   s    du 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u r@|	S t jd	||||dd
}
t |	|
dS )z/
    Reference implementation of torch.eye
    Nr   c                      r  )Nz%n must be greater or equal to 0, got r3  r3  )r  r3  r4  rD  h  r  zeye.<locals>.<lambda>c                      r  )Nz%m must be greater or equal to 0, got r3  r3  )r  r3  r4  rD  i  r  FrZ  rJ  rH  rr  )rU  rV  r  r`  r  r  r   r   )r  r  r  r*  r2  r+  r  Zrange_nZrange_mr`  oner3  )r  r  r4  r  V  s$   
r  c                C   sd   t | t | |d ur|nt t|}|d ur|ntd}t| |||||d}t||S )Nr  rr  )	r\  r  r  type_to_dtyper0  rU  r2  r  rB   )rH  r  r  r*  r2  r+  r  er3  r3  r4  r    s   

r  r  r*  r2  r+  r  r%  c          	   	   C   s"   t j| ||||||d}t||S )Nr  )rU  r  rB   )	rk  r  r  r*  r2  r+  r  r%  r  r3  r3  r4  r    s   
	r  c             
   C   .   t j| |p| jt jkrdnd||||||dS )NFr   r  rU  r  r  r  rk  r  r*  r2  r+  r  r%  r3  r3  r4  r&       r&  c             
   C   r  )NTrE  r  r  r  r3  r3  r4  r!    r  r!  c                 G   s>   t | t |}t | } t |}tj|dd| ||dS )Nr  r  )r   r   r  r2  r  )r\  r  rj  Zdtype_or_defaultr  r  r^   )r  r2  r*  r  r+  rH  r  r3  r3  r4  r"    s   




r"  c                C   sT   t | t | |d ur|nt t| }|d ur|ntd}tj| ||dS )Nr  r  )	r\  r  r  r  r0  rU  r2  r  r#  )rk  r  r*  r2  r+  r3  r3  r4  r#    s
   

r#  r  lowhighc                C   sd   t |  t|tsJ t|tsJ t|}t|}t|tjs#J t |}tj	| ||||dS )N)r  r  r  r2  )
r\  r  r8  r   r   rU  r  Zcanonicalize_devicer  _uniform_helper)rH  r  r  r  r2  r3  r3  r4  r    s   

r  r  c                    s   t | j t|trt|}n6|jtdkfdd | j	jddtj
 dfv o1|j	jdk}t|p;|j	| j	kdd  t |j}|tu rXtt |  fd	d t|| j}t||| }| S )
Nr   c                      r  )Nz@only supports a 0-dimensional value tensor, but got tensor with z
 dimensionr3  r3  )
value_ndimr3  r4  rD  4  r  zmasked_fill.<locals>.<lambda>cudaZxpur.  r  c                   S   r  )Nz,Expected `value` to be on same device as `a`r3  r3  r3  r3  r4  rD  >  r  c                      r  )Nzcould not convert to type z without overflowr3  r3  )r  r3  r4  rD  I  r  )r\  r   r  r8  r   r0  rM  rU  rV  r2  _CZ_get_privateuse1_backend_namer	  r   r&   r   r   )rk  r  r  Z
value_typeZis_cpu_scalarr  r3  )r  r  r4  r   (  s4   





r   c                 C   s   t | ||}| | | S r=  )rU  r   r9  )rk  r  r  r  r3  r3  r4  r   V  s   
r   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  r  rU  r   r   r   )rk  r  r  r  r  r3  r3  r4  r'  `  s   
r'  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r1dS ttt	| |S )NFr  r   T)
r\  r#  Zcheck_same_dtyperM  r  rH  r  r   r   r~   )rk  r  rA  r  r3  r3  r4  r(  q  s   r(  fror  c                C   s   |dkr|d u st |tst|dks|d u rd}t |tr!|g}t |tr<|d u r1tt| j}tjj	| ||||dS tjj
| ||||dS )Nr  r  r  )r8  r   rG  r^  rO  rS  rM  rU  r  Zmatrix_normr  )r  r  r  r  r  r3  r3  r4  r]     s   &

r]   c                 C   s(   t | jdkdd  t t | dS )Nr  c                   S   r  )Nz6expected a matrix, but got tensor with dim {self.ndim}r3  r3  r3  r3  r4  rD    r  ztrace.<locals>.<lambda>r   )rU  rV  rM  r   r   r  r3  r3  r4  rq     s   rq   c                    s.   dt ttf dt ttf dtf fdd}|S )Nrk  r  rg  c                    s
    || S r=  r3  r  base_opr3  r4  rop  r  z_make_r_binary_op.<locals>.rop)r   r#   r   )r  r  r3  r  r4  _make_r_binary_op  s   

r  c                 C   sh   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   r  )Nz2triu: input tensor must have at least 2 dimensionsr3  r3  r3  r3  r4  rD    r  ztriu.<locals>.<lambda>r	  r1  rJ  
rU  rV  rM  rH  r  r2  r  r\  r]  r   rk  r   hwr  r3  r3  r4  r       r  c                 C   sh   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   r  )Nz2tril: input tensor must have at least 2 dimensionsr3  r3  r3  r3  r4  rD    r  ztril.<locals>.<lambda>r	  r1  rJ  r  r  r3  r3  r4  r    r  r  rc  rd  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   rE  r  )r  r  rQ  )
rc  rd  r  m_first_rowZ
m_last_rowZ	n_row_allZn_row_trapezoidtrapezoid_sizeZdiff_rowrectangle_sizer3  r3  r4  _get_tril_sizes  s   &
r  c                    sV   t dkfdd t  dk fdd t t jt jfv fdd d S )Nr   c                      r  )Nzrow must be non-negative, got r3  r3  )rc  r3  r4  rD    r  z_trilu_checks.<locals>.<lambda>c                      r  )Nzcol must be non-negative, got r3  r3  )rd  r3  r4  rD    r  c                      s   d d  dS )Nrf  z" not implemented for ''r3  r3  )r  r  r3  r4  rD    s    )rU  rV  r  r`  )r  rc  rd  r  r*  r+  r3  )rd  r  r  rc  r4  _trilu_checks  s   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*  r2  r+  r  r  r  rE  )r  r  rQ  r   rU  r  r  rD   rm   r&   r   r   )rc  rd  r  r  r*  r2  r+  r  r  r  
row_offset	arange_kwxs1r  	row_inds1	col_inds1xs2	row_inds2	col_inds2r3  r3  r4  r    s$   
""
r  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  rE  )rQ  r  r  )
rc  rd  r  r  r  Ztrapezoid_size_trilZrectangle_size_trilr  Z	triu_sizer  r3  r3  r4  _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	||}|ro|||  }||
 }t
t||ft||ffS )	Nr  r   r  r  g      r  rE  r  )r  r  rQ  r   rU  r  r  rD   rm   r&   r   r   )rc  rd  r  r  r*  r2  r+  r  r  r  
col_offsetr  r  r  r  r  r  r  r  r3  r3  r4  r  =  s*   

""

r  )	out_int32re  
boundariesr  re  c                   sj  t   dk fdd t| t jr| nt | } |r t jnt j} jd }|dkr1t 	| S t j
| j| jt jd}|| }||| d  } | }	|rS|	| k}
n|	| k}
t |
||d }|dkrt j| t jd}tt|}t|D ]7}t |
|@ ||}||k }t |||| d  d} | }	|r|	| k}
n|	| k}
t |
 |@ |d |}qw|j|dS )	NrE  c                      s   d    dS )Nz2boundaries tensor must be 1 dimension but got dim(r  r/  r3  r  r3  r4  rD  s  r  zbucketize.<locals>.<lambda>rJ  r   r[  r  r  )rU  rV  r  r8  r  r  r  r`  rH  r&  r%  r2  r   r!  r  r  r  rX   rS  r   )rk  r  r  re  Z	out_dtypeZn_boundariesr  r  midZmid_valZcond_midZcond_updateZnitersr  r3  r  r4  r)  h  s<   	





r)  c                    s   |d u sJ t t j ot j ot j  fdd t dkfdd |t tj	t 
 d    S )Nc                      r  )NzwCauchy distribution is a continuous probability distribution.         dtype must be a floating point but you specified r  r3  r  r3  r4  rD        zcauchy.<locals>.<lambda>r  c                      r  )Nz-cauchy_ expects sigma > 0.0, but found sigma=r3  r3  )sigmar3  r4  rD    r  r  )rU  rV  r\  r  r  r  r  ro   r  r  	rand_like)r  Zmedianr  	generatorr3  )r  r  r4  r    s   

"r  c                    s   |d u sJ t tj otj otj fdd t  dk fdd t }t |jj	d }|d| k}t 
|| t |}d  | S )Nc                      r  )Nz|Exponential distribution is a continuous probability distribution.         dtype must be a floating point but you specified r  r3  r  r3  r4  rD    r  zexponential.<locals>.<lambda>r  c                      r  )Nz4exponential_ expects lambda > 0.0, but found lambda=r3  r3  )rater3  r4  rD    r  r  r  rJ  )rU  rV  r\  r  r  r  r  r  r  r  r   rV   )r  r  r  Zuniform_valepsilonr  Zlog_uniformr3  )r  r  r4  r@     s"   


r@   c                    s   |d u sJ t tj otj fdd t d k o% dk  fdd t t t  t	   d S )Nc                      r  )Nzgeometric not implemented for r  r3  r  r3  r4  rD    r  zgeometric.<locals>.<lambda>r   rE  c                      r  )Nz0geometric_ expects p to be in (0, 1), but got p=r3  r3  )r  r3  r4  rD    r  )
rU  rV  r\  r  r  r  rD   rW   r  r  )r  r  r  r3  )r  r  r4  rF     s   

(rF   r  c                    sv   |d u sJ t t j ot j ot j  fdd t dk fdd t t   | S )Nc                      r  )Nzlog_normal not implemented for r  r3  r  r3  r4  rD    r  zlog_normal.<locals>.<lambda>r   c                      r  )Nz-log_normal_ expects std > 0.0, but found std=r3  r3  r   r3  r4  rD     r  )	rU  rV  r\  r  r  r  r  r>   Z
randn_liker  r   r   r  r3  )r  r   r4  rZ     s   

rZ   )r   r   )r  r  r*  r2  r+  c          
   	      s$  |d u s|t jksJ t tst  dk fdd |d u rYtdd |  fD }t t|dkdd  t |d u o@|d u dd  tdd |D  }|d j}|d j	}n't t| t oft t d	d  |d u rst 
 n|}|d u r~t 	d
n|}tj|dd||d|d}	 |	 |  S )Nr   c                      r  )Nz)normal expects std >= 0.0, but found std r3  r3  r  r3  r4  rD    r  znormal.<locals>.<lambda>c                 s   s    | ]
}t |tr|V  qd S r=  r  rZ  r3  r3  r4  rB  #  s    znormal.<locals>.<genexpr>c                   S   r  )NzFnormal expects that either mean or std is a tensor, or size is definedr3  r3  r3  r3  r4  rD  &  r  c                   S   r  )Nz.Cannot pass layout, or pin_memory without sizer3  r3  r3  r3  r4  rD  *  r  c                 s   r  r=  rE  rZ  r3  r3  r4  rB  -  r  c                   S   r  )Nz>normal expects mean and std to be scalars when size is definedr3  r3  r3  r3  r4  rD  3  r  r  r  r  F)r   r   r  r2  r  r  )rU  stridedr8  r"   rV  rO  rG  rX  r  r2  r  r  r^   )
r   r   r  r  r  r*  r2  r+  r  Znormal_samplesr3  r  r4  r^     sD   


	r^   )r  c                C   s   t ||| j| |dS )N)r  r  )r^   rH  r  r3  r3  r4  normal_D  s   r  c                 C   &   t t| j dd  d}| | S )Nc                   S   r  )Nz-rad2deg is not supported for complex tensors.r3  r3  r3  r3  r4  rD  M  r  zrad2deg.<locals>.<lambda>gcܥL@rU  rV  r\  r  r  )r  ZM_180_PIr3  r3  r4  rb   I     rb   c                 C   r  )Nc                   S   r  )Nz-deg2rad is not supported for complex tensors.r3  r3  r3  r3  r4  rD  W  r  zdeg2rad.<locals>.<lambda>g9RFߑ?r  )r  ZM_PI_180r3  r3  r4  r9   S  r  r9   c                 C   s   | dk |S r  )r   )r  r  r3  r3  r4  r8   ]  s   r8   c                    sr   t  dko  dk fdd t j jk fdd  fdd}t    k| d S )NrE  c                      s   d   d    dS )Nz1D tensors expected, but got zD and z	D tensorsr/  r3  r7  r  r3  r4  rD  f  r  z_dot_check.<locals>.<lambda>c                      rR  )Nz:dot : expected both vectors to have same dtype, but found r  r  r3  r  r3  r4  rD  k  rT  c                	      s.   d   d    d   d    d	S )Nz+inconsistent tensor size, expected tensor [z] and src [z.] to have thesame number of elements, but got r  z elements respectively)r  r3  r  r3  r4  numel_erroro  s   z_dot_check.<locals>.numel_error)rU  rV  r  r  r  )r  r7  r  r3  r  r4  
_dot_checkc  s   
r  c                    s   t   fdd}|S )Nc                    s   t | |  | |S r=  )r  r'  rz  r3  r4  wrappery  s   

z#_dot_check_wrapper.<locals>.wrapper)r   )r{  r  r3  rz  r4  _dot_check_wrapperx  s   r  r'  c                 C   sd   |   r,|  r | rt|  |  S t|  |S | r,t| | S | |  S r=  )r*  is_conjrU  r   r   r   r   r'  r3  r3  r4  r     s   r   c                 C   st   |   s
t| |S |  r$| rt| |  S t|  |S | r2t| |  S |  |  S r=  )r*  rU  r   r  r   r   r5   r   r'  r3  r3  r4  r     s   r   c                 C   sz   t | j|}dg| j }d||< |dk r|| j|  }tj| j| | jd||k}t||	| j}t
||| S )NrE  rJ  r   r1  )r\  r  rM  rH  rU  r  r2  r  r  r   r   )rA  r  r  r:  Z
mask_shaper  r3  r3  r4  select_scatter  s    r  c                 C   s   t | tjtjfS r=  )r8  rU  ZTypedStorageZUntypedStorage)objr3  r3  r4  
_isStorage+  r6  r  c                 C   s   d}t | }g }t| ttfrYt| }|r||j }|| t||kr0tdt| j	 d|dkr7	 |S z| d }W n t
yO   tdt| j	 dw |} t| ttfs|S )N   ztoo many dimensions 'r  r   z.could not determine the shape of object type ')r  r8  r\  rO  rG  itemsizer  rT  r0  rq  r  )seqscalar_typeZMAX_DIMSZ
is_storager  r  handler3  r3  r4  _compute_sizes0  s.   

	r  c                 C   sF  t | tr	t S t | trt | tstjS t | trtjS t | trCt }|tj	u r/tj
S |tju r7tjS |tju r?tjS tdt | tjrL| jS t | tr\tdt| j dt | ttfrd }t| }|dkrqt S t|D ]!}| | }	 t|}|d urt||}n|}|tju r|  S qu|S tdt| j )Nz'invalid default scalar type for complexznew(): invalid data type 'r  r   zCould not infer dtype of )r8  r   rU  r  r   r  r`  r   r	  r  ZcfloatdoubleZcdoubleZhalfZchalfr]  r  r  r^  	TypeErrorr0  rq  r\  rO  rG  rS  _infer_scalar_typeZpromote_types)r  Zdefault_dtype
scalarTyper  rG  Zcur_itemZitem_scalarTyper3  r3  r4  r  J  sH   







r  r  r  c                    s   t |tr| dkr| j ddddS t |tr'| j dddS t |tr3tj| dS |}|s<t	dS t
 fdd	|D S )
NrE  r  T)r  r2  r)  r3  r  r   c                    s   g | ]}t  |qS r3  )_recursive_build)r@  r   r  r3  r4  rJ    r  z$_recursive_build.<locals>.<listcomp>)r8  r  r  detachr   r  r   rU  r#  r  r   )r  r  r  r3  r  r4  r  }  s   


r  c                 C   s   t |tjr0t| dd  |}|r| }|r|jn|}	|d ur$|n|j}
|j|
|	d|dS t|dr7t	S |d ur=|n| d }
|rGt
|n|}	t|rOt	S t|
jdkrYt	S t|	|}|j|
|	ddd}|S )	Nc                   S   r  )Nz,Can't pin tensor constructed from a variabler3  r3  r3  r3  r4  rD    r  z)_internal_new_from_data.<locals>.<lambda>F)r2  r  r,  r)  Z__cuda_array_interface__r2  meta)r,  r)  )r8  rU  r  rV  r  r  r2  r   hasattrNotImplementedr  r  r0  r  )optionsr  Z
device_optdatacopy_variables
copy_numpytype_inferencer+  r   Zinferred_scalar_typer2  r  r3  r3  r4  _internal_new_from_data  s4   



r  )r  r2  r+  r  c             
   C   sj   t | tjrtjdtdd |d u }tddi|d ur|nt || dd||d}|  |r3|	| |S )NzTo copy construct from a tensor, it is recommended to use sourceTensor.detach().clone() or sourceTensor.detach().clone().requires_grad_(True), rather than torch.tensor(sourceTensor)r  )
stacklevelr2  r  T)r  r  r  r+  )
r8  rU  r  r
  r  UserWarningr  r  Zdetach_r  )r  r  r2  r+  r  r  Z
new_tensorr3  r3  r4  r    s*   
r=  )F)r  NN)r   r  FrH  )NN)NNNNNFF)FFN)NF)NNFr  )r   rJ  )	NNNTr  FNNN)NNNTFNNF)r3  )rE  r)  )r   r   rE  )r   r	  rJ  )r   NrE  )r  )r  r  )r  NF)r   rE  Nrh  )rE  r  N(  r  r  r~  r  r  r}  r
  collections.abcr   r   enumr   	functoolsr   r   r   r   typingr	   r
   r   r   r   r   rU  Ztorch._primsZ_primsr  Ztorch._prims_commonZ_prims_commonr\  Ztorch.utils._pytreeZ_pytreerW  r   r   r   r   r   r   r   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+   r  r  r  ZDispatchKeyZ_opsr  r  r5  r:  rX  rb  Ztorch._decomprc  objectro  rw  r  r  rw  r,   ZINT_TO_FLOATr-   r.   r0   r/   r1   r2   DEFAULTr3   r4   r*  r5   r6   r7   r:   r;   r<   r=   r>   r?   rA   Z	NO_OPMATHrB   rC   r$  rD   rE   r   ZALWAYS_BOOLrM   rN   rO   rP   rQ   ZspecialZmultigammalnr\   rR   rS   rU   rV   rW   rX   rY   r  r  r[   r   r  r_   r  r`   ra   r   rc   rd   r   re   rf   rg   rh   ri   rj   rk   rm   ZBOOL_TO_LONGrn   ro   rp   rr   r	  r  rs   rt   ru   rv   rw   rx   ry   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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rz   r{   r   r   r-  r%  r   r   r*  r/  r0  registerr2  r  r4  r5  r6  r8  r=  r   rR  rZ  r   r   r   Zdim_IntListZIntList_outr\  r   r   r   r   rs  r   r   r   r   r   r   r   r  r   r   r   r   r   r   rg  Zpy_implZCompositeImplicitAutogradZMetar   r   r   r   r   rU  r   r   r   r   r   r   r   r   r   r   r  r  r   r   Z_subclassesZ
fake_implsZregister_op_implr  r   r+  r,  r  r-  r  r   r"  r   r   r   r   r+  r   rl   r   r  r
  r  rH   rI   rK   rL   r7  rG   rJ   r   r  r   r   r   r  r   r  r   r   r   r   rf  r   r   r   r   r   r   r   r  rj  r   r   r  r  r  r   r   r  r  r  r  r  r%  r  r   r  r  r  r  Z
start_stepZ	start_outrT   r  r  r   r   r  r  r  r  r&  r!  r"  r#  r  r   r   r'  r(  r]   rq   r  r   r   r   r  r  r  r  r  rC  r  r  r)  r  r@   rF   rZ   r^   r  rb   r9   r8   r  r  r   r   r  Zabs_Zacos_Zacosh_Zadd_Zaddcmul_Zaddcdiv_Zasin_Zasinh_Zatan_Zatanh_Zatan2_Zbitwise_and_Zbitwise_left_shift_Zbitwise_not_Zbitwise_or_Zbitwise_right_shift_Zbitwise_xor_Zceil_Zclamp_Z
clamp_min_Z
clamp_max_Zconj_physical_Z	copysign_Zcos_Zcosh_Zcumsum_Zcumprod_Zdeg2rad_Zdigamma_Zdiv_Zeq_Zerf_Zerfc_Zerfinv_Zexp_Zexp2_Zexpm1_Zfloat_power_Zfloor_Zfloor_divide_Zfmod_Zfrac_Zgcd_Zge_Zgt_Z
heaviside_Zhypot_Zigamma_Zigammac_Zi0_Zlcm_Zle_Zlerp_Zlgamma_Zlog10_Zlog1p_Zlog2_Zlog_Zlogical_and_Zlogical_not_Zlogical_or_Zlogical_xor_Zlt_Zmul_Z	mvlgamma_Znan_to_num_Zne_Zneg_Z
nextafter_Zpow_Zrad2deg_Zreciprocal_Z
remainder_Zrsqrt_Zsgn_Zsigmoid_Zsign_Zsin_Zsinc_Zsinh_Zsqrt_Zsquare_Zsub_Ztan_Ztanh_Ztril_Ztriu_Ztrue_divide_Ztrunc_Zxlogy_Zcauchy_Zexponential_Z
geometric_Zlog_normal_Zzero_r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  Ztorch._refs._conversionsZtorch._refs.fftZtorch._refs.linalgZtorch._refs.nn.functionalZtorch._refs.specialr3  r3  r3  r4  <module>   s   \   0
(
"



























	
"	










&	
:










6



+	



',

			



+	
?
-	;	
(w
	T
%0(
"	
""	
4D

'	
r	 
8 
,
/
	&	"
$&$




1
"&
"
H*'


)
8"$


&

	*



 $&

	
	
	
	
	)
	

c0



	

X


	
;"
B


?
	

	(
		

	
	
"
,



&
&0

	0)

	
)
:




4	
	 
	

(



















































































3
#9
&


