o
    Ih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  H/var/www/vscode/kcb/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)torch._subclasses.fake_tensorr7  
isinstancefake_devicer5  r   )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r9  r   .0xr3  r3  r4  	<genexpr>  s
    
z$_broadcast_shapes.<locals>.<genexpr>c                 S   s   | d uS r@  r3  rD  r3  r3  r4  <lambda>  s    z#_broadcast_shapes.<locals>.<lambda>   c                 s   s    | ]}t |V  qd S r@  len)rC  shaper3  r3  r4  rE        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  arg_idxcommon_shapeidxrK  r3  r4  rG    s    )%torch.fx.experimental.symbolic_shapesr?  tuplefilterrJ  r9  r   r   max	enumeraterange
ValueErrortorch_check)_shapesr?  shapesr3  rN  r4  _broadcast_shapes  s8   r]  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@  )r9  r"   rK  rC  r   r3  r3  r4  rE    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: !)r9  r   r"   utilsis_cpu_scalar_tensor
same_shaperK  r   RuntimeErrorstrr0  )rD  rK  )rP  r^  r3  r4  __maybe_broadcast  s   


z+_maybe_broadcast.<locals>.__maybe_broadcastc                 3   s    | ]} |V  qd S r@  r3  rB  )rf  rP  r3  r4  rE        )r]  rS  )r^  argsr3  )rf  rP  r^  r4  _maybe_broadcast  s
   ri  )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rm  atype_promoting_argstype_promotion_kindrr  rn  c                    s$    d ur |  | }t | g|S r@  )r=  )rr  r<  )rl  ro  r3  r4  _ref  s   z>_make_elementwise_unary_reference.<locals>.inner.<locals>._ref)
r   r+   r*   r)   r#   infer_aten_opra  get_aten_op__name__rj  ro  rv  rk  rm  rl  ru  ro  r4  inner  s    z0_make_elementwise_unary_reference.<locals>.innerr
   )ru  rk  rl  rm  r}  r3  r{  r4  !_make_elementwise_unary_reference  s   r  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  rh  kwargsfnr3  r4  _fn     z_make_alias.<locals>._fnry  )ry  inspectcurrentframef_back	f_globals
__module__)r  namer  r3  r  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  )rr  rh  r  r  r3  r4  r  	  s   z_make_inplace.<locals>._fn_r   )	getmodule)	r   ry  rj  getattratenr  r  __all__append)r  r  inplace_namer  _allr3  r  r4  _make_inplace  s   

r  rp  c                 C   
   t | S r@  )primsr,   rq  r3  r3  r4  r,        
r,   c                 C   r  r@  )r  r-   rq  r3  r3  r4  r-   #     
r-   c                 C   r  r@  )r  r.   rq  r3  r3  r4  r.   (  r  r.   c                 C   r  r@  )r  r0   rq  r3  r3  r4  r0   -  r  r0   c                 C   r  r@  )r  r/   rq  r3  r3  r4  r/   2  r  r/   c                 C   r  r@  )r  r1   rq  r3  r3  r4  r1   7  r  r1   c                 C   r  r@  )r  r2   rq  r3  r3  r4  r2   <  r  r2   c                 C   r  r@  )r  r3   rq  r3  r3  r4  r3   A  r  r3   c                 C   r  r@  )r  r4   rq  r3  r3  r4  r4   F  r  r4   inputc                 C   s   t | jS r@  )ra  is_complex_dtypedtyper  r3  r3  r4  r*  N     r*  c                 C   s   t | js| S t| S r@  )ra  r  r  r  r5   r  r3  r3  r4  r5   S  s   
r5   c                 C   r  r@  )r  r6   rq  r3  r3  r4  r6   [  r  r6   c                 C   r  r@  )r  r7   rq  r3  r3  r4  r7   `  r  r7   c                 C   r  r@  )r  r:   rq  r3  r3  r4  r:   e  r  r:   c                 C   r  r@  )r  r;   rq  r3  r3  r4  r;   j  r  r;   c                 C   r  r@  )r  erf_invrq  r3  r3  r4  r<   o  r  r<   c                 C   r  r@  )r  r=   rq  r3  r3  r4  r=   t  r  r=   c                 C   r  r@  )r  r>   rq  r3  r3  r4  r>   y  r  r>   c                 C   r  r@  )r  r?   rq  r3  r3  r4  r?   ~  r  r?   c                 C   r  r@  )r  rA   rq  r3  r3  r4  rA     r  rA   za,rs  rr  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`  )r9  r"   r   ra  r   r  r   r0  rX  r  rB   )rr  r  python_typemsgr3  r3  r4  rB     s   rB   c                 C   s   t | |}t | | | S r@  )r  rB   r   )rr  r  rr3  r3  r4  rC     s   rC   c                 C   r  r@  )rY  r&  r  r3  r3  r4  r$    s   
r$  c                 C   r  r@  )r  rD   rq  r3  r3  r4  rD     r  rD   rD  c                 C   s*   t t t | t | }t | |S r@  )rY  r   rD   r,   rg   r   )rD  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  rG        zimag.<locals>.<lambda>)	r9  r"   rY  rZ  ra  r  r  r  r   rq  r3  r3  r4  r     s
   
r   )rk  c                 C   s0   t | jst | jrt| S t| tjdS )Nr  )	ra  is_float_dtyper  r  r  rM   r!  rY  boolrq  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  )ra  r  r  rY  r   rN   r   r   r  r,   floatr&  r  rq  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  rq  r3  r4  rG        zisposinf.<locals>.<lambda>r  r  	rY  rZ  ra  r  r  r  r  r&  r  rq  r3  rq  r4  rO        
rO   c                    r  )Nc                      r  )Nz7Complex dtype is not supported for isneginf, got dtype r  r3  rq  r3  r4  rG    r  zisneginf.<locals>.<lambda>z-infr  r  rq  r3  rq  r4  rP     r  rP   c                 C   s   t | | S r@  r  r   rq  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  )ra  r  r  rY  r   r!  r  rq  r3  r3  r4  rR     s   rR   c                 C   r  r@  )r  	bessel_i0rq  r3  r3  r4  rS        
rS   c                 C   r  r@  )r  rU   rq  r3  r3  r4  rU     r  rU   c                 C   r  r@  )r  rV   rq  r3  r3  r4  rV     r  rV   c                 C   r  r@  )r  rW   rq  r3  r3  r4  rW     r  rW   c                 C   r  r@  )r  rX   rq  r3  r3  r4  rX     r  rX   c                 C   r  r@  )r  rY   rq  r3  r3  r4  rY      r  rY   dimr  c                 C   s6   |p| j }t|}t| |}t|t||dd |S )NTkeepdim)r  ra  get_computation_dtyper&   r   )rr  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  )r9  r   numelrY  r   r>   rV   r   r   r   r,   r  r   rs   )r  r  r  maxes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  )r9  r"   ra  is_boolean_dtyper  is_integer_dtyper   rY  finforU  minr   rQ   rP   rO   )rr  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  rG  e     z_neg_meta.<locals>.<lambda>)rY  rZ  r  r  rq  r3  r3  r4  	_neg_metab  s   
r  )rl  c                 C   r  r@  )r  r`   rq  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.)r9  r"   r  rY  r  rd  )rr  r  r3  r3  r4  ra   v  s
   ra   c                 C   s(   t | tsJ t| jrt| S | S r@  )r9  r"   ra  r  r  r  r   rq  r3  r3  r4  r     s   
r   c                 C   r  r@  )r  rc   rq  r3  r3  r4  rc     r  rc   rq  )decimalsr  c                C   s>   |dkr	t | S d| }d|  }t t t | ||S )Nr   
   )r  rd   r   )rr  r  ten_powten_neg_powr3  r3  r4  rd     s
   

rd   c                 C   r  r@  )r  r   rq  r3  r3  r4  r     r  r   c                 C   s   t dtdtt| S )NrH  )r   rs   r>   r`   rq  r3  r3  r4  re     s   re   c                 C   s2   t | jr|  }t|dkd| | S |  S Nr   )ra  r  r  r,   rY  r   rg   )rr  a_absr3  r3  r4  rf     s   rf   c                 C   r  r@  )r  rg   rq  r3  r3  r4  rg     r  rg   c                 C   r  r@  )r  rh   rq  r3  r3  r4  rh     r  rh   c                 C   r  r@  )r  ri   rq  r3  r3  r4  ri     r  ri   c                 C   s&   t j|  } t| dkdt| |  S Nr   rH  )mathpirY  r   ri   rq  r3  r3  r4  rj     s   
rj   c                 C   r  r@  )r  rk   rq  r3  r3  r4  rk     r  rk   c                 C   r  r@  )r  rm   rq  r3  r3  r4  rm     r  rm   c                 C   s
   t | | S r@  )r   rq  r3  r3  r4  rn     r  rn   c                 C   r  r@  )r  ro   rq  r3  r3  r4  ro     r  ro   c                 C   r  r@  )r  rp   rq  r3  r3  r4  rp     r  rp   c                 C   r  r@  )r  rr   rq  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  input_dtyper3  r4  rG    s    z!view_as_complex.<locals>.<lambda>r   c                   S   r  )Nz-Input tensor must have one or more dimensionsr3  r3  r3  r3  r4  rG    r  rM     c                   S   r  )Nz+Tensor must have a last dimension of size 2r3  r3  r3  r3  r4  rG     r  rH  c                   S   r  )Nz/Tensor must have a last dimension with stride 1r3  r3  r3  r3  r4  rG    r  c                 s   s    | ]	}|d  dkV  qdS )r  r   Nr3  )rC  strider3  r3  r4  rE  
  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  rG    r  c                   S   r  )Nz0Tensor must have a storage_offset divisible by 2r3  r3  r3  r3  r4  rG    r  )r  rY  rZ  ra  r  sizerJ  r  builtinsr   storage_offsetr  view_element_typecorresponding_complex_dtyper   )r  sizesold_stridesdimsr3  r  r4  r	    sB   




r	  c           	   	      s$   dt f fdd}|S )Nro  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rr  brs  rr  r  rn  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  rG  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  rG  5  r  c                      r  )Nz?: Receive two Number inputs to an elementwise binary operation!r3  r3  r  r3  r4  rG  ;  r  )rY  _check_valuer9  r   ri  r=  )rr  r  r<  )r  ro  supports_lhs_python_scalarsupports_rhs_python_scalarsupports_two_python_scalarsr3  r4  rv  %  s    	



z?_make_elementwise_binary_reference.<locals>.inner.<locals>._ref)ry  r   r)   r   Tensorr   r+   rw  ra  rx  rj  rz  rk  has_outr  should_register_decompositionr  r  r  ru  r|  r4  r}     s,   


z1_make_elementwise_binary_reference.<locals>.innerr~  )	ru  rk  r  r  r  r  r  r  r}  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`  )ri  r9  r"   r  ra  r   r  r   r0  rX  r  r   rs   r=  rr  r  r  r  r  r  r<  r3  r3  r4  rs   P  s   

rs   )ru  r  r  c                 C      t | |S r@  )r  rt   r  r3  r3  r4  rt   s     rt   )ru  c                 C   r  r@  )r  ru   r  r3  r3  r4  ru   |     ru   c                 C   r  r@  )r  
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  shift_right_arithmeticr  r3  r3  r4  rx     r  rx   c                 C   r  r@  )r  ry   r  r3  r3  r4  ry     r  ry   )ru  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`  )r9  r   r  r#  r  r2  rd  r   rh   r`   r,   rr  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   rX  )rr  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)r9  r#   r   r   rY  rm   rB   ra  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!)r9  r   rX  ra  get_higher_dtyper  rY  
complex128float64r&   ri  r   rr  r  r  r3  r3  r4  r     s   



r   )ru  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  rG  A  r  zfloor_divide.<locals>.<lambda>)r9  r   r#  r  r  r2  rY  rd  r  
device_putra  r  _floor_divide_floatr  _floor_divide_integerrZ  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  )
ri  r  	is_signedr  r}   rY  rh   r   r   r&   )rr  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   rH  r  r  )r   r   r   ry   r   r   ru   r   rD   r   rs   r#  r  r2  r|   )
rr  r  modr}   different_signed_inputsnon_zero_remaindermask	floor_div	basic_div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   mantissaexponentc                 C   s   t jt| S r@  )rY  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  )rY  r~   r   r   rQ   r   )r  r  input_eq_zeroinput_lt_zerozeros_and_onesr<  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  )rr  r  r  r3  r4  rG        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  rG        c                      s    d  dS )Nz6: atol must be greater than or equal to zero, but got r`  r3  r3  )r  r  r3  r4  rG    r!  )rY  r  r  rZ  r  rr  r  r  r  r3  )rr  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~   ra  r  r  r  r   r   rQ   r  convert_element_typerY  get_default_dtypers   r,   r   r   rM   r   )	rr  r  r  r  r&  closeallowed_error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  rY  int8int16r  r'  int32r   r   r,   r}   )rr  r  r  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  )rY  r   r   r   r   rM   ra  r  r  rV   r>   rW   rQ   complexr  )
rr  r  r  max_min_inf_maskneg_min_maskinf_valsnon_nan_vals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  rG  M  r  zlogaddexp2.<locals>.<lambda>r  r  )rY  rZ  ra  r  r  r   r   rN   r  rV   rW   rA   )rr  r  r  r3  r4  r5  	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  ra  r  r  r  r3  r3  r4  r   Y  
   r   c                 C   s   t | js
| dkS |  S r  r;  rq  r3  r3  r4  r   d  s   r   c                 C   s2   t | js
| dk} t |js|dk}t| |S r  )ra  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   )ru  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   rH  c                 C   s&   t | trd}t|tj|| |dS )Nz?Received a Number for the first argument, but expected a Tensorr  )r9  r   rX  rY  r   )rr  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  rG    r  zsub.<locals>.<lambda>rH  r  r  r`  )ri  r9  r"   rY  rZ  ra  r  r  r   r   r0  rX  r  r  r   r   r=  r  r3  r3  r4  r     s"   
r   r   )ru  r  rk  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  rG  	  r  zxlogy.<locals>.<lambda>r  r   r  )rY  rZ  r9  r"   r   r#  r  r2  r   r~   r   rV   rQ   r  )rr  r  rhsr3  r3  r4  r      s   $r   )ru  rk  r  c                 C   s0   t | }t |rt| |S tt| |S r@  )ra  	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  rG  B      zaddcdiv.<locals>.<lambda>r  ra  r   rY  r  r   r0  r  r?  r@  r  r  r3  rC  r4  r   -     
r   c                   sJ   dur| j }t| ttt  fdd | | |  S )z3
    Reference implementation of torch.addcmul
    Nc                      rB  r  r/  r3  rC  r3  r4  rG  ]  rD  zaddcmul.<locals>.<lambda>rE  rF  r3  rC  r4  r   H  rG  r   )rr  r  rU  r  rU  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!)rX  rY  rQ   rw   r   r   r   )rr  r  rU  r  a_isnan	conditionr3  r3  r4  r   c  s   

r   c                 C      t j| |dS )N)r  rY  r   )r  r  r3  r3  r4  rz        rz   c                 C   rJ  )N)rU  rK  )r  rU  r3  r3  r4  r{     rL  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  rM  r3  r4  rG    r  zwhere.<locals>.<lambda>)
NotImplementedErrorra  check_same_devicerY  rZ  r  r  ri  r  r   )rM  rr  r  r3  rQ  r4  r     s   

r   memory_formatrU  c                C   s   t j| |d}|S NrT  )r  r   )rr  rU  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  rd  r  r   )rr  r  rW  r  r3  r3  r4  r     s   r   c                 C   s>   |   dkrd|    d}t|t| j}|t| S )NrH  zCan't convert a tensor with z elements to a number!)r  rX  ra  r   r  r  r   )rr  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 rV  )r2  r  rZ  rY  preserve_formatra  is_contiguous_for_memory_format)rr  r2  r  rY  rZ  rU  r[  r\  r3  r3  r4  _to_will_alias  s   r_  c                  O   s   t r@  )rR  r  r3  r3  r4  _to_dispatch     r`  c                 C   s   | ||||d}|S N)r2  r  r\  rY  rU  r3  r2  r  r\  rY  rU  r  r3  r3  r4  
_to_device  s   	rd  c                 C   s   t | ||||d}|S rb  )rY  r2  rc  r3  r3  r4  _to_device_str  s   	re  c                 C   s   | |||d}|S )N)r  r\  rY  rU  r3  )r  r\  rY  rU  r  r3  r3  r4  	_to_dtype  s   rf  otherc                 C   s(   | j }| j}| j}||||||d}|S )N)r2  r  rZ  r\  rY  rU  )r2  r  rZ  )rg  r\  rY  rU  r2  r  rZ  r  r3  r3  r4  	_to_other)  s   rh  	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  rZ  rU  r2  rU  )	r9  re  rY  r2  r]  r0  indexr  pop)rr  ri  options_to_checkkwr3  r3  r4  _canonicalize_to_argumentsA  s   
rn  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[  rY  Fr\  r  rU  r2  rZ  )rJ  r`  rn  r_  rk  getr  r  r'  rY  r  r   )rr  rh  r  rY  r\  r  r3  r3  r4  r   Y  s(   

r   )has_identityaccepts_dim_tupler  keepdimsr  r  ro  rp  rq  r  rr  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@  rK  rC  irq  r3  r4  rE    rg  z_reduction.<locals>.<genexpr>zJreducing over zero-size dimension for reduction operation without identityc                    s"   g | ]}|vr j | nd qS rH  rv  rw  rr  r  r3  r4  
<listcomp>  s   " z_reduction.<locals>.<listcomp>c                    s   g | ]}| vr|qS r3  r3  rw  )r  r3  r4  r{        z7Expected the dtype of reduction result and out to match	copy_fromr   )r9  r"   ndimrd  r  r   ra  reduction_dimsrK  r  r   reduction_dtypesr&   rW  r  broadcast_in_dimr'   r(   r'  )rr  ro  rp  rq  r  rr  r  r  rs  valid_shaper  r  r  output_shapebroadcast_dimsr3  rz  r4  
_reduction  sV   


"

r  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 rV  )r   rY  contiguous_formatrF  r3  r3  r4  rG        z3_make_copy_from_view.<locals>._fn.<locals>.<lambda>)pytreetree_map)r  rh  r  r  r  r3  r4  r    s   z!_make_copy_from_view.<locals>._fn_copy)r  r  ry  r+   r   r  updaterj  )r  aten_fnannotationsr  	copy_namer3  r  r4  _make_copy_from_view  s   

r  c                 C   s:   t t jt | ||d}| jt jkr|jt jd}|S )Nr  r  )rY  r   r   r  uint8r   )rr  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&   rY  r  r9  listrS  rJ  r   r   r   r  r  r  r'  )rr  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  rr  r  r  rs  )r  ra  r  r  rY  int64r  r  r   r   SAMErr  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 ""rv  r3  rr  rK  r3  r4  rG  !	  s    zsum_to_size.<locals>.<lambda>r   c                 3   s2    | ]}|  d kr j | d kr|V  qdS rH  Nrv  rw  rr  leading_dimsrK  r3  r4  rE  (	  s    zsum_to_size.<locals>.<genexpr>T)r  r  r  )ra  extract_shape_from_varargsrY  rZ  is_expandable_torK  is_same_shaperJ  r  view_ofr  rS  rW  r   )rr  rK  reduce_dimsr3  r  r4  r   	  s   

r   c             	   C   r  r  )r  ra  r  r  rY  r  r  r  r   r   r  r  r3  r3  r4  r   0	  r  r   r  c             
   C   0   |dks|g kr
d }t | tj||d |dtjdS Nr3  Fr  rr  r  r  rp  rs  )r  r  r   r   r  rr  r  r  r  r3  r3  r4  r   N	     	r   c             
   C   r  r  )r  r  r   r   r  r  r3  r3  r4  r   f	  r  r   c                 C   s"   |d u rt | tr| }d } | |fS r@  )r9  r  )r  unbiasedr3  r3  r4  _dim_var_dispatch~	  s   r  
correctionr  r  c             
   C   sV   t ||\}}t||}|dks|g krd }t| ttj|d||d d dtjd}|S )Nr3  r  Tr  )	r  ra  set_correctionr  r   r  r   r   COMPLEX_TO_FLOAT)rr  r  r  r  r  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)r  r  )
r  ra  r  r  r   r  r&   rY  r   rm   )	rr  r  r  r  r  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. Inputr   z> dtype must be either a floating point or complex dtype. Got: r3  r3  )r  
orig_dtyper3  r4  rG  	  s
   zmean.<locals>.<lambda>r   rH  c                 3   ru  r@  rv  rw  rq  r3  r4  rE  	  rg  zmean.<locals>.<genexpr>r}  )r  r  r  r   r   KEEP_PROMOTED_TYPErY  rZ  ra  r  r  r9  r   r  rK  r  r   operatorr   r   r&   r"   r'   r(   )	rr  r  r  r  r  r  r  nelemr  r3  )rr  r  r  r4  r   	  s<   
	
*

r   out0out1)r  r  r  c                C   s|   t ||\}}t||}t| tj\}}| j}t| |} tj	| |||d\}}	t
|}
|d us4J t|
|t|	|fS r  )r  ra  r  r  r   r  r  r&   rY  r   rm   )rr  r  r  r  r  r  r  original_dtyper  a_meanr  r3  r3  r4  r   	  s   


r   c                C   s4   t ||\}}t| ||||d}t| ||}||fS )Nr  )r  r   r   )rr  r  r  r  r  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 )NrH  c                         d j  dS )Nz*addr: Expected 1-D argument vec1, but got -Dr  r3  )r  r3  r4  rG  $
  r  zaddr.<locals>.<lambda>c                      r  )Nz*addr: Expected 1-D argument vec2, but got r  r  r3  )r  r3  r4  rG  (
  r  r  r  c                         d  dS )NzBoolean z$ only supported for Boolean results.r3  r3  )arg_namer3  r4  rG  0
  r  r   c                         dt   S )Nzexpected bool/int beta but got r/  r3  r  r3  r4  rG  7
  r  c                      r  )Nz expected bool/int alpha but got r/  r3  r  r3  r4  rG  ;
  r  Fc                         dt   dj S Nzcannot safely convert z to r0  r  r3  )r  r  r3  r4  rG  G
  rD  c                      r  r  r  r3  )r  r  r3  r4  rG  K
  rD  )rY  rZ  r  r9  r  ra  r  r  r   rK  r   r0  intouterr  r   r   )r  r  r  r  r  argr3  )r  r  r  r  r  r  r4  r   
  s^   








r   r  rh  .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 )rH  r   N)r  r  rC  rr  r3  r3  r4  rE  ^
  s   & zatleast_1d.<locals>.<genexpr>rH  r   )r9  collectionsabcr   rS  rJ  r  rh  args_r1  r3  r3  r4  r   U
  s   
r   at_least_fnc                 C   s    | |}t |tsJ t||S r@  )r9  r"   r  )r  r  r  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  unsqueeze_atleast_1dr3  r4  rE  w
     $ zatleast_2d.<locals>.<genexpr>rH  )	r9  r  r  r   r   r  r   rS  rJ  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`.rM  c                 3   r  )   Nr  r  unsqueeze_atleast_2dr3  r4  rE  
  r  zatleast_3d.<locals>.<genexpr>rH  r   )	r9  r  r  r   r   r  r   rS  rJ  r  r3  r  r4  r   |
  r  r   r  r  r  c                 C   s$   |d ur|n|   }t| |||S r@  )r  r  r   )rr  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@  )rY  Sizer]  )r\  r3  r3  r4  r   
  r  r   c                  G   s4   t | dkrt| d ts| d } tt| ddiS )NrH  r   r^  F)rJ  r9  r  r  ri  tensorsr3  r3  r4  r   
  s   r   c                 C   s8   t |t | j }tt|t | j| }t| ||S r@  )rJ  rK  rS  rW  r  r  )rr  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@  )ra  suggest_memory_formatrY  r  )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!rP  Fr>  rH  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  )examplerx  r   r3  r4  rG  
  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  rG  	  s
    c                 s       | ]}|j V  qd S r@  )requires_gradrB  r3  r3  r4  rE         zcat.<locals>.<genexpr>r   r  r2  r  rU  rT  )rJ  rX  r9  r"   ra  rS  rR  r?  rV  r  rY  rZ  rK  r  r  r   	Exceptionr  r  r2  canonicalize_dimvalidate_idxr  r   r   )
r  r  r  r  tensorr?  rK  filteredrU  r  r3  )r  rx  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 r  )r  r   r  rB  r3  r3  r4  rE  5  s     
zcolumn_stack.<locals>.<genexpr>rH  )rS  r   r  aligned_tensorsr3  r3  r4  r   3  s   
r   c                 C   s*   t | js| S | jrt| S t| S r@  )ra  r  r  	is_sparserY  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 rI  r3  )r  r3  r4  rG  K  r  z!constant_pad_nd.<locals>.<lambda>c                      rB  )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.rI  r3  )l_inpr  r3  r4  rG  V  s
    rH  c                 s   s    | ]}|d k V  qdS )r   Nr3  )rC  pr3  r3  r4  rE  m  rL  z"constant_pad_nd.<locals>.<genexpr>c                	      s6   d    d  dd   d   d	S )NzThe input size z, plus negative padding r  rH  zG resulted in a negative output size, which is invalid. Check dimension z of your input.r3  r3  )rx  input_sizesl_diffr  pad_idxr3  r4  rG  w  s    
r  F)rY  rZ  rJ  rK  rW  r   r  r   r   r  r  ra  r  r  r  r2  r  r  rB   r  r   )
r  r  r  l_padc_input	new_shapenew_dimrU  r<  c_outputr3  )rx  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  rG    r  zcontiguous.<locals>.<lambda>rT  )rY  rZ  r]  ra  r^  r   )rr  rU  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  rG    r  zdstack.<locals>.<lambda>r  )rY  rZ  rJ  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>  rH  c                   S   r  )Nz3expand: the requested shape has too few dimensions!r3  r3  r3  r3  r4  rG    r  zexpand.<locals>.<lambda>rM  c                      r  )Nz3expand: attempting to expand a dimension of length r`  r3  r3  rF  r3  r4  rG    r  )rR  r?  rJ  r9  r   rS  rY  rZ  rK  r  rV  ra  validate_shaper  r  rW  )rr  rK  r?  r  shape_rQ  
offset_idxrequested_lengthr3  rF  r4  r     s0   


r   c                 C   s   |  |jS r@  )r   rK  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   rw  rr  
chunk_sizer  r3  r4  r{    s    zchunk.<locals>.<listcomp>)rX  ra  r  r  rK  r  r4   rD   rW  r  r   rS  )rr  r  r  r  lengthfull_chunkstail_chunk_sizer  r3  r  r4  r     s   
r   rM  	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  )ra  r  r  r  _collapse_view_helpercollapse_viewcollapse)rr  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)
r9  rS  r  rX  ra  canonicalize_dimsr  validate_no_repeating_dimsr  revrz  r3  r3  r4  r      s
   
r   c                 C      | j dk r	tdt| dS )Nr  zInput must be >= 2-d.ry  r  rd  r   rq  r3  r3  r4  r        

r   c                 C   r  )NrH  zInput must be >= 1-d.r  r  rq  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  rG  #  r  znarrow.<locals>.<lambda>c                   S   r  )Nz-narrow() cannot be applied to a 0-dim tensor.r3  r3  r3  r3  r4  rG  '  r  c                   S   r  )Nz&narrow(): length must be non-negative.r3  r3  r3  r3  r4  rG  (  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  rG  .  r   c                      s   d d d  dS )Nzstart (z) + length (z) exceeds dimension size (z).r3  r3  r#  r  r  r3  r4  rG  4  r|  )r9  r"   rY  rZ  r  ra  r  r  r   r   r  r  r  r  _check_with
IndexErrorr  rK  r   r  r  )rr  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  r  r  )ra  r  r  r  r  r&   r9  r"   rY  r   r   )	rr  r'  r(  r  a_acc
biased_varr   rstdr  r3  r3  r4  
_normalize=  s   


r,  
dimensionsc                 C   s   t |D ]}t| |} q| S r@  )sortedrY  r  )rD  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  rG  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 = rv  r3  r  r5  r3  r4  rG  r  s    r  )rY  rZ  r  r   r,  r  rK  r  rW  r/  r&   r  r   )r  r0  r1  r2  r3  r4  r5  r(  r  input_reshapedr  r   r+  r  unsqueeze_biasunsqueeze_weightr3  r6  r4  r   a  s@   




r   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 )NrH  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 = )re  r3  )r;  r3  r4  rG    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 = re  rK  r3  )r;  r0  r3  r4  rG        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  )r1  r;  r3  r4  rG    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  rG    s    )r  mtia)rJ  rY  rZ  rK  rS  r  r   r  rW  r,  r&   r  r2  r0  )r  r;  r0  r1  r(  normalized_ndimaxisr  r  r   r+  r3  )r1  r  r;  r0  r4  r     sJ   	
	




r   c                 O   s   t | S r@  )r   )	fake_modefuncrh  r  r3  r3  r4  native_layer_norm_fake  s   rD  c                 G   s    t | jt |}t| |S r@  )ra  r  r  extract_dims_from_varargsr  r   )rr  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  rG    r  zrenorm.<locals>.<lambda>r   c                   S   r  )Nz'renorm: non-positive norm not supportedr3  r3  r3  r3  r4  rG    r  c                   S   r  )Nz#renorm: maxnorm must be real-valuedr3  r3  r3  r3  r4  rG    r  c                      r  )Nz,renorm: expected maxnorm to be >= 0 but got r3  r3  )rG  r3  r4  rG    r  rH  c                      r  )Nz/renorm: input needs at least 2 dimensions, got  dimensionsr3  r3  r  r3  r4  rG    r  T)r  r  r  gHz>r  )rY  rZ  r9  r2  r  ra  r  r  rW  r  r  linalgvector_normr   r  r'  r   )	r  r  r  rG  r  acc_typer]   r(  norm_factorr3  )rG  r  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  rQ  r3  r4  rG  $     

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  rG  A  r  rH  r  c                   S   r  )Nzstft expected a 1D or 2D tensorr3  r3  r3  r3  r4  rG  C  r  r   r  c                         d  d S )Nzstft expected 0 < n_fft <= z, but got n_fft=r3  r3  )r  rN  r3  r4  rG  S  r!  c                      r  )Nz0stft expected hop_length > 0 but got hop_length=r3  r3  )hop_length_r3  r4  rG  W  r  c                      r  )Nz9stft expected 0 < win_length <= n_fft but got win_length=r3  r3  )win_length_r3  r4  rG  [  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 rv  r3  )r_  rQ  r3  r4  rG  _  r[  r  rM  )	dimensionr  steporthoc                   S   r  )Nz9Cannot have onesided output if window or input is complexr3  r3  r3  r3  r4  rG  x  r  r  r]   )rY  rZ  r2  r*  ra  r  r  r  r  r  	itertoolsr   rK  r  r  r  r  r   r   r   fftrfft
transpose_squeeze_view_as_real)r  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  return_complex_original_ndim
extra_dims
pad_amountextended_shapeleftinput_pad_amountcomplex_fftr]   r  r3  )r^  r  r  rN  r_  rQ  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                      rX  NzBistft input and window must be on the same device but got self on rY  r1  r3  rZ  r3  r4  rG    r[  zistft.<locals>.<lambda>r\  c                      s   d j  dj   S rr  r1  r3  rZ  r3  r4  rG    s   rM  rH  r   c                   S   r  )Nz"istft input tensor cannot be emptyr3  r3  r3  r3  r4  rG    r  r  r  c                      r  )Nz8istft expected a tensor with 2 or 3 dimensions, but got r  r3  r  r3  r4  rG    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  rG    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  rG    r  c                   S   r  )Nz+istft expected 0 < hop_length <= win_lengthr3  r3  r3  r3  r4  rG    r  c                   S   r  )Nz&istft expected 0 < win_length <= n_fftr3  r3  r3  r3  r4  rG    r  c                   S   r  )NzDInvalid window shape. window has to be 1D and length of `win_length`r3  r3  r3  r3  r4  rG    r  r  rb  c                   S   r  )Nz9cannot have onesided output if window or input is complexr3  r3  r3  r3  r4  rG    r  rc  c                   S   r  )Nz:Complex windows are incompatible with return_complex=Falser3  r3  r3  r3  r4  rG    r  )r  r  r  )r  r  r  ra  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)rY  rZ  r2  ra  r  r  r  r  r  rK  corresponding_real_dtyper   r  r   r  r   re  ifftr   irfftr  unfold_backwardr   r   rU  r   warningswarn)r  rN  rO  rP  rQ  rR  rT  rU  r  rV  r^  r_  n_framesfft_sizeexpected_output_signal_len	onesided_
real_dtypewindow_ro  rk  r]   y_tmpywindow_envelopr  endr3  rZ  r4  r-    s   










r-  a_shapea_strider`  ra  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)wrap_scalarr   rH  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  rG  &  rD  z*_get_unfold_shape_stride.<locals>.<lambda>c                      r  )NzStep is z but must be > 0r3  r3  ra  r3  r4  rG  +  r  )rJ  ra  r  rY  rZ  r  r  )	r  r  r`  r  ra  a_ndimlast_striderK  stridesr3  )r  r  r  ra  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 )NFr  c                   S   r  )Nzbrepeat: Number of dimensions of repeat dims can not be smaller than number of dimensions of tensorr3  r3  r3  r3  r4  rG  >  r  zrepeat.<locals>.<lambda>r   rH  c                 s   s    | ]	\}}|| V  qd S r@  r3  )rC  padded_sizerepeat_sizer3  r3  r4  rE  I  s
    
zrepeat.<locals>.<genexpr>r  T)keyreverse)ra  r  rY  rZ  rJ  rK  r   r  r  rS  zipr  r  r2  r  r  make_contiguous_strides_forrV  r  rU  r  sortr  
itemgetterr   r   r   )rr  repeat_shapenum_new_dimensionspadded_shapedim_sizetarget_shapeurtensor_shapeurtensor_strider  enumerated_stridepermute_order_sorted_striderepeat_xtensorcloned_result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_eqFr  rH  rM  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 rv  r3  r  rQ  r3  r4  rG    rD  z&_reshape_view_helper.<locals>.<lambda>)rR  r?  r  ra  r  
infer_sizer  r   r  r  r  r  r  rJ  rK  r   is_contiguousrY  	split_dimr  r   r  rX  r   rZ  )rr  r  rK  r?  r  _ar  dim0dim1last_dimaccumr  r  r  r  r3  r  r4  _reshape_view_helperr  s   












r  rK  c                 G      t | g|R ddiS )Nr  Tr  r  r3  r3  r4  r        r   c                 C      |  | S r@  )r   r  r  rg  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 dimensionsrH  z`shifts` requiredz*shifts and dimensions must align. shifts: z, dims: Nr1  )ra  r  r  r9  r   r  r   r  rJ  r&  rd  rY  r   r   r  rK  r  r2  rJ   r   )rr  r  r  
len_shiftslen_dimstail_shifts	tail_dimsfirst_dim_rolledr  r  r  rQ  r3  r3  r4  r     s@   


r   r   rH  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   rH  z7expected rotation dims to be different, but got dim0 = z and dim1 = r\  r  rT  )
rJ  rd  r  ra  r  rY  r   r   r   r  )rr  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   rH  z4stack expects each tensor to be equal size, but got z at entry 0 and z
 at entry )rK  rW  rJ  )r  entry_shaperx  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 TensorListrH  c                    s   g | ]}|  qS r3  )r  r_  wrapped_dimr3  r4  r{  e  rD  zstack.<locals>.<listcomp>)rJ  ra  r  r  r  r  rK  insertrY  r   r  )r  r  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  ra  r  r&   r  r>   r   r   r   )rr  r  r  r  r  r  a_exp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  rG    r  zhstack.<locals>.<lambda>rH  )rY  rZ  rJ  r   r  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  rG    r  zvstack.<locals>.<lambda>)rY  rZ  rJ  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  rG    r  zunflatten.<locals>.<lambda>rH  )	ra  r  r  rY  rZ  rJ  r  rS  rK  )rr  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  rG    r  zunbind.<locals>.<lambda>r3  c                 3   s    | ]	}t | V  qd S r@  )rY  r   )rC  sr  r3  r4  rE    s    
zunbind.<locals>.<genexpr>)rR  r?  ra  r  r  rY  _check_indexrJ  rK  rS  r   )r   r  r?  r3  r  r4  r    s   r  rj  r  c                 C   s   | j tjd|||S rV  )r   rY  r  rI   )rD  r  rj  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 )NrH  c                      r  Nz(Index should have dimension 1 or 0 (got r"  r  r3  rj  r3  r4  rG    r  zindex_copy_.<locals>.<lambda>r   )ra  r  r  rY  rZ  r  slice)rD  r  rj  r  r  rQ  r3  r  r4  rI     s   
rI   c                 C      t | |||ddS )NFinplace_index_fillrD  r  rj  r  r3  r3  r4  rK     s   rK   c                 C   r  )NTr  r  r  r3  r3  r4  rL     s   rL   r  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 )NrH  c                      r  r  r  r3  r  r3  r4  rG    r  z_index_fill.<locals>.<lambda>r   c                      r  )Nz<Only supports 0-dimensional value tensor. Got a tensor with r  r  r3  rA  r3  r4  rG    s    )r  rZ  r2  )rY  rZ  r  r9  r"   r#  r  rZ  r2  r  r  rK  r  r   r  rI   rH   r   r   r  r  copy_)rD  r  rj  r  r  zero_dimr  rK  rH   r  new_outr3  )rj  r  r4  r    s>   







r  c                C   s   | j tjdj||||dS )NrT  r  )r   rY  r  
index_add_)rD  r  rj  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 )NrH  c                      r  r  r  r3  r  r3  r4  rG    r  zindex_select.<locals>.<lambda>r   )
ra  r  r  rY  rZ  r  r  rH   r   r  )rD  r  rj  rQ  r3  r  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 r  r3  )rC  rQ  r  r3  r3  r4  rE  $  s    zsqueeze.<locals>.<genexpr>r  c                 3   s&    | ]} j | d kr|V  qdS r  rv  )rC  drr  r?  r3  r4  rE  0  r  rH  T)r  )rR  r?  rS  rV  rK  r  r   r  r  ra  r  r9  r   rJ  r  r.  )rr  r  r  r  	dims_listrx  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  rG  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   rK  r3  r  r  r  r3  r4  rG  J  s    )rW  rJ  rY  _check_is_sizer%  rX  r  r   rK  r  r  r  r   r  )r  r  r  rx  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 rH  r  zntensor_split: non-scalar indices_or_sections tensors must have only one dimension, but received a tensor with rH  c                    s    g | ]} |d    |  qS ry  r3  rw  indicesr3  r4  r{         z tensor_split.<locals>.<listcomp>)ra  r  r  rX  r9  r"   r2  r0  r  rY  longr   r   r   rK  r  rD   rW  r  rS  r  r   tolistr  rJ  )rr  r  r  _dimr  sectionsr  min_split_sizenum_splits_one_extrar  	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 )NrH  c                         dt  j d S )NzPtorch.hsplit requires a tensor with at least 1 dimension, but got a tensor with  dimensions!re  r  r3  rq  r3  r4  rG    
   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  )rr  r  r  r3  r4  rG    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  rG       
rY  rZ  r  r9  r   rK  r   _check_typer  rS  rr  r  r  r3  )rr  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                      r  )NzPtorch.vsplit requires a tensor with at least 2 dimension, but got a tensor with r  r  r3  rq  r3  r4  rG    r  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   r  r`  rv  r3  )rr  r  r3  r4  rG    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  r  r3  r4  rG    r  r  r  r3  )rr  r  r  r4  r    s"   


	r  r  c                    s@   |    t dv  fdd  dkrt| |S t| |S )N)rH  r  c                      r  )Nz'diag(): Supports 1D or 2D tensors. Got Dr3  r3  r  r3  r4  rG    r  zdiag.<locals>.<lambda>rH  )r  rY  rZ  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 rv  r3  r   r  r3  r4  rG    
    z"diagonal_scatter.<locals>.<lambda>)ra  clone_preserve_stridesr   rY  rZ  rK  r   )r  r  r  r  r  r  r3  r  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
    )rQ  rankc                      r]  Nz(diagonal dimensions cannot be identical r!  r3  r3  r  r  r3  r4  rG  (  r!  zdiagonal.<locals>.<lambda>r   c                        g | ]\}}| fvr|qS r3  r3  rC  rx  r  r  r3  r4  r{  8  r  zdiagonal.<locals>.<listcomp>c                    r  r3  r3  r  r  r3  r4  r{  ;  r  )r  r  r  )r  ra  r  rY  rZ  r  rU  r  r  r  rV  r  r   )
r  r  r  r  num_dimsr  	diag_sizer  r  r  r3  r  r4  r     s(   
&$
r   rs  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
    rH  )r  rQ  c                      r]  r  r3  r3  r  r3  r4  rG  Z  r!  zdiag_embed.<locals>.<lambda>rM  r   Fr  r2  r  r  r2  r  c                    s    g | ]}| fv rnd qS ry  r3  rw  r  r  r  r3  r4  r{  u  r  zdiag_embed.<locals>.<listcomp>)r  ra  r  rY  rZ  r  r  rK  r  r,   r%  r  r2  r   r  r   r  r  rW  rJ  r   mask_tensorr   )r   r  r  r  r  t_shapezpaira_rangeb_rangecond
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 )rH  rM  )r  r  rC  r  r3  r3  r4  r{    s    z(_block_diag_iterable.<locals>.<listcomp>c                 s   s    | ]}|j d  V  qdS r  rv  r  r3  r3  r4  rE    rg  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 rH  r  r3  )rx  r  r3  r4  rG    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  rx  r  r3  r4  rG    s    r  rH  r  )r  r   r2  rV  rY  rZ  r  rK  r%  r  r   )	r  
tensors_2dncolsr  	col_startrowcolro  rightr3  r	  r4  _block_diag_iterable}  s0   



r  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.
    )r  r  r3  r3  r4  r     s   r   r  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 r  r   r  z3torch.dsplit attempted to split along dimension 2, zbut the size of the dimension r  r`  )r  rd  r9  r   rK  r   )rr  r  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 r  r   rH  )r  rd  rY  r   rq  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  rG    r  zT.<locals>.<lambda>)rY  rZ  r  r   rq  r3  r3  r4  r     s
   r   c                 C   r  r@  )r  r  rq  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 )NrH  r   )
ra  r  r  r  r   defaultr  rW  rY  r   )rr  r  r  _dim0_dim1rF  r3  r3  r4  r     s   r   c                 C   s&   t | j|  |||\}}| ||S r@  )r  rK  r  r   )r  r`  r  ra  rK  r  r3  r3  r4  r     s   r   c                 C   s   |  |||jtjdS rV  )r   r   rY  r  )r  r`  r  ra  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  rH  r1  rM  )
r  ra  r  r  rY  r  rK  r2  rW  r   )rC  initrr  r  r  r  r  rgr  r  masked_ar3  r3  r4  _cumsumprod_common  s   r  c                C      t td| |||dS )Nr   rC  r  rr  r  r  r  )r  r   rr  r  r  r  r3  r3  r4  r        r   c                C   r  )NrH  r  )r  r   r  r3  r3  r4  r   $  r  r   c                 C   s(   | j d }t||}tj| |f|dS )NrH  r  )r  ra  r  r  expand_dims)rr  r  r  r3  r3  r4  r  0  s   
r  c                 G   r  )Nr  Fr  r  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)rM  )r   rq  r3  r3  r4  r   H  s   
r   r  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  rr  r  r3  r4  rG  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  rG  ]  s   rM  r   )rY  rZ  r  ra  r  r  gatherr  r  rK  r  infer_size_shapesr   )rr  r  r  
self_sizesbroadcast_shapeindices_broadcastindices_sizesself_broadcastr3  r  r4  r   N  s&   
	





r   r  rZ  r2  r  r[  rU  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  rG    r  zempty.<locals>.<lambda>c                      r  )Nz/torch.empty: received an unknown memory format r`  r3  r3  rT  r3  r4  rG    r  r  rZ  r2  r[  r  )rY  rZ  r]  ra  r  r  r  channels_last_3d!make_channels_last_3d_strides_forchannels_last!make_channels_last_2d_strides_forr  )r  rZ  r2  r  r[  rU  rK  r  r3  rT  r4  r  s  s.   





r  c                 C   s   t j| ||||dS )Nr  )r  r  )rK  physical_layoutr  rZ  r2  r  r[  r3  r3  r4  r    s   
r  r  rZ  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[  rZ  )r  rZ  r2  rY  r  )rr  r  r  rZ  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
    Nr-  )r  rZ  r2  rY  r  )rr  r  r  r  rZ  r2  r[  r3  r3  r4  r    s   r  r&  c              	   G   @   t |}| d u rt } tj|| tjkrdnd| ||||dS NFr   r&  ra  r  rY  r(  r  r  r  rZ  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 r/  r  rZ  r2  rY  r  r  rr  r  r  rZ  r2  r[  r  r3  r3  r4  r       r  c              	   G   r.  NTrH  r&  r0  r1  r3  r3  r4  r     r2  r   c             	   C   r3  r7  r4  r5  r3  r3  r4  r  2  r6  r  
fill_valuec                C   sL   |d u r| j n|}|d u r| jn|}|d u r| jn|}tj||||||dS )Nr,  )r  rZ  r2  rY  r  )rr  r  r8  r  rZ  r2  r[  r3  r3  r4  r  M  s   r  )r  r2  rZ  r[  r  rU  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 )Nr%  r&  )
r  rZ  r2  rY  r]  r  rK  ra  3compute_elementwise_output_logical_to_physical_permr  )rr  r  r2  rZ  r[  r  rU  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  rG    r  zarange.<locals>.<lambda>c                   S   r  Nz7upper bound and lower bound inconsistent with step signr3  r3  r3  r3  r4  rG    r  c                   S   r  r;  r3  r3  r3  r3  r4  rG    r  c                 S   s   t | t p
t| S r@  )r9  r   r  rM   rF  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  rG    r!  c                      r  )Nzstep must be finite but got r3  r3  r  r3  r4  rG    r  c                 s       | ]}t |tV  qd S r@  rA  rC  r  r3  r3  r4  rE    rg  zarange.<locals>.<genexpr>)r  ra  r  r2  r  rH  FT)ra  check_layoutcheck_pin_memoryrY  r2  device_or_defaultr9  r2  rZ  r  r   r  r(  r  r   r  r  r4   r  iotar  get_acc_typer&   requires_grad_)r  r  ra  r  rZ  r2  r[  r  r<  rh  integer_args
is_integerxstartxendxsteprf   r  rj  r  r  r3  )r  r  ra  r4  r    s   




	



r  )r  r  r0  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  rH  )r9  r   r  r  r  r,   rY  r   ra  "compute_elementwise_output_stridesri  r  r  copy_stridedr=  )	r  r  r0  r  r  coeffbaser<  r  r3  r3  r4  rT     s   


rT   )r  r2  rZ  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  rG  &  r  zlinspace.<locals>.<lambda>c                   S   r  rO  r3  r3  r3  r3  r4  rG  ,  r  c                 s   r=  r@  r9  r2  r>  r3  r3  r4  rE  0  rg  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  rG  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  ry  r3  )r  r  rN  r3  r4  rG  B  s    c                   S   r  )Nz$number of steps must be non-negativer3  r3  r3  r3  r4  rG  F  r  )rZ  r2  r[  r  r  r  rH  r  r  )r  r   )r9  r#   rY  rZ  r  r&   r  r  r   ra  r  r(  r  r  r  r   r  r  opsr  rY  r  r  r  r  r  r  r   r  r   r   )r  r  rN  r  r2  rZ  r[  r  factory_kwargsempty_tensorr  	dtype_redr  r  cast_rgra  r  r3  )rQ  r  r  r  rN  r4  r    sx   






r  r  rM  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  rG    r  zlogspace.<locals>.<lambda>c                   S   r  rW  r3  r3  r3  r3  r4  rG    r  c                 s   r=  r@  rP  r>  r3  r3  r4  rE    rg  zlogspace.<locals>.<genexpr>r&  )rY  r(  r  ra  r  r9  r   r   r#   rZ  r  r&   r  r   r  r  r2  rR  r  r   )r  r  rN  rM  r  r2  rZ  r[  r  rQ  _dtyperetr3  r3  r4  r  p  sP   










r  indexingc                 C      d S r@  r3  )r  rZ  r3  r3  r4  r     ra  r   c                 G   r[  r@  r3  )rZ  r  r3  r3  r4  r     ra  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   rH  c                 s   r=  r@  r9  r"   r  r3  r3  r4  rE    rg  zmeshgrid.<locals>.<genexpr>c                   S   r  )Nz)meshgrid expects its inputs to be tensorsr3  r3  r3  r3  r4  rG    r  zmeshgrid.<locals>.<lambda>c                   S   r  )Nz'meshgrid expects a non-empty TensorListr3  r3  r3  r3  r4  rG    r  c                   S   r  )Nz3meshgrid expects all tensors to have the same dtyper3  r3  r3  r3  r4  rG    r  c                   S   r  )Nz4meshgrid expects all tensors to have the same devicer3  r3  r3  r3  r4  rG    r  Fxyr  ijc                      r  )NzDtorch.meshgrid: indexing must be one of "xy" or "ij", but received: r3  r3  )rZ  r3  r4  rG    s   c                      r  )NzEtorch.meshgrid: Expected 0D or 1D tensor in the tensor list but got: r3  r3  )r   r3  r4  rG    r  ry  )r9  r  rS  rJ  rY  rZ  r  r   rW  r  r2  r"   r  r  r  rV  r  r  r  )rZ  r  rx  swap_first_and_second_tensorsresult_shapegridsr3  )rZ  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  rc  rb  r3  r4  rG    s
   zmovedim.<locals>.<lambda>)r  r  c                         dt   dS )Nz#movedim: repeated dim in `source` (r"  rd  r3  )rb  r3  r4  rG    r!  c                      rf  )Nz(movedim: repeated dim in `destination` (r"  rd  r3  )rc  r3  r4  rG     r!  r   NrH  )r0  r  rY  rZ  rJ  r  rS  ra  r  setdictr  rW  ro  r  r   )r  rb  rc  r  ssdssssdssr  r  sidir  r  r3  re  r4  r     sF   	




r   )r  r2  rZ  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  r  )	ra  r?  r@  r  rY  r(  r2  r  r  )rK  r  r  r2  rZ  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  )ro  r3  r4  rG  h  r  zeye.<locals>.<lambda>c                      r  )Nz%m must be greater or equal to 0, got r3  r3  )r  r3  r4  rG  i  r  Fr  rM  ry  r&  )rY  rZ  r  r  r  r  r   r   )ro  r  r  rZ  r2  r[  r  range_nrange_mr  oner3  )r  ro  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  r&  )	ra  r?  r@  type_to_dtyper0  rY  r2  r  rB   )rK  r8  r  rZ  r2  r[  r  er3  r3  r4  r    s   

r  r  rZ  r2  r[  r  rU  c          	   	   C   s"   t j| ||||||d}t||S )Nru  )rY  r  rB   )	rr  r8  r  rZ  r2  r[  r  rU  rt  r3  r3  r4  r    s   
	r  c             
   C   .   t j| |p| jt jkrdnd||||||dS )NFr   ru  rY  r  r  r  rr  r  rZ  r2  r[  r  rU  r3  r3  r4  r&       r&  c             
   C   rv  )NTrH  ru  rw  rx  r3  r3  r4  r!    ry  r!  c                 G   s>   t | t |}t | } t |}tj|dd| ||dS )Nr  r  )r   r   r  r2  r  )ra  r@  r  dtype_or_defaultrA  r  r^   )r  r2  rZ  r  r[  rK  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  )	ra  r?  r@  rs  r0  rY  r2  r  r#  )rr  r  rZ  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  )
ra  r  r9  r   r   rY  r  canonicalize_devicer  _uniform_helper)rK  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  rG  4  r  zmasked_fill.<locals>.<lambda>cudaxpur.  r  c                   S   r  )Nz,Expected `value` to be on same device as `a`r3  r3  r3  r3  r4  rG  >  r  c                      r  )Nzcould not convert to type z without overflowr3  r3  )r  r3  r4  rG  I  r  )ra  r   r  r9  r   r0  r  rY  rZ  r2  _C_get_privateuse1_backend_namer2  r   r&   r   r   )rr  r  r  
value_typeis_cpu_scalarr  r3  )r  r  r4  r   (  s4   





r   c                 C   s   t | ||}| | | S r@  )rY  r   r  )rr  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  rY  r   r   r   )rr  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 )NFrO  r   T)
ra  rS  check_same_dtyper  r  rK  r  r   r   r~   )rr  r  rD  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  )r9  r   rJ  re  rS  rW  r  rY  rI  matrix_normrJ  )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  rG    r  ztrace.<locals>.<lambda>r   )rY  rZ  r  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 )Nrr  r  rn  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  rG    r  ztriu.<locals>.<lambda>rs  r1  rM  
rY  rZ  r  rK  r  r2  r  ra  r   r   rr  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  rG    r  ztril.<locals>.<lambda>rs  r1  rM  r  r  r3  r3  r4  r    r  r  r  r  c           
      C   s   | dks|dkr
dS |dkrt |d| nt| | dk}tdt || | }tdt | | | }|| d }|| | d }|| }td|| }	||	|fS )Nr   r   r   r   rH  r  )r  r  rU  )
r  r  r  m_first_row
m_last_row	n_row_alln_row_trapezoidtrapezoid_size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  )r  r3  r4  rG    r  z_trilu_checks.<locals>.<lambda>c                      r  )Nzcol must be non-negative, got r3  r3  )r  r3  r4  rG    r  c                      s   d d  dS )Nr  z" not implemented for ''r3  r3  )r  r  r3  r4  rG    s    )rY  rZ  r.  r  )r  r  r  r  rZ  r[  r3  )r  r  r  r  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   rZ  r2  r[  r  r  r  rH  )r  r  rU  r   rY  r  r  rD   rm   r&   r   r   )r  r  r  r  rZ  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  rH  )rU  r  r  )
r  r  r  r  r  trapezoid_size_trilrectangle_size_trilr  	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  rH  r  )r  r  rU  r   rY  r  r  rD   rm   r&   r   r   )r  r  r  r  rZ  r2  r[  r  r  r  
col_offsetr  r  r  r  r  r  r  r  r3  r3  r4  r  =  s*   

""

r  )	out_int32r  
boundariesr  r  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 )	NrH  c                      s   d    dS )Nz2boundaries tensor must be 1 dimension but got dim(r"  r  r3  r  r3  r4  rG  s  r!  zbucketize.<locals>.<lambda>rM  r   r  r  r  )rY  rZ  r  r9  r  r  r.  r  rK  r&  r%  r2  r   r!  r  r  r  rX   rW  r   )rr  r  r  r  	out_dtypen_boundariesr  r  midmid_valcond_midcond_update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  rG        zcauchy.<locals>.<lambda>r  c                      r  )Nz-cauchy_ expects sigma > 0.0, but found sigma=r3  r3  )sigmar3  r4  rG    r  r  )rY  rZ  ra  r  r  r  r  ro   r  r  	rand_like)r  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  rG    r  zexponential.<locals>.<lambda>r  c                      r  )Nz4exponential_ expects lambda > 0.0, but found lambda=r3  r3  )rater3  r4  rG    r  r  r  rM  )rY  rZ  ra  r  r  r  r  r  r  r(  r   rV   )r  r  r  uniform_valepsilonrI  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  rG    r  zgeometric.<locals>.<lambda>r   rH  c                      r  )Nz0geometric_ expects p to be in (0, 1), but got p=r3  r3  )r  r3  r4  rG    r  )
rY  rZ  ra  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  rG    r  zlog_normal.<locals>.<lambda>r   c                      r  )Nz-log_normal_ expects std > 0.0, but found std=r3  r3  r   r3  r4  rG     r  )	rY  rZ  ra  r  r  r  r  r>   
randn_liker  r   r   r  r3  )r  r   r4  rZ     s   

rZ   )r   r   )r  r  rZ  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  rG    r  znormal.<locals>.<lambda>c                 s   s    | ]
}t |tr|V  qd S r@  r\  r_  r3  r3  r4  rE  #  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  rG  &  r  c                   S   r  )Nz.Cannot pass layout, or pin_memory without sizer3  r3  r3  r3  r4  rG  *  r  c                 s   r  r@  rv  r_  r3  r3  r4  rE  -  r  c                   S   r  )Nz>normal expects mean and std to be scalars when size is definedr3  r3  r3  r3  r4  rG  3  r  r  r  r  F)r   r   r  r2  r  r  )rY  stridedr9  r"   rZ  rS  rJ  r]  r  r2  r(  r  r^   )
r   r   r  r  r  rZ  r2  r[  r  normal_samplesr3  r  r4  r^     sD   


	r^   )r  c                C   s   t ||| j| |dS )N)r  r  )r^   rK  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  rG  M  r  zrad2deg.<locals>.<lambda>gcܥL@rY  rZ  ra  r  r  )r  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  rG  W  r  zdeg2rad.<locals>.<lambda>g9RFߑ?r  )r  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 )NrH  c                      s   d   d    dS )Nz1D tensors expected, but got zD and z	D tensorsr  r3  rg  r  r3  r4  rG  f  r   z_dot_check.<locals>.<lambda>c                      r  )Nz:dot : expected both vectors to have same dtype, but found r  r  r3  r  r3  r4  rG  k  r  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)rY  rZ  r  r  r  )r  rg  r  r3  r  r4  
_dot_checkc  s   
r  c                    s   t   fdd}|S )Nc                    s   t | |  | |S r@  )r  r  r  r3  r4  wrappery  s   

z#_dot_check_wrapper.<locals>.wrapper)r   )r  r  r3  r  r4  _dot_check_wrapperx  s   r  r  c                 C   sd   |   r,|  r | rt|  |  S t|  |S | r,t| | S | |  S r@  )r*  is_conjrY  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*  rY  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 )NrH  rM  r   r1  )ra  r  r  rK  rY  r  r2  r  r  r   r   )rD  r  r  rj  
mask_shaper  r3  r3  r4  select_scatter  s    r  c                 C   s   t | tjtjfS r@  )r9  rY  TypedStorage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  r9  r  rS  rJ  itemsizer  rX  r0  ry  r  )seqscalar_typeMAX_DIMS
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 )r9  r   rY  r(  r   r  r  r   r2  r  cfloatdoublecdoublehalfchalfrd  r  r  re  	TypeErrorr0  ry  r  rS  rJ  rW  _infer_scalar_typepromote_types)r  default_dtype
scalarTyper  rx  cur_item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 )
NrH  r  T)r  r2  rY  r3  r  r   c                    s   g | ]}t  |qS r3  )_recursive_build)rC  r   r  r3  r4  r{    rD  z$_recursive_build.<locals>.<listcomp>)r9  r  r  detachr   r  r   rY  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  rG    r  z)_internal_new_from_data.<locals>.<lambda>F)r2  r  r\  rY  __cuda_array_interface__r2  meta)r\  rY  )r9  rY  r  rZ  r  r  r2  r   hasattrNotImplementedr  r  r0  r  )optionsr  
device_optdatacopy_variables
copy_numpytype_inferencer[  r   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[  )
r9  rY  r  rx  ry  UserWarningr  r(  detach_rD  )r  r  r2  r[  r  r  
new_tensorr3  r3  r4  r    s*   
r@  )F)r  NN)r$  r%  Fry  )NN)NNNNNFF)FFN)NF)NNFr  )r   rM  )	NNNTrM  FNNN)NNNTFNNF)r3  )rH  r  )r   r   rH  )r   rs  rM  )r   NrH  )r  )r  r  )r  NF)r   rH  Nr  )rH  r  N(  r  r  r  rd  r  r  rx  collections.abcr   r   enumr   	functoolsr   r   r   r   typingr	   r
   r   r   r   r   rY  torch._prims_primsr  torch._prims_common_prims_commonra  torch.utils._pytree_pytreer  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   torch._prims_common.wrappersr&   r'   r(   r)   r*   r+   r  r  r  DispatchKey_opsrR  r  r5  r=  r]  ri  torch._decomprj  objectrw  r  r  r  r  r,   INT_TO_FLOATr-   r.   r0   r/   r1   r2   DEFAULTr3   r4   r*  r5   r6   r7   r:   r;   r<   r=   r>   r?   rA   	NO_OPMATHrB   rC   r$  rD   rE   r   ALWAYS_BOOLrM   rN   rO   rP   rQ   special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   BOOL_TO_LONGrn   ro   rp   rr   r	  r  rs   rt   ru   rv   rw   rx   ry   r|   r}   re  r~   r   r   r   r  r
  r   r   r   r  rS  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]  rU  r   r   rZ  r_  r`  registerr2  rh  rd  re  rf  rh  rn  r   r  r  r   r   r   dim_IntListIntList_outr  r   r   r   r   r  r   r   r   r   r   r   r   r  r   r   r   r   r   r   r  py_implCompositeImplicitAutogradMetar   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r,  r/  r   r   _subclasses
fake_implsregister_op_implrD  r   r+  r,  rR  r-  r  r   r  r   r   r   r   r  r   rl   r   r  r
  r  rH   rI   rK   rL   r  rG   rJ   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  r  r%  r  r   r  r  r  r  
start_step	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  r  r  r  r)  r  r@   rF   rZ   r^   r  rb   r9   r8   r  r  r   r   r  abs_acos_acosh_add_addcmul_addcdiv_asin_asinh_atan_atanh_atan2_bitwise_and_bitwise_left_shift_bitwise_not_bitwise_or_bitwise_right_shift_bitwise_xor_ceil_clamp_
clamp_min_
clamp_max_conj_physical_	copysign_cos_cosh_cumsum_cumprod_deg2rad_digamma_div_eq_erf_erfc_erfinv_exp_exp2_expm1_float_power_floor_floor_divide_fmod_frac_gcd_ge_gt_
heaviside_hypot_igamma_igammac_i0_lcm_le_lerp_lgamma_log10_log1p_log2_log_logical_and_logical_not_logical_or_logical_xor_lt_mul_	mvlgamma_nan_to_num_ne_neg_
nextafter_pow_rad2deg_reciprocal_
remainder_rsqrt_sgn_sigmoid_sign_sin_sinc_sinh_sqrt_square_sub_tan_tanh_tril_triu_true_divide_trunc_xlogy_cauchy_exponential_
geometric_log_normal_zero_r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  torch._refs._conversionstorch._refs.ffttorch._refs.linalgtorch._refs.nn.functional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
&


