U
    yh+                    @   s7  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 d dl	m
Z
 d dlmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZ d dlZd dlmZ d dlmZ  d dlm!Z!m"Z" d dlm#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> d	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgZ?ej@Z@ejAjBZBejCjDjEZEd d ZFdd ZGdd ZHdddd	ZId d
lJmKZK eL ZMeMddedddZNdd ZOdd ZPeNe)jQdd	 ZReNe)jSdd
 ZTeNe)jSdd ZUeNe)jSdd ZVeNe)jSdd ZWeNe)jSdd ZXeNe)jSdd ZYeNe)jZdd Z[eNe)jZdd Z\eKeEj]e5dddZ]eKeEj^e> e5dddZ^eNe)jSdd Z_eNe)jSd d Z`eNe)jSd!d ZaeNe)jSd"d ZbeNe)jSd#d ZceNe)jSd$d ZdeNe)jSd%d ZeeNe)jSd&d ZfeNe)jSd'd Zge> e<d(e)jhd)e5e/e5d*d+dZie5e/e5d*d,d ZjeKeEjke> e5e5d-d.dZkeNe)jZd/d! ZleNe)jZe5e5d0d1d"Zme5e5d2d3dhZneNe)jodd4e5e5d2d5d*ZpeNe)joe5e5d2d6d+ZqeNe)joe5e5d2d7d,ZreNe)joe5e5d2d8d-ZseNe)joe5e5d2d9d.ZteOejujvd9ZweNe)jodd4e5e5d2d:d/ZxeNe)jSeEjyd4d;d0 ZyeNe)jSd<d2 ZzeNe)jSd=d3 Z{eNe)jSd>d4 Z|eNe)jSd?d5 Z}eNe)jSd@d6 Z~e> de5eeej e5dAdBd8ZeKeEje> e<dCe)jSd)de5e'ee5dEdFdrZeKeEje> de5ee/ ee/ ee/ e5dHdId<Ze5dJdKdLZeNe)jZedMdNd= Ze5e5d2dOd>Ze5e5d2dPdzZeNe)jSdQd@ ZeKeEje> e<dJe)jZd)d dRe5ee5dSdTdAZeNe)jSdUd˄ ZeNe)jSe5e5d2dVdBZeNe)jZdWdC ZeNe)jZdXdD ZeNe)jodYdE ZeNe)jSdZdF ZeNe)jSd[dG ZeNe)jSd\dH ZeNe)jSd]dJ ZeNe)jdd4e5e5d2d^dKZeNe)jSd_dL ZeNe)jSd`dM ZeNe)jZdadO Ze5e5dbdcdۄZeMdddddDdfeddddeZeKeEje> e<dfe)jZd)ddgee5e/f ee5e/f ee/ dhdidPZee)jSdDdDdjdkdQ Zee)jZdle5e5e5dmdndRZee)jZdle5e5e5dmdodSZee)jZdle5e5e5dmdpdTZee)jZdle5e5e5dmdqdUZee)jZdle5e5e5dmdrdVZee)jSdDdsee5e/f ee5e/f dfdtdYZeKeEje> dduee5e/f ee5e/f ee dvdwdZZee)jodDdse5e5e5dmdxd[Zee)jdlee5e/f ee5e/f e5dmdydyZe> ee5e/f ee5e/f e@dmdzd\Zee j)jZddDd{ee5e/f ee5e/f dfd|d]Ze@e@e@dmd}d~Ze@e@e@dmddZee)jZdDdDdje5e5e5dmdd^Zee)jZdDdDdje5e5e5dmdd_Zee)jZdDddje5e5e5dmdd`ZeKeEje>dde5ee5e5f dbddZee)jZdDdDdje5e5e5dmddaZee)jodDdse5e5e5dmddbZee)jodDdse5e5e5dmddcZee)jZdDdDdje5e5e5ddddZee)jZdDdDdje5e5e5dmddeZee)jSdDdDdje5e5e5dmddfZee)jSdDdDdje5e5e5dmddgZee5e5eeddddZde5e5eeee5dddiZee)jZdDdDdje5e5dfddjZee)jodDdse5e5e5dmddkZee)jZdDdDdje5e5e5dmddlZee)jZdDdDdje5e5e5dmddmZee)jodle5e5dfddnZeNe)joe5dJddoZee)jodle5e5dfddpZee)jodle5e5dfddqZee)jodDdse5e5e5dmddsZee)jZdle5e5e5dmddtZee)jZdle5e5e5dmdduZee)jZdde5e5e5dmddvZee)jodDdse5e5e5dmddwZee)jhdDdDdje5e5e5dmddxZee)jZdle5e5e5dmdd|ZeKeEjȃe> d	ee5e/f ee5e/f e/dhdd}ZeKeEjɃe> e<dfe)jZd)ddgee5e/f ee5e/f e/dhddZee)jSdddde5e5e5dmddZeKeEj˃e> e<dfe)jSd)ee5e/f ee5e/f dfddZee j)jZdddee5e/f ee5e/f dfddZeKeEj̓e> e<de)jSd)dde5e5e5e/e5dddZeKeEj΃e> e<de)jZd)dde5e5e5e/e5dddZeKeEjσe> e<de)jZd)d
e5ee6 ee6 e5dddZeKeEjЃe> de5ee6 e5dddWZeKeEjуe> de5ee6 e5dddXZeKeEj҃e> e<dfe)jhd)de@ee6 ee6 dddZeKeEjӃe> ejԐde5eje5dddZӐdde@e@dfddZeKeEj׃e5e/d2ddZאde5ee$ eej ee eej eej ee eedÜ	dĐdńZedƐdǄ Zejېdejejeeeej eeef dȜdɐdʄZejېdeejeeeej eeef dȜdːd̄Zejېdejeeeej eeef d͜dΐdτZejېde@eeeej eeef dМdѐd҄Ze@edӜdԐdՄZe5e5d2ddZddddDdddלe5eeeee' eeej ee@ e1e5d؜
dِdڄZdېd܄ ZeZeKeEje> de5ee' ee5dݜddZeZeKeEje> de5ee' ee5dݜddZeKeEjjeEjjgdddde5eee eee  f eeej ee@ e5dddZe@e@d2ddZeKeEjdddde5eee eee  f eee@ e5dddZeKeEjddde5ee' eee@ e5dddZeKeEjddde5ee' eee@ e5dddZdddZeKeEje> ddde5ee' ee eee/ e5dddZeKeEje> ddde5eee eee  f ee eee/ e5dddZeKeEjdddde5ee' ee5dݜddZeKeEje>dddddDdde5ee' ee eee/ dddZeKeEje>ddddde5ee' ee eee/ dddZeKeEje> e<de)jZd)ddde5e5e5e/e/e5dddZee5ee5 f e5ee5ee5df f dddZeee5e5dddZee5ee5 f e5ee5ee5df f dd dZee5ee5 f e5ee5ee5df f dddZde5e2e3ee e5dddZeKeEje> d e5e5e2e3ee e5dddZe2dddZeEjj eBjeEjj eBjee5 dddZe5e2e5dd	dZeKeEje> e<d
e)jhd)d!e7ee5dddZe> e7e5dddZe5e5d-ddZeKeEje> d"e5ee e/e5dddZej	de@eje@dddZ
e> e7e5dddZeKeEje@e@d2ddZe@e@e@dmddZd#e5eeee5df dddZd$e5eee5dddZeKeEje> e5e&e5dddZe5e5d2ddZe5e5d2ddZe5eeee5f ee5dd dZeeZe@e'eee@e@e@f d!d"d#Ze5ee e5d$d%d&ZeKeEjj e@ee@ ee@ eeeeeee@e@e@f d'	d(dZeKeEje>ddd)e@e2ee@ ee@ eee@e@e@f d*d+dÄZeKeEje5e5d2d,dĄZeKeEje> e5e0ee0e5d-d.dZeEjjeBjd%e@eee ee ee@ eeeee ee e@d0d1dZeEjj eBjd&e@eee ee ee@ eeee ee e@d2
d3dZe2e3eeed4d5d6ZeKeEje> e@e@d2d7dƄZe5ee5d8d9d:Z e5e2e5d;d<dǄZ!e5e5e5d=d>dȄZ"eKeEj#e> e$ fe5e'e'e5d?d@dɄZ#eKeEj%e> d'e5ee&e5dBdCdʄZ%e7dddDdEZ&eKeEj'e> d(e7ee5ddFd̄Z'e> d)e5eeej e5dAdGdIZ(e> e7e5ddHdZ)e> e7e5ddIdڄZ*e5ee2e5dJdKd܄Z+eKeEj,d*e5ee7dLdMd݄Z,e> e4ee4e4dNdOd%Z-e4ee4e4dNdPd&Z.eKeEj/e> e4ee4ee/e4f dQdRd(Z/eKeEj0e4ee4ee/e4f dQdSd)Z0e4ee4ee/e4f edTdUdVZ1e> ddge4ee4e4e/dWdXd$Z2eKeEj3e> e4ee4dYdZd'Z3eKeEj4j5d+e5ee' e5d[d\d΄Z4d,e5ee@e'f eee5df d]d^d҄Z6e5e'ee5df d_d`dZ7e5e'ee5df d_dadلZ8eKeEj9j:e> d-e5ee5dbdcdZ9eKeEj;e> d.e5e5eeee5dddedZ;eKeEj<d/e5eeee5dfdgdZ<ee<Z=eKeEj>e> d0e5eeee5didjdZ>eKeEj?e> ee5 e5ddkdlZ@ee5 e5ddmdZ?e5e'e7dndodZAeKeEjBj e5dJdpdτZBe5e5d2dqdЄZCeKeEjDe5e5d2drdZDeKeEjEe5eee5dsdtdӄZEeEZFeKeEjGe5eeee5dudvdԄZGeKeEjHe> e5eeedwdxdՄZHddde5eeej ee@ e5dydzd{ZIeKeEjJddde5eeej ee@ e5dyd|dZJeKeEjKddde5eeej ee@ e5dyd}dZKeKeEjLe5ee5d[d~dքZLeKeEjMj e5e2e5d;ddׄZMe5e5e5d=dd؄ZNe5e5d2ddńZOe> d1ej@ej@ee ej@dddфZPe> dejQddDdDej	deej ejee$ eeeje5dddZRe> dejQddDdDfeej ejee$ eee5dddZSeKeEjTe> ddddDde5e2eej eej ee$ ee5dddZTeKeEjUe> ddddDde5e2e3eej eej ee$ ee5dddZUeKeEjVj e> dejQddDdDdeej ejee$ eee5dddZVeKeEjWe> ddddDdDde5e2eej eej ee$ eee5dddZWeKeEjXj e> dejQddDdDdeej ejee$ eee5dddZXeKeEjYe> ddddDdDde5e2eej eej ee$ eee5dddZYeKeEjZe> ddddDde5e2e/eej eej ee$ ee5dddZZeKeEj[e> ddddDdDejԐde5eej ee$ eej eeeje5dddZ[eKeEj\j]eEj\j^ge> d2dejQddDdDde/ee/ e/eej ejee$ eee5d	ddZ\eKeEj_e> e<de)jZd)e@e@ee@e/f ddd1Z_eKeEj`e> ddejQdDdDdee/e5f ee/e5f e/eej ee$ ejeee5d	ddZ`eKeEjae> d3ddejQdDdDdee/e5f ee/e5f e/e/eej ee$ ejeee5d
ddZaeee5 edddZbee5edddZbeKeEjbee5ee5 ee5 f eee5 dddZbe5eee&f eee&f e5dddZceKeEjde> ddejQdDdDdee2ee2 f e3eej ee$ ejeee5dddZdeKeEjee> d4dejQddDdDdeee eej ejee$ eee5dddZeeKeEjfj eEjfj:ge> dejQddDdDde2e/eej ejee$ eee5dddZfddddDdDejԐde5e/eej eej ee$ eeeje5d	ddZgeKeEjhe> ddddDdDejԐde5eej eej ee$ eeeje5dddZheKeEjie> ddddDdDejԐde5eej eej ee$ eeeje5dddZieKeEjjj e> ddddDdDdeej ee$ eej eee5dddZjdejQddDde/eej ejee$ ee5dddZkd5e2eeeef eeeef eje$e5dddZleKeEjme> e5e5e6dddZmeKeEjne5e5e6e5dddZnd6e5e5eeeedddZoe5e5edmddZpeKeEjqe>ddƍd7ddȜe5eeeef  ee' eeej e5dɜdd:ZqeKeEjre> e5e5dbddNZrd̐d̈́ ZseseʃZteseZueseZveKeEjwe> d8e5ee5dΜddބZweKeEjxe> d9e5ee5dΜdd߄Zxeeeeeeef dќdҐdӄZyeeeejejedԜdՐdքZzeKeEj{e> d:ej|ejQdאdDdeeeejeje$ee5d؜ddZ{eeeeeeef dќdڐdۄZ}eKeEj~e> d;ej|ejQdאdDdeeeejeje$ee5d؜ddZ~eKeEje>ddƍdDdDdݜe5e5eedޜddZeKeEje> e<dCe)jZd)d<ddZeKeEje> e<dCe)jZd)d=ddZeKeEje> e<dCe)jZd)d>dd#ZeKeEje> e<dCe)jZd)d?dd7ZeKeEje> e<de)jZd)d@dddddddd;ZeKeEjdAddddZeNe)jSe5dCdd?ZeNe)jSe5dCddZeKeEje> dBee' dddZdd ZeKeEje> e<de)jZd)dd ZeKeEje> e<de)jZd)dd ZeKeEje> e5e5eedddZePeRZePeTZePeUZePeZePe΃ZePe̓ZePeVZePeWZePeXZePeYZePeZePeZePeZePe[ZePeZePeZePeZePe\ZePeσZePeЃZePeуZePe^ZePeZePe_ZePe`ZePeJZePeKZePeZePeaZePeZePeZePebZePedZePecZePeeZePegZePefZePeZePelZePeZePeZePemZePeZePeZePeZePeZePeZePeZePeZePeyZePeZePeZePe_ZePezZePe~ZePe|ZePe}ZePe{ZePeZePeZePeZePeZePeZePeăZePewZePeZePeŃZePeZePeƃZePeZePeZePeZePeǃZePeZePeZePeZePeZePeZePeZePeZePeZePeZePeɃZePeZePeZePexZePewZePeʃZePeZePe˃ZePeZePeZePeZePeZePekZdd Zdd Zdd Zejee6e7f dddZdCd dZdddDdDdddZd dlZd dlZd dlZd dlZd dlZdS (D      N)Iterable)Enum)partialreducesingledispatchwraps)	AnyCallableDictListOptionaloverloadSequenceTuple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
atleast_1d
atleast_2d
atleast_3d
as_strided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flattenflipfliplrflipudhsplithstackmeshgridmovedimnarrownarrow_copynative_group_normnative_layer_normpermuteravelrepeatreshape
reshape_asrollrot90rsqrtstack	swap_axessqueezetTtake_along_dimtensor_split	transposeunfoldunfold_copy	unsqueezeviewview_as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 k	r| j dkrdS dS )NZhpuFTtypedevice r)  F/var/www/html/venv/lib/python3.8/site-packages/torch/_refs/__init__.pyis_noncontiguous_supportedb  s    r+  c                 C   sB   d }ddl m} | D ]}t||r|j} q.qt|s>| }|S )Nr   )
FakeTensor)Ztorch._subclasses.fake_tensorr,  
isinstanceZfake_devicer+  r   )Zinput_tlistoutputr(  r,  r   r)  r)  r*  handle_noncontiguous_outputsh  s    
r/  c                  G   s  ddl m} tdd tdd | D }t|dkr8d S |D ]}t|ts<tq<dgtt	dd |D  }t
|D ]\}}td	d	t| d	D ]}||| dkr|| dk rtd
|| ||< q||| dkr|| || krtd||  d| d| d| d| 
qqr|S )Nr   guard_size_obliviousc                 s   s"   | ]}t |tr|fn|V  qd S Nr-  r   .0xr)  r)  r*  	<genexpr>z  s   z$_broadcast_shapes.<locals>.<genexpr>c                 S   s   | d k	S r2  r)  r6  r)  r)  r*  <lambda>|      z#_broadcast_shapes.<locals>.<lambda>   c                 s   s   | ]}t |V  qd S r2  len)r5  shaper)  r)  r*  r7    s     z9Attempting to broadcast a dimension with negative length!z.Attempting to broadcast a dimension of length z at z ! Mismatching argument at index z had z0; but expected shape should be broadcastable to )%torch.fx.experimental.symbolic_shapesr1  tuplefilterr=  r-  r   AssertionErrorr   max	enumeraterange
ValueErrorRuntimeError)Z_shapesr1  shapesr>  common_shapeZarg_idxidxr)  r)  r*  _broadcast_shapesw  s4    $rL  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 r2  )r-  r$   r>  r5  r   r)  r)  r*  r7    s     z#_maybe_broadcast.<locals>.<genexpr>c                    sn   | d krd S t | tr| S t | trRr6t| r6| S t| j sN|  S | S tdt	t
|  d d S )Nz#Unexpected type when broadcasting: !)r-  r   r$   utilsZis_cpu_scalar_tensorZ
same_shaper>  r   rH  strr&  )r6  r>  )rJ  rM  r)  r*  __maybe_broadcast  s    


z+_maybe_broadcast.<locals>.__maybe_broadcastc                 3   s   | ]} |V  qd S r2  r)  r4  )rR  rJ  r)  r*  r7    s     )rL  rA  )rM  argsr)  )rR  rJ  rM  r*  _maybe_broadcast  s
    rT  )register_decomposition)aten_op
extra_meta)returnc                   s   t d fdd}|S )Nprimc                    sb   t  t ttddttd fdd}tkrJt  jd k	r^t	| |S )NaZtype_promoting_argstype_promotion_kindr\  rX  c                    s$    d k	r |  | }t | g|S r2  )r/  )r\  r.  )rW  rZ  r)  r*  _ref  s    z>_make_elementwise_unary_reference.<locals>.inner.<locals>._ref)
r   r-   r,   r+   r%   infer_aten_oprP  get_aten_op__name__rU  rZ  r`  rV  rW  r^  rY  r*  inner  s    z0_make_elementwise_unary_reference.<locals>.innerr	   )r^  rV  rW  rf  r)  re  r*  !_make_elementwise_unary_reference  s    rh  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
    | |S r2  r)  rS  kwargsfnr)  r*  _fn  s    z_make_alias.<locals>._fnrc  )rc  inspectcurrentframef_back	f_globals
__module__)rl  namerm  r)  rk  r*  _make_alias  s    rt  c                    sd   t   fdd} j d}||_ttt||}ddlm} | j}||kr`|| |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    | f|d| i|S )Noutr)  )r\  rS  rj  rk  r)  r*  rm    s    z_make_inplace.<locals>._fn_r   )	getmodule)	r   rc  rU  getattratenrn  rw  __all__append)rl  rm  Zinplace_namerw  Z_allr)  rk  r*  _make_inplace  s    

r|  c                 C   s
   t | S r2  )primsr.   r[  r)  r)  r*  r.     s    c                 C   s
   t | S r2  )r}  r/   r[  r)  r)  r*  r/     s    c                 C   s
   t | S r2  )r}  r0   r[  r)  r)  r*  r0     s    c                 C   s
   t | S r2  )r}  r2   r[  r)  r)  r*  r2     s    c                 C   s
   t | S r2  )r}  r1   r[  r)  r)  r*  r1   #  s    c                 C   s
   t | S r2  )r}  r3   r[  r)  r)  r*  r3   (  s    c                 C   s
   t | S r2  )r}  r4   r[  r)  r)  r*  r4   -  s    c                 C   s
   t | S r2  )r}  r5   r[  r)  r)  r*  r5   2  s    c                 C   s
   t | S r2  )r}  r6   r[  r)  r)  r*  r6   7  s    inputc                 C   s   t | jS r2  )rP  is_complex_dtypedtyper~  r)  r)  r*  r!  <  s    c                 C   s   t | js| S t| S r2  )rP  r  r  r}  r7   r~  r)  r)  r*  r7   A  s    c                 C   s
   t | S r2  )r}  r8   r[  r)  r)  r*  r8   I  s    c                 C   s
   t | S r2  )r}  r9   r[  r)  r)  r*  r9   N  s    c                 C   s
   t | S r2  )r}  r<   r[  r)  r)  r*  r<   S  s    c                 C   s
   t | S r2  )r}  r=   r[  r)  r)  r*  r=   X  s    c                 C   s
   t | S r2  )r}  Zerf_invr[  r)  r)  r*  r>   ]  s    c                 C   s
   t | S r2  )r}  r?   r[  r)  r)  r*  r?   b  s    c                 C   s
   t | S r2  )r}  r@   r[  r)  r)  r*  r@   g  s    c                 C   s
   t | S r2  )r}  rA   r[  r)  r)  r*  rA   l  s    c                 C   s
   t | S r2  )r}  rC   r[  r)  r)  r*  rC   q  s    za,r]  )r\  valuerX  c                 C   sb   t | tstt |tstt| j}tt||sVdt| d| d}t	|t
| |S Nzvalue argument of type  cannot be safely cast to type rO  )r-  r$   rC  r   rP  r   r  r   r&  rG  r}  rD   )r\  r  python_typemsgr)  r)  r*  rD   x  s    c                 C   s   t | |}t | | | S r2  )r}  rD   r   )r\  r  rr)  r)  r*  rE     s    )r  rX  c                 C   s
   t | S r2  )torchr  r~  r)  r)  r*  r    s    c                 C   s
   t | S r2  )r}  rF   r[  r)  r)  r*  rF     s    )r6  rX  c                 C   s*   t t t | t | }t | |S r2  )r  r   rF   r.   ri   r   )r6  Ztrunc_xr)  r)  r*  rG     s    r_  c                 C   s0   t | tsttt| jdd  t	| S )Nc                   S   s   dS )Nz#imag only supports complex tensors.r)  r)  r)  r)  r*  r9    r:  zimag.<locals>.<lambda>)
r-  r$   rC  r  _checkrP  r  r  r}  r   r[  r)  r)  r*  r     s    
 )rV  c                 C   s0   t | jst | jr"t| S t| tjdS )Nr  )	rP  is_float_dtyper  r  r}  rO   r  r  boolr[  r)  r)  r*  rO     s    
c                 C   sZ   t | jr,ttt| tt| S t | jrJt	| t
dkS tj| tjdS )Ninfr  )rP  r  r  r  r   rP   r   r   r  r.   floatr  r  r[  r)  r)  r*  rP     s
     c                    sF   t t j  fdd t jr6 tdkS t j t jdS )Nc                      s   d j  S )Nz7Complex dtype is not supported for isposinf, got dtype r  r)  r[  r)  r*  r9    r:  zisposinf.<locals>.<lambda>r  r  	r  r  rP  r  r  r  r  r  r  r[  r)  r[  r*  rQ     s    
c                    sF   t t j  fdd t jr6 tdkS t j t jdS )Nc                      s   d j  S )Nz7Complex dtype is not supported for isneginf, got dtype r  r)  r[  r)  r*  r9    r:  zisneginf.<locals>.<lambda>z-infr  r  r[  r)  r[  r*  rR     s    
c                 C   s   t | | S r2  r}  r   r[  r)  r)  r*  rS     s    c                 C   s*   t | jrt| dkS tj| tjdS )Nr   r  )rP  r  r  r  r   r  r  r[  r)  r)  r*  rT     s    c                 C   s
   t | S r2  )r}  Z	bessel_i0r[  r)  r)  r*  rU     s    c                 C   s
   t | S r2  )r}  rW   r[  r)  r)  r*  rW     s    c                 C   s
   t | S r2  )r}  rX   r[  r)  r)  r*  rX     s    c                 C   s
   t | S r2  )r}  rY   r[  r)  r)  r*  rY     s    c                 C   s
   t | S r2  )r}  rZ   r[  r)  r)  r*  rZ     s    c                 C   s
   t | S r2  )r}  r[   r[  r)  r)  r*  r[     s    )r\  dimr  rX  c                 C   s6   |p| j }t|}t| |}t|t||dd |S )NTkeepdim)r  rP  get_computation_dtyper(   r   )r\  r  r  result_dtypecomputation_dtypea_r)  r)  r*  r]     s    


selfF)r  r  r  rX  c                 C   s   t |ts|f}|  dkr4tt| || S tj| |dd}t||	 t
dkd}|rf|n
t||}tt| | ||}| |S )Nr   Tr  r  )r-  r   numelr  r   r@   rX   r   r   r.   r  r   ru   )r  r  r  ZmaxesZmaxes_squeezedresultr)  r)  r*  r     s    	
        )r\  nanposinfneginfrX  c                 C   s   t | tstt| js&t| jr.|  S |d kr:d}|d krPt	| jj
}|d krft	| jj}tt| || }tt| ||}tt| ||}|S )Nr  )r-  r$   rC  rP  is_boolean_dtyper  is_integer_dtyper   r  ZfinforD  minr   rS   rR   rQ   )r\  r  r  r  r  r)  r)  r*  ra   (  s    r[  c                 C   s   t | jt jk	dd  d S )Nc                   S   s   dS )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.r)  r)  r)  r)  r*  r9  G  s    z_neg_meta.<locals>.<lambda>)r  r  r  r  r[  r)  r)  r*  	_neg_metaD  s    
r  )rW  c                 C   s
   t | S r2  )r}  rb   r[  r)  r)  r*  rb   O  s    c                 C   s*   t | tst| jtjkr&d}t|| S )Nz'positive does not support bool tensors.)r-  r$   rC  r  r  r  rH  )r\  r  r)  r)  r*  rc   X  s
    c                 C   s(   t | tstt| jr$t| S | S r2  )r-  r$   rC  rP  r  r  r}  r   r[  r)  r)  r*  r   a  s    
c                 C   s
   t | S r2  )r}  re   r[  r)  r)  r*  re   h  s    )decimals)r\  r  rX  c                C   sB   |dkrt | S d| }d|  }t t t | ||S d S )Nr   
   )r}  rf   r   )r\  r  Zten_powZten_neg_powr)  r)  r*  rf   m  s
    

c                 C   s
   t | S r2  )r}  r   r[  r)  r)  r*  r   |  s    c                 C   s   t dtdtt| S )Nr;  )r   ru   r@   rb   r[  r)  r)  r*  rg     s    c                 C   s6   t | jr*|  }t|dkd| | S |  S d S Nr   )rP  r  r  r.   r  r   ri   )r\  Za_absr)  r)  r*  rh     s    c                 C   s
   t | S r2  )r}  ri   r[  r)  r)  r*  ri     s    c                 C   s
   t | S r2  )r}  rj   r[  r)  r)  r*  rj     s    c                 C   s
   t | S r2  )r}  rk   r[  r)  r)  r*  rk     s    c                 C   s&   t j|  } t| dkdt| |  S Nr   r;  )mathpir  r   rk   r[  r)  r)  r*  rl     s    
c                 C   s
   t | S r2  )r}  rm   r[  r)  r)  r*  rm     s    c                 C   s
   t | S r2  )r}  ro   r[  r)  r)  r*  ro     s    c                 C   s
   t | | S r2  )r   r[  r)  r)  r*  rp     s    c                 C   s
   t | S r2  )r}  rq   r[  r)  r)  r*  rq     s    c                 C   s
   t | S r2  )r}  rr   r[  r)  r)  r*  rr     s    c                 C   s
   t | S r2  )r}  rt   r[  r)  r)  r*  rt     s    )r  rX  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                      s
   d  S )Nz^view_as_complex is only supported for floating pointtensors, but got a tensor of scalar type: r)  r)  Zinput_dtyper)  r*  r9    r:  z!view_as_complex.<locals>.<lambda>r   c                   S   s   dS )Nz-Input tensor must have one or more dimensionsr)  r)  r)  r)  r*  r9    r:  r?     c                   S   s   dS )Nz+Tensor must have a last dimension of size 2r)  r)  r)  r)  r*  r9    r:  r;  c                   S   s   dS )Nz/Tensor must have a last dimension with stride 1r)  r)  r)  r)  r*  r9    r:  c                 s   s   | ]}|d  dkV  qdS )r  r   Nr)  )r5  strider)  r)  r*  r7    s     z"view_as_complex.<locals>.<genexpr>c                   S   s   dS )NzCTensor must have a stride divisible by 2 for all but last dimensionr)  r)  r)  r)  r*  r9    r:  c                   S   s   dS )Nz0Tensor must have a storage_offset divisible by 2r)  r)  r)  r)  r*  r9    r:  )r  r  r  rP  r  sizer=  r  py_allstorage_offsetr}  Zview_element_typecorresponding_complex_dtyper   )r  sizesZold_stridesdimsr)  r  r*  r     sD    



 c           	   	      s$   t d fdd}|S )NrY  c                    s   d kr j t tddtttf tttf td fdd}r^t |}|_ tkrxt	 d k	rrt
| |S )Nr\  br]  r\  r  rX  c                    s   t pt| t  fdd t p2t|t  fdd t p\t| toZt|t  fdd t| |\} }| |}t| |g|S )Nc                      s
     dS )Nzc: Received a lhs Python scalar to an elementwise binary operation that does not accept lhs scalars!r)  r)  rs  r)  r*  r9    r:  zQ_make_elementwise_binary_reference.<locals>.inner.<locals>._ref.<locals>.<lambda>c                      s
     dS )Nzc: Received a rhs Python scalar to an elementwise binary operation that does not accept rhs scalars!r)  r)  r  r)  r*  r9    r:  c                      s
     dS )Nz?: Receive two Number inputs to an elementwise binary operation!r)  r)  r  r)  r*  r9    r:  )r  _check_valuer-  r   rT  r/  )r\  r  r.  )rs  rZ  supports_lhs_python_scalarsupports_rhs_python_scalarsupports_two_python_scalarsr)  r*  r`    s     	



z?_make_elementwise_binary_reference.<locals>.inner.<locals>._ref)rc  r   r+   r   Tensorr   r-   ra  rP  rb  rU  rd  rV  has_outrs  should_register_decompositionr  r  r  r^  rY  r*  rf    s&    


z1_make_elementwise_binary_reference.<locals>.innerrg  )	r^  rV  rs  r  r  r  r  r  rf  r)  r  r*  "_make_elementwise_binary_reference  s    
 ,r  r  alpha)r\  r  r  c                C   s   t | |\} }|dk	rt| tr&| jn|j}t|}|tkrltt||sldt| d| d}t	|t|trt
||}n|| }t
| |}t| |g|S )z/
    Reference implementation of torch.add
    Nalpha argument of type r  rO  )rT  r-  r$   r  rP  r   r  r   r&  rG  r}  r   ru   r/  r\  r  r  r  r  r  r.  r)  r)  r*  ru   &  s    
 
)r^  r  r  c                 C   s   t | |S r2  )r}  rv   r  r)  r)  r*  rv   I  s    )r^  r  c                 C   s   t | |S r2  )r}  rw   r  r)  r)  r*  rw   R  s    c                 C   s   t | |S r2  )r}  Z
shift_leftr  r)  r)  r*  rx   Y  s    c                 C   s   t | |S r2  )r}  ry   r  r)  r)  r*  ry   `  s    c                 C   s   t | |S r2  )r}  Zshift_right_arithmeticr  r)  r)  r*  rz   g  s    c                 C   s   t | |S r2  )r}  r{   r  r)  r)  r*  r{   n  s    )r^  r  c                 C   s   t |tr(t | tr(t|| j| jd}n>t | trft |trf| j|jkrfd| j d|j d}t|tt|t	t
| t
| S )Nr  r(  /Expected divisor (b) to be on the same device (&) as dividend (a), but it is found on rO  )r-  r   r  r  r  r(  rH  r   rj   rb   r.   r\  r  r  r)  r)  r*  r~   u  s     )rounding_mode)r\  r  r  c                C   sN   |dkrt | |S |dkr$t| |S |dkr6t| |S d| d}t|dS )z/
    Reference implementation of torch.div
    Nrt   rF   zLdiv expected rounding_mode to be one of None, 'trunc', or 'floor' but found .)r   r   r   rG  )r\  r  r  r  r)  r)  r*  r     s    


c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r     s    c                 C   s   t | tst |tstt |trV|dkr2|  S |dkrB| |  S |dkrt| S nHt | tr| dkrtt|dS | dkrt	|j
st|j
rt|S t| |S )N      ?g       @      ?T)r-  r%   rC  r   r   r  ro   rD   rP  r  r  r  rC   r}  r   r  r)  r)  r*  r     s$    




c                 C   sx   t | trt |trtdt| |}|d k	s4tt|rFtj}ntj	}t
| |} t
||}t| |\} }t| |S )Nz=Receive two Number inputs to an elementwise binary operation!)r-  r   rG  rP  Zget_higher_dtyperC  r  r  Z
complex128float64r(   rT  r   r\  r  r  r)  r)  r*  r     s    


)r^  r  r  c                    s8  t | tr&t |tr&t| } t|}nt |trNt | trNt|| j| jd}nt | trvt |trvt| |j|jd} n`t | trt |tr| j|jkr| jtdkrd| j d|j d}t|ntj	|| jd}t | trt |tst
| j t r
t| |S t r t| |S td fdd	 d S )
Nr  cpur  r  rO  r'  Fc                      s
     dS )Nz not supported for floor_divider)  r)  r  r)  r*  r9    r:  zfloor_divide.<locals>.<lambda>)r-  r   r  r  r  r(  r  rH  r}  Z
device_putrC  rP  r  _floor_divide_floatr  _floor_divide_integerr  r  r)  r  r*  r     s&    	
 


c                 C   s`   t | |\} }| jjs"t| |S t| t|kt| |dk}t| |t	|| j S r  )
rT  r  	is_signedr}  r   r  rj   r   r   r(   )r\  r  offsetr)  r)  r*  r    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   r;  r  r  )r   r   r   r{   r   r   rw   r   rF   r   ru   r  r  r(  r~   )
r\  r  modr   Zdifferent_signed_inputsZnon_zero_remaindermaskZ	floor_divZ	basic_divZzero_tensorr)  r)  r*  r  %  s    



r  c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r   >  s    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r   G  s    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r   P  s    Zmantissaexponentc                 C   s   t jt| S r2  )r  Zreturn_typesfrexpr}  r  r)  r)  r*  r  Y  s    r  c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r   _  s    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r   h  s    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r   p  s    )r  valuesrX  c                 C   sF   t | d}t t | dt | }t |dd}t |||}|S r  )r  r   r   r   rS   r   )r  r  Zinput_eq_zeroZinput_lt_zeroZzeros_and_onesr.  r)  r)  r*  r   x  s
    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r     s    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r     s    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r     s    )rs  r\  r  rtolatolrX  c                    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 rO  r  r)  )r\  r  rs  r)  r*  r9    r:  z#_check_close_args.<locals>.<lambda>r   c                      s     d dS )Nz6: rtol must be greater than or equal to zero, but got rO  r)  r)  )rs  r  r)  r*  r9    r:  c                      s    d  dS )Nz6: atol must be greater than or equal to zero, but got rO  r)  r)  )r  rs  r)  r*  r9    r:  )r  r  r  r  rs  r\  r  r  r  r)  )r\  r  r  rs  r  r*  _check_close_args  s    
r  h㈵>:0yE>)r\  r  r  r  	equal_nanrX  c           	      C   s   t d| |||d t| |}|rPt| js8t| jrPt|tt| t|}|dkrd|dkrd|S t| jst| jst	
| t } t	
|t }t|tt||}tt| |}t|tt|t||}|S )Nztorch.iscloser  r   )r  r   rP  r  r  r  r   r   rS   r}  convert_element_typer  get_default_dtyperu   r.   r   r   rO   r   )	r\  r  r  r  r  closeZallowed_errorZactual_errorr  r)  r)  r*  r     s     
 c                 C   s~   | j }|tjtjfk}|r6t| tj} t|tj}t| |}t|dkd|}t	t
| || }|sr|S t||S r  )r  r  Zint8Zint16r}  r  int32r   r   r.   r   )r\  r  r  Zpromote_to_intgresr)  r)  r*  r     s    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r     s    c           
      C   s  t | t |k}t || |}t ||| }t t t t | t | t |k}t| jsvt|jrt |dk }t ||t 	t 
|t 
| }t |||t t 
||  }t |}	t |	ttdtd|S t || |t t 
||  S d S )Nr   r  )r  r   r   r   r   rO   rP  r  r  rX   r@   rY   rS   complexr  )
r\  r  r  max_min_inf_maskZneg_min_maskZinf_valsZnon_nan_valsZnan_maskr)  r)  r*  r     s,         
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   s   dS )Nz)logaddexp2 doesn't support complex dtypesr)  r)  r)  r)  r*  r9  #  r:  zlogaddexp2.<locals>.<lambda>r  r  )r  r  rP  r  r  r   r   rP   r  rX   rY   rC   )r\  r  r  r  r  r  Z	inv_log_2r  r)  r)  r*  r     s    c                 C   s0   t | js| dk} t |js(|dk}| |@ S r  rP  r  r  r  r)  r)  r*  r   /  s
    c                 C   s   t | js| dkS |  S r  r  r[  r)  r)  r*  r   :  s    c                 C   s2   t | js| dk} t |js(|dk}t| |S r  )rP  r  r  ry   r  r)  r)  r*  r   A  s
    c                 C   s0   t | js| dk} t |js(|dk}| |A S r  r  r  r)  r)  r*  r   M  s
    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r   X  s    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r   `  s    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r   g  s    )r^  r  c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r   n  s    c                 C   s   t | |S r2  r  r  r)  r)  r*  r   v  s    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r   ~  s    c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r     s    r;  c                 C   s&   t | trd}t|tj|| |dS )Nz?Received a Number for the first argument, but expected a Tensorr  )r-  r   rG  r  r   )r\  r  r  r  r)  r)  r*  r     s    
c                C   s   t | |\} }|dkrt| tr&| jn|j}t|}tt||sddt| d| d}t|t|t	j
r~t||}n|| }t| |}t| |g|S )z/
    Reference implementation of torch.sub
    r;  r  r  rO  )rT  r-  r$   r  rP  r   r   r&  rG  r  r  r}  r   r   r/  r  r)  r)  r*  r     s    
)r^  rs  rV  r  c                 C   s   t | |S r2  )r}  r   r  r)  r)  r*  r     s    c              
   C   s   t t| tpt|tdd  t|trHt| trHt| |j|jd} n&t| trnt|trnt|| j| jd}t| ts|tt|tstt 	t 
| ddt | t |}t 	t |td|S )Nc                   S   s   dS )Nz/Expected either argument a or b to be a Tensor"r)  r)  r)  r)  r*  r9    r:  zxlogy.<locals>.<lambda>r  r   r  )r  r  r-  r$   r   r  r  r(  rC  r   r   r   rX   rS   r  )r\  r  rhsr)  r)  r*  r     s    $)r^  rV  r  c                 C   s0   t | }t |r t| |S tt| |S r2  )rP  Z	get_dtyper  r}  r   rt   r  r)  r)  r*  r     s    

)r  tensor1tensor2r  )r  r  r  r  rX  c                   sJ   dk	r:| j }t| ttt  fdd | | |  S )z3
    Reference implementation of torch.addcdiv
    Nc                      s   dt  d  dS r  r%  r)  r  r  r)  r*  r9    r:  zaddcdiv.<locals>.<lambda>r  rP  r   r  r  r   r&  r  r  r  r  r  r)  r  r*  r     s    
c                   sJ   dk	r:| j }t| ttt  fdd | | |  S )z3
    Reference implementation of torch.addcmul
    Nc                      s   dt  d  dS r  r%  r)  r  r)  r*  r9  *  r:  zaddcmul.<locals>.<lambda>r  r  r)  r  r*  r     s    
)r\  r  rD  )r\  r  rD  rX  c                 C   s   |d kr|d krd}t ||d k	rPt| }tt| ||}t|| |} |d k	rt| }tt| ||}t|| |} | S )Nz+clamp called but both min and max are none!)rG  r  rS   ry   r   r   r   )r\  r  rD  r  Za_isnan	conditionr)  r)  r*  r   0  s    

)r  r  rX  c                 C   s   t j| |dS )N)r  r  r   )r  r  r)  r)  r*  r|   P  s    )r  rD  rX  c                 C   s   t j| |dS )N)rD  r  )r  rD  r)  r)  r*  r}   Y  s    predr\  r  c                    sb   |dks|dkrt tj ||dd t jtjk fdd t ||\ }}t	 ||S ) NTallow_cpu_scalar_tensorsc                      s   d j  S )Nz#expected predicate to be bool, got r  r)  r  r)  r*  r9  |  r:  zwhere.<locals>.<lambda>)
NotImplementedErrorrP  check_same_devicer  r  r  r  rT  r}  r   r  r)  r  r*  r   i  s    

memory_format)r\  r  rX  c                C   s   t j| |d}|S Nr  )r}  r   )r\  r  r  r)  r)  r*  r     s    )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!)r(  rH  r}  r   )r\  r  r  r  r)  r)  r*  r     s    c                 C   s>   |   dkr$d|    d}t|t| j}|t| S )Nr;  zCan't convert a tensor with z elements to a number!)r  rG  rP  r   r  r}  r   )r\  r  number_typer)  r)  r*  r     s
    )	r\  r(  r  copylayoutr  
pin_memorynon_blockingrX  c                 C   s\   | oZ|d ks| j |koZ|d ks*| j|koZ|d ks<| j|koZ|d kpZ|tjkpZtj| |dS r  )r(  r  r  r  preserve_formatrP  is_contiguous_for_memory_format)r\  r(  r  r  r  r  r  r  r)  r)  r*  _to_will_alias  s    r  c                  O   s   t d S r2  )r  ri  r)  r)  r*  _to_dispatch  s    r  )r(  r  r  r  r  rX  c                 C   s   | ||||d}|S N)r(  r  r  r  r  r)  r(  r  r  r  r  rj  r)  r)  r*  
_to_device  s    	r  c                 C   s   t | ||||d}|S r	  )r  r(  r
  r)  r)  r*  _to_device_str  s    	r  )r  r  r  r  rX  c                 C   s   | |||d}|S )N)r  r  r  r  r)  )r  r  r  r  rj  r)  r)  r*  	_to_dtype  s    r  )otherr  r  r  rX  c                 C   s(   | j }| j}| j}||||||d}|S )N)r(  r  r  r  r  r  )r(  r  r  )r  r  r  r  r(  r  r  rj  r)  r)  r*  	_to_other  s    r  )r\  	to_kwargsc                 C   s   ddddg}d|kr4t |d tr4t|d |d< |D ]v}||kr8|dkrZ|| tjks|dkr|| j| jjkr|| jr|| j| jjkst| |d || kr8|| q8d S )Nr  r(  r  r  )	r-  rQ  r  r(  r  r&  indexrx  pop)r\  r  Zoptions_to_checkkwr)  r)  r*  _canonicalize_to_arguments  s(    
r  c                 O   s   t |dkrt||}d|ks"tt| | t| f|r<| S d|krN|dnd}d|krd|dnd}|s|d| j| jkr|sd|krd|krd	|krt	| |d| jS t
j| f|}t||  |S )
Nr   r  r  Fr  r  r  r(  r  )r=  r  rC  r  r  r  getr  r}  r  r  r
  r   )r\  rS  rj  r  r  r  r)  r)  r*  r   &  s0    

	
)has_identityaccepts_dim_tupler  keepdimsr  ru  )
r\  rZ  r  r  r  r  r  ru  output_dtype_kindrX  c                   s  t  tst jdkr*td j d|d k	rZt |ts@t|d k	rZ||jkrZtd|std kstt tsttt trft j	|s jdkpt
 fddD }	|	stdt ||\}
}t |
 | }|r. fd	d
t jD }fdd
t jD }t|||}|d k	r||d k	sFt|d k	rd||jkrdtdt||j	}t||dS |j|kr|d k	rt||}|S )N@   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   s   | ]} j | V  qd S r2  r>  r5  ir[  r)  r*  r7  n  s     z_reduction.<locals>.<genexpr>zJreducing over zero-size dimension for reduction operation without identityc                    s"   g | ]}|kr j | nd qS r;  r  r  r\  r  r)  r*  
<listcomp>y  s     z_reduction.<locals>.<listcomp>c                    s   g | ]}| kr|qS r)  r)  r  )r  r)  r*  r   z  s      z7Expected the dtype of reduction result and out to matchZ	copy_fromr   )r-  r$   rC  ndimrH  r  r   rP  reduction_dimsr>  r  reduction_dtypesr(   rF  r}  broadcast_in_dimr)   r*   r  )r\  rZ  r  r  r  r  r  ru  r  Zvalid_shaper  r  r  Zoutput_shapebroadcast_dimsr)  r  r*  
_reductionM  sZ    


   


r'  c                    sH    j }t   dd fdd
}| d}||_ ttt||}|S )zk
    Given a view function (e.g. torch.diagonal) generates its copy variant (e.g. torch.diagonal_copy)
    Nru  c                    s,    |d| i|}| d kr(|j tjdS |S )Nru  r  )r   r  contiguous_format)ru  rS  rj  r  rk  r)  r*  rm    s    z!_make_copy_from_view.<locals>._fnZ_copy)rc  r-   rU  rx  ry  )rl  rs  rm  Z	copy_namer)  rk  r*  _make_copy_from_view  s    

r*  )r\  r  r  rX  c                 C   s:   t t jt | ||d}| jt jkr6|jt jd}|S )Nr  r  )r  r   r   r  uint8r   )r\  r  r  r  r)  r)  r*  r     s    c                 C   sb   t | tj}t|ttfr0t|dkr0| }n|j||d	d}| j
tjkr^t|tjS |S )Nr   )r  r  F)r(   r  r  r-  listrA  r=  r   r   r   r  r+  r}  r  )r\  r  r  r  r  r)  r)  r*  r     s    
r  ru  )r\  r  r  r  ru  rX  c             	   C   sl   |d kr>|d k	r|j }n&t| j s0t| j r8tj}n| j }|dksN|g krRd }t| tj||||t	j
dS Nr)  r  r  r  ru  r  )r  rP  r  r  r  int64r'  r}  r   r!   SAMEr\  r  r  r  ru  r)  r)  r*  r     s"    	c                    s   t jddtt  j fdd t  jrRtdkrRt	 S  j
t ttt fddttD  }tj |dd d	S )
NFvalidatec                      s   d d j  dS )Nzsum_to_size: size "z" is not expandable to size ""r  r)  r\  r>  r)  r*  r9    r:  zsum_to_size.<locals>.<lambda>r   c                 3   s0   | ](}|  d kr j | d kr|V  qdS r;  Nr  r  r\  Zleading_dimsr>  r)  r*  r7    s    zsum_to_size.<locals>.<genexpr>T)r  r  r  )rP  extract_shape_from_varargsr  r  Zis_expandable_tor>  Zis_same_shaper=  r}  view_ofr"  rA  rF  r   )r\  r>  reduce_dimsr)  r8  r*  r     s    

)r\  r  r  ru  rX  c             	   C   sl   |d kr>|d k	r|j }n&t| j s0t| j r8tj}n| j }|dksN|g krRd }t| tj||||t	j
dS r.  )r  rP  r  r  r  r0  r'  r}  r   r!   r1  r2  r)  r)  r*  r     s"    	r(  c             
   C   s0   |dks|g krd }t | tj||d |dtjdS Nr)  Fr  r  r  ru  r  r  )r'  r}  r   r!   r1  r\  r  r  ru  r)  r)  r*  r   	  s    	c             
   C   s0   |dks|g krd }t | tj||d |dtjdS r<  )r'  r}  r   r!   r1  r>  r)  r)  r*  r   4	  s    	c                 C   s"   |d krt | tr| }d } | |fS r2  )r-  r  )r  unbiasedr)  r)  r*  _dim_var_dispatchL	  s    r@  
correction)r\  r  r?  r  rB  rX  c             
   C   sV   t ||\}}t||}|dks*|g kr.d }t| ttj|d||d d dtjd}|S )Nr)  rA  Tr=  )	r@  rP  set_correctionr'  r   r}  r   r!   COMPLEX_TO_FLOAT)r\  r  r?  r  rB  r  r)  r)  r*  r   V	  s    

c          	      C   sh   t ||\}}t||}t| tj\}}t| |} tj| |||d}t	|}|d k	s^t
t||S N)rB  r  )r@  rP  rC  r$  r!   rD  r(   r  r   ro   rC  )	r\  r  r?  r  rB  opmath_dtyper  a_vara_stdr)  r)  r*  r   s	  s    
 

c          	   	      s.  |dks|g krd }d kr& j td kp:j kfdd t tj||d tjd}tt	pzt
fdd t|tr|f}t j|} jdkrdnttj fdd	|D d}t||}d kr j n}t||}d k	r*ttstt|jt|d
S |S )Nr)  c                      s   d  dj  dS )Nz"Expected out tensor to have dtype z
, but got  insteadr  r)  r-  r)  r*  r9  	  r:  zmean.<locals>.<lambda>r/  c                      s   dd krdnd d  S )Nz&mean(): could not infer output dtype. ZInputr   z> dtype must be either a floating point or complex dtype. Got: r)  r)  )r  
orig_dtyper)  r*  r9  	  s    r   r;  c                 3   s   | ]} j | V  qd S r2  r  r  r[  r)  r*  r7  	  s     zmean.<locals>.<genexpr>r!  )r  r  r  r'  r}  r   r!   ZKEEP_PROMOTED_TYPErP  r  r  r-  r   r#  r>  r"  r   operatorr   r   r(   r$   rC  r)   r*   )	r\  r  r  r  ru  r  r  Znelemr  r)  )r\  r  rJ  ru  r*  r   	  sD    
	
*


Zout0Zout1)r?  r  rB  )r\  r  r?  r  rB  c                C   s|   t ||\}}t||}t| tj\}}| j}t| |} tj	| |||d\}}	t
|}
|d k	shtt|
|t|	|fS rE  )r@  rP  rC  r$  r!   rD  r  r(   r  r   ro   rC  )r\  r  r?  r  rB  rF  r  Zoriginal_dtyperG  Za_meanrH  r)  r)  r*  r   	  s    
 

c                C   s4   t ||\}}t| ||||d}t| ||}||fS )NrA  )r@  r   r   )r\  r  r?  r  rB  vmr)  r)  r*  r   	  s    
)r  vec1vec2)betar  )r  rN  rO  rP  r  rX  c                   s\  t jdkfdd t jdkfdd jd jd tjrt tt	t
fdd t tt	 t
fdd s rt S t dS t  rt n
t dS n~t tt	tjfd	d t tt	 tj fd
d dkr@ t  S   t   S d S )Nr;  c                      s   d j  dS )Nz*addr: Expected 1-D argument vec1, but got -Dr"  r)  )rN  r)  r*  r9  	  r:  zaddr.<locals>.<lambda>c                      s   d j  dS )Nz*addr: Expected 1-D argument vec2, but got rQ  rR  r)  )rO  r)  r*  r9  	  r:  r   c                      s   dt   S )Nzexpected bool/int beta but got r%  r)  rP  r)  r*  r9  
  r:  c                      s   dt   S )Nz expected bool/int alpha but got r%  r)  rS  r)  r*  r9  
  r:  Fc                      s   dt   dj S Nzcannot safely convert z to r&  r  r)  )rP  r  r)  r*  r9  
  r:  c                      s   dt   dj S rT  rU  r)  )r  r  r)  r*  r9  
  r:  )r  r  r"  r   r>  rP  r  r  r   r&  intouterr  r   r   )r  rN  rO  rP  r  r)  )r  rP  r  rN  rO  r*  r   	  sF    




.)argrS  rX  c                 G   s^   |st | tjjr| }nt | tjjr*t| f| }tdd |D }t|dkrV|S |d S )z5Reference implementation of :func:`torch.atleast_1d`.c                 s   s&   | ]}|j d kr|nt|dV  qdS )r;  r   N)r"  r   r5  r\  r)  r)  r*  r7  )
  s     zatleast_1d.<locals>.<genexpr>r;  r   )r-  collectionsabcr   rC  rA  r=  rX  rS  Zargs_r  r)  r)  r*  r    
  s    
)at_least_fnr  rX  rX  c                 C   s    | |}t |tstt||S r2  )r-  r$   rC  r   )r]  r  rX  Zarg_r)  r)  r*  _unsqueeze_atleast/
  s    r^  c                    sn   |st | tjjr| }nt | tjjr*t| f| }tttd t fdd|D }t	|dkrf|S |d S )z5Reference implementation of :func:`torch.atleast_2d`.r   c                 3   s$   | ]}|j d kr|n |V  qdS )r  NrR  rY  Zunsqueeze_atleast_1dr)  r*  r7  B
  s     zatleast_2d.<locals>.<genexpr>r;  )
r-  rZ  r[  r   rC  r   r^  r   rA  r=  r\  r)  r_  r*  r   8
  s    
c                    sn   |st | tjjr| }nt | tjjr*t| f| }tttd t fdd|D }t	|dkrf|S |d S )z5Reference implementation of :func:`torch.atleast_3d`.r?  c                 3   s$   | ]}|j d kr|n |V  qdS )   NrR  rY  Zunsqueeze_atleast_2dr)  r*  r7  Q
  s     zatleast_3d.<locals>.<genexpr>r;  r   )
r-  rZ  r[  r   rC  r   r^  r   rA  r=  r\  r)  ra  r*  r   G
  s    
)r\  r  r  r  rX  c                 C   s$   |d k	r|n|   }t| |||S r2  )r  r}  r   )r\  r  r  r  storage_offset_intr)  r)  r*  r   U
  s    )r  srcr  r  r  rX  c                 C   s"   |d krdn|}t | ||||S r  )r}  r   )r  rc  r  r  r  rb  r)  r)  r*  r   a
  s    	c                  G   s   t t|  S r2  )r  SizerL  )rI  r)  r)  r*  r   n
  s    c                  G   s4   t | dkr"t| d ts"| d } tt| ddiS )Nr;  r   rM  F)r=  r-  r  r,  rT  tensorsr)  r)  r*  r   r
  s    )r\  r  rX  c                 C   s8   t |t | j }tt|t | j| }t| ||S r2  )r=  r>  rA  rF  r}  r%  )r\  r  startr  r)  r)  r*  r   {
  s    re  )rf  r  rX  c           
         s  dd }t | dkr d}t|| D ]}t|ts$tq$tj| ddi ddlm} d  t	| D ]J\ d krj
dkr q`j
dkr`tj
 j
k fd	d
 q` d kr| d   j}g }t	| D ]x\}t |t |jkr|j
dkstt|jd dk fdd
 q|j
dkr<||jd dkr<q|| q|| }t |dkr| d ztdd | D }	W n tk
r   d}	Y nX tdjj|	|dS t|d j
|}t|d j
| t||j|dS )Nc                 S   sX   d }| D ]>}t |}|tjkr(|  S |d k	rB||krBtj  S |}q|d k	sTt|S r2  )rP  suggest_memory_formatr  r)  rC  )inputsformatr   fr)  r)  r*   cat_compute_output_memory_format
  s    


z-cat.<locals>.cat_compute_output_memory_formatr   z3cat expects at least one tensor, but received zero!r  Fr0  r;  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 listrR  r)  )exampler  r   r)  r*  r9  
  r:  zcat.<locals>.<lambda>c                      s   d j  d dS )Nrm  z*-D tensors, but got 1-D for tensor number rn  rR  r)  )ro  
tensor_idxr)  r*  r9  
  r:  c                 s   s   | ]}|j V  qd S r2  )requires_gradr4  r)  r)  r*  r7  
  s     zcat.<locals>.<genexpr>r   r  r(  rq  r  r  )r=  rG  r-  r$   rC  rP  r  r@  r1  rE  r"  r  r  r>  r{  r   	Exceptionr	  r  r(  canonicalize_dimZvalidate_idxr}  r   r   )
rf  r  rl  r  tensorr1  r>  filteredr  rq  r)  )ro  r  r   rp  r*  r   
  sb    


 
)rf  rX  c                 C   s   t dd | D }t|dS )Nc                 s   s.   | ]&}|j d kr|n|| d fV  qdS r7  )r"  r   r  r4  r)  r)  r*  r7  
  s    zcolumn_stack.<locals>.<genexpr>r;  )rA  r   rf  Zaligned_tensorsr)  r)  r*  r   
  s    c                 C   s*   t | js| S | jr t| S t| S r2  )rP  r  r  Z	is_sparser  r7   r}  r   r~  r)  r)  r*  r   
  s
    
)r  padr  rX  c           
   	      sZ  t td dkfdd | jttd }| t |kfdd | }tD ]r d  d   dk r|   |j    }d  dk rj| d|j  d   }qjtdd D r| S t	d  }t|D ]d t d d       d   }t |dk fd	d |
| qt| }t j|| j| j| j|d
}|dkr| jt jkrd}t ||}|}	tD ]v d  d   dkr|	  |	j    }	d  dkr|	 d|	j  d   }	qt|	| |S )Nr  r   c                      s   dt   S )Nz1Length of pad must be even but instead it equals r<  r)  )ry  r)  r*  r9    r:  z!constant_pad_nd.<locals>.<lambda>c                      s   dt  d  dS )Nz`Length of pad should be no more than twice the number of dimensions of the input. Pad length is z while the input has  dimensions.r<  r)  )l_inpry  r)  r*  r9    r:  r;  c                 s   s   | ]}|d kV  qdS )r   Nr)  )r5  pr)  r)  r*  r7  !  s     z"constant_pad_nd.<locals>.<genexpr>c                	      s6   d    d  dd   d   d	S )NzThe input size z, plus negative padding r  r;  zG resulted in a negative output size, which is invalid. Check dimension z of your input.r)  r)  )r  input_sizesl_diffry  pad_idxr)  r*  r9  +  r:  rs  F)r  r  r=  r>  rF  r   builtinsr   r   r,  r{  rP  rh  r	  r  r(  rq  r  rD   r}  r   )
r  ry  r  Zl_padZc_input	new_shapeZnew_dimr  r.  Zc_outputr)  )r  r}  r~  r{  ry  r  r*  r      sl    
"" 
  $c                C   s6   t |t jkdd  tj| |dr(| S t j| |dS )Nc                   S   s   dS )Nz@preserve memory format is unsupported by the contiguous operatorr)  r)  r)  r)  r*  r9  R  r:  zcontiguous.<locals>.<lambda>r  )r  r  r  rP  r  r   )r\  r  r)  r)  r*  r   M  s    c                 C   s*   t t| dkdd  t|  }t|dS )Nr   c                   S   s   dS )Nz%dstack expects a non-empty TensorListr)  r)  r)  r)  r*  r9  ]  r:  zdstack.<locals>.<lambda>r  )r  r  r=  r   r   rx  r)  r)  r*  r   [  s    c              	      s   ddl m} t|dkr2t|d tr2t|d }tt|t| jkdd  t|t| j }t	|}t
| jD ]\\} || }|| }t|| kp| dkp|dk fdd |dkr|n ||< qtt| t| |tt|t| j| S )Nr   r0  r;  c                   S   s   dS )Nz3expand: the requested shape has too few dimensions!r)  r)  r)  r)  r*  r9  n  r:  zexpand.<locals>.<lambda>r?  c                      s   d  dS )Nz3expand: attempting to expand a dimension of length rO  r)  r)  r8  r)  r*  r9  z  r:  )r@  r1  r=  r-  r   rA  r  r  r>  r,  rE  rP  validate_shaper}  r%  rF  )r\  r>  r1  r  shape_rK  Z
offset_idxZrequested_lengthr)  r8  r*  r   b  s4    


  c                 C   s   |  |jS r2  )r   r>  r  r)  r)  r*  r     s    )r\  chunksr  rX  c           
      C   s   |dkrd| d}t |t| j|}| j| }t|| }t|| }|| }g }t|D ]}	|	t
| ||	| | qd|dkr|	t
| ||| | t|S )Nr   z%Expected at least one chunk, but got rO  )rG  rP  ru  r"  r>  r  r6   rF   rF  r{  r   rA  )
r\  r  r  r  length
chunk_sizeZfull_chunksZtail_chunk_sizer  r  r)  r)  r*  r     s    
r?  )r\  	start_dimend_dimrX  c                 C   sh   t | j|}t | j|}||kr2| jdkr2| S t| ||\}}|d k	rZt| ||S t| ||S r  )rP  ru  r"  r}  _collapse_view_helperZcollapse_viewZcollapse)r\  r  r  r  new_stridesr)  r)  r*  r     s    )r\  r  rX  c                 C   s@   t |tst |tstdt| j|}t| t	| |S )Nz!dims has to be a sequence of ints)
r-  rA  r,  rG  rP  canonicalize_dimsr"  Zvalidate_no_repeating_dimsr}  revr  r)  r)  r*  r     s
    
c                 C   s   | j dk rtdt| dS )Nr  zInput must be >= 2-d.r  r"  rH  r   r[  r)  r)  r*  r     s    
c                 C   s   | j dk rtdt| dS )Nr;  zInput must be >= 1-d.rr  r  r[  r)  r)  r*  r     s    
)r\  r  rg  r  rX  c                    s   t tr6t dko$tjdd   t|  dkdd  tdkdd  t	| j
|}| | tt  ko k fdd dk r  t  k fdd tj|  |dS )	Nr   c                   S   s   dS )Nz'start must be an 0-dim integral Tensor.r)  r)  r)  r)  r*  r9    r:  znarrow.<locals>.<lambda>c                   S   s   dS )Nz-narrow() cannot be applied to a 0-dim tensor.r)  r)  r)  r)  r*  r9    r:  c                   S   s   dS )Nz&narrow(): length must be non-negative.r)  r)  r)  r)  r*  r9    r:  c                      s   d   d  d dS )Nz0start out of range (expected to be in range of [, z], but got )r)  r)  )
dim_lengthrg  r)  r*  r9    r:  c                      s   d d d  dS )Nzstart (z) + length (z) exceeds dimension size (z).r)  r)  r  r  rg  r)  r*  r9    r:  axis)r-  r$   r  r  r  rP  r  r  r   ru  r"  r  Z_check_with
IndexErrorr}  slice_in_dim)r\  r  rg  r  r)  r  r*  r     s,    


)r\  	norm_dimsepsrX  c           	      C   sl   t | j|}t | j}t| |}t|ts2t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  )rP  r  r"  r  r  r(   r-  r$   rC  r  r   r   )	r\  r  r  r  Za_accZ
biased_varr   rstdru  r)  r)  r*  
_normalize  s    
   
r  )r6  
dimensionsrX  c                 C   s   t |D ]}t| |} q| S r2  )sortedr  r   )r6  r  r  r)  r)  r*  _unsqueeze_multiple  s    r  )	r  weightbias
batch_sizenum_channelsflattened_inner_size
num_groupsr  rX  c                    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 k	rt	||}d }|d k	rt	||}|d k	r|
| }
|d k	r|
| }
t
|
 j}
t
| j}t
| j}t ||}t ||}|
||fS )Nr  c                      s   d j  S )Nz=Expected at least 2 dimensions for input tensor but received rR  r)  r~  r)  r*  r9  $  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 = r  r)  r  r  r)  r*  r9  (  s   r`  )r  r  r"  r   r  r   r>  r,  rF  r  r(   r  r   )r  r  r  r  r  r  r  r  r#  Zinput_reshapedru  r   r  r&  Zunsqueeze_biasZunsqueeze_weightr)  r  r*  r     s@    



Zout2)r  normalized_shaper  r  r  rX  c                    s  t }t|dkfdd td kp8jtkfdd t d kp` jtk fdd tj|kojj| d  tkfdd  d k	r  d k	rЈ   j| }tt|j}t	||\}}	}
d kr d k	r|  }n>d k	r8 d kr8| }n d k	rX d k	rX|   }t
|j}jjdkrt
|	j}	t
|
j}
||	|
fS )Nr;  c                      s   dt   S )NzzExpected normalized_shape to be at least 1-dimensional, i.e., containing at least one element, but got normalized_shape = )rQ  r)  )r  r)  r*  r9  X  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 = rQ  r>  r)  )r  r  r)  r*  r9  a  s   c                      s   dt  j d t  S )NzMExpected bias to be of same shape as normalized_shape, but got bias of shape r  r  r)  )r  r  r)  r*  r9  i  s   c                      s&   dt  d t  d t  j S )NzGiven normalized_shape=z, expected input with shape z, but got input of size r  r)  )r  r  r)  r*  r9  r  s   r  )r=  r  r  r>  rA  r"  r   r,  rF  r  r(   r  r(  r&  )r  r  r  r  r  Znormalized_ndimr  r#  ru  r   r  r)  )r  r  r  r  r*  r   L  sJ    	
	



c                 G   s    t | jt |}t| |S r2  )rP  r  r"  Zextract_dims_from_varargsr}  r   )r\  r  _permutationr)  r)  r*  r     s
     )r  r|  r  maxnormrX  c           	         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rt jj| ||d	|d
}nt jj| ||d	d}d}t | k ||  d}|| j
krt|| j
}| |  S )Nc                   S   s   dS )Nzrenorm: p must be real-valuedr)  r)  r)  r)  r*  r9    r:  zrenorm.<locals>.<lambda>r   c                   S   s   dS )Nz'renorm: non-positive norm not supportedr)  r)  r)  r)  r*  r9    r:  c                   S   s   dS )Nz#renorm: maxnorm must be real-valuedr)  r)  r)  r)  r*  r9    r:  c                      s
   d  S )Nz,renorm: expected maxnorm to be >= 0 but got r)  r)  )r  r)  r*  r9    r:  r;  c                      s   d  dS )Nz/renorm: input needs at least 2 dimensions, got  dimensionsr)  r)  rR  r)  r*  r9    r:  T)r  r  r  gHz>r  )r  r  r-  r  r"  rP  ru  r,  rF  r  r  linalgvector_normr   r}  r  r   )	r  r|  r  r  r;  Zacc_typer_   r  Znorm_factorr)  )r  r"  r*  r"    sB    
  


    reflect)r  n_fft
hop_length
win_lengthwindowcenterpad_mode
normalizedonesidedreturn_complexrX  c
                    s  t d kpjjkfdd |d k	r2|nd  |d k	rF|n|	d kr| pld k	oltj}
t |
d n|	}
t tjptjdd  t dj  kodkn  dd  j}|dkr	d	|r:d
j }d }t
d|j}t|||g| |d  d	}dt d	  k ofkn  fdd t  d	k fdd t d	  k okn  fdd t d kpԈjfkfdd k r0d krt jjjd d }t| | gjd dd k	rR tj}|d k	rl|n| }|r|dnd }|rt | dd  t jjd|d}nt jjd|d}|dd |dkr|d	}|
r|S t |S )Nc                      s   d j  dj   S )NzAstft input and window must be on the same device but got self on  and window on r'  r)  r  r  r)  r*  r9    s    

zstft.<locals>.<lambda>   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   s   dS )Nz:stft expected a tensor of floating point or complex valuesr)  r)  r)  r)  r*  r9    r:  r;  r  c                   S   s   dS )Nzstft expected a 1D or 2D tensorr)  r)  r)  r)  r*  r9    r:  r   r`  c                      s   d  d S )Nzstft expected 0 < n_fft <= z, but got n_fft=r)  r)  )r  r  r)  r*  r9     r:  c                      s
   d  S )Nz0stft expected hop_length > 0 but got hop_length=r)  r)  )hop_length_r)  r*  r9    r:  c                      s
   d  S )Nz9stft expected 0 < win_length <= n_fft but got win_length=r)  r)  )win_length_r)  r*  r9    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 r  r)  )r  r  r)  r*  r9    s    

r  r?  )	dimensionr  steporthoc                   S   s   dS )Nz9Cannot have onesided output if window or input is complexr)  r)  r)  r)  r*  r9  "  r:  r  r_   )r  r  r(  r!  rP  r  r  r  r"  r   	itertoolsr   r>  ry  ry  r   r  r  r   r   fftZrfftZ
transpose_Zsqueeze_Zview_as_real)r  r  r  r  r  r  r  r  r  r  Zreturn_complex_original_ndimZ
extra_dimsZ
pad_amountZextended_shapebatchleftZcomplex_fftr_   ru  r)  )r  r  r  r  r  r  r*  r#    s    &










)
r  r  r  r  r  r  r  r  r  rX  c
                    s  t d kpj jk fdd |d k	r2|n|d }
|d k	rF|n|}t t j fdd  d} d}||
|d   }t   dkd	d  t d
 j  kodkn   fdd |d k	r|n||k}|rt |d
 d |kdd  nt ||kdd  t d|
  k o2|kn  dd  t d|  k oX|kn  dd  t d kp~j	|fkdd  d k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 }|	rHt | dd  t jj d|d nTt d kpbtj dd  |s jdd|d
 d d t jj d|d  d
|kst |dd|g }tj||d|fd||
d}tj|d
d||f|d|fd||
d}||dks&t||dks:t|rH|d
 nd}|d k	r`|| }n|rt||d
  }n|}td|| }|jd||d}|jd||d}|  d}t |  dd  || }|d
kr|d}||krt d t|d|| fd}|S )Nc                      s   d j  dj   S NzBistft input and window must be on the same device but got self on r  r'  r)  r  r)  r*  r9  @  s    

zistft.<locals>.<lambda>r  c                      s   d j  dj   S r  r'  r)  r  r)  r*  r9  K  s    r?  r;  r   c                   S   s   dS )Nz"istft input tensor cannot be emptyr)  r)  r)  r)  r*  r9  T  r:  r  r`  c                      s   d j  S )Nz8istft expected a tensor with 2 or 3 dimensions, but got rR  r)  r~  r)  r*  r9  W  r:  c                   S   s   dS )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}r)  r)  r)  r)  r*  r9  ^  s    c                   S   s   dS )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}r)  r)  r)  r)  r*  r9  f  r:  c                   S   s   dS )Nz+istft expected 0 < hop_length <= win_lengthr)  r)  r)  r)  r*  r9  n  r:  c                   S   s   dS )Nz&istft expected 0 < win_length <= n_fftr)  r)  r)  r)  r*  r9  q  r:  c                   S   s   dS )NzDInvalid window shape. window has to be 1D and length of `win_length`r)  r)  r)  r)  r*  r9  u  r:  r  r  c                   S   s   dS )Nz9cannot have onesided output if window or input is complexr)  r)  r)  r)  r*  r9    r:  r  c                   S   s   dS )Nz:Complex windows are incompatible with return_complex=Falser)  r)  r)  r)  r*  r9    r:  )r  rg  r  )r}  r  r  r  gdy=c                   S   s   dS )Nz&window overlap add min less than 1e-11r)  r)  r)  r)  r*  r9    r:  zThe length of signal is shorter than the length parameter. Result is being padded with zeros in the tail. Please check your center and hop_length settings)!r  r  r(  rP  r  r  r  r  r"  r>  Zcorresponding_real_dtyper  ry  r   r   r   r  Zifftr   ZirfftrC  r   Zunfold_backwardr   r   rD  r.   r  r   r   r   warningswarn)r  r  r  r  r  r  r  r  r  r  r  r  Zn_framesZfft_sizeZexpected_output_signal_lenZ	onesided_Z
real_dtypeZwindow_r  r  r_   Zy_tmpyZwindow_enveloprg  endZwindow_envelop_lowestr)  r  r*  r$  1  s    



 







)a_shapea_strider  r  r  c           	         s   t | }tj||dd |dkr$dn|   |dkr8dn|  }tk fdd tdkfdd t| }t|}| ||  |k r|    d | < |   9  < ||fS )NT)Zwrap_scalarr   r;  c                      s   d  d d S )Nz%Maximum size for tensor at dimension z is z but size is r)  r)  )r  max_sizer  r)  r*  r9    r:  z*_get_unfold_shape_stride.<locals>.<lambda>c                      s   d  dS )NzStep is z but must be > 0r)  r)  r  r)  r*  r9    r:  )r=  rP  ru  r  r  r,  r{  )	r  r  r  r  r  Za_ndimZlast_strider>  stridesr)  )r  r  r  r  r*  _get_unfold_shape_stride  s(    


r  c              	   G   s>  t j|dd}tt|t| jkdd  t|dkrBt| S t|| j }dg| }| jD ]}|| q`t	dd t
||D }d|krtj|| j| j| jt | d	S |}t |}t|D ]"\}}t||||t|d\}}qtt|}	|	jtdd
d t
|	 \}
}| |}t|}||
}||S )NFr3  c                   S   s   dS )Nzbrepeat: Number of dimensions of repeat dims can not be smaller than number of dimensions of tensorr)  r)  r)  r)  r*  r9    r:  zrepeat.<locals>.<lambda>r   r;  c                 s   s   | ]\}}|| V  qd S r2  r)  )r5  Zpadded_sizeZrepeat_sizer)  r)  r*  r7    s   zrepeat.<locals>.<genexpr>rs  T)keyreverse)rP  r9  r  r  r=  r>  r   r"  r{  rA  zipr	  r  r(  rq  rh  make_contiguous_strides_forrE  r  rD  r,  sortrK  
itemgetterr   r   r   )r\  Zrepeat_shapeZnum_new_dimensionsZpadded_shapedim_sizeZtarget_shapeZurtensor_shapeZurtensor_strider  Zenumerated_strideZpermute_orderZsorted_strideZrepeat_xtensorZcloned_resultZpermuted_resultr)  r)  r*  r     sN    



    



)r\  
allow_copyrX  c                   s  ddl m}m} tj|dd}t||  }||  dkrPt| |t|S | j	dkr| }|D ]}|dksrt
t|d}qb|| krt| S |S t|dkr| }| jD ]}|dkst
t|d}q|| krt| S |S |  rVt|dkr| j	dkrt| |  gdgS t|dkrV| j	dkrV|d }|d }t| ||g|dgS d|  |D ]6} j	kr|dkst
 j	d }	t |	 j|	  d qb|| j kr̈d qb j }
}||
| dkr|d }|
 j|  }
q|krtt |\}}|d krh|rBt| |  S d| j d	|   d
| d}t|t | ||
|krt | d qb j	k rt j dk fdd t  q | krt| S  S d S )Nr   )r1  sym_eqFr3  r;  r?  r  z Cannot view a tensor with shape z and strides z as a tensor with shape rO  c                      s   d d j   S )Nza.size(z) expected to be 1 but got r  r)  r  rK  r)  r*  r9    r:  z&_reshape_view_helper.<locals>.<lambda>)r@  r1  r  rP  r9  Z
infer_sizer  r   r  r"  rC  r   r}  r:  r=  r>  r   Zis_contiguousr  Z	split_dimr  r   r  rG  r   r  )r\  r  r>  r1  r  _ar  dim0dim1last_dimaccumr  r  r  r  r)  r  r*  _reshape_view_helper"  s    











r  )r\  r>  rX  c                 G   s   t | f|ddiS )Nr  Tr  r6  r)  r)  r*  r     s    )r  r  rX  c                 C   s   |  | S r2  )r   r  r  r  r)  r)  r*  r     s    )r\  shiftsr  rX  c                 C   s|  t | j|}t|ts|f}t|ts.|f}|  dkrB|  S |  dkrnt|dkrnt	d|d  dt|}t|}|dks|dkr2|dkrt
d|dkr|dkrtt| |d| jS ||krt
d| d| |dkst|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 dimensionsr;  z`shifts` requiredz*shifts and dimensions must align. shifts: z, dims: Nr'  )rP  r  r"  r-  r   r  r   r  r=  r  rH  r  r   r   r   r>  rC  r  r(  rL   r   )r\  r  r  Z
len_shiftsZlen_dimsZtail_shiftsZ	tail_dimsZfirst_dim_rolledr  r  rg  rK  r)  r)  r*  r     s@    


r   r;  )r\  kr  rX  c                 C   s   t |dkrtdt | | jdk r8td| j t| j|}|d |d krrtd|d  d|d  |d }|dkrtt| |d f|d |d S |dkrt| |S |d	krtt| |d f|d |d S t| tj	d
S dS )z0Reference implementation of :func:`torch.rot90`.r  z2expected total rotation dims == 2, but got dims = z/expected total dims >= 2, but got total dims = r   r;  z7expected rotation dims to be different, but got dim0 = z and dim1 = r  r`  r  N)
r=  rH  r"  rP  r  r  r   r   r   r)  )r\  r  r  r)  r)  r*  r     s&    
$$c                 C   sP   | d j }tdt| D ]2}| | j |kstd| d| | j  d| qd S )Nr   r;  z4stack expects each tensor to be equal size, but got z at entry 0 and z
 at entry )r>  rF  r=  rC  )rf  Zentry_shaper  r)  r)  r*  _check_stack_inputs   s
    
r  c                    s   t | dkstdt| d jd |  | d jk rtt|  t| d j}| t |  t	
|  }||S t	
 fdd| D |S )Nr   z$stack expects a non-empty TensorListr;  c                    s   g | ]}|  qS r)  )r   rN  Zwrapped_dimr)  r*  r     s     zstack.<locals>.<listcomp>)r=  rC  rP  ru  r"  r  r,  r>  insertr  r   r   )rf  r  Zresult_sizesru  r)  r  r*  r   	  s    
c                 C   sh   |p| j }t|}t| |}|  dkr4t|}nt||dd}t|| }tt|t||dd|S )Nr   Tr  )	r  rP  r  r(   r  r@   r   r   r   )r\  r  r  r  r  r  Za_expZa_maxr)  r)  r*  rn     s    



 c                 C   sB   t t| dkdd  t|  }|d jdkr8t|dS t|dS )Nr   c                   S   s   dS )Nz%hstack expects a non-empty TensorListr)  r)  r)  r)  r*  r9  1  r:  zhstack.<locals>.<lambda>r;  )r  r  r=  r   r"  r   rx  r)  r)  r*  r   /  s
    
c                 C   s*   t t| dkdd  t|  }t|dS )Nr   c                   S   s   dS )Nz%vstack expects a non-empty TensorListr)  r)  r)  r)  r*  r9  ;  r:  zvstack.<locals>.<lambda>)r  r  r=  r   r   rx  r)  r)  r*  r   9  s    )r\  r  r  rX  c                 C   s\   t | j|}tt|dkdd  | t| jd | t| t| j|d d   S )Nr   c                   S   s   dS )Nz"unflatten: sizes must be non-emptyr)  r)  r)  r)  r*  r9  C  r:  zunflatten.<locals>.<lambda>r;  )	rP  ru  r"  r  r  r=  r   rA  r>  )r\  r  r  r)  r)  r*  r  A  s    )r   r  rX  c                    sv   ddl m} t| j  tt| jdkdd  || j  dkrLt	 S t	 fddt
| | j   D S d S )Nr   r0  c                   S   s   dS )Nz5Dimension specified as 0 but tensor has no dimensionsr)  r)  r)  r)  r*  r9  N  r:  zunbind.<locals>.<lambda>c                 3   s   | ]}t | V  qd S r2  )r  r   )r5  sr  r)  r*  r7  S  s    zunbind.<locals>.<genexpr>)r@  r1  rP  ru  r"  r  Z_check_indexr=  r>  rA  r   )r   r  r1  r)  r  r*  r  G  s    r6  r  r  rv  c                 C   s   | j tjd|||S r  )r   r  r)  rK   r  r)  r)  r*  rJ   X  s
      c                    s`   t | j|}t jdk fdd | jdkr<| dn| }td f|  f }|||< | S )Nr;  c                      s   d j  dS Nz(Index should have dimension 1 or 0 (got r  rR  r)  r  r)  r*  r9  c  r:  zindex_copy_.<locals>.<lambda>r   )rP  r  r"  r  r  r   slice)r6  r  r  rv  r  rK  r)  r  r*  rK   _  s    
r6  r  r  r  c                 C   s   t | |||ddS )NFinplace_index_fillr  r)  r)  r*  rM   l  s    c                 C   s   t | |||ddS )NTr  r  r  r)  r)  r*  rN   t  s    )r6  r  r  r  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}|rp| 	dn| }t
|j}  ||< ||rtjnt j}||| }	|r| S |r|	d }	|	 |  krt | }
|
|	 |
}	|	S d S )Nr;  c                      s   d j  dS r  rR  r)  r  r)  r*  r9    r:  z_index_fill.<locals>.<lambda>r   c                      s   d j  dS )Nz<Only supports 0-dimensional value tensor. Got a tensor with rz  rR  r)  r  r)  r*  r9    r:  )r  r  r(  )r  r  r"  r-  r$   r  r  r  r(  r   r,  r>  r  r   r  rK   rJ   r   r   r  r
  copy_)r6  r  r  r  r  Zzero_dimr  r>  rJ   ru  Znew_outr)  )r  r  r*  r  {  s>    


   




r  r6  r  r  rv  r  c                C   s   | j tjdj||||dS )Nr  r  )r   r  r)  Z
index_add_r  r)  r)  r*  rI     s    
   )r6  r  r  c                    s|   t | j|}t jdk fdd  jdkr< d | jdkr`t| d |  S t	d f|  f }| | S )Nr;  c                      s   d j  dS r  rR  r)  r  r)  r*  r9    r:  zindex_select.<locals>.<lambda>r   )
rP  r  r"  r  r  r   r
  rJ   r   r  )r6  r  r  rK  r)  r  r*  rL     s    



)r\  r  rX  c                    s  ddl m |d krFtdd t jD }|r<t |S t S  j}t	
||}t|trh|fn|}|dkrt|dks|dkstt S t fdd|D }t|dkrt S t|dkrt |S t|}t|dd	}|D ]}t | q S )
Nr   r0  c                 s   s   | ]\}}|d kr|V  qdS r7  r)  )r5  rK  r  r)  r)  r*  r7    s      zsqueeze.<locals>.<genexpr>rr  c                 3   s$   | ]} j | d kr|V  qdS r7  r  )r5  dr\  r1  r)  r*  r7    s      r;  T)r  )r@  r1  rA  rE  r>  r}  r   r:  r"  rP  r  r-  r   r=  rC  r,  r  )r\  r  r  r"  Z	dims_listr  r)  r  r*  r     s(    

)r\  indices_or_sectionsr  rX  c              	   C   s  t | j|}| jdkr$d}t|t|trr|jjdksNd|j }t||jt	j
krrd}d|j  t|t|tst|tr@|jdkr@t|tr|n| }|dkrd| }t|g }| j| }t|| }|| }	d}
t|D ]B}||	k r
|d n|}tj| |
|
| |d	}|| |
| }
qt|S |}t|tr~|jdkrvd
}d|j d t|| }g }d}
|D ]"}|tj| |
||d	 |}
q|tj| |
| j| |d	 t|S d S )Nr   zXtensor_split: received a rank zero tensor, but expected a tensor of rank one or greater!r  z\tensor_split: if indices_or_sections is a tensor it must be on the CPU, but received one on zJtensor_split: if indices_or_sections is a tensor it must have long dtype, z but received one with dtype zAtensor_split: number of sections must be greater than 0, but was r;  r  zStensor_split: non-scalar indices_or_sections tensors must have only one dimension, zbut received a tensor with r  )rP  ru  r"  rG  r-  r$   r(  r&  r  r  longr   r   r   r>  r  rF   rF  r}  r  r{  rA  tolist)r\  r  r  Z_dimr  sectionsZsplitsr  Zmin_split_sizeZnum_splits_one_extraZ	start_idxZ	split_idx
split_sizer  indicesr6  r)  r)  r*  r     sj    







)r\  r  rX  c                    s   t  jdk fdd  jdkr(dndttrtt dkoV j  dk fdd t S t ttt	ffdd }t |S )Nr;  c                      s   dt  j d S )NzPtorch.hsplit requires a tensor with at least 1 dimension, but got a tensor with  dimensions!rQ  r"  r)  r[  r)  r*  r9  9  s
    zhsplit.<locals>.<lambda>r   c                      s.   dt  d t  j  d t  d S )Nz0torch.hsplit attempted to split along dimension z , but the size of the dimension $ is not divisible by the split_size rO  r  r)  )r\  r  r  r)  r*  r9  D  s    c                      s   dt   S )Nzhsplit(): received an invalid combination of arguments. Expected indices_or_sections to be of type int, list of ints or tuple of ints but got type r%  r)  r  r)  r*  r9  R  s    
r  r  r"  r-  r   r>  r   _check_typer,  rA  r\  r  Zsplit_sizesr)  )r\  r  r  r  r*  r   4  s$    


	c                    s   t  jdk fdd ttr`t dkoD jd  dk fdd t dS t ttt	ffdd }t |dS )Nr  c                      s   dt  j d S )NzPtorch.vsplit requires a tensor with at least 2 dimension, but got a tensor with r  r  r)  r[  r)  r*  r9  c  s
    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  rO  r  r)  )r\  r  r)  r*  r9  m  s    c                      s   dt   S )Nzvsplit(): received an invalid combination of arguments. Expected indices_or_sections to be of type int, list of ints or tuple of ints but got type r%  r)  r   r)  r*  r9  z  s    r  r  r)  )r\  r  r  r*  r   ^  s"    


	)r  r  rX  c                    sD   |    t dk fdd  dkr4t| |S t| |S d S )N)r;  r  c                      s   d  dS )Nz'diag(): Supports 1D or 2D tensors. Got Dr)  r)  rR  r)  r*  r9    r:  zdiag.<locals>.<lambda>r;  )r  r  r  r   r   )r  r  r)  rR  r*  r     s     
)r  rc  r  r  dim2rX  c                    sD   t | }|||| t jjk fdd t  |S )Nc                      s   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 r  r)  r   rc  r)  r*  r9    r:  z"diagonal_scatter.<locals>.<lambda>)rP  Zclone_preserve_stridesr   r  r  r>  r   )r  rc  r  r  r  ru  r)  r  r*  r     s    	


)r  r  r  r  rX  c           
         sF  |   }tj |d tj|dt k fdd |  }|dkrttt|    |   | d}n$tt|    | |   d}|dkr|dkr||| 	   7 }n||| 	    8 } fddt
|  D }||  fddt
| 	 D }|| 	   | 	    | j|||d}	|	S )	z4
    Reference implementation of torch.diagonal
    )rK  rankc                      s   d  d S Nz(diagonal dimensions cannot be identical r  r)  r)  r  r  r)  r*  r9    r:  zdiagonal.<locals>.<lambda>r   c                    s    g | ]\}}| fkr|qS r)  r)  r5  r  r  r	  r)  r*  r     s      zdiagonal.<locals>.<listcomp>c                    s    g | ]\}}| fkr|qS r)  r)  r
  r	  r)  r*  r     s      )r  r  r  )r  rP  ru  r  r  r  rD  r  r  r  rE  r{  r   )
r  r  r  r  Znum_dimsr  Z	diag_sizer  r  r  r)  r	  r*  r     s*    
 &$
r  )r   r  r  r  rX  c                    sT  | j d }tj| d tj|d kr>   | }t k fdd | d|dkrt| j}t	||d< tj
|| j| jdd}|dkr|| fn| |f}tj|dd	} t	|7 |  d} tj| jtjd
}tj|| | jtjd
}	||	dk}
 fddtt| jD }|
|}
t|
|  S )z6
    Reference implementation of torch.diag_embed
    r;  )r  rK  c                      s   d  d S r  r)  r)  r	  r)  r*  r9    r:  zdiag_embed.<locals>.<lambda>r?  r   Fr  r(  rq  r  r(  r  c                    s    g | ]}| fkrnd qS r  r)  r  r  r  r  r)  r*  r     s     zdiag_embed.<locals>.<listcomp>)r"  rP  ru  r  r  r  r,  r>  r  r.   r  r  r(  r   r   r   r  r0  rF  r=  r   mask_tensorr   )r   r  r  r  r  Zt_shapezpairZa_rangeZb_rangecondZ
cond_shaper)  r  r*  r     s<    

 

    
c           	         s   dd | D }t dd |D }|d j g }d}t|D ]\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 )r;  r?  )r  r   r5  rv  r)  r)  r*  r     s    z(_block_diag_iterable.<locals>.<listcomp>c                 s   s   | ]}|j d  V  qdS r7  r  r  r)  r)  r*  r7    s     z'_block_diag_iterable.<locals>.<genexpr>r   r  c                      s   d  d   dS )Nz5Input tensors must have 2 or fewer dimensions. Input z has r  r  r)  )r  rv  r)  r*  r9  #  r:  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  r'  r)  r(  r  rv  r)  r*  r9  (  r:  r  r;  r  )r  r   r(  rE  r  r  r  r>  r  r  r   )	rf  Z
tensors_2dZncolsr  Z	col_startrowcolr  rightr)  r  r*  _block_diag_iterable  s4    


  
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  re  r)  r)  r*  r   6  s    )r\  r  rX  c                 C   sl   | j dk rtd| j  dt|tr`|dks@| jd | dkr`tdd| jd  d| d	 t| |dS )
Nr`  zPtorch.dsplit requires a tensor with at least 3 dimension, but got a tensor with r  r   r  z3torch.dsplit attempted to split along dimension 2, zbut the size of the dimension r  rO  )r"  rH  r-  r   r>  r   )r\  r  r)  r)  r*  r   @  s    
$c                 C   s8   | j dkrtd| j  dt| d| j dk r2dndS )Nr  z7t() expects a tensor with <= 2 dimensions, but self is r  r   r;  )r"  rH  r  r   r[  r)  r)  r*  r   M  s
    
c                 C   s   t | jdkdd  |  S )N)r   r  c                   S   s   dS )NzcThe use of `x.T` on tensors of dimension other than 0 or 2 to reverse their shape is not supported.r)  r)  r)  r)  r*  r9  d  s    zT.<locals>.<lambda>)r  r  r"  r   r[  r)  r)  r*  r   `  s
    c                 C   s
   t | S r2  )r}  r:  r[  r)  r)  r*  r   l  s    )r\  r  r  rX  c                 C   s`   t | j||f\}}| jdks(||kr4tj| S ttd| j}|||< |||< t	| |S )Nr;  r   )
rP  r  r"  ry  r   defaultr,  rF  r  r   )r\  r  r  Z_dim0Z_dim1r  r)  r)  r*  r   q  s    )r  r  r  r  rX  c                 C   s&   t | j|  |||\}}| ||S r2  )r  r>  r  r   )r  r  r  r  r>  r  r)  r)  r*  r     s        r  r  r  r  c                 C   s   |  |||jtjdS r  )r   r   r  r)  r  r)  r)  r*  r     s    )r\  r  r  ru  rX  c                C   s   |j }t||}|dkr0| |dd||dS ||d }tj|j| |jd}|d|k}t|| d D ]}	|d}qrt	|||}
| |
|||dS )Nr   )r  r  ru  r;  r'  r?  )
r"  rP  ru  r   r  r  r>  r(  rF  r   )funcinitr\  r  r  ru  r"  rgr  rv  Zmasked_ar)  r)  r*  _cumsumprod_common  s    r  c                C   s   t td| |||dS )Nr   r  r  r\  r  r  ru  )r  r   r\  r  r  ru  r)  r)  r*  r     s    c                C   s   t td| |||dS )Nr;  r  )r  r   r  r)  r)  r*  r     s    c                 C   s(   | j d }t||}tj| |f|dS )Nr;  rR  )r"  rP  ru  r}  Zexpand_dims)r\  r  r"  r)  r)  r*  r     s    
c                 G   s   t | f|ddiS )Nr  Fr  r6  r)  r)  r*  r     s    c                 C   s   |  | S r2  )r   r  r  r)  r)  r*  r     s    c                 C   s
   t | dS )N)r?  )r   r[  r)  r)  r*  r     s    )r\  r  r  rX  c                    s   t  jjk fdd t tjfdd |d kr\t  dddS t j	}
|||< t|
 }t|}tj	} 
|||< t| 
 }t |}t |||S d 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 indicesrR  r)  r\  r  r)  r*  r9    s    z take_along_dim.<locals>.<lambda>c                      s   d j  dS )Nz?torch.take_along_dim(): dtype of indices should be int but got rI  r  r)  )r  r)  r*  r9    s    r?  r   )r  r  r"  rP  r  r  Zgatherr   r,  r>  r  Zinfer_size_shapesr   )r\  r  r  Z
self_sizesZbroadcast_shapeZindices_broadcastZindices_sizesZself_broadcastr)  r   r*  r     s&    
	





r  r  r(  rq  r  r  )r  r  r(  rq  r  r  rX  c              	      s   t  t jkdd  t|} t jkr6t|}n: t jkrLt|}n$t  t j	k fdd t
|}t j||| ||||dS )Nc                   S   s   dS )Nz8torch.empty: the Preserve memory format is not supportedr)  r)  r)  r)  r*  r9    r:  zempty.<locals>.<lambda>c                      s   d  dS )Nz/torch.empty: received an unknown memory format rO  r)  r)  r  r)  r*  r9    r:  r  r  r(  r  rq  )r  r  r  rP  r9  r)  r  Zchannels_last_3dZ!make_channels_last_3d_strides_forZchannels_lastZ!make_channels_last_2d_strides_forr  )r  r  r(  rq  r  r  r>  r  r)  r  r*  r	    s.    





)r  r  r(  rq  r  rX  c                 C   s   t j| ||||dS )Nr  )r}  r  )r>  Zphysical_layoutr  r  r(  rq  r  r)  r)  r*  r  -  s    
r  r  r(  r  )r\  r  r  r  r(  r  rX  c                C   sJ   |d kr| j n|}|d kr | jn|}|d kr2| jn|}tj|||||dS )Nr  r(  r  r  )r  r  r(  r  r	  )r\  r  r  r  r(  r  r)  r)  r*  r  @  s    )r\  r  r  r  r  r(  r  rX  c                C   sL   |dkr| j n|}|dkr | jn|}|dkr2| jn|}tj||||||dS )zD
    Reference implementation of torch.Tensor.new_empty_strided
    Nr$  )r  r  r(  r  r  )r\  r  r  r  r  r(  r  r)  r)  r*  r  X  s    r"  )r  r  r(  r  rq  rX  c              	   G   s@   t |}| d krt } tj|| tjkr.dnd| ||||dS NFr   r"  rP  r9  r  r  r  r  r  r  r(  r  rq  r  r)  r)  r*  r  v  s    

)r\  r  r  r  r(  r  rq  rX  c             	   C   sb   |d kr| j n|}|d kr | jn|}|d kr2| jn|}tj||pD| j tjkrPdnd|||||dS r%  r  r  r(  r  r  r  r\  r  r  r  r(  r  rq  r)  r)  r*  r    s    c              	   G   s@   t |}| d krt } tj|| tjkr.dnd| ||||dS NTr;  r"  r&  r'  r)  r)  r*  r    s    

c             	   C   sb   |d kr| j n|}|d kr | jn|}|d kr2| jn|}tj||pD| j tjkrPdnd|||||dS r*  r(  r)  r)  r)  r*  r    s    )r\  r  
fill_valuer  r  r(  r  rX  c                C   sL   |d kr| j n|}|d kr | jn|}|d kr2| jn|}tj||||||dS )Nr#  )r  r  r(  r  r  )r\  r  r+  r  r  r(  r  r)  r)  r*  r    s    )r  r(  r  r  rq  r  )r\  r  r(  r  r  rq  r  rX  c             	   C   s~   |d kr| j n|}|d kr | jn|}|d kr2| jn|}|tjkrZtj| j||||||dS t| }tj	| j||||||dS )Nr!  r"  )
r  r  r(  r  r  r	  r>  rP  Z3compute_elementwise_output_logical_to_physical_permr  )r\  r  r(  r  r  rq  r  Zlogical_to_physical_permr)  r)  r*  r
    s0    
)	rg  r  r  r  r  r(  r  rq  rX  c                   s  t | t | tt |}ttr2tt tr@tttrNt d kr^ dt	dkdd  dkrt	 kdd  ndk rt	 kdd  dd }t	|o|  fdd t	|fd	d  f}	t
d
d |	D }
|d kr*|
r"tjnt }t |}|rRt}t }t}|tjk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   s   dS )Nzstep must be nonzeror)  r)  r)  r)  r*  r9  >  r:  zarange.<locals>.<lambda>c                   S   s   dS Nz7upper bound and lower bound inconsistent with step signr)  r)  r)  r)  r*  r9  B  r:  c                   S   s   dS r,  r)  r)  r)  r)  r*  r9  G  r:  c                 S   s   t | t pt| S r2  )r-  r   r  rO   r8  r)  r)  r*  	is_finiteJ  s    zarange.<locals>.is_finitec                      s   d d  S )Nzunsupported range: z -> r)  r)  )r  rg  r)  r*  r9  O  r:  c                      s
   d  S )Nzstep must be finite but got r)  r)  r  r)  r*  r9  S  r:  c                 s   s   | ]}t |tV  qd S r2  r3  r5  rX  r)  r)  r*  r7  W  s     zarange.<locals>.<genexpr>)rg  r  r  r(  rq  r;  FT)rP  check_layoutcheck_pin_memoryr  r(  device_or_defaultr-  r  rC  r  r  r   r0  r  r  r   r  r  r6   r}  iotar  Zget_acc_typer(   requires_grad_)rg  r  r  r  r  r(  r  rq  r-  rS  Zinteger_args
is_integerZxstartZxendZxsteprh   r  r  r  r  r)  )r  rg  r  r*  r  %  s    





	



)rg  r  r  c           	      C   s   | |g}t |tr | d|}n
|| t |ts8t| dk}t||d |}t||| }|||   | }t	j
t|  }| |krt||}t||S )Nr)  r  r;  )r-  r   r  r{  r  rC  r.   r  r   rP  Z"compute_elementwise_output_stridesrT  r  r}  Zcopy_stridedr/  )	rg  r  r  ri  r  Zcoeffbaser.  r  r)  r)  r*  rV     s    

)r  r(  r  r  rq  )	rg  r  stepsr  r(  r  r  rq  rX  c             	      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 rt	t
  d kr qtt fdd npt
 t tjsttt tfdd t tsttdkd	d  ||||d
}dkr6tjddi|S dkrt trjtjffdi|S tjffdi|S tjdf|}	tstrtjn}
t|	tj|
\}}tt|d} d  }t|	d k |||	  ||d |	   }t|S )Nr   c                   S   s   dS Nz:linspace only supports 0-dimensional start and end tensorsr)  r)  r)  r)  r*  r9    r:  zlinspace.<locals>.<lambda>c                   S   s   dS r7  r)  r)  r)  r)  r*  r9    r:  c                 s   s   | ]}t |tV  qd S r2  r-  r  r.  r)  r)  r*  r7    s     zlinspace.<locals>.<genexpr>c                      s   d  d S )Nzlinspace(): inferred dtype z& can't be safely cast to passed dtype r)  r)  )default_complex_dtyper  r)  r*  r9    r:  c                      s*   dt j dt  j dt j dS )Nz4received an invalid combination of arguments - got (r  r  )r&  rc  r)  )r  rg  r6  r)  r*  r9    s   c                   S   s   dS )Nz$number of steps must be non-negativer)  r)  r)  r)  r*  r9    r:  )r  r(  r  rq  rr  r  r;  r  r  )rr  r   )r-  r%   r  r  r  r(   r  py_anyrP  r  r  r  r  rC  r  r   r  r	  r  r  r  r  r0  r$  r!   r1  r   r   )rg  r  r6  r  r(  r  r  rq  Zfactory_kwargsr  Z	dtype_redr  rv  Zcast_rgr  ru  r)  )r9  r  r  rg  r6  r*  r    sz    






  
r  )
rg  r  r6  r5  r  r(  r  r  rq  rX  c             
   C   s  |d krt  }tj|rt| tr0t| } n,t| tr\t 	| 
 dkdd  t| |} t|trpt|}n,t|trt 	|
 dkdd  t||}tdd | ||fD rtt  }	|	}d }
nt j}
t|trt|dk rtt j| |||
||||d}tt |||S )Nr   c                   S   s   dS Nz:logspace only supports 0-dimensional start and end tensorsr)  r)  r)  r)  r*  r9    r:  zlogspace.<locals>.<lambda>c                   S   s   dS r;  r)  r)  r)  r)  r*  r9  "  r:  c                 s   s   | ]}t |tV  qd S r2  r8  r.  r)  r)  r*  r7  &  s     zlogspace.<locals>.<genexpr>r"  )r  r  r}  rP  r  r-  r   r   r%   r  r  r(   r:  r  r  r  rC  r  r  r   )rg  r  r6  r5  r  r(  r  r  rq  r9  Z_dtyperetr)  r)  r*  r    sP    










rf  indexingc                 C   s   d S r2  r)  r=  r)  r)  r*  r   ?  s    c                 G   s   d S r2  r)  )r>  rf  r)  r)  r*  r   D  s    )rf  r>  rX  c                    s  t |d ttfr.t|dks"tt|d }ttdd |D dd  tt|dkdd  tt|d D ]L}t|| j	||d  j	kdd  t|| j
||d  j
kd	d  qtd
} dkrt|dk}|r|d |d f|dd  }nt dk fdd g }|D ]Jt ts0ttjdkpHjdkfdd |  qg }t|D ]F\}t tstjdkrd|t||f qt|r|d |d  |d< |d< |S )Nr   r;  c                 s   s   | ]}t |tV  qd S r2  r-  r$   rY  r)  r)  r*  r7  V  s     zmeshgrid.<locals>.<genexpr>c                   S   s   dS )Nz)meshgrid expects its inputs to be tensorsr)  r)  r)  r)  r*  r9  W  r:  zmeshgrid.<locals>.<lambda>c                   S   s   dS )Nz'meshgrid expects a non-empty TensorListr)  r)  r)  r)  r*  r9  Z  r:  c                   S   s   dS )Nz3meshgrid expects all tensors to have the same dtyper)  r)  r)  r)  r*  r9  _  r:  c                   S   s   dS )Nz4meshgrid expects all tensors to have the same devicer)  r)  r)  r)  r*  r9  c  r:  FZxyr  Zijc                      s
   d  S )NzDtorch.meshgrid: indexing must be one of "xy" or "ij", but received: r)  r)  )r>  r)  r*  r9  n  s    c                      s
   d  S )NzEtorch.meshgrid: Expected 0D or 1D tensor in the tensor list but got: r)  r)  )r   r)  r*  r9  y  r:  r  )r-  r,  rA  r=  rC  r  r  r  rF  r  r(  r$   r"  r{  r  rE  r   r}  r%  )r>  rf  r  Zswap_first_and_second_tensorsZresult_shapeZgridsr)  )r>  r   r*  r   I  sV    


)r  sourcedestinationrX  c                    s@  t tkrft  tkr$ f ttt k fdd | j}ttj|d}ttj| d}t	|}t	|}tt|t|kfdd tt|t|k fdd t
t||}g }	d}
t|D ]L}||}|dk	r|	| q|
|kr|
d7 }
q|	|
 |
d7 }
qt| t|	}|S )	z3
    Reference implementation of torch.movedim
    c                      s   d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,  r)  rA  r@  r)  r*  r9    s    zmovedim.<locals>.<lambda>)r  r  c                      s   dt   dS )Nz#movedim: repeated dim in `source` (r  rB  r)  )r@  r)  r*  r9    r:  c                      s   dt   dS )Nz(movedim: repeated dim in `destination` (r  rB  r)  )rA  r)  r*  r9    r:  r   Nr;  )r&  rV  r  r  r=  r"  rA  rP  r  setdictr  rF  r  r{  r   )r  r@  rA  r  ssZdsZsssZdssrM  r  siZdir  r  r)  rC  r*  r     sD    	






)r  r(  r  rq  r  )r>  r  r  r(  r  rq  r  rX  c                C   s\   t | t | t | } |d kr.t n|}|d krDtdn|}tj| ||||dS )Nr  r  )	rP  r/  r0  r9  r  r  r(  r}  r  )r>  r  r  r(  r  rq  r  r)  r)  r*  r    s    


)nrM  r  r  r(  r  rq  rX  c                   s    dkr t dkfdd t  dk fdd t jt j|dd}t j t j|dd}|d|k}	|t jkr|	S t jd	||||dd
}
t |	|
dS dS )z/
    Reference implementation of torch.eye
    Nr   c                      s
   d  S )Nz%n must be greater or equal to 0, got r)  r)  )rH  r)  r*  r9    r:  zeye.<locals>.<lambda>c                      s
   d  S )Nz%m must be greater or equal to 0, got r)  r)  )rM  r)  r*  r9    r:  Fr  r?  r  r"  )r  r  r  r0  r   r  r  r   )rH  rM  r  r  r(  r  rq  Zrange_nZrange_mr  oner)  )rM  rH  r*  r    s$    
)r>  r+  r  r  r(  r  rq  rX  c                C   sd   t | t | |d k	r |nt t|}|d k	r:|ntd}t| |||||d}t||S )Nr  r"  )	rP  r/  r0  type_to_dtyper&  r  r(  r	  rD   )r>  r+  r  r  r(  r  rq  er)  r)  r*  r    s    

r  r  r(  r  rq  r  )	r\  r+  r  r  r(  r  rq  r  rX  c          	   	   C   s"   t j| ||||||d}t||S )NrL  )r  r
  rD   )	r\  r+  r  r  r(  r  rq  r  rK  r)  r)  r*  r  /  s    	)r\  r  r  r(  r  rq  r  rX  c             
   C   s.   t j| |p| jt jkrdnd||||||dS )NFr   rL  r  r  r  r  r\  r  r  r(  r  rq  r  r)  r)  r*  r  F  s    c             
   C   s.   t j| |p| jt jkrdnd||||||dS )NTr;  rL  rM  rN  r)  r)  r*  r  ^  s    )r  r(  r  rq  r  rX  c                 G   s>   t | t |}t | } t |}tj|dd| ||dS )Nr  r  )r   r   r  r(  rq  )rP  r0  r9  Zdtype_or_defaultr1  r}  r`   )r  r(  r  rq  r  r>  r  r)  r)  r*  r  v  s    




)r\  r  r  r(  r  rX  c                C   sT   t | t | |d k	r |nt t| }|d k	r:|ntd}tj| ||dS )Nr  r  )	rP  r/  r0  rJ  r&  r  r(  r}  r  )r\  r  r  r(  r  r)  r)  r*  r    s
    

r  )r>  lowhighr  r(  rX  c                C   sd   t |  t|tstt|ts&tt|}t|}t|tjsFtt |}t	j
| ||||dS )N)rO  rP  r  r(  )rP  r  r-  r   rC  r   r  r  Zcanonicalize_devicer}  _uniform_helper)r>  rO  rP  r  r(  r)  r)  r*  rQ    s    

rQ  )r\  r  r  c                    s   t | j t|tr t|}nj|jtdkfdd | j	jddtj
 fko`|j	jdk}t|pt|j	| j	kdd  t |j}|tkrtt |  fdd t|| j}t||| }| S )	Nr   c                      s   d  dS )Nz@only supports a 0-dimensional value tensor, but got tensor with z
 dimensionr)  r)  )
value_ndimr)  r*  r9    r:  zmasked_fill.<locals>.<lambda>cudaZxpur  c                   S   s   dS )Nz,Expected `value` to be on same device as `a`r)  r)  r)  r)  r*  r9    r:  c                      s   d  dS )Nzcould not convert to type z without overflowr)  r)  )r  r)  r*  r9    r:  )rP  r   r  r-  r   r&  r"  r  r  r(  _CZ_get_privateuse1_backend_namer  r   r(   r   r   )r\  r  r  Z
value_typeZis_cpu_scalarr  r)  )r  rR  r*  r     s0    





)r\  r  r  rX  c                 C   s   t | ||}| | | S r2  )r  r   r  )r\  r  r  r  r)  r)  r*  r     s    
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  r  r   r   r   )r\  r  r  r  r  r)  r)  r*  r    s    
c                 C   st   t j| |dd t | | | j|jkr,dS t| j|jD ]\}}||kr: dS q:|  dkrbdS ttt	| |S )NFr  r   T)
rP  r  Zcheck_same_dtyper"  r  r>  r  r   r   r   )r\  r  r6  r  r)  r)  r*  r    s    )Zexact_dtypefror  )r  r|  r  r  r  rX  c                C   s   |dkr&|d ks.t |ts.t|dks.|d kr2d}t |trB|g}t |trx|d krbtt| j}tjj	| ||||dS tjj
| ||||dS d S )NrU  r  r  )r-  r   r=  rQ  rA  rF  r"  r  r  Zmatrix_normr  )r  r|  r  r  r  r)  r)  r*  r_     s$    


c                 C   s(   t | jdkdd  t t | dS )Nr  c                   S   s   dS )Nz6expected a matrix, but got tensor with dim {self.ndim}r)  r)  r)  r)  r*  r9  4  r:  ztrace.<locals>.<lambda>r   )r  r  r"  r   r   r  r)  r)  r*  rs   0  s
     c                    s*   t ttf t ttf td fdd}|S )Nr  c                    s
    || S r2  r)  r  base_opr)  r*  rop:  s    z_make_r_binary_op.<locals>.rop)r   r%   r   )rW  rX  r)  rV  r*  _make_r_binary_op9  s
    

rY  )r\  r   rX  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   s   dS )Nz2triu: input tensor must have at least 2 dimensionsr)  r)  r)  r)  r*  r9  L  r:  ztriu.<locals>.<lambda>r  r'  r?  
r  r  r"  r>  r  r(  r   rP  r  r   r\  r   hwr  r)  r)  r*  r  H  s     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   s   dS )Nz2tril: input tensor must have at least 2 dimensionsr)  r)  r)  r)  r*  r9  ]  r:  ztril.<locals>.<lambda>r  r'  r?  rZ  r[  r)  r)  r*  r  Y  s     )r  r  r  rX  c           
      C   s   | dks|dkrdS |dkr*t |d| nt| | dk}tdt || | }tdt | | | }|| d }|| | d }|| }td|| }	||	|fS )Nr   r   r   r   r;  r  )r  rV  rD  )
r  r  r  m_first_rowZ
m_last_rowZ	n_row_allZn_row_trapezoidtrapezoid_sizeZdiff_rowrectangle_sizer)  r)  r*  _get_tril_sizeso  s    &rb  rs  r  r  r  r  r  c                    sV   t dkfdd t  dk fdd t t jt jfkfdd d S )Nr   c                      s
   d  S )Nzrow must be non-negative, got r)  r)  )r  r)  r*  r9    r:  z_trilu_checks.<locals>.<lambda>c                      s
   d  S )Nzcol must be non-negative, got r)  r)  )r  r)  r*  r9    r:  c                      s   d d  dS )Nr5  z" not implemented for ''r)  r)  )r  rs  r)  r*  r9    r:  )r  r  r  r0  rc  r)  )r  r  rs  r  r*  _trilu_checks  s    re  r  )r  r  r  r  r  r(  r  rX  c                C   s  t d| |||| t| ||\}}}	td| }
ttj|||d}|d|tjd}|	d }t| t|| d|   }t|d|	 d | | d  }t	||
 |}t	||}|d||d}|| ||	 d |
  }|| }t
t||ft||ffS )Nr  r   r  r(  r  r  r  r  r;  )re  rb  rD  r   r  r  r  rF   ro   r(   r   r   )r  r  r  r  r  r(  r  r`  ra  r_  
row_offset	arange_kwxs1r  	row_inds1	col_inds1xs2	row_inds2	col_inds2r)  r)  r*  r    s*       ""
c           
      C   s|   | dks|dkrdS |dkr*t d|| n|}t dt| | | }t| ||d \}}}| | ||  }|| }	|	||fS )Nr   r^  r;  )rD  r  rb  )
r  r  r  r_  ra  Ztrapezoid_size_trilZrectangle_size_trilrv  Z	triu_sizer`  r)  r)  r*  _get_triu_sizes  s    ro  c                C   s  t d| |||| t| ||\}}}	td|}
ttj|||d}|d||d}|| }|| }|d|tjd}d|	 }t| t|| d|   }t|d|	 d | | d  }t	||}t	||}|r|||  }||
 }t
t||ft||ffS )	Nr  r   rf  r  g      r  r;  r  )re  ro  rD  r   r  r  r  rF   ro   r(   r   r   )r  r  r  r  r  r(  r  r`  ra  r_  
col_offsetrh  rl  rm  rn  ri  r  rj  rk  r)  r)  r*  r    s0    
   ""

)	out_int32r  )r\  
boundariesrq  r  c                   sT  t   dk fdd |r&t jnt j} jd }|dkrHt | S t j| j| jt jd}|| }||| d  } | }	|r|	| k}
n|	| k}
t 	|
||d }|dkrHt j
| t jd}tt|}t|D ]p}t 	|
|@ ||}||k }t 	|||| d  d} | }	|r&|	| k}
n|	| k}
t 	|
 |@ |d |}q|j|dS )	Nr;  c                      s   d    dS )Nz2boundaries tensor must be 1 dimension but got dim(r  r  r)  rr  r)  r*  r9    r:  zbucketize.<locals>.<lambda>r?  r   r  r  r  )r  r  r  r  r0  r>  r  r  r(  r   r  r  rV  r  rZ   rF  r   )r\  rr  rq  r  Z	out_dtypeZn_boundariesrg  r  midZmid_valZcond_midZcond_updateZnitersrv  r)  rs  r*  r     s:    	






c                    s   |d kst tt j o8t j o8t j  fdd tdkfdd |tt	j
t d    S )Nc                      s   d j  S )NzwCauchy distribution is a continuous probability distribution.         dtype must be a floating point but you specified r  r)  r  r)  r*  r9  @  s   zcauchy.<locals>.<lambda>r  c                      s
   d  S )Nz-cauchy_ expects sigma > 0.0, but found sigma=r)  r)  )sigmar)  r*  r9  E  r:  r  )rC  r  r  rP  r  r  r  r  rq   r  r  	rand_like)r  Zmedianru  	generatorr)  )r  ru  r*  r  4  s    

c                    sx   |d kst ttj o8tj o8tj fdd t dk fdd d  tt	  S )Nc                      s   d j  S )Nz|Exponential distribution is a continuous probability distribution.         dtype must be a floating point but you specified r  r)  r  r)  r*  r9  V  s   zexponential.<locals>.<lambda>r  c                      s
   d  S )Nz4exponential_ expects lambda > 0.0, but found lambda=r)  r)  )rater)  r*  r9  [  r:  r?  )
rC  r  r  rP  r  r  r  r  rY   rv  )r  rx  rw  r)  )rx  r  r*  rB   J  s    

c                    s   |d kst ttj o*tj fdd td k oJ dk  fdd ttt	 t
   d S )Nc                      s   d j  S )Nzgeometric not implemented for r  r)  r  r)  r*  r9  l  r:  zgeometric.<locals>.<lambda>r   r;  c                      s
   d  S )Nz0geometric_ expects p to be in (0, 1), but got p=r)  r)  )r|  r)  r*  r9  p  r:  )rC  r  r  rP  r  r  r  rF   rY   rv  r  )r  r|  rw  r)  )r|  r  r*  rH   `  s    

r  c                    sv   |d kst tt j o8t j o8t j  fdd tdk fdd tt	  | S )Nc                      s   d j  S )Nzlog_normal not implemented for r  r)  r  r)  r*  r9    r:  zlog_normal.<locals>.<lambda>r   c                      s
   d  S )Nz-log_normal_ expects std > 0.0, but found std=r)  r)  r   r)  r*  r9    r:  )
rC  r  r  rP  r  r  r  r  r@   Z
randn_liker  r   r   rw  r)  )r  r   r*  r\   u  s    

)r   r   )rw  r  r  r(  r  c          
   	      s$  |d ks|t jkstt ts8t  dk fdd |d krtdd |  fD }t t|dkdd  t |d ko|d kdd  tdd |D  }|d j	}|d j
}nNt t| t ot t d	d  |d krt  n|}|d krt 
d
n|}tj|dd||d|d}	 |	 |  S )Nr   c                      s
   d  S )Nz)normal expects std >= 0.0, but found std r)  r)  ry  r)  r*  r9    r:  znormal.<locals>.<lambda>c                 s   s   | ]}t |tr|V  qd S r2  r?  rN  r)  r)  r*  r7    s     
 znormal.<locals>.<genexpr>c                   S   s   dS )NzFnormal expects that either mean or std is a tensor, or size is definedr)  r)  r)  r)  r*  r9    r:  c                   S   s   dS )Nz.Cannot pass layout, or pin_memory without sizer)  r)  r)  r)  r*  r9    r:  c                 s   s   | ]}|j V  qd S r2  r  rN  r)  r)  r*  r7    s     c                   S   s   dS )Nz>normal expects mean and std to be scalars when size is definedr)  r)  r)  r)  r*  r9    r:  r  r  r  F)r   r   r  r(  rq  rw  )r  stridedrC  r-  r$   r  rA  r=  rL  r  r(  r  r}  r`   )
r   r   r  rw  r  r  r(  r  rf  Znormal_samplesr)  ry  r*  r`     sF    
 


	)rw  c                C   s   t ||| j| |dS )N)ru  rw  )r`   r>  rz  r)  r)  r*  normal_  s    r|  c                 C   s&   t t| j dd  d}| | S )Nc                   S   s   dS )Nz-rad2deg is not supported for complex tensors.r)  r)  r)  r)  r*  r9    r:  zrad2deg.<locals>.<lambda>gcܥL@r  r  rP  r  r  )r  ZM_180_PIr)  r)  r*  rd     s    c                 C   s&   t t| j dd  d}| | S )Nc                   S   s   dS )Nz-deg2rad is not supported for complex tensors.r)  r)  r)  r)  r*  r9    r:  zdeg2rad.<locals>.<lambda>g9RFߑ?r}  )r  ZM_PI_180r)  r)  r*  r;     s    r  c                 C   s   | dk |S r  )r   )r  r  r)  r)  r*  r:     s    c                    sT   t  dko  dk fdd  fdd}t    k| d S )Nr;  c                      s   d   d    dS )Nz1D tensors expected, but got zD and z	D tensorsr  r)  r  r  r)  r*  r9    r:  z_dot_check.<locals>.<lambda>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  r)  r~  r)  r*  numel_error  s    ,z_dot_check.<locals>.numel_error)r  r  r  r  )r  r  r  r)  r~  r*  
_dot_check  s    r  r  c                 C   sp   |   rZ|  rB| r0t|  |  S t|  |S n| rZt| | S t| | | |  S r2  )r!  is_conjr  r   r   r   r  r   r  r)  r)  r*  r     s    
c                 C   s   |   st| |S |  rJ| r8t| |  S t|  |S n| rft| |  S t| | |  |  S r2  )	r!  r  r   r  r   r   r  r7   r   r  r)  r)  r*  r     s    
)r6  rc  r  r  c                 C   sz   t | j|}dg| j }d||< |dk r8|| j|  }tj| j| | jd||k}t||	| j}t
||| S )Nr;  r?  r   r'  )rP  ru  r"  r>  r  r  r(  r   r   r   r   )r6  rc  r  r  Z
mask_shaper  r)  r)  r*  select_scatter"  s     r  c                 C   s   t | tjtjfS r2  )r-  r  ZTypedStorageZUntypedStorage)objr)  r)  r*  
_isStorage  s    r  c                 C   s   d}t | }g }t| ttfrt| }|r4||j }|| t||kr`tdt| j	 d|dkrjqz| d }W n* t
k
r   tdt| j	 dY nX |} q|S )N   ztoo many dimensions 'rd  r   z.could not determine the shape of object type ')r  r-  r,  rA  r=  itemsizer{  rG  r&  rc  rt  )seqscalar_typeZMAX_DIMSZ
is_storager  r  handler)  r)  r*  _compute_sizes  s(    


r  c                 C   sL  t | trt S t | tr,t | ts,tjS t | tr<tjS t | trt }|tj	kr^tj
S |tjkrntjS |tjkr~tjS tdt | tjr| jS t | trtdt| j dt | ttfr4d }t| }|dkrt S t|D ]B}| | }t|}|d k	rt||}n|}|tjkr|  S q|S tdt| j d S )Nz'invalid default scalar type for complexznew(): invalid data type 'rd  r   zCould not infer dtype of )r-  r   r  r  r   r  r0  r   r  r  ZcfloatdoubleZcdoubleZhalfZchalfrH  r  r  rQ  	TypeErrorr&  rc  r,  rA  r=  rF  _infer_scalar_typeZpromote_types)r  Zdefault_dtype
scalarTyper  r  Zcur_itemZitem_scalarTyper)  r)  r*  r    sD    









r  )r  r  c                    s   t |tr0| dkr0| j ddddS t |trN| j dddS t |trftj| dS |}t	 fdd|D S )	Nr;  r  T)r  r(  r  r)  r  c                    s   g | ]}t  |qS r)  )_recursive_build)r5  r   r  r)  r*  r     s     z$_recursive_build.<locals>.<listcomp>)
r-  r  r  detachr   r   r   r  r  r   )r  r  r  r)  r  r*  r    s    

r  c                 C   s   t |tjr`t| dd  |}|r.| }|r8|jn|}	|d k	rH|n|j}
|j|
|	d|dS t|drnt	S |d k	rz|n| d }
|rt
|n|}	t|rt	S t|
jdkrt	S t|	|}|j|
|	ddd}|S )	Nc                   S   s   dS )Nz,Can't pin tensor constructed from a variabler)  r)  r)  r)  r*  r9    r:  z)_internal_new_from_data.<locals>.<lambda>F)r(  r  r  r  Z__cuda_array_interface__r(  meta)r  r  )r-  r  r  r  r  r  r(  r   hasattrNotImplementedr  r  r&  r  )optionsr  Z
device_optdatacopy_variables
copy_numpytype_inferencer  r   Zinferred_scalar_typer(  rv  r)  r)  r*  _internal_new_from_data  s6    
 

r  )r  r(  r  rq  c             
   C   sd   t | tjrtd |d k}tddi|d k	r2|nt || dd||d}|  |r`|| |S )NzTo copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor)r(  r  T)r  r  r  r  )	r-  r  r  r  r  r  r  Zdetach_r3  )r  r  r(  r  rq  r  Z
new_tensorr)  r)  r*  rv  4  s&    
rv  )N)F)r  NN)r  r  F)r;  )NN)N)N)NN)NNNNNFF)FFN)FFN)FFN)FFN)NF)NF)NF)NF)NF)NF)NN)NNF)NNF)NF)N)NNF)N)N)r   )r   )r   )r   r?  )NNNTr  FNN)NNNTFNNF)r;  r  )r   )N)r   )N)r   )r   )r   r   r;  )r   r   r;  )r   r  r?  )N)r   Nr;  )r  )N)r  r  )r  r  F)rU  NF)r   )r   )r   )r   )r   r;  N)r;  N)N)r;  r  N)r   r;  N)r   r;  )N)F(  r  rZ  rn  r  r  rK  r  collections.abcr   enumr   	functoolsr   r   r   r   typingr   r	   r
   r   r   r   r   r   r   r  Ztorch._primsZ_primsr}  Ztorch._prims_commonZ_prims_commonrP  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   Ztorch._prims_common.wrappersr(   r)   r*   r+   r,   r-   rz  r  rT  ZDispatchKeyZ_opsZopsry  r+  r/  rL  rT  Ztorch._decomprU  objectra  rh  rt  r|  rD  r.   ZINT_TO_FLOATr/   r0   r2   r1   r3   r4   DEFAULTr5   r6   r!  r7   r8   r9   r<   r=   r>   r?   r@   rA   rC   Z	NO_OPMATHrD   rE   r  rF   rG   r   ZALWAYS_BOOLrO   rP   rQ   rR   rS   specialZmultigammalnr^   rT   rU   rW   rX   rY   rZ   r[   rV  r  r]   r   r  ra   r  rb   rc   r   re   rf   r   rg   rh   ri   rj   rk   rl   rm   ro   ZBOOL_TO_LONGrp   rq   rr   rt   r   r  ru   rv   rw   rx   ry   rz   r{   r~   r   rQ  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   r   r   r|   r}   r   r   r  r  r   r   r  r  r  registerr(  r  r  r  r  rE  r  r   r'  r*  r   r  r   r:  r   Zdim_IntListZIntList_outr   r   r   r   r@  r   r   r   r   r   r   r   r^  r   r   r   r   r   r   r  Zpy_implZCompositeImplicitAutogradZMetar   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   rA  r   r  r   rn   r   r   r  r  rJ   rK   rM   rN   r  rI   rL   r   r  r   r   r   r   ru  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  Z
start_stepZ	start_outrV   r  r  r   r   r  r  r  r  r  r  r  r  rQ  r   r   r  r  r_   rs   rY  r   r   r   r  r  rb  re  r  r  ro  r  r   r  rB   rH   r\   r`   r|  rd   r;   r:   r  r   r   r  Zabs_Zacos_Zacosh_Zadd_Zaddcmul_Zaddcdiv_Zasin_Zasinh_Zatan_Zatanh_Zatan2_Zbitwise_and_Zbitwise_left_shift_Zbitwise_not_Zbitwise_or_Zbitwise_right_shift_Zbitwise_xor_Zceil_Zclamp_Z
clamp_min_Z
clamp_max_Zconj_physical_Z	copysign_Zcos_Zcosh_Zcumsum_Zcumprod_Zdeg2rad_Zdigamma_Zdiv_eq_Zerf_Zerfc_Zerfinv_Zexp_Zexp2_Zexpm1_Zfloat_power_Zfloor_Zfloor_divide_Zfmod_Zfrac_Zgcd_Zge_Zgt_Z
heaviside_Zhypot_Zigamma_Zigammac_Zi0_Zlcm_Zle_Zlerp_Zlgamma_Zlog10_Zlog1p_Zlog2_Zlog_Zlogical_and_Zlogical_not_Zlogical_or_Zlogical_xor_Zlt_Zmul_Z	mvlgamma_Znan_to_num_Zne_Zneg_Z
nextafter_Zpow_Zrad2deg_Zreciprocal_Z
remainder_Zrsqrt_Zsgn_Zsigmoid_Zsign_Zsin_Zsinc_Zsinh_Zsqrt_Zsquare_Zsub_Ztan_Ztanh_Ztril_Ztriu_Ztrue_divide_Ztrunc_Zxlogy_Zcauchy_Zexponential_Z
geometric_Zlog_normal_Zzero_r  r  r  r  r  rv  Ztorch._refs._conversionsZtorch._refs.fftZtorch._refs.linalgZtorch._refs.nn.functionalZtorch._refs.specialr)  r)  r)  r*  <module>   s  ,\     %
(!

      	$	&	:


 






6
 
"  +	



*
 
		           
  
  
  
+?      
     2  	4   
  
"h	
  L 
%(
		  
   4
F

   '       k            
8 
  1
    	
 	

   

   

.
"!
K + '
  
  )
  8
 $



   	




  $&





)  c
&


W


;
C

?

(

 
+
    
  


 
 &
)&
)
9




  4
		
 


 



















































































4 
9 $



