U
    *-e                    @   s|#  d dl Z d dlmZ d dlmZmZmZmZmZ d dl	Z	d dl
mZ d dl	mZmZmZ d dlmZmZmZ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  d d	l!m"Z"m#Z#m$Z$m%Z% d d
l&m'Z'm(Z( d dl)m*Z*m+Z+ d dl,m-Z- e	j.j/Z/e	j01dddZ2dd Z3dd Z4dd Z5e3e/j6j7e/j6j8ge% dd Z9e3e/j:j7e/j:j8ge% ddddZ:e3e/j;e% dd Z;e3e/j<j7e/j<j8e/j=j7e/j=j8ge%ddd d! Z>e3e/j?j7e/j?j8ge% d"d# Z?d$d% Z@e3e/jAj7e/jAj8ge% d&d' ZBe3e/jCj7e/jCj8ge% d(d) ZDe3e/jEjFdd*d+d,ZGe3e/jEj7e	jHdddd-d.d/ZIe3e/jJj7e	jHdddd-d0d1ZKe3e/jJjLe	jHdddd-d2d3ZMe3e/jNj7ddddd-d4d5ZOe3e/jPj7e/jPj8ge% d6d7 ZQe3e/jRj7dpd9d:ZSd;d< ZTe3e/jUj7d=d> ZVe3e/jWj7d?d@eeXee	jeYeZedAdBdCZ[e3e/j\j7d?d@eeXee	jeYeZedAdDdEZ]e3e/j^j7dFdG Z_e3e/j^j8dHdI Z`e3e/jaj7e/jajbge% dJdK Zce3e/jajddqdLdMZee3e/jfj7e/jfjbge% dNdO Zge3e/jfjddrdPdQZhe3e/jij7dRdS Zje3e/jij8dTdU Zke3e/jlj7dVdW Zme3e/jljndXdY Zoe3e/jpj7ddddddZd[d\Zqe3e/jrj7dsd]d^Zre3e/jsj7dtd_d`Zte3e/juj7dudadbZue3e/jvj7dcdd Zwe3e/jxjndedf ZyeeYdgdhdiZzeeeYdjdkdlZ{dveeYeZdmdndoZ|dweeYeYdqdrdsZ}eeeZeYdtdudvZ~dxeYeeeYdxdydzZeYd{d|d}Ze3e/jj7e/jjge%d~ddyeeYeZdddZeedddZe3e/je% eeeZedddZe3e/je% dzeeeZedddZe3e/je% d{eeZedddZe3e/je% d|eeZedddZe3e/jj7d}eeZeZdddZe3e/jj7e/jj8ge% eeedddZe3e/jj7d~eeZdddZe3e/jj7e/jj8ge%dddd8d8deeZeZeeeef dddZe3e/jj7e/jj8ge% d8deeeeZedddZe3e/jj7e/jj8ge%dddd?deeZeeeef dddZe3e/jj7e/jj8ge%dddd?d8deeZeZeeeef dddZe3e/jj7e/jj8ge% d?d8deeeeZeZedddZe3e/je%ddddeeeZeZeeeef dddZeYeeZeZf dddZe3e/jj7e/jj8ge%dddeeYeeef dddZe3e/jj7e/jjge%ddddeeeeeef dddĄZe3e/jj7deeZeZeeY dŜddǄZeeeeeX eeX f dȜddʄZeeeeY eeef d˜dd̈́ZeeeZdΜddЄZe3e/jd?d8dddddќeeeZeZee ee ee ee eeeeef dҜ	ddԄZe3e/jj7e/jj8gd?d8dd՜eeeZeZeZee ed֜dd؄Ze3e/je%ddڃdeeeZeZeZeeef dۜdd݄Ze3e/jj7dd߄ Ze3e/je% deeeeZeZedddZdd Zdd Ze3e/je% dd Ze3e/je% dd Zdd Ze3e/je% dd Ze3e/je% dd Zdd Ze3e/je% dd Ze3e/je% dd Ze3e/jj7e/jje/jj7e/jjge% dd Zdd Ze3e/je% dd Ze3e/je% dd Ze3e/jj7e/jje/jj7e/jjge% dd  Ze3e/jǃe% deeedddZe3e/jʃe% eeeeedddZe3e/jj7e/jj8ge% ddd	d
dZe3e/jj7e/jj8ge% dd*ddZe3e/jjȃdddZe3e/jj҃dddZe3e/jj7dddZՐdd Ze3e/jj7dd Ze3e/jj7gdd Zڐdd Zېdddd Zܐde	je	jeeeX eXf eeeX eXf eeeX eXf eZeXeeeeX eXf  d!d"d#Zݐd$d% Ze3e/jj7e	je	je	jeeX eeX eeX eZeeX eXd&	d'd(Ze	jjre	j01d)ddZe3e	j.jjj7d*d+ Ze3e	j.jjj7d,d- Ze	jjrBe	j01d.ddZe3e	j.jjd/d0 Ze	j01d1ddZe3e	j.jjj7d2d3 Ze3e	j.jjj7d4d5 Zd6d7 Ze3e/jj7dd:d;Zd<d= Ze3e/jj7d>d? Ze3e/je% dd@dAZe3e/je% dBdC Ze3e/jj7dDdE Ze3e/j j7dFdG Ze3e/jj7dHdI Ze3e/je% dJdK ZeeYdLdMdNZe3e/je%dOddPdQ Ze3e/j	e% dRdS Z
e3e/je%dOddTdU Ze3e/je% dVdW Ze3e/jjddXdYZe3e/jj7e/jj8ge% dZd[ Ze3e/jjd\d] Ze3e/jj7d^d_ Ze3e/jj7e/jj8gdd`eXeXdadbdcZe3e/jje/jjgddde Ze3e/jj7gdfdg Ze3e/jj7e/jj8ge% ddd	dhdiZe3e/jj7e/j j7e/j!j7e/j"j7gdjdk Z#e3e/j$j7e/j%j7e/j&j7e/j'j7gdldm Z(dndo Z)e3e/j*je/j+je/j,je/j-je/j.je/j/jgddpdqZ0e3e/j1je/j2je/j3je/j4je/j5je/j6jgddrdsZ7e3e/j1j8e/j3j8e/j2j8e/j4j8gddtduZ9e3e/j*j8e/j-j8e/j,j8e/j+j8gddvdwZ:e3e/j;j8e/j<j8gddxdyZ=e3e/j>j8gddzd{Z?e3e/j@j8e/jAj8gdd|d}ZBe3e/jCjDgd~d ZEe3e/j;je/j<jgdd ZFe3e/jGgdddZHe3e/jIj7gdddddZJe3e/jKj7gdddddZLe3e/jMge% dd ZNe3e/jOj7dd ZPe3e/jQe% dd ZRe3e/jSj7dddZTe3e/jUj7dd ZVdddZWe3e/jXj7e/jXj8ge% dddddZYe3e/jZj7e/j[j7gdd Z\e3e/jZjde/jZj]e/j[jde/j[j]e/j^j7e/j^j_ge%dddddZ`e3e/jaj7dd Zbe3e/jcj7dd Zde3e/jej7dd Zfe3e/jgj8e/jhj8e/jgje/jhje/jij7e/jjj7e/jkj7gdd Zle3e/jmj8e/jnj8e/jmje/jnjgdddZoe3e/jpj7e/jpjqgdd Zrdd Zse3e/jtje/jtj8gdd Zue3e/jvje/jvj8gdd Zwe3e/jxj7dd Zye3e/jzje/jzj8gdd Z{e3e/j|je/j|j8gdd Z}e3e/j~j7dd Ze3e/jj7e/jj7gdddZe3e/jj8dd Ze3e/jj7dddZe3e/jj7dd ZdddZe3e/jj7dd ZddÄ ZdĐdń ZdƐdǄ ZdȐdɄ ZdeeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeYeZdʜdːd̄Zd͐d΄ ZeeeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeYdϜdАdфZdҐdӄ Ze3e/jj7dԐdՄ Ze3e/jj7ddאd؄Ze3e/je% dِdڄ Zdېd܄ Ze3e/je% dݐdބ Ze3e/je%dOdddߐdZe3e/je% dd ZeedddZG dd deZeeeXdddZe3e/jj7dd Ze3e/je% dd Ze3e/je%dddd Ze3e/jj7gdd Ze3e/jj7dddZe3e/jjXdd Ze3e/jj7dd Ze3e/jj7dddZdeXeXeZdddZd d Zdd Ze3e/jj7dddZdddZddd	Zd
d ZdddZdddZe3e/jj7dd Ze3e/jdd Ze3e/jje/jje/jje/jjge% dddZe3e/jĐje/jĐje/jĐje/jĐjgdddZe3e/jgdeeeeeZeZee dddZe3e/jgdeeeeeeeeeXeXeeZeeee dddZe3e/jgdeeeee eZeZee dd d!Ze3e/jgdeeeeee eeeeeeeZ eZee d"d#d$Ze3e/jΐje/jΐjge% dd%d&Ze3e/jҐjσdd'd(Ze3e/jj7e/jj8ge% ddd*d)d*ZՐd+d, Z֐d-d. Ze3e/jj7dd/d0Ze3e/jj7dd1d2Ze3e/jj7deeeeXe	jېjf  eeeXe	jېjf  ee ee d3d4d5Ze3e/jj7dd6d7Ze3e/jj7e/jސje/jސj_e/jސjgdd8d9Ze3e/jj߃dd8d:d;d<Zd=d> Ze3e/jj7dd?d@Ze3e/jj7dAdB Ze3e/jj7dCdD ZdEdF ZdGdH Ze3e/jj7e/jj7gddIdJZe3e/jj7ddKdLZe3e/jj7ddMdNZe	jZdOdP Ze3e/jj7dQdR Ze3e/jj7dSdT Ze3e/jj7dUdV Ze3e/jje/jjge% d8d8dWdXdYZe3e/jj7ddZd[Ze3e/jj7d\d] Ze3e/jj7e/jj8ge% dd^d_Ze3e	j.j/jd`da Ze3e	j.j/j dbdc Z e3e/je% d8d8dddddedfZe3e/je% eXeedgdhdiZdjdk Zdldm Zee/j ee/j ee/j	 ee/j
 ee/j ee/j ee/j ee/j ee/j ee/jj7e/jj8e/jjg ee/jj7e/jj8e/jjg ee/jj7e/jj8e/jjg ee/jj7e/jj8e/jjg ee/jj7e/jj8e/jjg d dl&Z	d dlZ	d dlZ	dndo Ze  dS (      N)Enum)ListOptionalSequenceTupleUnion)SymBoolSymFloatTensor)_add_op_to_registry_convert_out_paramsglobal_decomposition_table
meta_table)
OpOverload)_elementwise_meta$ELEMENTWISE_PRIM_TYPE_PROMOTION_KIND)corresponding_complex_dtypecorresponding_real_dtypeelementwise_dtypesELEMENTWISE_TYPE_PROMOTION_KINDIntLikemake_contiguous_strides_for
TensorLike)_maybe_resize_out_resize_output_check_safe_copy_outout_wrapper)_broadcast_shapes_maybe_broadcast)_constrain_range_for_sizeconstrain_range)tree_mapatenZIMPLMetac                    s    fdd}|S )Nc                    s"   t    fdd}t|  S )Nc                    s   t t|   d S N)r   r   opfn Z/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/torch/_meta_registrations.pyregister1   s    z0register_meta.<locals>.wrapper.<locals>.register)r   r!   )r(   r+   r%   r'   r*   wrapper.   s    
zregister_meta.<locals>.wrapperr)   )r&   r,   r)   r%   r*   register_meta-   s    	r-   c                 C   s(   t jt jt jt jt jt ji}|| | S r$   )torchZ	complex32halfcfloatfloatcdoubledoubleget)dtypeZfrom_complexr)   r)   r*   toRealValueType:   s       r6   c                    s0   t tf|  t k fdd d S )Nc                      s   d d  S )Nzoutput with shape z# doesn't match the broadcast shape r)   r)   Zbroadcasted_shape
self_shaper)   r*   <lambda>G       z)check_inplace_broadcast.<locals>.<lambda>)tupler   r.   _check)r8   Z
args_shaper)   r7   r*   check_inplace_broadcastC   s
    r=   c                    sN   t  jt jk fdd t |  dko6  dk dd  |  jS )Nc                      s   d j  S )Nz2take(): Expected a long tensor for index, but got r5   r)   indexr)   r*   r9   Q   r:   zmeta_take.<locals>.<lambda>r   c                   S   s   dS )Nz*take(): tried to take from an empty tensorr)   r)   r)   r)   r*   r9   V   r:   )r.   r<   r5   long_check_indexnumel	new_emptyshape)selfr@   r)   r?   r*   	meta_takeK   s    

rG   dimc                   sh   j }j }t||kdd  t dko> dk fdd tjj}|S )Nc                   S   s   dS )Nz=linalg.cross: inputs must have the same number of dimensions.r)   r)   r)   r)   r*   r9   b   r:   zlinalg_cross.<locals>.<lambda>   c                      s"   d  d   d   S )Nzlinalg.cross: inputs dimension z must have length 3. Got  and sizer)   rJ   otherrF   r)   r*   r9   f   s    )ndimr.   r<   rN   r   rE   rD   )rF   rP   rJ   Zx_dZy_d	out_shaper)   rO   r*   linalg_cross[   s    rS   c                 C   s   t | d t| d t| S )Nzlinalg.matrix_expZ
matrix_exp)squareCheckInputscheckFloatingOrComplexr.   
empty_likerF   r)   r)   r*   linalg_matrix_expo   s    

rX   valuesindicesc                 C   sV   t j| j| j| jd}t j| j| jt jd}|  dkrN| jdkrNt|| j ||fS )Ndevicer5   r   )	r.   emptyrE   r\   r5   int64rC   rQ   maybe_wrap_dim)rF   rJ   rY   rZ   r)   r)   r*   	cummaxminw   s
    r`   c                 C   s   t || j t|  S r$   )r_   rQ   r.   rV   
contiguous)rF   rJ   r)   r)   r*   logcumsumexp   s    rb   c                    s  |j }t|}|| }tt|}dd t|D }	|D ]}
d|	|
< q8g g  }}|D ]"}
|	|
 sl||
 qT||
 qT|| }t|}|  |d | }|j fdddd |||d   }||}dgt|j|d   }|	|}|
d}||d< |}tt|D ]}|||  ||d	 < q| 	|} d
d t|D }d	}|d	 }|dkr|| d ||| < ||||  9 }|d	8 }qTt||D ] }| d	||  ||| < q| |||  S )Nc                 S   s   g | ]}d qS )Fr)   .0_r)   r)   r*   
<listcomp>   s     z_exec_fft.<locals>.<listcomp>Tc                    s    |  S r$   r)   xZself_stridesr)   r*   r9      r:   z_exec_fft.<locals>.<lambda>keyreverserH   r      c                 S   s   g | ]}d qS r   r)   rc   r)   r)   r*   rf      s     )rQ   lenlistrangeappendstridesortpermuterE   reshaperN   
as_stridedstorage_offset)outrF   	out_sizesrJ   forwardrQ   Zsignal_ndim
batch_dimsZdim_permuteZis_transformed_dimdleftrightZ	batch_endtmpinputZbatched_sizes
batch_sizeZbatched_out_sizesiZout_stridesZbatch_numelr)   ri   r*   	_exec_fft   sJ    






r   c                    sb   | j jst| j}| |}|s$|S |d d  }|   |j fdddd t|| |||}|S )Nc                    s    |  S r$   r)   rg   ri   r)   r*   r9      r:   zmeta_fft_c2c.<locals>.<lambda>Trj   )r5   
is_complexAssertionErrorrE   rD   rs   rt   r   )rF   rJ   normalizationr{   rz   outputZsorted_dimsr)   ri   r*   meta_fft_c2c   s    
r   c                 C   sR   | j jstt|  }|r<|d }|| d d }|||< | j|t| j dS )NrH      rm   r>   )r5   is_floating_pointr   rp   rN   rD   utilsr   )rF   rJ   r   Zonesidedoutput_sizesZlast_dimZlast_dim_halfsizer)   r)   r*   meta_fft_r2c   s     
r   )	generatorc                C   s    |j dkr|d| kst|S Nrm   r   )rQ   rN   r   )nr   ry   r)   r)   r*   meta_randperm   s    r   r5   layoutr\   
pin_memoryc                C   s   t j| ||||dS Nr   r.   r]   )r   r5   r   r\   r   r)   r)   r*   meta_randperm_default   s        r   c                C   s   t j|||||dS r   r   )highrN   r5   r   r\   r   r)   r)   r*   meta_randint   s        r   c                C   s   t j|||||dS r   r   )lowr   rN   r5   r   r\   r   r)   r)   r*   meta_randint_low   s        r   c                C   s   t j| ||||dS r   r   )rN   r5   r   r\   r   r)   r)   r*   meta_rand_default  s        r   c                 C   s8   | j jstt|  }|||d < | j|t| j dS )NrH   r>   )r5   r   r   rp   rN   rD   r6   )rF   rJ   r   Zlastdimr   r)   r)   r*   meta_fft_c2r  s    r   Fc                 C   s2   | | |}|  | kr.tj||   | S r$   )torN   r"   Zexpand_copydefault)rF   srcnon_blockingZintermediater)   r)   r*   
meta_copy_  s    r   c                 C   sX   t |  }t |  }||  kr(dn|| ||  }||d ||| ||fS Nrm   )rp   rN   rs   rJ   insert)tensorrJ   Zresult_sizesZresult_strides
new_strider)   r)   r*   inferUnsqueezeGeometry*  s     r   c                 C   s0   t ||  d }t| |\}}| || | S r   )r_   rJ   r   as_strided_)rF   rJ   Zg_sizesZ	g_stridesr)   r)   r*   meta_unsqueeze_3  s    r   T)include_self)rF   rJ   r@   sourcereducer   returnc                C   s   t j| t jdS )Nmemory_format)r.   rV   contiguous_formatrF   rJ   r@   r   r   r   r)   r)   r*   meta_index_reduce;  s    
r   c                C   s   | S r$   r)   r   r)   r)   r*   meta_index_reduce_H  s    
r   c                 C   s.   t |  }|  dkr$| ||< | |S )Nr   )rp   rN   rJ   rC   rD   )rF   rJ   r@   result_sizer)   r)   r*   meta_index_selectV  s    r   c                 C   s(   t ||  | j |t | ||S r$   )r.   _resize_output_rN   r\   copy_index_select)rF   rJ   r@   ry   r)   r)   r*   meta_index_select_out^  s    r   c                 C   s
   |  dS Nr)   rD   rW   r)   r)   r*   meta_maxd  s    r   c                 C   s6   t | j|f}t| ||}| || j|tjdfS Nr>   r   reduction_dimsrE   _compute_reduction_shaperD   r.   rA   rF   rJ   keepdimoutput_shaper)   r)   r*   meta_max_dimj  s
    r   c                 C   s
   |  dS r   r   rW   r)   r)   r*   meta_mint  s    r   c                 C   s6   t | j|f}t| ||}| || j|tjdfS r   r   r   r)   r)   r*   meta_min_dimz  s
    r   c                 C   s4   |   rt| j}nt| tjd\}}tj| |dS )NZtype_promotion_kindr>   )r   r   r5   r   r   INT_TO_FLOATr.   rV   )rF   result_dtypere   r)   r)   r*   
meta_angle  s    
r   c                 C   s$   t ||  | j |t | S r$   )r.   r   rN   r\   r   angle)rF   ry   r)   r)   r*   meta_angle_out  s    r   c                 C   s   d S r$   r)   )valr)   r)   r*   assert_async  s    r   c                 C   s   d S r$   r)   )r   
assert_msgr)   r)   r*   assert_async_meta  s    r   r5   r   r\   r   r   c                 C   s   t jg ddS )Nmetar\   r   r   r)   r)   r*   make_dep_token  s    	r   c                 C   s(   t | ttfrtdt| ||d d S Nz'Constraining SymFloat or Symbool is nyiminmax)
isinstancer	   r   
ValueErrorr    rN   r   r   r)   r)   r*   sym_constrain_range  s    r   c                 C   s   t j| ||d |S Nr   )r"   r   rN   r   r   	dep_tokenr)   r)   r*   functional_sym_constrain_range  s    r   c                 C   s(   t | ttfrtdt| ||d d S r   )r   r	   r   r   r   r   r)   r)   r*   sym_constrain_range_for_size  s    r   c                 C   s   t j| ||d |S r   )r"   r   r   r)   r)   r*   'functional_sym_constrain_range_for_size  s    r   c                 C   s   |S r$   r)   )r   r   r   r)   r)   r*   functional_assert_async_meta  s    r   rF   f_namec                 C   sX   |   dkst| d| d| dksTt| d| d d| d dd S )Nr   z3: The input tensor must have at least 2 dimensions.rH   z5: A must be batches of square matrices, but they are  by 	 matrices)rJ   r   rN   r   r)   r)   r*   rT     s    
 rT   rF   Anamec                    s   t j jk fdd t j jk fdd t  d dk fdd t  ddk fdd d S )Nc                      s   dj  d j  dS )Nz:Expected b and A to be on the same device, but found b on z
 and A on 	 instead.r   r)   r   rF   r)   r*   r9     s    z(linearSolveCheckInputs.<locals>.<lambda>c                      s   dj  d j  dS )Nz=Expected b and A to have the same dtype, but found b of type z and A of type r   r>   r)   r   r)   r*   r9     s    rH   r   c                      s   d  d d  d dS )Nz3A must be batches of square matrices, but they are r   r   rH   r   rM   r)   r   r)   r*   r9     s    c                      s:   d d  d d  d d d d d 
S )NzIncompatible matrix sizes for z: each A matrix is rH   r   z but each b matrix is r   rM   r)   r   r   rF   r)   r*   r9     s    )r.   r<   r\   r5   rN   r   r)   r   r*   linearSolveCheckInputs  s     


r   tr   allow_low_precision_dtypesc                    sZ   | j  t|  p|   fdd |sVt tjtjtjtjfk fdd d S )Nc                      s    d  S )Nz<: Expected a floating point or complex tensor as input. Got r)   r)   r5   r   r)   r*   r9     r:   z(checkFloatingOrComplex.<locals>.<lambda>c                      s    d  S )Nz*: Low precision dtypes not supported. Got r)   r)   r   r)   r*   r9     r:   )	r5   r.   r<   r   r   r1   r3   r0   r2   r   r)   r   r*   rU      s    rU   r   r   r   arg_namec                    s"   t |  dk fdd d S )Nr   c                      s    d  dS )Nz: The input tensor z! must have at least 2 dimensions.r)   r)   r   r   r)   r*   r9     r:   zcheckIsMatrix.<locals>.<lambda>)r.   r<   rJ   r   r)   r   r*   checkIsMatrix  s    
r   r   Br~   r   c                    sZ   t   t tr0 ddkn ddk fdd d S )Nr   rH   c                      sH    drdnd d  d d  d d d d d d	S )
Nz2: Incompatible shapes of A and B for the equation zAX = BzXA = Bz (r   rh   rH   rL   )rM   r)   r   r   r   r~   r)   r*   r9   !  s    z#checkInputsSolver.<locals>.<lambda>)rT   r   r.   r<   rN   r   r)   r   r*   checkInputsSolver  s    

*r   resultfn_namer   r   result_namec                    s&   t jjk fdd d S )Nc                	      s$     d d dj  dj  	S )Nz: Expected z5 and input tensors to be on the same device, but got z on z and input on r   r)   r  r   r   r  r)   r*   r9   .  s    z!checkSameDevice.<locals>.<lambda>)r.   r<   r\   r   r)   r  r*   checkSameDevice)  s    
r  UPLOc                    s8      }tt dko&|dkp&|dk fdd d S )Nrm   ULc                      s
   d  S )Nz1Expected UPLO argument to be 'L' or 'U', but got r)   r)   r  r)   r*   r9   9  r:   zcheckUplo.<locals>.<lambda>)upperr.   r<   ro   )r  ZUPLO_uppercaser)   r  r*   	checkUplo5  s
    
r
  eigenvaluesZeigenvectorsr  )r   r  	compute_vc                 C   sp   t | d t| t| j}|r@| |}||t|dd n| dg}|  | j|t| j	d}||fS )Nzlinalg.eighFZ	row_majorr   r>   )
rT   r
  rp   rE   rD   r   r   popr6   r5   )r   r  r  rE   Zvecsvalsr)   r)   r*   meta__linalg_eigh=  s    


r  )r   r   c                 C   s   | j jtjdddS )Nr   r   rH   )ZmTcloner.   r   	transpose)r   r)   r)   r*   cloneBatchedColumnMajorT  s    r  )rF   r   r	  r   c                 C   s   t | S r$   )r  )rF   r   r	  r)   r)   r*   _cholesky_solve_helperX  s    r  c                    sP   t jdkfdd t  jdk fdd t d\}}t|||S )Nr   c                      s   d j  dS )Nz-b should have at least 2 dimensions, but has  dimensions insteadrQ   r)   rW   r)   r*   r9   c  r:   z cholesky_solve.<locals>.<lambda>c                      s   d j  dS )Nz-u should have at least 2 dimensions, but has r  r  r)   r   r)   r*   r9   g  r:   cholesky_solve)r.   r<   rQ   !_linalg_broadcast_batch_dims_namer  )rF   r   r	  Zself_broadcastedZA_broadcastedr)   r   r*   r  ^  s    

  r  )rF   r	  r   c                 C   s.   |   dkrtj| tjdS t| d t| S )Nr   r   cholesky)rC   r.   rV   legacy_contiguous_formatrT   r  rF   r	  r)   r)   r*   r  o  s    
r  c                 C   s   t | d t| S )Ncholesky_inverse)rT   r  r  r)   r)   r*   r  x  s    
r  )r   r	  check_errorsc                 C   sf   t | d t| d | j}t|}t|d}| |}||| | j|d|d  tjd}||fS )Nzlinalg.choleskyFr   r   r>   )	rT   rU   rE   ro   r   rD   r   r.   int32)r   r	  r  ZA_shaperQ   Z	L_stridesr  infosr)   r)   r*   linalg_cholesky_ex  s    



r   )r   taur   c                    s  t jdkdd  t ddkdd  t ddkdd  t jj dkfd	d jdkrjd d }jd d  t  |k fd
d t jjkfdd tdd t jjtjddjj	dS )Nr   c                   S   s   dS )NzHtorch.linalg.householder_product: input must have at least 2 dimensions.r)   r)   r)   r)   r*   r9     r:   z,linalg_householder_product.<locals>.<lambda>r   rH   c                   S   s   dS )Nzbtorch.linalg.householder_product: input.shape[-2] must be greater than or equal to input.shape[-1]r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS )Nz`torch.linalg.householder_product: input.shape[-1] must be greater than or equal to tau.shape[-1]r)   r)   r)   r)   r*   r9     r:   rm   c                      s   dj  d j  S )Nzptorch.linalg.householder_product: Expected tau to have one dimension less than input, but got tau.ndim equal to  and input.ndim is equal to r  r)   r   r!  r)   r*   r9     s    c                      s
   d  S )Nzltorch.linalg.householder_product: Expected batch dimensions of tau to be equal to input.shape[:-2], but got r)   r)   actual_batch_tau_shaper)   r*   r9     s    c                      s   dj  d j  S )Nz,torch.linalg.householder_product: tau dtype z does not match input dtype r>   r)   r#  r)   r*   r9     s    z torch.linalg.householder_productr!  Fr  rN   rs   r5   r\   )
r.   r<   rQ   rN   rE   r5   r  empty_stridedr   r\   )r   r!  Zexpected_batch_tau_shaper)   )r%  r   r!  r*   linalg_householder_product  sD    


r(  )r   r  c                 C   s^   t | d t| ddd | | j}|| jt| jdd | j| jd d tjd}||fS )Nzlinalg.inv_exF)r   r  r   r>   rT   rU   rD   rE   r   r   r.   r  )r   r  r  r  r)   r)   r*   linalg_inv_ex_meta  s    
r*  LDpivotsinfo)	hermitianr  )rF   r.  r  r   c                C   st   t | d t| d tj| jt| jdd| j| jd}| j| jd d tj	d}| j| jd d tj	d}|||fS )Nztorch.linalg.ldl_factor_exFr  r&  rH   r>   r   )
rT   rU   r.   r'  rE   r   r5   r\   rD   int)rF   r.  r  r+  r,  r-  r)   r)   r*   linalg_ldl_factor_ex_meta  s    

r0  )r.  )r+  r,  r   r.  r   c                   s   t d td t d t jdk fdd jd d }t|jkfdd ttj	fdd tj	 j	k fdd t
 \}}tj|t|d	d
 j	 jdS )Nztorch.linalg.ldl_solver   c                      s   d j  dS )NzMtorch.linalg.ldl_solve: Expected B to have at least 2 dimensions, but it has r  r  r)   )r   r)   r*   r9     s    z'linalg_ldl_solve_meta.<locals>.<lambda>rH   c                      s   d j  dS )Nzjtorch.linalg.ldl_solve: Expected LD.shape[:-1] and pivots.shape to be the same, but got pivots with shape  insteadrE   r)   r,  r)   r*   r9     s    c                      s   d j  S )Nz<torch.linalg.ldl_solve: Expected pivots to be integers. Got r>   r)   r3  r)   r*   r9     r:   c                      s   dj  d j  S )Nz!torch.linalg.ldl_solve: LD dtype z does not match b dtype r>   r)   )r   r+  r)   r*   r9     r:   Fr  r&  )rT   rU   r   r.   r<   rQ   rE   r   is_integer_dtyper5   _linalg_broadcast_batch_dimsr'  r   r\   )r+  r,  r   r.  Zexpected_pivots_shapeB_broadcast_sizere   r)   )r   r+  r,  r*   linalg_ldl_solve_meta  s6    







r7  Pr  )pivot)r   r9  r   c          	         s   t  jdk fdd t j}|d }|d }t||}||d< |rV |}n dg}||d<  |}||d< ||d<  |}|||fS )Nr   c                      s   d j  dS )Nz@linalg.lu: Expected tensor with 2 or more dimensions. Got size: r1  r2  r)   r   r)   r*   r9     r:   z linalg_lu_meta.<locals>.<lambda>r   rH   r   )r.   r<   rQ   rp   rE   r   rD   )	r   r9  sizesmr   kr8  r  r  r)   r   r*   linalg_lu_meta  s$    




r=  LU)r9  r  )r   r9  r  r   c          	         s   t  jdk fdd t j}|d }|d }t j|t|dd j jd}|	  t
|||d<  j|t jd	}|	   j|t jd	}|||fS )
Nr   c                      s   d j  dS )NzFtorch.lu_factor: Expected tensor with 2 or more dimensions. Got size: r1  r2  r)   r   r)   r*   r9   4  r:   z*linalg_lu_factor_ex_meta.<locals>.<lambda>r   rH   Fr  r&  r>   )r.   r<   rQ   rp   rE   r'  r   r5   r\   r  r   rD   r/  )	r   r9  r  r:  r;  r   r>  r,  r-  r)   r   r*   linalg_lu_factor_ex_meta-  s&    


r?  )r~   adjoint)r>  r,  r   r~   r@  r   c                   s   t d tj jk fdd tjtjkdd  td t |d tddkdd  tjd d jkfdd t	 \}}tj
|t|| d	 j jd
}| dkr|s| r| }|S )Nztorch.linalg.lu_solvec                      s   dj  d j  dS )NzPlinalg.lu_solve: Expected LU and B to have the same dtype, but found LU of type  and B of type r1  r>   r)   )r   r>  r)   r*   r9   \  s    z&linalg_lu_solve_meta.<locals>.<lambda>c                   S   s   dS )NzElinalg.lu_solve: pivots should be a Tensor of scalar type torch.int32r)   r)   r)   r)   r*   r9   c  r:   zlinalg.lu_solverH   c                   S   s   dS )NzYlinalg.lu_solve: Number of pivots per batch should be same as the dimension of the matrixr)   r)   r)   r)   r*   r9   k  r:   c                      s   d j  dS )Nzclinalg.lu_solve: Expected LU.shape[:-1] and pivots.shape to be the same, but got pivots with shape r1  r2  r)   r3  r)   r*   r9   q  s    r  r&  r   )rU   r.   r<   r5   r/  rT   r   rN   rE   r5  r'  r   r\   rC   r   conj)r>  r,  r   r~   r@  r6  re   r   r)   )r   r>  r,  r*   linalg_lu_solve_metaN  s<    




rC  )r>  r,  unpack_dataunpack_pivotsr   c                    s   t  jdk fdd |r6t |jt jkdd  t j}|d }|d }t||}||d< |rr |}n dg}|r||d<  |}	||d< ||d<  |}
n dg}	 dg}
||	|
fS )Nr   c                      s   d j  dS )NzFtorch.lu_unpack: Expected tensor with 2 or more dimensions. Got size: r1  r2  r)   r>  r)   r*   r9     r:   z lu_unpack_meta.<locals>.<lambda>c                   S   s   dS )Nztorch.lu_unpack: LU_pivots is expected to be a contiguous tensor of torch.int32 dtype.
Note: this function is intended to be used with the output produced by torch.linalg.lu_factorr)   r)   r)   r)   r*   r9     s    r   rH   r   )	r.   r<   rQ   r5   r  rp   rE   r   rD   )r>  r,  rD  rE  r:  r;  r   r<  r8  r  r  r)   rF  r*   lu_unpack_meta  s4    




rG  )moder   c                    sR    dkrd}d}n8 dkr$d}d}n& dkr6d}d}nt d fdd ||fS )NreducedTZcompleteFrc                      s   d  dS )Nzqr received unrecognized mode 'z=' but expected one of 'reduced' (default), 'r', or 'complete'r)   r)   rH  r)   r*   r9     s    z _parse_qr_mode.<locals>.<lambda>r.   r<   )rH  	compute_qrI  r)   rK  r*   _parse_qr_mode  s    
rN  QRrI  )r   rH  r   c                 C   s   t | d t| d t|\}}| jd }| jd }t||}|r|t| j}|rT|n||d< | |}||t|dd n| dg}t| j}	|s|s|n||	d< | |	}
|
|	t|	dd ||
fS )Nz	linalg.qrr   rH   Fr  r   )	r   rU   rN  rE   r   rp   rD   r   r   )r   rH  rM  Zreduced_moder;  r   r<  ZQ_shaperO  ZR_shaperP  r)   r)   r*   linalg_qr_meta  s"    








rQ  sign	logabsdet)r   r   c                 C   s   t | d t| dd | j}| |d d }| j|d d t| jd}tj|t|d| j| j	d}| j|d d tj
d}||||fS )Nzlinalg.slogdetFr   r>   r&  rH   )rT   rU   rE   rD   r6   r5   r.   r'  r   r\   r  )r   rE   rR  rS  r>  r,  r)   r)   r*   _linalg_slogdet  s    
rT  )r   full_matrices
compute_uvdriverc                 C   s   t | d t| d t| jd d }| jd }| jd }t||}|r|||rT|n|g }| |}	|	|t|dd ||r|n||g }
| |
}t| dk}||
t|
|d n| dg}	| dg}| j||g t	| j
d}|	||fS )	Nz
linalg.svdr   rH   Fr  cudar   r>   )r   rU   rp   rE   r   rD   r   r   device_hintr6   r5   )r   rU  rV  rW  r|   r;  r   r<  ZU_shaper  ZV_shapeVZis_cudaSr)   r)   r*   _linalg_svd_meta  s$    






r\  )arg1arg2r   c                 C   sn   | j d d }|j d d }t||}t|}|| d| dg7 }t|}||d|dg7 }||fS )Nr   rH   )rE   r   rp   rN   )r]  r^  Zarg1_batch_sizesZarg2_batch_sizesexpand_batch_portionarg1_expand_sizearg2_expand_sizer)   r)   r*   r5    s    
r5  )r]  r^  r   r   c                 C   sV   |rt | || t| |\}}|| jkr,| n| |}||jkrD|n||}||fS r$   )r   r5  rE   expand)r]  r^  r   r`  ra  Zarg1_broadcastedZarg2_broadcastedr)   r)   r*   r  /  s    r  )r   rP   r   c                 C   s6   | j d d }|jdkp0| jd |jko0|j |k}|S )NrH   rm   )rE   rQ   )r   rP   Zexpected_batched_rhs_shapevector_caser)   r)   r*   linalg_solve_is_vector_rhsA  s
    
rd  )r~   r  r   r>  r,  r-  )	r   r   r~   r  r   r>  r,  r-  r   c                   sr  t  d t jjk fdd t }|r@dn}	t |	|d t|	 \}
}t|pl| dd  |r|
d d n|
}tj|t	|| jj
d} j} j}tj|t	|d j j
d} j|d d tjd} j|d d	 tjd}||||f}||||f}td
d |D rnt||D ]6\}}t||j ||j|  t||dd q6|S )Nzlinalg.solvec                      s   d j  dj  dS )NzKlinalg.solve: Expected A and B to have the same dtype, but found A of type rA  r1  r>   r)   r   r   r)   r*   r9   X  s    z"_linalg_solve_ex.<locals>.<lambda>rH   c                   S   s   dS )Nzlinalg.solve: Vector broadcasting of the left hand side is not supported for left=False. In this case linalg.solve is equivalent to B / A.squeeze(-1)r)   r)   r)   r)   r*   r9   c  s    r&  Fr>   r   c                 s   s   | ]}|d k	V  qd S r$   r)   rd   rh   r)   r)   r*   	<genexpr>{  s     z#_linalg_solve_ex.<locals>.<genexpr>)	copy_fromcopy_toZexact_dtype)rU   r.   r<   r5   rd  	unsqueezer   r5  r'  r   r\   rE   rQ   rD   r  allzipr   r   rs   r   )r   r   r~   r  r   r>  r,  r-  rc  B_ZB_broad_shapere   Zresult_shapeZresult_rE   rQ   ZLU_Zpivots_Zinfo_ry   resrJ  or)   re  r*   _linalg_solve_exI  sL    



rp  )r~   unitriangularry   )r   r   r	  r~   rq  ry   r   c          	      C   s   |d kr|  dg}t|ts"tt| ||d t|| d \}}|dd oV| }|rjt	||j
}n,t||j
r||ddj
 |dd |S )Nr   zlinalg.solve_triangularr   rH   )rD   r   r   r   r   r  r  is_contiguousis_conjr   rE   r   Zresize_
transpose_)	r   r   r	  r~   rq  ry   rm  ZA_Zavoid_copy_Ar)   r)   r*   linalg_solve_triangular_meta  s    
ru  solutioncloned_coefficient)rF   r   r	  r  rq  r   c           	         s   t jdkfdd t  jdk fdd t d  jt jkrt \}}t j|t|ddj	j
d}t j|t|dd j	 j
d}n@ jt jks jt jkrt }d	g}nt dd
d  ||fS )Nr   c                      s   d j  dS )NzMtorch.triangular_solve: Expected b to have at least 2 dimensions, but it has r  r  r)   rW   r)   r*   r9     s    z'triangular_solve_meta.<locals>.<lambda>c                      s   d j  dS )NzMtorch.triangular_solve: Expected A to have at least 2 dimensions, but it has r  r  r)   r   r)   r*   r9     s    triangular_solveFr  r&  r   c                   S   s   dS )Nz+triangular_solve: Got an unexpected layout.r)   r)   r)   r)   r*   r9     r:   )r.   r<   rQ   r   r   stridedr5  r'  r   r5   r\   
sparse_csr
sparse_bsrrV   rD   )	rF   r   r	  r  rq  Zself_broadcast_sizeZA_broadcast_sizerv  rw  r)   r   r*   triangular_solve_meta  s8    	




r|  c                 C   sp   t | d t| d | | jd d }| | j}|| jt| jdd | j| jd d tjd}|||fS )Nz
linalg.detr   Fr  rH   r>   r)  )r   Zdetr>  r,  r)   r)   r*   _linalg_det_meta  s    

r}  )r   r!  rP   r~   r  r   c                    s  t jdkdd  t jdkdd  |r4dndt j jd kfdd t j jd kfdd t jd jd kd	d  t jj d
kfdd t jjkfdd jdkrFjd d }jd d t |kfdd jd d  t  |k fdd t jjkfdd t jjkfdd tdd tdd t jjtjddjjdS )Nr   c                   S   s   dS )Nz3torch.ormqr: input must have at least 2 dimensions.r)   r)   r)   r)   r*   r9     r:   zormqr.<locals>.<lambda>c                   S   s   dS )Nz3torch.ormqr: other must have at least 2 dimensions.r)   r)   r)   r)   r*   r9     r:   r   rH   c                      s   d  dS )Ntorch.ormqr: other.shape[z0] must be greater than or equal to tau.shape[-1]r)   r)   left_size_conditionr)   r*   r9     r:   c                      s   d  dS )Nr~  z"] must be equal to input.shape[-2]r)   r)   r  r)   r*   r9     r:   c                   S   s   dS )NzHtorch.ormqr: tau.shape[-1] must be less than or equal to input.shape[-1]r)   r)   r)   r)   r*   r9     r:   rm   c                      s   dj  d j  S )Nz[torch.ormqr: Expected tau to have one dimension less than input, but got tau.ndim equal to r"  r  r)   r#  r)   r*   r9     s    c                      s   dj  d j  S )Nzhtorch.ormqr: Expected other to have the same number of dimensions as input, but got other.ndim equal to r"  r  r)   r   rP   r)   r*   r9     s    c                      s
   d  S )NzWtorch.ormqr: Expected batch dimensions of tau to be equal to input.shape[:-2], but got r)   r)   r$  r)   r*   r9     s    c                      s
   d  S )NzYtorch.ormqr: Expected batch dimensions of other to be equal to input.shape[:-2], but got r)   r)   )actual_batch_other_shaper)   r*   r9     s    c                      s   d j  dj  S )NzPtorch.ormqr: Expected input and tau to have the same dtype, but input has dtype z and tau has dtype r>   r)   r#  r)   r*   r9   "  s    c                      s   d j  dj  S )NzRtorch.ormqr: Expected input and other to have the same dtype, but input has dtype z and other has dtype r>   r)   r  r)   r*   r9   )  s    ztorch.ormqrr!  rP   Fr  r&  )	r.   r<   rQ   rE   r5   r  r'  r   r\   )r   r!  rP   r~   r  Zexpected_batch_shaper)   )r  r%  r   r  rP   r!  r*   ormqr  sr    	  






r  c                   s   t td  k fdd j}| d k}|}| }|rftd|D ]}|o`|dk}qLn"td|D ]}|o|dk}qpt |p| fdd d S )Nr   c                      s   dd   dt  S )Nzpadding size is expected to be r   z, but got: ro   r)   )rJ   paddingr)   r*   r9   =  r:   z,_padding_check_valid_input.<locals>.<lambda>rm   r   c                      s    d d  d d  dj  S )Nz	Expected rm   zD or r   zcD (batch mode) tensor with possibly 0 batch size and other non-zero dimensions for input, but got: r2  r)   )rJ   r   r)   r*   r9   R  s    )r.   r<   ro   rQ   rq   rN   )r   r  rJ   Z	input_dimZis_batch_modeZvalid_batch_modeZvalid_non_batch_moder}   r)   )rJ   r   r  r*   _padding_check_valid_input:  s"    r  c                   s   d}d d}j dkr0d} d7  |d7 }t|dd |\|}   |rtk o|k  fdd tdkfdd j dkr|fS ||fS d S )	Nr   rm   rK   rI   c                      s   d d d  dj  S NzcArgument #4: Padding size should be less than the corresponding input dimension, but got: padding (, ) at dimension 
 of input r2  r)   dim_wr   pad_lpad_rr)   r*   r9   n  s    z_pad1d_common.<locals>.<lambda>c                      s   d  d S )Nz
input (W: z%) is too small. Calculated output W: r)   r)   )input_woutput_wr)   r*   r9   v  r:   r   )rQ   rN   r  r.   r<   rD   )r   r  is_reflection	dim_planenbatchnplaner)   )r  r   r  r  r  r  r*   _pad1d_commonY  s0    




r  c                 C   s   t | |ddS NTr  r  r   r  r)   r)   r*   meta_reflection_pad1d  s    r  c                 C   s   t | |ddS NFr  r  r  r)   r)   r*   meta_replication_pad1d  s    r  c                   s   d |s t t|dkdd  jdkr2 d7  |\ }|  |rzt |k of|k  fdd t  k fdd jS )Nrm   r   c                   S   s   dS )Nz padding size is expected to be 2r)   r)   r)   r)   r*   r9     r:   z(_pad1d_backward_common.<locals>.<lambda>rK   c                      s   d d d  dj  S r  r2  r)   r  r)   r*   r9     s    c                      s   d d   S Nz(grad_output width unexpected. Expected: , Got: rM   r)   r  grad_outputr  r)   r*   r9     r:   )r.   r<   ro   rQ   rN   rD   rE   )r  r   r  r  r  r)   )r  r  r   r  r  r  r*   _pad1d_backward_common  s$    

r  c                 C   s   t | ||ddS r  r  r  r   r  r)   r)   r*   meta_reflection_pad1d_backward  s    r  c                 C   s   t | ||ddS r  r  r  r)   r)   r*   meta_replication_pad1d_backward  s    r  c                   s8  dd d}d}t |dd j}|dkrNd}d7  d7  |d7 }|\	
|} 
   	 |rtk o	k 	fdd t
k ök  
fdd tdkpdkfd	d jd
kr"|fS ||fS d S )Nr   rm   r   rI      c                      s   d d d  dj  S r  r2  r)   r  r)   r*   r9     s    z_pad2d_common.<locals>.<lambda>c                      s   d d d  dj  S NzcArgument #6: Padding size should be less than the corresponding input dimension, but got: padding (r  r  r  r2  r)   dim_hr   pad_bpad_tr)   r*   r9     s    c                      s   d  d d d S )Nz
input (H:  W: z%) is too small. Calculated output H: r)   r)   )input_hr  output_hr  r)   r*   r9     s    rK   r  rQ   rN   r.   r<   rD   )r   r  r  Z
dim_slicesr  rQ   r  r)   )r  r  r   r  r  r  r  r  r  r  r  r*   _pad2d_common  sB    



r  c                 C   s   t | |ddS r  r  r  r)   r)   r*   meta_reflection_pad2d  s    r  c                 C   s   t | |ddS r  r  r  r)   r)   r*   meta_replication_pad2d  s    r  c                    s   dd d}d}|j }| dkrB|d }d7  d7  |d7 }|\}}}}	|| }
|  }| }|| |	 || | tkfdd t k fdd ||j S )Nr   rm   r   r  c                      s   d d   S r  rM   r)   r  r)   r*   r9     r:   z%meta_pad2d_backward.<locals>.<lambda>c                      s   d d   S Nz)grad_output height unexpected. Expected: r  rM   r)   r  r  r  r)   r*   r9     r:   )rE   rJ   r.   r<   rN   rD   )r  rF   r  r  r  r8   r  r  r  r  r  r  r  r)   )r  r  r  r  r  r*   meta_pad2d_backward  s2    
r  c             	      s  ddd d}t |dd jdk}|rVd}d7 d7  d7  |d7 }|\
|}    
   	|r,tk oʈk fdd tk o
k 
fd	d tk ok  fd
d t	dkpJdkpJdk	fdd |r|||	fS |	fS d S )NrK   r   rm   r   rI      c                      s   d d d  dj  S r  r2  r)   r  r)   r*   r9   <  s    z_pad3d_common.<locals>.<lambda>c                      s   d d d  dj  S r  r2  r)   r  r)   r*   r9   C  s    c                      s   d d d  dj  S )NzcArgument #8: Padding size should be less than the corresponding input dimension, but got: padding (r  r  r  r2  r)   )dim_dr   pad_bkpad_fr)   r*   r9   J  s    c                      s(   d  d d d d d S )Nz
input (D:  H: r  z%) is too small. Calculated output D: r)   r)   )input_dr  r  output_dr  r  r)   r*   r9   R  s    r  )r   r  r  r  Z
batch_moder  r  r)   )r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r*   _pad3d_common  sP    





r  c                 C   s   t | |ddS r  r  r  r)   r)   r*   meta_reflection_pad3d^  s    r  c                 C   s   t | |ddS r  r  r  r)   r)   r*   meta_replication_pad3dd  s    r  c                    s(  t t|dkdd  |jdks&tj|jks6tddd |jdkrdd7 d7  d7  |\}}}}}}| }	|}
|}|	| | |
| | || | t kfdd t kfd	d t  k fd
d ||jS )N   c                   S   s   dS )Nz padding size is expected to be 6r)   r)   r)   r)   r*   r9   t  r:   z%meta_pad3d_backward.<locals>.<lambda>rK   r   rm   r  c                      s   d d   S r  rM   r)   r  r)   r*   r9     r:   c                      s   d d   S r  rM   r)   r  r)   r*   r9     r:   c                      s   d d   S )Nz(grad_output depth unexpected. Expected: r  rM   r)   )r  r  r  r)   r*   r9     r:   )r.   r<   ro   rQ   r   rN   rD   rE   )r  r   r  r  r  r  r  r  r  r  r  r  r)   )r  r  r  r  r  r  r  r*   meta_pad3d_backwardj  s<    




r  r   )rF   pr   c                 C   sb   t |  dd  | d}|dkr<| dgjt jdS | ||d  d fjt jdS d S )Nc                   S   s   dS )Nz(_pdist_forward requires contiguous inputr)   r)   r)   r)   r*   r9     r:   z%meta__pdist_forward.<locals>.<lambda>r   rm   r   r   )r.   r<   rr  rN   rD   r   r  )rF   r  r   r)   r)   r*   meta__pdist_forward  s     
r  )gradrF   r  pdistr   c                 C   s8   t | dd  t | dd  t j|t jdS )Nc                   S   s   dS )Nz._pdist_backward requires self to be contiguousr)   r)   r)   r)   r*   r9     r:   z&meta__pdist_backward.<locals>.<lambda>c                   S   s   dS )Nz/_pdist_backward requires pdist to be contiguousr)   r)   r)   r)   r*   r9     r:   r   )r.   r<   rr  rV   r  )r  rF   r  r  r)   r)   r*   meta__pdist_backward  s      r  rm   )betaalphac          	         s     d}  d} d}|||ft  dkdd  t dkdd  tj j  kozjkn   fdd  j}j|d |d td koƈd kfd	d   S )
Nr   rm   r   rK   c                   S   s   dS Nzbatch1 must be a 3D tensorr)   r)   r)   r)   r*   r9     r:   zmeta_baddbmm.<locals>.<lambda>c                   S   s   dS Nzbatch2 must be a 3D tensorr)   r)   r)   r)   r*   r9     r:   c                      s   dj  d j  dj  S )Nz+Input dtypes must be the same, got: input: z
, batch1: z
, batch2: r>   r)   )batch1batch2rF   r)   r*   r9     r:   c                	      s&   d d d d  d d  d	S Nz@Expected size for first two dimensions of batch2 tensor to be: [r  z] but got: [r   rm   ].r)   r)   batch2_sizesbscontraction_sizer)   r*   r9     s    )rN   rb  r.   r<   rJ   r5   rE   rD   )	rF   r  r  r  r  dim1dim2Zdim3batch1_sizesr)   )r  r  r  r  r  rF   r*   meta_baddbmm  s&    


r  c                C   s   t |  S r$   r.   rV   ra   )rF   r   r)   r)   r*   meta_bernoulli  s    r        ?c                 C   s   | S r$   r)   rF   r  r   r)   r)   r*   meta_bernoulli_  s    r  c                 C   s   t |  S r$   r  r  r)   r)   r*   meta_bernoulli_p  s    r  c                 C   s6   t |
|  k dd  t j| t jd}t | |fS )Nc                   S   s   dS )NzJError in fused_moving_avg_obs_fake_quant_cpu: ch_axis must be < self.dim()r)   r)   r)   r)   r*   r9     r:   z6meta__fused_moving_avg_obs_fq_helper.<locals>.<lambda>r>   )r.   r<   rJ   rV   bool)rF   Zobserver_onZfake_quant_onZrunning_minZrunning_maxscaleZ
zero_pointZaveraging_constZ	quant_minZ	quant_maxZch_axisZper_row_fake_quantZsymmetric_quantmaskr)   r)   r*   $meta__fused_moving_avg_obs_fq_helper  s    
r  c                    sT   t  dko  dk fdd  fdd}t    k| d S )Nrm   c                      s   d   d    dS )Nz1D tensors expected, but got zD and z	D tensorsrI   r)   rP   rF   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 rL   z elements respectivelyrC   r)   r  r)   r*   numel_error   s    ,zdot_check.<locals>.numel_error)r.   r<   rJ   rC   )rF   rP   r  r)   r  r*   	dot_check  s    r  c                 C   s   t | | | dS r   )r  rD   )rF   r   r)   r)   r*   meta_dot	  s    
r  c                    sn   t |  dkdd  t | dkdd  | j\ |j\t  k fdd | S )Nr   c                   S   s   dS )Nza must be 2Dr)   r)   r)   r)   r*   r9     r:   zmeta_mm.<locals>.<lambda>c                   S   s   dS )Nzb must be 2Dr)   r)   r)   r)   r*   r9     r:   c                	      s   d d  d d d	S )Nz/a and b must have same reduction dim, but got [r  z] X [r  r)   r)   ZM1ZM2Nr8  r)   r*   r9     r:   )r.   r<   rJ   rE   rD   abr)   r  r*   meta_mm  s    

r  c                    s0   |r"t  fddtjD S tj S )Nc                 3   s$   | ]}| krj | nd V  qdS )rm   Nr2  rd   r   dimsrF   r)   r*   rg    s     z+_compute_reduction_shape.<locals>.<genexpr>)r;   rq   rQ   r   compute_reduction_output_shaperE   )rF   r  r   r)   r  r*   r     s    r   str)r   c                 C   s   t | tjjr| jjS dS d S )NrX  )r   r.   Z_subclassesZ
FakeTensorZfake_devicetype)r   r)   r)   r*   rY  '  s    rY  )input_tensorweightrs   r  dilationis_transposedgroupsoutput_paddingc                 C   s  t t t t t t ddd}t t t t t t t ddd}	|jdd  }
| jdd  }|rb||jd  }n*|jd	 }|jd | | jd krtd
| jd	 |g}t|tr|gt| }nt|dkr|d	 gt| }t|tr|gt| }n t|dkr|d	 gt| }t|tr(|gt| }n t|dkrH|d	 gt| }d }|rt|trn|gt| }n&t|dkr|d	 gt| }n|}tt|D ]h}|r||	|| || || |
| || ||  n*|||| || || |
| ||  q|S )N)lnr  r}   r<  sr   c                 S   s$   | d|  ||d   d | d S )a  
        Formula to apply to calculate the length of some dimension of the output

        See: https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html

        Args:
            ln: length of the dimension
            p: padding in that dim
            d: dilation in that dim
            k: kernel size in that dim
            s: stride in that dim
        Returns:
            The output length
        r   rm   r)   )r  r  r}   r<  r  r)   r)   r*   _formula8  s    z+calc_conv_nd_return_shape.<locals>._formula)r  r  r}   r<  r  r&   r   c                 S   s(   | d | d|  ||d   | d S )a  
        Formula to apply to calculate the length of some dimension of the output
        if transposed convolution is used.
        See: https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose2d.html

        Args:
            ln: length of the dimension
            p: padding in that dim
            d: dilation in that dim
            k: kernel size in that dim
            s: stride in that dim
            op: output padding in that dim

        Returns:
            The output length
        rm   r   r)   )r  r  r}   r<  r  r&   r)   r)   r*   _formula_transposedI  s    z6calc_conv_nd_return_shape.<locals>._formula_transposedr   rm   r   zInvalid channel dimensions)r/  rE   RuntimeErrorr   r   ro   rq   rr   )r  r  rs   r  r  r  r  r  r  r  kernel_sizer  Zout_channelsZ	ret_shapeZoutput_padding_listr   r)   r)   r*   calc_conv_nd_return_shape.  sZ    



"r   c                 C   s   t j| t jkS r$   r.   _prims_commonsuggest_memory_formatchannels_lasttenr)   r)   r*   is_channels_last  s    r  )	r  r  biasrs   r  r  r  r  r  c	              	      sH    fdd}	t  ||||||r&|nd }
 |
}|j|	 d}|S )Nc                      s^   t  dkr$t str2tjS nt r2tjS  jtjdrFtjS  jtjdrZtjS d S NrX  r   )rY  r  r.   r  rr  r   preserve_formatr)   r  r  r)   r*   pick_memory_format  s    z%meta_conv.<locals>.pick_memory_formatr   )r   rD   r   )r  r  r  rs   r  r  r  r  r  r  	shape_outry   r)   r  r*   	meta_conv  s    

r  mkldnnc
              	   C   s6   t | ||||d|g }
| |
}tj}|j|d}|S )NFr   )r   rD   r.   r  r   )r  r  r  r  rs   r  r  attrscalars	algorithmr  ry   Zout_memory_formatr)   r)   r*   meta_mkldnn_convolution_default  s           
r  c                 C   s    |  | jd d |jd fS NrH   r   rD   rE   )r  r  r  r  r  r  r)   r)   r*   meta_linear_pointwise_default  s    r  mklc                 C   s    |  | jd d |jd fS r  r  )r  Zpacked_weightZorig_weightr  r   r)   r)   r*   meta_mkl_linear  s    r  onednnc              	   C   s@   t | ||||	d|
d }| j||r&tjnd d}|jtjd}|S )NFr>   r   )r   rD   r.   float32r   r  )rh   x_scalex_zpww_scalew_zpr  rs   r  r  r  output_scaleoutput_zero_pointfp32_outputr  r  r  r  ry   r)   r)   r*   meta_qconv2d_pointwise  s    
r#  c                 C   s4   t | j}|jd |d< | j||	r(tjnd d}|S )Nr   rH   r>   )rp   rE   rD   r.   r  )rh   r  r  r  r  r  r  r   r!  r"  Zpost_op_nameZpost_op_argsZpost_op_algorithmr   ry   r)   r)   r*   meta_qlinear_pointwise  s    
r$  c                    s4   t   koj k fdd d S )Nc                      s8   d  d d dd   d dj   S )NzExpected a tensor of dimension z and tensor.size[z] == r  zbut got : dimension z] = rJ   rE   r)   rJ   dim_sizerN   r   r)   r*   r9   0  s   z check_dim_size.<locals>.<lambda>)r.   r<   rJ   rE   )r   rJ   r'  rN   r)   r&  r*   check_dim_size-  s    r(  r)   rn   c                 C   sd  dd }|d|\}}	t t|dkdd  t|dkrF||	 }
}n.t|dkrf|d |d  }
}n|d	|\}
}|d
|\}}t |d kp|dkdd  |  dkr| dnd}| d}| d}| d}t||||
d|}t||	||d|}t| }t| ||	|
|||dd|||||| |  dkrB|||g}n||||g}t j	|| j
| j|dS )Nc                    sD   t t|dk fdd |d }t|dkr4|n|d }||fS )Nrm   r   c                      s   d  dS )Nzavg_pool2d: 4 must either be a single int, or a tuple of two intsr)   r)   r   r)   r*   r9   B  r:   z1meta_avg_pool2d.<locals>.unpack.<locals>.<lambda>r   rm   r.   r<   ro   r   r   HWr)   r+  r*   unpack?  s    

zmeta_avg_pool2d.<locals>.unpackr  r   rm   r   c                   S   s   dS NzOavg_pool2d: stride must either be omitted, a single int, or a tuple of two intsr)   r)   r)   r)   r*   r9   K  r:   z!meta_avg_pool2d.<locals>.<lambda>r   rm   rs   r  c                   S   s   dS Nzdivisor must be not zeror)   r)   r)   r)   r*   r9   X  r:   r  r   rH   rK   r5   r\   r   )r.   r<   ro   rJ   rN   pooling_output_shaper   r  pool2d_shape_checkr]   r5   r\   )r   r  rs   r  	ceil_modecount_include_paddivisor_overrider0  kHkWdHdWpadHpadWr  nInputPlaneinputHeight
inputWidthoutputHeightoutputWidthr   rN   r)   r)   r*   meta_avg_pool2d5  sb    
	




rG  c                 C   sj   t | ||||||dd|	|
|||| |  }|	}t|||d | t|||d | t|||d | d S )Nrm   rK   r   )r8  rJ   r(  )r   Z
gradOutputr  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  
mem_formatrQ   nOutputPlaner)   r)   r*   avg_pool2d_backward_shape_check  s,    rJ  c                 C   s  t t|dkpt|dkdd  |d }t|dkr<|n|d }	t t|dkpjt|dkpjt|dkdd  t|dkr|n|d }
t|dkr|	nt|dkr|
n|d }t t|dkpt|dkdd  |d }t|dkr|n|d }t |d kp|dkdd  |j}| d	kr2|d
 nd}|d }|d }|d }t||||
d|}t||	||d|}t|}t|| |||	|
||||||||| t j	||j
|j|dS )Nrm   r   c                   S   s   dS )NzKavg_pool2d: kernel_size must either be a single int, or a tuple of two intsr)   r)   r)   r)   r*   r9     r:   z*meta_avg_pool2d_backward.<locals>.<lambda>r   c                   S   s   dS r2  r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS )NzGavg_pool2d: padding must either be a single int, or a tuple of two intsr)   r)   r)   r)   r*   r9     r:   c                   S   s   dS r3  r)   r)   r)   r)   r*   r9     r:   r  r4  r5  r   rH   r6  )r.   r<   ro   rE   rJ   r7  r   r  rJ  r]   r5   r\   )ZgradOutput_r   r  rs   r  r9  r:  r;  r<  r=  r>  r?  r@  rA  
input_sizer  rB  rC  rD  rE  rF  rH  r)   r)   r*   meta_avg_pool2d_backward  sj    "(
rL  c                 C   s  t t|dkdd  |d }t|dkr0|n|d }t|dkrH|n|d }	t | pdt|dkdd  |sv|n|d }
|s|nt|dkr|
n|d }|s|	nt|dkr|
n|d }t t|dkdd  |d }t|dkr|n|d }t|dkr|n|d }t | jd	kd
d  t | p8|dkdd  | d}| d}| d}| d}| d}t||||
d|}t||||d|}t||	||d|}t| ||||	|
|||||ddd||||||ddd | jdkr| ||||fS | |||||fS d S )Nrm   rK   c                   S   s   dS NzFavg_pool3d: kernel_size must be a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   	  r:   z!meta_avg_pool3d.<locals>.<lambda>r   rm   r   c                   S   s   dS NzJavg_pool3d: stride must be omitted, a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   	  r:   c                   S   s   dS NzBavg_pool3d: padding must be a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   	  r:   r  r  c                   S   s   dS Nz9non-empty 4D or 5D (batch mode) tensor expected for inputr)   r)   r)   r)   r*   r9   	  r:   c                   S   s   dS r3  r)   r)   r)   r)   r*   r9   "	  r:   r4  r5  r   rH   zavg_pool3d()T)check_input_sizer  )r.   r<   ro   rQ   rN   r7  pool3d_shape_checkrD   )r   r  rs   r  r9  r:  r;  kTr<  r=  dTr>  r?  padTr@  rA  r  nslicesitimeiheightiwidthotimeoheightowidthr)   r)   r*   meta_avg_pool3d  s    
  





r_  c                 C   s  t t|dkdd  |d }t|dkr0|n|d }	t|dkrH|n|d }
t | pdt|dkdd  |sv|n|d }|s|	nt|dkr|n|d }|s|
nt|dkr|n|d }t t|dkdd  |d }t|dkr|n|d }t|dkr|n|d }t |jd	kd
d  t | p8|dkdd  |d}|d}|d}|d}t||||d|}t||	||d|}t||
||d|}t|| |||	|
||||||||||||d ||jS )NrM  c                   S   s   dS rN  r)   r)   r)   r)   r*   r9   \	  r:   z*meta_avg_pool3d_backward.<locals>.<lambda>r   rm   r   c                   S   s   dS rO  r)   r)   r)   r)   r*   r9   d	  r:   c                   S   s   dS rP  r)   r)   r)   r)   r*   r9   l	  r:   rQ  c                   S   s   dS rR  r)   r)   r)   r)   r*   r9   t	  r:   c                   S   s   dS r3  r)   r)   r)   r)   r*   r9   y	  r:   r4  r5  r   rH   zavg_pool3d_backward())	r.   r<   ro   rQ   rN   r7  avg_pool3d_backward_shape_checkrD   rE   )r  r   r  rs   r  r9  r:  r;  rU  r<  r=  rV  r>  r?  rW  r@  rA  rX  rY  rZ  r[  Zotime_for_shape_checkZoheight_for_shape_checkZowidth_for_shape_checkr)   r)   r*   meta_avg_pool3d_backwardN	  st    
  




ra  c                    sZ   t  jdkp jdk fdd  jd d t| }t }t j| j j	|dS )NrK   r  c                      s   d j  S )Nz"Expected 3D or 4D tensor, but got r2  r)   rW   r)   r*   r9   	  r:   z*meta_adaptive_avg_pool2d.<locals>.<lambda>r   r6  )
r.   r<   rQ   rE   r;   r   r  r]   r5   r\   )rF   output_sizer   r   r)   rW   r*   meta_adaptive_avg_pool2d	  s    

rc  c                    s@   t  jdkp jdk fdd   jd d t| S )Nr  r  c                      s   d j  S )Nz"Expected 4D or 5D tensor, but got r2  r)   rW   r)   r*   r9   	  r:   z*meta_adaptive_avg_pool3d.<locals>.<lambda>r5  )r.   r<   rQ   rD   rE   r;   )rF   rb  r)   rW   r*   meta_adaptive_avg_pool3d	  s
    
rd  c                    s    j }td|D ]$t dk fdd qt|dkpH|dkfdd tj jk fdd tj}trtj}	j
j|d	S )
Nrm   r   c                      s   d j  d dS )Nz{adaptive_avg_pool2d_backward(): Expected grad_output to have non-zero                       size for non-batch dimensions,  with dimension  being emptyr2  r)   )grad_outr   r)   r*   r9   	  s   z4meta__adaptive_avg_pool2d_backward.<locals>.<lambda>rK   r  c                      s   d j  S )NzBadaptive_avg_pool2d_backward(): Expected 3D or 4D tensor, but got r2  r)   rW   r)   r*   r9   	  r:   c                      s   dj  d j  S Nzexpected dtype z! for `grad_output` but got dtype r>   r)   )rg  rF   r)   r*   r9   	  r:   r   )rQ   rq   r.   r<   rN   r5   r   r  r  rD   rE   r   )rg  rF   rQ   r   r)   )rg  r   rF   r*   "meta__adaptive_avg_pool2d_backward	  s$    

ri  c                 C   s   t | d tj|tjdS )NZadaptive_avg_pool3d_backwardr   )!_adaptive_pool_empty_output_checkr.   rV   r  r  rF   r)   r)   r*   "meta__adaptive_avg_pool3d_backward	  s    
rl  )r  r   c                    s<   j }td|D ]&tdk fdd qd S )Nrm   r   c                      s     dj  d dS )Nzc(): Expected grad_output to have non-zero size for non-batch dimensions, but grad_output has sizes re  rf  r2  r)   r   r  r   r)   r*   r9   	  s    z3_adaptive_pool_empty_output_check.<locals>.<lambda>)rQ   rq   r.   r<   rN   )r  r   rQ   r)   rm  r*   rj  	  s    rj  ry   c                    s&  j }t|dkfdd td|D ]$ t dk fdd q(tt|dkdd  d}d}d}j d	krd}|d7 }|d }|\}}j d
kr|||f}|}	j|tjd}
|	|
fS ||||f}t	}|j
|d}	j|tjdj
|d}
|	|
fS d S )NrK   r  c                      s   d j  S )Nz:adaptive_max_pool2d(): Expected 3D or 4D tensor, but got: r2  r)   r   r)   r*   r9   	  r:   z*meta_adaptive_max_pool2d.<locals>.<lambda>rm   r   c                      s   dj  d  dS )Nzjadaptive_max_pool2d(): Expected input to have non-zero size for non-batch dimensions, but input has sizes re  rf  r2  r)   r   r   r)   r*   r9   	  s    r   c                   S   s   dS )NzCadaptive_max_pool2d(): internal error: output_size.size() must be 2r)   r)   r)   r)   r*   r9   	  r:   r  rK   r>   r   )rQ   r.   r<   rq   rN   ro   rD   r^   r   r  r   )r   rb  rQ   ZdimHsizeBsizeDosizeHosizeWrR   ry   rZ   r   r)   rp  r*   meta_adaptive_max_pool2d	  sD    







ru  c                    sd    j }t|dk fdd t d tj jk fdd t}jj	|dS )Nrn  c                      s   d j  S )NzKadaptive_max_pooling2d_backward(): Expected 3D or 4D grad_output, but got: r2  r)   r  r)   r*   r9   
  r:   z3meta_adaptive_max_pool2d_backward.<locals>.<lambda>adaptive_max_pool2d_backwardc                      s   dj  d j  S rh  r>   r)   r  r   r)   r*   r9    
  r:   r   )
rQ   r.   r<   rj  r5   r   r  rD   rE   r   )r  r   rZ   rQ   r   r)   rx  r*   !meta_adaptive_max_pool2d_backward
  s    



ry  c                    s   j }t|dkfdd td|D ]$ t dk fdd q(tt|dkdd  d}d}d}|d	krd}|d7 }|}|\}}}|d
kr||||f}	n|||||f}	|	}
j|	tjd}|
|fS )NrQ  c                      s   d j  S )Nz:adaptive_max_pool3d(): Expected 4D or 5D tensor, but got: r2  r)   ro  r)   r*   r9   -
  r:   z*meta_adaptive_max_pool3d.<locals>.<lambda>rm   r   c                      s   dj  d  dS )Nzjadaptive_max_pool3d(): Expected input to have non-zero size for non-batch dimensions, but input has sizes re  rf  r2  r)   rp  r)   r*   r9   2
  s    rK   c                   S   s   dS )NzCadaptive_max_pool3d(): internal error: output_size.size() must be 3r)   r)   r)   r)   r*   r9   :
  r:   r  r  r>   )rQ   r.   r<   rq   rN   ro   rD   r^   )r   rb  rQ   ZdimDrq  rr  ZosizeTrs  rt  rR   ry   rZ   r)   rp  r*   meta_adaptive_max_pool3d'
  s8    





rz  c                 C   s   t | d ||jS )Nadaptive_max_pool3d_backward)rj  rD   rE   )r  r   rZ   r)   r)   r*   !meta_adaptive_max_pool3d_backwardS
  s    
r|  c                 C   s   |d krt d| |S )Nz:cannot repeat_interleave a meta tensor without output_size)r  rD   )repeatsrb  r)   r)   r*   meta_repeat_interleave_TensorZ
  s    r~  c                 C   s:   | j jst|j jstt| j|j}| j|t| j dS r   )r5   r   r   r   rE   rD   r   )realimagrR   r)   r)   r*   meta_complexa
  s    r  c                 C   s   t | |S r$   )r   clone_preserve_stridesr   )rF   r5   r)   r)   r*   
view_dtypej
  s    r  c                 C   sx   | j st| |S |  rH| r6t| |  S t|  |S n| rdt| |  S t| | | dS r   )r   r.   dotrs  vdotrB  r  rD   rF   rP   r)   r)   r*   r  o
  s    
r  )
fill_value)rN   r  c                C   s   | j ||  ftjdS r   )rD   rJ   r.   rA   )rF   rN   r  r)   r)   r*   nonzero_static
  s    r  c              
      s  t tdd  g }tD ]\ d k	rt jt jt jt jt jfkdd  jt jt jfkr }t	|t 
j jkfdd tjD ]Ft 
j j  k fdd ||d qn
| q | q |t t	jkfdd dd lm} t|j t	jk r`d  qBd}d	}D ]J|dkrd k	rd}n*|dkrd krd
}nd k	rl qqld}|s<g }g }tD ](\ d k	r|  | qtD ](\ d kr|  | q||g }	g }
g }tD ]H\}d kr|rz|
j|  n|	j|  n
tj}qP|	| |
 S )Nc                   S   s   dS )Nz#at least one index must be providedr)   r)   r)   r)   r*   r9   
  r:   z#meta_index_Tensor.<locals>.<lambda>c                   S   s   dS )Nz?tensors used as indices must be long, int, byte or bool tensorsr)   r)   r)   r)   r*   r9   
  r:   c                      s   d j  S )N)too many indices for tensor of dimension r  r)   rW   r)   r*   r9   
  r:   c                	      s$   dj  d  dj  d  S )NzThe shape of the mask z
 at index z0 does not match the shape of the indexed tensor r2  r)   )r   r@   jr<  rF   r)   r*   r9   
  r:   rm   c                      s   dj  dt  dS )Nr  z (got r   )rQ   ro   r)   )rZ   rF   r)   r*   r9   
  r:   r   Fr   T)r.   r<   r  	enumerater5   rA   r/  int8nonzeroro   rB   rQ   rq   rE   rr   selecttorch._refsZ_refsrp   r   ru   rD   )rF   rZ   r   r  refsstateZhas_contiguous_subspacer  Ztransposed_indicesZbefore_shapeZafter_shapeZreplacement_shaperJ   r)   )r   r@   rZ   r  r<  rF   r*   meta_index_Tensor
  s    












r  c                 C   sT   d }d }d }|
d r"|  | }|
d r8|  | }|
d rJ|  |}|||fS )Nr   rm   r   )rD   rN   )Zgrad_output_Zinput_Zweight_Zbias_sizes_optrs   r  r  Z
transposedr  r  output_maskZbackend_grad_inputZbackend_grad_weightZbackend_grad_biasr)   r)   r*   meta_convolution_backward
  s    
r  c                   s     d} d}| ||f} t  dkdd  t dkdd  t  d dk fdd t  d dk fd	d t|  d|ko|  d|kd
d  | |   S )Nrm   r   rK   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   zmeta_addbmm.<locals>.<lambda>c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   r   c                      s   d  d d d S )Nz8batch1 and batch2 must have same number of batches, got r   rL   rM   r)   r  r  r)   r*   r9     r:   c                
      s6   d  d d  d d d d d d	S )Nz#Incompatible matrix sizes for bmm (rm   rh   r   rL   r   rM   r)   r  r)   r*   r9     s    c                   S   s   dS )Nz.self tensor does not match matmul output shaper)   r)   r)   r)   r*   r9     r:   )rN   rb  r.   r<   rJ   rD   )rF   r  r  r  r  r  r  r)   r  r*   meta_addbmm  s$    

r  c                    s   t t t fdd d S )Nc                      s   dt   S NzExpect List[Tensor] but got r  r)   rW   r)   r*   r9   ,  r:   z&meta__foreach_unaop_.<locals>.<lambda>r.   r<   r   r   rW   r)   rW   r*   meta__foreach_unaop_!  s    	
r  c                    s(   t t t fdd dd  D S )Nc                      s   dt   S r  r  r)   rW   r)   r*   r9   ;  r:   z%meta__foreach_unaop.<locals>.<lambda>c                 S   s   g | ]}t |qS r)   r.   rV   rd   r  r)   r)   r*   rf   =  s     z'meta__foreach_unaop.<locals>.<listcomp>r  rW   r)   rW   r*   meta__foreach_unaop0  s
    	
r  c                    sX   t ttot t fdd t tdkoDtt k fdd d S )Nc                      s   dt  dt   dS )Nz9The first two arguments of must be List[Tensor], but got rL   .r  r)   r  r)   r*   r9   C  s    z3_check_foreach_binop_tensor_lists.<locals>.<lambda>r   c                      s   dt  dt   dS )Nz>self and other must be non-empty and match in length, but got rL   r  r  r)   r  r)   r*   r9   J  s    )r.   r<   r   r   ro   r  r)   r  r*   !_check_foreach_binop_tensor_lists@  s    r  c                 C   s   t | | dd | D S )Nc                 S   s   g | ]}t |qS r)   r  r  r)   r)   r*   rf   ]  s     z,meta__foreach_binop_list.<locals>.<listcomp>r  rF   rP   r  r)   r)   r*   meta__foreach_binop_listQ  s    
r  c                 C   s   t | | d S r$   r  r  r)   r)   r*   meta__foreach_binop__list`  s    r  c                    s   t t t fdd d S )Nc                      s   dt   dS Nz4The first argument of must be List[Tensor], but got r  r  r)   rW   r)   r*   r9   y  r:   z-meta__foreach_binop__scalar.<locals>.<lambda>r  rF   scalarr)   rW   r*   meta__foreach_binop__scalarn  s    	
r  c                    s(   t t t fdd dd  D S )Nc                      s   dt   dS r  r  r)   rW   r)   r*   r9     r:   z,meta__foreach_binop_scalar.<locals>.<lambda>c                 S   s   g | ]}t |qS r)   r  r  r)   r)   r*   rf     s     z.meta__foreach_binop_scalar.<locals>.<listcomp>r  r  r)   rW   r*   meta__foreach_binop_scalar}  s
    	
r  c                    st   t tdd  fD  fdd t t dkdd  t t tkoft tkdd  d S )Nc                 s   s   | ]}t |tV  qd S r$   r   r   rd   lr)   r)   r*   rg    s     z/meta__foreach_addcop__scalar.<locals>.<genexpr>c                      s"   dt   dt  dt  S )Nz?All arguments of _foreach_addc*_ must be List[Tensor], but got r  , and r  r)   rF   tensor1tensor2r)   r*   r9     s    z.meta__foreach_addcop__scalar.<locals>.<lambda>r   c                   S   s   dS Nz$input tensor list must not be empty.r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS Nz0All input tensor lists must have the same lengthr)   r)   r)   r)   r*   r9     r:   r.   r<   rk  ro   rF   r  r  r  r)   r  r*   meta__foreach_addcop__scalar  s    r  c                 C   s   t | | d S r$   r  )rF   rP   r  r)   r)   r*   meta__foreach_lerp__scalar  s    r  c                    s~   t tdd  fD  fdd t t dkdd  t t tkoft tkdd  dd	  D S )
Nc                 s   s   | ]}t |tV  qd S r$   r  r  r)   r)   r*   rg    s     z.meta__foreach_addcop_scalar.<locals>.<genexpr>c                      s"   dt   dt  dt  S )Nz,All arguments must be List[Tensor], but got r  r  r  r)   r  r)   r*   r9     s    z-meta__foreach_addcop_scalar.<locals>.<lambda>r   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   c                 S   s   g | ]}t |qS r)   r  r  r)   r)   r*   rf     s     z/meta__foreach_addcop_scalar.<locals>.<listcomp>r  r  r)   r  r*   meta__foreach_addcop_scalar  s    r  c                    s(   t t t fdd dd  D S )Nc                      s   dt   S Nz'exponent must be a tensor list but got r  r)   exponentr)   r*   r9     r:   z5meta__foreach_pow_scalar_and_tensor.<locals>.<lambda>c                 S   s   g | ]}t |qS r)   r  )rd   er)   r)   r*   rf     s     z7meta__foreach_pow_scalar_and_tensor.<locals>.<listcomp>r  )rF   r  r)   r  r*   #meta__foreach_pow_scalar_and_tensor  s
    
r  c                    s   t tdd fD o&t t j fdd t tdkdd  t ttkotttkdd  d S )Nc                 s   s   | ]}t |tV  qd S r$   r  r  r)   r)   r*   rg    s     z.meta__foreach_addcop_tensor.<locals>.<genexpr>c                	      s,   dt  dt  dt  dt   S )Nzi_foreach_addc*_ op expects arguments of type: List[Tensor], List[Tensor], List[Tensor], tensor, but got: r  r  r  r)   r  rF   r  r  r)   r*   r9     s    z-meta__foreach_addcop_tensor.<locals>.<lambda>r   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   )r.   r<   rk  r   r
   ro   )rF   r  r  r  r)   r  r*   meta__foreach_addcop_tensor  s    
r  c                 C   s   t | | d S r$   r  )rF   r   r   r)   r)   r*   meta__foreach_copy_inplace  s    r  )
grad_scale	found_infc       	            s4   | |||||fD ] t t t fdd qd S )Nc                      s   dt   S r  r  r)   r  r)   r*   r9     r:   z#meta__fused_adam_.<locals>.<lambda>r  )rF   gradsexp_avgsexp_avg_sqsmax_exp_avg_sqsstate_stepslrbeta1beta2weight_decayepsamsgradmaximizer  r  r)   r  r*   meta__fused_adam_  s
    
r  c       	            sZ   | |||||fD ] t t t fdd qdd }|| ||||||||fS )Nc                      s   dt   S r  r  r)   r  r)   r*   r9     r:   z"meta__fused_adam.<locals>.<lambda>c                 S   s   dd | D S )Nc                 S   s   g | ]}t |qS r)   r  )rd   r   r)   r)   r*   rf     s     z=meta__fused_adam.<locals>.empty_like_list.<locals>.<listcomp>r)   )Ztensor_listr)   r)   r*   empty_like_list  s    z)meta__fused_adam.<locals>.empty_like_listr  )rF   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)   r  r*   meta__fused_adam  s    
r  c                    s   t   dkdd  t  dkdd  t  jt jk fdd t jt jkfdd t  ddk fd	d  j ddft jd
S )Nr   c                   S   s   dS )Nza must be a 2D tensorr)   r)   r)   r)   r*   r9   #  r:   zmeta__int_mm.<locals>.<lambda>c                   S   s   dS )Nzb must be a 2D tensorr)   r)   r)   r)   r*   r9   $  r:   c                      s   d j  S )Nzexpected self to be int8, got r>   r)   )r  r)   r*   r9   '  r:   c                      s   d j  S )Nzexpected mat2 to be int8, got r>   r)   )r  r)   r*   r9   +  r:   rm   r   c                
      s6   d  d d  d d d d d d	S )Nz'Incompatible matrix sizes for _int_mm (r   rh   rm   rL   r   rM   r)   r  r)   r*   r9   /  s    r>   )r.   r<   rJ   r5   r  rN   rD   r  r  r)   r  r*   meta__int_mm   s    



r  c           	         s  t  dkfdd t  dkfdd t ddkfdd t tjdd  t tjdd  t |d	kd
d  t  dk fdd d}d}jd d }jd d }tt 	||}|
||g |S )Nr   c                      s   d    dS )Nz1cdist only supports at least 2D tensors, X1 got: DrI   r)   )x1r)   r*   r9   ;  r:   z$meta_cdist_forward.<locals>.<lambda>c                      s   d    dS )Nz1cdist only supports at least 2D tensors, X2 got: r  rI   r)   )x2r)   r*   r9   ?  r:   rH   c                      s   d  d d d S )Nz4X1 and X2 must have the same number of columns. X1: rH   z X2: rM   r)   )r  r  r)   r*   r9   C  r:   c                   S   s   dS )Nz=cdist only supports floating-point dtypes, X1 got: {x1.dtype}r)   r)   r)   r)   r*   r9   G  r:   c                   S   s   dS )Nz=cdist only supports floating-point dtypes, X2 got: {x2.dtype}r)   r)   r)   r)   r*   r9   K  r:   r   c                   S   s   dS )Nz)cdist only supports non-negative p valuesr)   r)   r)   r)   r*   r9   M  r:   )Nrm   r   c                      s
   d  S )Nz%possible modes: None, 1, 2, but was: r)   r)   )compute_moder)   r*   r9   P  r:   r   )r.   r<   rJ   rN   r   is_float_dtyper5   rE   rp   broadcast_shapesextendrD   )	r  r  r  r  r1r2batch_tensor1batch_tensor2r   r)   )r  r  r  r*   meta_cdist_forward7  s@    








r  c                 C   s   |j d }|j d }|j d }|j d d }|j d d }	tt||	}
|
d d  }|||g t|
}|dks|dks|dks|dkrt|S |t|j kr||}tj	|tj
dS )NrH   r   r   r   )rE   rp   r.   r  r  mathprod
zeros_likerb  rV   r   )r  r  r  r  Zcdistc1r  r  r  r  r_  Ztensor1_expand_sizeZbatch_productr)   r)   r*   meta_cdist_backward[  s    



 

r  c	                    sF  t  jt jt jfk fdd t jt jt jfkfdd t tjfdd d}	|rt |	dkdd  |	d8 }	|	d}
t	d\}}}d k	r"t ||kd	d  t jjkfd
d t j
dkfdd t    k fdd fdddd fdd}tdkr  d}  }||kr |	d}n
 d}n||
|}|||fks|sΈ d}n
d}|	}jd }||kr,|rt |dkdd  |d8 }|jd }n| }|
|||fS )Nc                      s   d j  S )Nz(expected indices to be long or int, got r>   r)   rZ   r)   r*   r9     r:   z$meta_embedding_bag.<locals>.<lambda>c                      s   d j  S )Nz(expected offsets to be long or int, got r>   r)   )offsetsr)   r*   r9     r:   c                      s   d j  S )Nz/expected weight to be floating point type, got r>   r)   )r  r)   r*   r9     r:   r   rm   c                   S   s   dS Nz1include_last_offset: numBags should be at least 1r)   r)   r)   r)   r*   r9     r:   rK   c                   S   s   dS )Nz@embedding_bag: per_sample_weights only supported with mode='sum'r)   r)   r)   r)   r*   r9     r:   c                      s   dj  d j  dS )Nzexpected weight (z) and per_sample_weights (z) to have same dtyper>   r)   )per_sample_weightsr  r)   r*   r9     r:   c                      s   d j  dS )Nz1expected per_sample_weights to be 1D tensor, got r  r  r)   )r  r)   r*   r9     r:   c                      s   d   d    dS )Nz%expected per_sample_weights.numel() (z$ to be the same as indices.numel() (r   r  r)   )rZ   r  r)   r*   r9     s    c                    s    | ||o| ddkS Nr   rm   rs   r   r  r   padding_idx)is_fast_path_index_selectr)   r*   is_fast_path_index_select_scale  s    z;meta_embedding_bag.<locals>.is_fast_path_index_select_scalec                 S   s<   | j tjks| j tjko:| ddko:|ddko:|dk S r   )r5   r.   r1   r/   rs   )r   r   r  r)   r)   r*   r    s    z5meta_embedding_bag.<locals>.is_fast_path_index_selectc                    s&   |d k	r| |||S  | ||S d S r$   r)   r  )r  r  r)   r*   is_fast_path  s    z(meta_embedding_bag.<locals>.is_fast_pathcpuc                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   )r.   r<   r5   rA   r/  r   r  rN   rD   rq   rQ   rC   rY  rE   )r  rZ   r  Zscale_grad_by_freqrH  sparser  Zinclude_last_offsetr  Znum_bagsr   ZMODE_SUMZ	MODE_MEANZMODE_MAXr  
offset2bagbag_sizemax_indicesZfast_path_sumZnumBagsr)   )rZ   r  r  r  r  r  r*   meta_embedding_bagr  s~    












r  c                 G   s@   t | ||f| \}}}}t|dkr4|| }||||fS )Nr  )r  rY  rD   rN   )r  rZ   r  argsr   r  r  r  r)   r)   r*   meta_embedding_bag_forward_only  s      r  c                 C   s.   |r|S | j js| j jr| j S |r(tjS | j S r$   )r5   r   r   r.   rA   )r   r5   promote_int_to_longr)   r)   r*   _get_reduction_dtype  s    r  r>   c                C   s6   t | |dd}t| j|}t| ||}| j||dS )NT)r  r>   )r  r   r   rE   r   rD   )r   r  r   r5   Zoutput_dtyper   r)   r)   r*   meta_nansum  s    r  c                 C   s$   t | jtt|  }| |S r$   )r   r  rE   r;   rq   rJ   rD   )r   r   r)   r)   r*   meta_median  s
     r  c                 C   sL   t | dkrtd t| j|f}t| ||}| || j|tjdfS )NrX  zmedian CUDA with indices outputr>   )	rY  r   alert_not_deterministicr   rE   r   rD   r.   rA   )r   rJ   r   r   r)   r)   r*   meta_median_mode_dim  s    
r  c                 C   s   | S r$   r)   rW   r)   r)   r*   meta_logical_not_  s    r  c                    sd   t t|  kdd  t|   }d| t| j   fddttD }| |S )Nc                   S   s   dS )NzZNumber of dimensions of repeat dims can not be smaller than number of dimensions of tensorr)   r)   r)   r)   r*   r9   "  r:   zmeta_repeat.<locals>.<lambda>rm   c                    s   g | ]} | |  qS r)   r)   r  Zpadded_sizer}  r)   r*   rf   )  s     zmeta_repeat.<locals>.<listcomp>)r.   r<   ro   rJ   r;   rE   rq   rD   )rF   r}  Znum_new_dimensionsZtarget_sizer)   r  r*   meta_repeat  s    r  c                 C   s   | S r$   r)   rW   r)   r)   r*   
meta_zero_-  s    r   c                 C   s   t |tjrt| j|j | S r$   r   r.   r
   r=   rE   r  r)   r)   r*   meta_binop_inplace2  s    r  c                 C   s   t |tjrt| j|j | S r$   r  r  r)   r)   r*   meta_binop_inplace_alphaC  s    	r  c                 K   s   t | tjdS NZtype_promotion)r   r   DEFAULT)rF   kwargsr)   r)   r*   
meta_roundQ  s     r  c                    sj   t tj fdd tt jrJt tj fdd nt tt fdd d S )Nc                      s     dj  S )Nz7: Expected input tensor to have an integral dtype. Got r>   r)   )r  rF   r)   r*   r9   [  r:   z#shift_dtype_check.<locals>.<lambda>c                      s     dj  S )Nz6: Expected shift value to have an integral dtype. Got r>   r)   r  r   r)   r*   r9   `  r:   c                      s     d S )Nz): Expected shift value to be an int. Got r)   r)   r	  r)   r*   r9   e  r:   )r.   r<   r   r4  r5   r   r
   r   r  rF   r   r)   r
  r*   shift_dtype_checkX  s    

r  c                 C   sL   t d| | t| tjd}|  dkrHt|tjrHtj|j	|j
|jdS |S )Nrshiftr  r   r[   r  r   r   r  rJ   r   r.   r
   r]   rE   r\   r5   rF   rP   Zelement_wiser)   r)   r*   meta_rshiftsi  s       r  c                 C   sL   t d| | t| tjd}|  dkrHt|tjrHtj|j	|j
|jdS |S )Nlshiftr  r   r[   r  r  r)   r)   r*   meta_lshiftsw  s       r  c                 C   s   |  | jS r$   r  rW   r)   r)   r*   	meta_zero  s    r  c                 C   s   | S r$   r)   rF   r   r)   r)   r*   
meta_fill_  s    r  c                 C   s
   t | S r$   r  r  r)   r)   r*   	meta_fill  s    r  c                 C   s   | S r$   r)   rW   r)   r)   r*   
meta_relu_  s    r  c                 C   s
   t | S r$   r  rF   rZ   rY   
accumulater)   r)   r*   meta_index_put  s    r  c                 C   s   t | j|j | S r$   )r=   rE   )rF   r  valuer)   r)   r*   meta_masked_fill_  s    r  c                 C   s   | S r$   r)   r  r)   r)   r*   meta_index_put_  s    r  c                 C   s   |  | jS r$   )viewrE   rW   r)   r)   r*   
meta_alias  s    r  c                    s   t |  dkdd  t | dkdd  |  }|  |d |d |d } d }||ft  d ko d k fdd |}|sd k	rt  dkd	d  t  kfd
d |S )NrK   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   z)common_meta_baddbmm_bmm.<locals>.<lambda>c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   r   r   rm   c                	      s&   d d d d  d d  d	S r  r)   r)   r  r)   r*   r9     r:   c                   S   s   dS )Nzself must be a 3D tensorr)   r)   r)   r)   r*   r9     r:   c                      s   d  d   S )Nz*Expected an input tensor shape with shape z but got shape: rM   r)   )rb  self_baddbmmr)   r*   r9     r:   )r.   r<   rJ   rN   rD   )r  r  Zis_bmmr  r  Zres_rowsZres_colsr   r)   )r  r  r  rb  r  r*   common_meta_baddbmm_bmm  s*    


r   c                 C   s   t | |dS )NT)r   )rF   Zmat2r)   r)   r*   meta_bmm  s    r!  c                 C   s<   | | }| | }|dkr8t |dk t |dk kr8|d8 }|S r  )r  )rh   yqrJ  r)   r)   r*   div_rtn  s
     r$  c                 C   sZ   t | | | ||d   d |r(|d nd |d }|rV|d | | | krV|d8 }|S r   )r$  )	inputSize
kernelSizer  r  rs   r  r9  Z
outputSizer)   r)   r*   pooling_output_shape_pad_lr  s*    
	r'  c                    s^   t |dkdd  t dkfdd t  d k fdd t|  |||S )Nr   c                   S   s   dS )Nzstride should not be zeror)   r)   r)   r)   r*   r9     r:   z&pooling_output_shape.<locals>.<lambda>c                      s
   d  S )Nz'pad must be non-negative, but got pad: r)   r)   )padr)   r*   r9     r:   r   c                      s   d d  S )Nz7pad should be at most half of kernel size, but got pad=z and kernel_size=r)   r)   r&  r(  r)   r*   r9     r:   )r.   r<   r'  )r%  r&  r(  rs   r  r9  r)   r)  r*   r7    s    
      r7  c              	      sR     }tdkodkdd  t|dko:|dkdd  t|dkoV|dkdd   ddkoz ddk}|tjkrt|dko|o d	dkd
d  nDt|d	kr̈ ddkr|p|dko|o d	dk fdd td 
kod 	k	
fdd tdko6dkfdd d S )Nr   c                   S   s   dS )NzCkernel size should be greater than zero, but got kH: {kH}, kW: {kW}r)   r)   r)   r)   r*   r9     r:   z$pool2d_shape_check.<locals>.<lambda>c                   S   s   dS )Nz>stride should be greater than zero, but got dH: {dH}, dW: {dW}r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS )Nz\dilation should be greater than zero, but got dilationH: {dilationH}, dilationW: {dilationW}r)   r)   r)   r)   r*   r9     r:   rm   r   r  rK   c                   S   s   dS )NzExpected 4D (batch mode) tensor expected for input with channels_last layout with optional 0 dim batch size for input, but got: {input.size()}r)   r)   r)   r)   r*   r9   %  r:   c                      s   d    S )NzYExpected 3D or 4D (batch mode) tensor with optional 0 dim batch size for input, but got: rM   r)   ro  r)   r*   r9   ,  r:   c                      s   d d d d  S )NzKpad should be smaller than or equal to half of kernel size, but got padW = z	, padH = z, kW = z, kH = r)   r)   )r<  r=  r@  rA  r)   r*   r9   1  r:   c                      s*   d d  d d d d dS NzGiven input size: (rh   z). Calculated output size: (z). Output size is too smallr)   r)   )rC  rD  rB  rI  rE  rF  r)   r*   r9   7  r:   )rJ   r.   r<   rN   r  )r   r<  r=  r>  r?  r@  rA  	dilationH	dilationWrB  rC  rD  rE  rF  r   rQ   Z
valid_dimsr)   )r   rC  rD  r<  r=  rB  rI  rE  rF  r@  rA  r*   r8    sB    

r8  )r   rX  rU  r<  r=  rV  r>  r?  pTpHpW	dilationTr+  r,  rY  rZ  r[  r\  r]  r^  r  rS  c              
      s  	j }tdko dko dkfdd tdkoLdkoL dk fdd tdkoxdkoxdkfdd t|dk	fdd t|D ]8|dkrdkrqt	dk	fd	d q|r"t
ko
ko
k
fd
d td koLd koLd kfdd tdkodkodk
fdd d S )Nr   c                      s   d d  d S )Nz5kernel size should be greater than zero, but got kT: z, kH: z, kW: r)   r)   )r<  rU  r=  r)   r*   r9   Y  s    z$pool3d_shape_check.<locals>.<lambda>c                      s   d d  d S )Nz0stride should be greater than zero, but got dT: z, dH: z, dW: r)   r)   )r>  rV  r?  r)   r*   r9   `  s    c                      s   d d  d S )Nz9dilation should be greater than zero, but got dilationT: z, dilationH: z, dilationW: r)   r)   )r+  r0  r,  r)   r*   r9   g  s    rQ  c                      s     dj  S )Nz/: Expected 4D or 5D tensor for input, but got: r2  r)   )r  r   r)   r*   r9   o  r:   r  c                      s     dj  d dS )NzZ: Expected input's non-batch dimensions to have positive length, but input has a shape of z and non-batch dimension z has length zero!)rE   rN   r)   r  r   r   r)   r*   r9   x  s    c                      s*   d d  d d d d dS )Nzinput image (T: r  r  z ) smaller than kernel size (kT:  kH:  kW: r   r)   r)   )rZ  rY  r[  r<  rU  r=  r)   r*   r9     s    r   c                      s(   d d d  d d d S )NzHpad should be smaller than or equal to half of kernel size, but got kT: r3  r2  z padT: z padW: z padH: r)   r)   )r<  rU  r=  r.  r-  r/  r)   r*   r9     s    rm   c                      s6   d d d  d d d d d dS r*  r)   r)   )rZ  rY  r[  rX  r]  r\  r^  r)   r*   r9     s    )rQ   r.   r<   rq   rN   )r   rX  rU  r<  r=  rV  r>  r?  r-  r.  r/  r0  r+  r,  rY  rZ  r[  r\  r]  r^  r  rS  rQ   r)   )r>  rV  r?  r+  r0  r,  r  r   rZ  r   rY  r[  r<  rU  r=  rX  r]  r\  r^  r.  r-  r/  r*   rT  =  sJ    	&rT  c                 C   s   | j }t| |||||||	|
|||||||||||| t|||d | t|||d | t|||d | t|||d | t|||d | t|||d | t|||d | t|||d | d S )Nr  rK   r   rm   rQ   rT  r(  )r   r  rZ   rX  rU  r<  r=  rV  r>  r?  r-  r.  r/  r0  r+  r,  rY  rZ  r[  r\  r]  r^  r  rQ   r)   r)   r*   max_pool3d_backward_shape_check  s@    r5  )r   r  rX  rU  r<  r=  rV  r>  r?  r-  r.  r/  rY  rZ  r[  r\  r]  r^  r  c                 C   s   | j }t| ||||||||	|
|ddd|||||||d t|||d | t|||d | t|||d | t|||d | d S )Nrm   Tr  rK   r   r4  )r   r  rX  rU  r<  r=  rV  r>  r?  r-  r.  r/  rY  rZ  r[  r\  r]  r^  r  rQ   r)   r)   r*   r`    s:    r`  c                 C   sB  dd }|d|\}}t t|dkdd  t|dkrF|| }	}
n|d|\}	}
|d	|\}}|d
|\}}| d}| d}| d}t| }|t jkrt |  dkdd  n4|t jkrt |  dkdd  nt ddd  t	||||	||}t	||||
||}t
| |||	|
|||||||||| |||fS )Nc                    sD   t t|dk fdd |d }t|dkr4|n|d }||fS )Nr)  c                      s   d  dS )Nzmax_pool2d: r*  r)   r)   r+  r)   r*   r9     r:   zEmax_pool2d_checks_and_compute_shape.<locals>.unpack.<locals>.<lambda>r   rm   r,  r-  r)   r+  r*   r0    s    

z3max_pool2d_checks_and_compute_shape.<locals>.unpackr  r1  c                   S   s   dS )NzOmax_pool2d: stride must either be omitted, a single int, or a tuple of two intsr)   r)   r)   r)   r*   r9     r:   z5max_pool2d_checks_and_compute_shape.<locals>.<lambda>r   rs   r  r  r5  r   rH   r  c                   S   s   dS )NzMnon-empty 4D (batch mode) tensor expected for input with channels_last layoutr)   r)   r)   r)   r*   r9   0  r:   rn  c                   S   s   dS )Nz9non-empty 3D or 4D (batch mode) tensor expected for inputr)   r)   r)   r)   r*   r9   5  r:   Fc                   S   s   dS )Nz?Unsupport memory format. Supports only ChannelsLast, Contiguousr)   r)   r)   r)   r*   r9   :  r:   )r.   r<   ro   rN   r   r  r  rJ   r   r7  r8  )r   r  rs   r  r  r9  r0  r<  r=  r>  r?  r@  rA  r+  r,  rB  rC  rD  r   rE  rF  r)   r)   r*   #max_pool2d_checks_and_compute_shape  sb    	








r6  c                    s   t |||||\}tj jk fdd |jfdd}	|	  |	| t}
tjjjj	|
dS )Nc                      s   dj  d j  S )NzExpected dtype z  for `gradOutput` but got dtype r>   r)   rk  r)   r*   r9   j  r:   z7meta_max_pool2d_with_indices_backward.<locals>.<lambda>c                    s:   t | d   t | d  t | d  d S )NrK   r   rm   )r(  )r   )rI  rQ   rE  rF  r)   r*   _check_dim_sizep  s    z>meta_max_pool2d_with_indices_backward.<locals>._check_dim_sizer6  )
r6  r.   r<   r5   rQ   r   r  r]   rE   r\   )r  rF   r  rs   r  r  r9  rZ   rB  r7  r   r)   )r  rI  rQ   rE  rF  rF   r*   %meta_max_pool2d_with_indices_backwardU  s8         

r8  r  c                 C   s   t | |||||\}}}|  dkr.| dnd}	t| }
|  dkrT|||g}n|	|||g}tj|| j| j|
dtj|tj	| j|
dfS )Nr  r4  rm   rK   r6  )
r6  rJ   rN   r   r  r.   r]   r5   r\   r^   )r   r  rs   r  r  r9  rB  rE  rF  r  r   rN   r)   r)   r*   meta_max_pool2d_with_indices  s<         
r9  c           	         s  t d tjtjkfdd ttdkfdd \}}tjdkfdd tjjkfdd t	d	jD ]$ t
 d
k fdd q }jdkr|
d
}||||f}n&|
d
}|
d	}|||||f}|S )NZmax_unpooling2d_forward_outc                      s   d j  S )Nz2elements in indices should be type int64 but got: r>   r)   r  r)   r*   r9     r:   z#meta_max_unpool2d.<locals>.<lambda>r   c                      s   dt   dS )NzMThere should be exactly two elements (height, width) in output_size, but got 
 elements.r  r)   rb  r)   r*   r9     s    rn  c                      s   d j  dS )NzLInput to max_unpooling2d should be a 3d or 4d Tensor, but got a tensor with  dimensions.r  r)   )self_r)   r*   r9     s    c                      s   dj  d j  S NzBExpected shape of indices to be same as that of the input tensor (z%) but got indices tensor with shape: r2  r)   )rZ   r=  r)   r*   r9     s    rm   r   c                      s   dj  d  dS )NzZmax_unpooling2d(): Expected input to have non-zero size for non-batch dimensions, but got re   being empty.r2  r)   )r   r=  r)   r*   r9     s    rK   )r   r  r.   r<   r5   r^   ro   rQ   rE   rq   rN   ra   rD   )	r=  rZ   rb  r]  r^  rF   	nchannelsr   r  r)   )r   rZ   rb  r=  r*   meta_max_unpool2d  s>    






	



rA  c                    s  t jt jkdd  t jdkfdd t tdkfdd t tdkfdd t tdkfdd t jjkfd	d td
jD ]&t dk fdd qt d dkod
 dkod dkfdd d S )Nc                   S   s   dS )Nz(elements in indices should be type int64r)   r)   r)   r)   r*   r9     r:   z._max_unpooling3d_shape_check.<locals>.<lambda>rQ  c                      s   d j  dS )NzLInput to max_unpooling3d should be a 4d or 5d Tensor, but got a tensor with r<  r  r)   ro  r)   r*   r9     r:   rK   c                      s   dt   dS )NzVThere should be exactly three elements (depth, height, width) in output_size, but got r:  r  r)   r;  r)   r*   r9     s    c                      s   dt   dS )NzRThere should be exactly three elements (depth, height, width) in stride, but got: r:  r  r)   r  r)   r*   r9     r:   c                      s   dt   dS )NzSThere should be exactly three elements (depth, height, width) in padding, but got: r:  r  r)   )r  r)   r*   r9     r:   c                      s   dj  d j  S r>  r2  r)   )rZ   r   r)   r*   r9     s    rm   r   c                      s     dj  d dS )NzI: Expected input to have non-zero size for non-batch dimensions, but got re  r?  r2  r)   r1  r)   r*   r9     s    r   c                      s
   d  S )Nz5strides should be greater than zero, but got stride: r)   r)   r  r)   r*   r9     r:   )	r.   r<   r5   r^   rQ   ro   rE   rq   rN   )r   rZ   rb  rs   r  r  r)   )r  r   rZ   r   rb  r  rs   r*   _max_unpooling3d_shape_check  sB    
 







	"
rB  c                 C   s   t d t| ||||d |  }|\}}}| jdkrV|d}	||	|||f}
n(|d}|d}	|||	|||f}
|
S )NZmax_unpooling3d_forward_outzmax_unpooling3d()r  r   rm   )r   r  rB  ra   rQ   rN   rD   )r=  rZ   rb  rs   r  rF   Zodepthr]  r^  r@  r   r  r)   r)   r*   meta_max_unpool3d  s$    
     




rC  c                 C   s  t t|dkdd  |d }t|dkr0|n|d }t|dkrH|n|d }t | pdt|dkdd  |sv|n|d }	|s|nt|dkr|	n|d }
|s|nt|dkr|	n|d }t t|dkdd  |d }t|dkr|n|d }t|dkr|n|d }t t|dkd	d  |d }t|dkrB|n|d }t|dkr\|n|d }t | jd
kdd  | jdkr| dnd}| d}| d}| d}| d}t||||	||}t||||
||}t||||||}t| |||||	|
|||||||||||||d | jdko<t| t j	k}| jdkr|| 
d}|  ol|jt j	d}||||f}n|||||f}| |}| j|t jd}|r|jt j	d}|jt j	d}||fS )NrM  c                   S   s   dS NzMmax_pool3d: kernel_size must either be a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   /  r:   z.meta_max_pool3d_with_indices.<locals>.<lambda>r   rm   r   c                   S   s   dS NzQmax_pool3d: stride must either be omitted, a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   7  r:   c                   S   s   dS NzImax_pool3d: padding must either be a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   ?  r:   c                   S   s   dS NzJmax_pool3d: dilation must be either a single int, or a tuple of three intsr)   r)   r)   r)   r*   r9   G  r:   rQ  c                   S   s   dS rR  r)   r)   r)   r)   r*   r9   O  r:   r  r4  r5  r   rH   zmax_pool3d_with_indices()r  r   r>   )r.   r<   ro   rQ   rN   r7  rT  r   r  channels_last_3drj  rr  rD   r^   r   )r   r  rs   r  r  r9  rU  r<  r=  rV  r>  r?  r-  r.  r/  r0  r+  r,  r  rX  rY  rZ  r[  r\  r]  r^  r  input_channels_last_checkrR   ry   rZ   r)   r)   r*   meta_max_pool3d_with_indices#  s    

  







rK  c                 C   sd  t t|dkdd  |d }t|dkr0|n|d }	t|dkrH|n|d }
t | pdt|dkdd  |sv|n|d }|s|	nt|dkr|n|d }|s|
nt|dkr|n|d }t t|dkdd  |d }t|dkr|n|d }t|dkr|n|d }t t|dkd	d  |d }t|dkrB|n|d }t|dkr\|n|d }t |jd
kdd  |d}|d}|d}|d}| d}| d}| d}t|| ||||	|
|||||||||||||||d |jdkot|t jk}|jdkr@|	d}|
  o>|j
t jd}||j}|r`|jt jd}|S )NrM  c                   S   s   dS rD  r)   r)   r)   r)   r*   r9     r:   z7meta_max_pool3d_with_indices_backward.<locals>.<lambda>r   rm   r   c                   S   s   dS rE  r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS rF  r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS rG  r)   r)   r)   r)   r*   r9     r:   rQ  c                   S   s   dS rR  r)   r)   r)   r)   r*   r9     r:   r4  r5  r   rH   z"max_pool3d_with_indices_backward()r  r  r   )r.   r<   ro   rQ   rN   r5  r   r  rI  rj  rr  rD   rE   r   )r  r   r  rs   r  r  r9  rZ   rU  r<  r=  rV  r>  r?  r-  r.  r/  r0  r+  r,  rX  rY  rZ  r[  r\  r]  r^  r  rJ  
grad_inputr)   r)   r*   %meta_max_pool3d_with_indices_backward  s    
  









rM  r   gridc                    s   t j jk fdd t jt jko8 jt jk fdd t jd  jd k fdd t  jd jd k fdd tdjD ]$t j dkfd	d qd S )
Nc                      s   dj  d j  S )NzNgrid_sampler(): expected input and grid to be on same device, but input is on z and grid is on r   r)   rO  r   r)   r*   r9     s    z+check_grid_sampler_common.<locals>.<lambda>c                      s   dj  d j  S )NzTgrid_sampler(): expected input and grid to have torch.strided layout, but input has z and grid has )r   r)   rP  r)   r*   r9     s    r   c                      s   dj  d j  S )NzZgrid_sampler(): expected grid and input to have same batch size, but got input with sizes  and grid with sizes r2  r)   rP  r)   r*   r9     s    rH   r   c                      s   dj d  d j S )Nz+grid_sampler(): expected grid to have size r   z, in last dimension, but got grid with sizes )rQ   rE   r)   rP  r)   r*   r9     s    c                      s   dj  d  dS )NzYgrid_sampler(): expected input to have non-empty spatial dimensions, but input has sizes re  rf  r2  r)   rp  r)   r*   r9     s    )r.   r<   r\   r   ry  rE   rQ   rq   rN  r)   )rO  r   r   r*   check_grid_sampler_common  s*    
rR  c                   @   s   e Zd ZdZdZdZdS )GridSamplerInterpolationr   rm   r   N)__name__
__module____qualname__ZBILINEARZNEARESTBICUBICr)   r)   r)   r*   rS    s   rS  r   rO  interpolation_modec                    sP   t jdkoj jk fdd t jdko@|tjjk dd  d S )Nr  c                      s   dj  d j  S )Nzdgrid_sampler(): expected 5D input and grid with same number of dimensions, but got input with sizes rQ  r2  r)   rP  r)   r*   r9   $  s    z'check_grid_sampler_3d.<locals>.<lambda>c                   S   s   dS )Nz<grid_sampler(): bicubic interpolation only supports 4D inputr)   r)   r)   r)   r*   r9   /  r:   )r.   r<   rQ   rS  rW  r  rX  r)   rP  r*   check_grid_sampler_3d!  s    

rZ  c           
      C   s:   |d }|rt j|t jd}nd }t j|t jd}	||	fS Nr   r   )r.   r  r   rV   
r  r   rO  rY  padding_modealign_cornersr  Zinput_requires_gradrL  	grad_gridr)   r)   r*   grid_sampler_2d_backward_meta3  s    
r`  c           
      C   s\   t | | t| || | jd }| jd }|jd }|jd }|jd }	| |||||	fS )Nr   rm   r   rK   )rR  rZ  rE   rD   )
r   rO  rY  r]  r^  r  CZout_DZout_HZout_Wr)   r)   r*   grid_sampler_3dF  s    	





rb  rL  r_  c           
      C   sP   t || t||| |d }|r4tj|tjd}nd }tj|tjd}	||	fS r[  )rR  rZ  r.   r  r  rV   r\  r)   r)   r*   grid_sampler_3d_backwardY  s    
 rc  c                 O   s4   | dd }|st|}||d< tj| f||S )Nr5   )r4   r   Z	get_dtyper.   r]   )rN   r  r  r  r5   r)   r)   r*   fullq  s
    
rd  c                 C   s   |t jkrt |d kdd  t jd|d kr2| jn|||d krD| jn||d}| jrp||  | 	 | 
  n||  |  d |d |S tjj| |||||d}|d |S )Nc                   S   s   dS )Nz9memory format option is only supported by strided tensorsr)   r)   r)   r)   r*   r9     r:   zzeros_like.<locals>.<lambda>r   r   Tr   )r.   Z
sparse_coor<   r]   r5   r\   	is_sparseZsparse_resize_and_clear_rN   
sparse_dim	dense_dimrJ   Z_coalesced_r"   rV   r   fill_)rF   r5   r   r\   r   r   rn  r)   r)   r*   r  {  s>    	
  
	
r  c                    s     }t|dkdd   dkr( n |   }t |kpN|k  fdd dkrnn| t }t } |    }| = | = |||S )Nr   c                   S   s   dS )Nz-select() cannot be applied to a 0-dim tensor.r)   r)   r)   r)   r*   r9     r:   zmeta_select.<locals>.<lambda>c                      s   d d   d  S )Nzselect(): index z! out of range for tensor of size z at dimension rM   r)   rJ   r@   rF   r)   r*   r9     r:   )rJ   r.   rB   rN   rp   rs   rx   rw   )rF   rJ   r@   rQ   rN   new_sizer   Znew_storage_offsetr)   ri  r*   meta_select  s$    
rk  c                 C   s
   t | S r$   r   r  )rF   r   rJ   r@   r)   r)   r*   meta_select_scatter  s    rm  c                 C   s
   t | S r$   rl  )rF   r   rJ   startendstepr)   r)   r*   meta_slice_scatter  s    rq  )rJ   dim_post_exprwrap_scalarc                 C   sb   |dkr|st d}| }|d }| |k s2| |krNt d|  d| d| d| dk r^| |7 } | S )Nr   rm   zdim z out of bounds (r  r   )r   )rJ   rr  rs  r   r   r)   r)   r*   r_     s    ,r_   c                 C   s   |   dkrdS | j| S r  r%  )r   rJ   r)   r)   r*   ensure_nonempty_size  s    rt  c                    st   t  d}t  d}t||kdd  t|D ]6 kr8tttk fdd q8d S )Nrm   c                   S   s   dS )NzDIndex tensor must have the same number of dimensions as input tensorr)   r)   r)   r)   r*   r9     r:   z$gather_shape_check.<locals>.<lambda>c                      s$   d dj  dj  d   S )Nz!Size does not match at dimension z expected index  to be smaller than self  apart from dimension r2  r)   rJ   r   r@   rF   r)   r*   r9     s   )r   rJ   r.   r<   rq   rt  )rF   rJ   r@   	self_dimsZ
index_dimsr)   rw  r*   gather_shape_check  s    ry  c                    sR   t ||  }  dk}|sFt jtjk fdd t| |  |  j	S )Nr   c                      s   d j  S )Nz2gather(): Expected dtype int64 for index, but got r>   r)   r?   r)   r*   r9     r:   zmeta_gather.<locals>.<lambda>)
r_   rJ   rC   r.   r<   r5   rA   ry  rD   rE   )rF   rJ   r@   Zsparse_gradwrapped_dimZis_index_emptyr)   r?   r*   meta_gather  s    

r{  c                 C   s   |rT| dkrdS | dkrdS | dkr(dS | dkr4dS | d	kr@d
S t ddd  d S | dkr`dS | dkrldS t ddd  d S d S )NsumZ
REDUCE_ADDr  ZREDUCE_MULTIPLYZmeanZREDUCE_MEANZamaxZREDUCE_MAXIMUMZaminZREDUCE_MINIMUMFc                   S   s   dS )Nz=reduce argument must be either sum, prod, mean, amax or amin.r)   r)   r)   r)   r*   r9     r:   z#get_operator_enum.<locals>.<lambda>addmultiplyc                   S   s   dS )Nz/reduce argument must be either add or multiply.r)   r)   r)   r)   r*   r9     r:   rL  )reduce_use_new_optionsr)   r)   r*   get_operator_enum  s,    r  c                    sP   |  dkr(t|jtjk fdd |d k	rLt|j|jk fdd d S )Nr   c                      s
     dS )Nz"(): Expected dtype int64 for indexr)   r)   method_namer)   r*   r9     r:   z,scatter_gather_dtype_check.<locals>.<lambda>c                      s
     dS )Nz0(): Expected self.dtype to be equal to src.dtyper)   r)   r  r)   r*   r9   $  r:   )rC   r.   r<   r5   rA   )r  rF   r@   src_optr)   r  r*   scatter_gather_dtype_check  s    



r  c                 C   s
   t | dS r   )r   rI   r)   r)   r*   ensure_nonempty_dim(  s    r  c                    s     dkrd S tt t kdd  d}t }t|D ].}t|}| krdqL|t|krLd} q|qL|sd k	rt|D ]$}t|}|t|krd} qqd k	rtt t kdd  t|  fdd nt|  fdd d S )	Nr   c                   S   s   dS NzCIndex tensor must have the same number of dimensions as self tensorr)   r)   r)   r)   r*   r9   2  r:   z%scatter_shape_check.<locals>.<lambda>FTc                   S   s   dS r  r)   r)   r)   r)   r*   r9   L  r:   c                      s&   dj  dj  d  dj   S )NExpected index ru  rv  z and to be smaller than src r2  r)   rJ   r@   rF   r  r)   r*   r9   P  s   c                      s   dj  dj  d   S )Nr  ru  rv  r2  r)   ri  r)   r*   r9   V  s   )rC   r.   r<   r  rJ   rq   rt  )rF   rJ   r@   r  Zis_wrong_shaperx  r}   Zindex_d_sizer)   r  r*   scatter_shape_check-  sD    


r  c                 C   s@   t ||  }td| || t| ||| |d k	r<t|| d S )Nscatter)r_   rJ   r  r  r  )rF   rJ   r@   r   r  r  rz  r)   r)   r*   scatter_meta_impl\  s
    r  c                 C   s   t | |||d | | jS Nr}  r  rD   rE   rF   rJ   r@   r   r)   r)   r*   meta_scatter_adde  s    r  c                 C   s   t | |||d | S r  r  r  r)   r)   r*   meta_scatter_add_k  s    r  c                 C   s0   t |tjr|nd }t| |||| | | jS r$   )r   r.   r
   r  rD   rE   rF   rJ   r@   Zsrc_or_valuer   r   r)   r)   r*   meta_scatterq  s    
r  c                 C   s(   t |tjr|nd }t| |||| | S r$   )r   r.   r
   r  r  r)   r)   r*   meta_scatter_  s    	r          )queryrk   r  	dropout_p	is_causalreturn_debug_maskr  c                 C   s
  |  d}|  d}|  d}	|  d}
| d}||	 }| dd}||||
}tj|| jd}|||	||
dd}t| dkr
tj||	|ftj	| jddd}||tjdtj
d	dtjdtj
d	dddtjdtjd	dtjdtjd	dtjd| j| jdf	S t|	d
 d
 }tj|||ftj	| jd}tj|d tj
d	d}tj|d tj
d	d}|r|
dkrvdnd}t|	| }|dkrd}n|dkrd}tj||||f| j| jd}ntjd| j| jd}|||||	|tjdtjd	dtjdtjd	d|f	S )Nr   rm   r   rK   r   r  r5   r\   r)   r      @         )rN   r  rv   r.   rV   r\   r  rY  r]   r1   r  rA   r5   r  ceil)r  rk   r  r  r  r  r  r   	num_headsZmax_seqlen_batch_qhead_dimZmax_seqlen_batch_kZNnz_qZquery_tZquery_reshapedZ	attention	logsumexpZmax_seqlen_qZcumulative_sequence_length_qZcumulative_sequence_length_kZblocksize_cZmax_seqlen_kZ
debug_maskr)   r)   r*   meta__scaled_dot_product_flash  s    




     
    


r  )rg  r  rk   r  ry   r  	cum_seq_q	cum_seq_kmax_qmax_kr  r  philox_seedphilox_offsetr  c                 C   s   | d}| d}| d}t|dkr4| dn|}t|dkrN| dn|	}tj||||fd|j|jd}tj||||fd|j|jd}tj||||fd|j|jd}|||fS )Nr   rm   rK   r  r   r   r   rm   rK   r  )rN   rY  r.   empty_permutedr5   r\   )rg  r  rk   r  ry   r  r  r  r  r  r  r  r  r  r  r   r  r  len_qZlen_kgrad_qgrad_kgrad_vr)   r)   r*   'meta__scaled_dot_product_flash_backward  s0    





r  )r  rk   r  	attn_biascompute_log_sumexpr  r  c                 C   s   |  dd} | dd}| dd}| d}| d}	|d}
| d}| d}|d}tj||	||| j| jd}|rt|	d d nd}tj|||ftj| jd}| dd}tjdtj	d	d}tjdtj	d	d}||||fS )
Nrm   r   r   r   rH   r      r)   r   )
r  rN   r.   r]   r5   r\   r  r  r1   rA   )r  rk   r  r  r  r  r  r  r   Mr  r  KZKvrn  Zlogsumexp_dimZ
logsum_expseedoffsetr)   r)   r*   "meta__scaled_dot_product_efficient   s(    





r  )rg  r  rk   r  r  ry   r  r  r  r  grad_input_maskr  r  c                 C   s   | d}| d}| d}| d}| d}tj||||fd|j|jd}tj||||fd|j|jd}tj||||fd|j|jd}d }|d k	r|
d rtj|  | |j|jd}||||fS )Nr   rm   r   rK   r  r  )rN   r.   r  r5   r\   r'  rs   )rg  r  rk   r  r  ry   r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  	grad_biasr)   r)   r*   +meta__scaled_dot_product_efficient_backwardL  s@    







r  c                 C   s    t | ||||dd | | jS NT)r  r  rF   rJ   r@   r   r   r   r)   r)   r*   meta_scatter_reduce_two  s    r  c                 C   s   t | ||||dd | S r  r  r  r)   r)   r*   meta_scatter_reduce__two  s    r  c                   sh   t d    k odkn   fdd   dkrLt j|t j jdS t j d|t j jdS )Nr   r   c                      s   d    S )Nz@The probabilty distributions dimensions must be 1 or 2, but got rI   r)   ro  r)   r*   r9     r:   z"meta_multinomial.<locals>.<lambda>rm   r  )r.   r<   rJ   r]   rA   r\   rN   )r   Znum_samplesreplacementr   r)   ro  r*   meta_multinomial  s    
   r  c                 C   s   d}| D ]}||9 }q|S r   r)   )vsrJ  vr)   r)   r*   multiply_integers  s    
r  c                    s   t tkfdd d  t t k fdd t tdd dd  D ortdd D fdd d d \}}||fS )Nc                      s   d  dt  S )Nz%It is expected output_size equals to , but got size r  r)   )num_spatial_dimsrb  r)   r*   r9     r:   z'upsample_common_check.<locals>.<lambda>r   c                      s   d  dt  S )Nz$It is expected input_size equals to r  r  r)   )expected_input_dimsrK  r)   r*   r9     r:   c                 s   s   | ]}|d kV  qdS r   Nr)   r  r)   r)   r*   rg    s     z(upsample_common_check.<locals>.<genexpr>c                      s   d  d S )NzDInput and output sizes should be greater than 0, but got input size z and output size r)   r)   )rK  rb  r)   r*   r9     r:   )r.   r<   ro   rk  )rK  rb  r  r  Zchannelsr)   )r  rK  r  rb  r*   upsample_common_check  s    

*r  c                    sZ   t   dkp"t  dd   fdd t  |dd} |jt	 dS )Nr   rm   c                      s   d    S )Nz>Non-empty 3D data tensor expected but got a tensor with sizes rM   r)   ro  r)   r*   r9     r:   z$upsample_nearest1d.<locals>.<lambda>r  r   
r.   r<   rC   r  rN   r  rD   r   r   r  )r   rb  scalesfull_output_sizer)   ro  r*   upsample_nearest1d  s    
  
r  c           	         s   t   dkp"t  dd   fdd t  |dd} |}t } j	\}}}} j
jdkr~|dk r~t j}|j|d	}|S )
Nr   rm   c                      s   d    S Nz>Non-empty 4D data tensor expected but got a tensor with sizes rM   r)   ro  r)   r*   r9     r:   z$upsample_nearest2d.<locals>.<lambda>r   r  rX  r  r   )r.   r<   rC   r  rN   r  rD   r   r  rE   r\   r  r   ra   )	r   rb  scales_hscales_wr  r   r   re   Z
n_channelsr)   ro  r*   upsample_nearest2d  s     
  

r  r  rb  rK  r  r  c                    st   t ||dd tjdkfdd tdD ]*t  k fdd q0|jt	dS )Nr   r  r  c                      s   d j  S )NzFExpected grad_output to be a tensor of dimension 4 but got: dimension r  r)   rv  r)   r*   r9     r:   z-upsample_nearest2d_backward.<locals>.<lambda>c                
      s&   d d   d d  S )NzCExpected grad_output to have the same shape as output; output.size(z) = z but got grad_output.size(rM   r)   r  r  r   r)   r*   r9     s    r   )
r  r.   r<   rQ   rq   rN   rD   r   r   r  r  r)   r  r*   upsample_nearest2d_backward  s"      
	
r  c                    sZ   t   dkp"t  dd   fdd t  |dd} |jt	 dS )Nr   rm   c                      s   d    S )Nz>Non-empty 5D data tensor expected but got a tensor with sizes rM   r)   ro  r)   r*   r9     r:   z$upsample_nearest3d.<locals>.<lambda>rK   r  r   r  )r   rb  Zscales_dr  r  r  r)   ro  r*   upsample_nearest3d   s    
  
r  c           
      C   s   t | t j| t jd }}|d k	r|d k	rt|ts:tt|tsHt|j}| }	t||}t||}|	||	 |	||	 t
||d t
||d ||fS ||fS )Nr>   )rh  ri  )r.   rV   r^   r   r   r   rE   rs   r   r   r   )
rF   stablerJ   
descendingrY   rZ   r  r   rR   Z
out_strider)   r)   r*   	meta_sort  s    	

r  )rJ   r  c                C   s   t | |||dd S )N)r  rJ   r  rm   )r  )rF   r  rJ   r  r)   r)   r*   meta_argsort)  s    r  c                    s  t jdkfdd t jjkfdd dd k	rt jdkfdd t  kfdd t jjkfdd t jdkfd	d d
   t   k fdd t tfddfD dd  d S )Nr   c                      s    j  dS Nz != 2r  r)   input_gatesr)   r*   r9   1  r:   z%rnn_cell_checkSizes.<locals>.<lambda>c                      s   j  d j  S N != r2  r)   )hidden_gatesr  r)   r*   r9   4  r:   rm   c                      s    j  dS )Nz != 1r  r)   )
input_biasr)   r*   r9   8  r:   c                      s      d  S r  r  r)   )
gates_sizer  r)   r*   r9   ;  r:   c                      s   j  d j  S r  r2  r)   )hidden_biasr  r)   r*   r9   ?  r:   c                      s    j  dS r  r  r)   )prev_hiddenr)   r*   r9   A  r:   r   c                
      s,      dd d d d  d
S )Nr  r   z * z // z (aka r   )rC   rN   r)   )expected_prev_hidden_numelfactorr  r  r  r)   r*   r9   E  r:   c                 3   s   | ]}|j  j kV  qd S r$   r   rf  r  r)   r*   rg  H  s   z&rnn_cell_checkSizes.<locals>.<genexpr>c                   S   s   dS )Nz%expected all inputs to be same devicer)   r)   r)   r)   r*   r9   L  r:   )r.   r<   rQ   rE   rN   rC   rk  )r  r  r  r  r  r  r)   )r  r  r  r  r  r  r  r  r*   rnn_cell_checkSizes.  s8    





r  c                 C   sL   t | |||d| tj| tjd}tj|tjd}tj|tjd}|||fS )Nr  r   )r  r.   rV   r   )r  r  cxr  r  	workspacehycyr)   r)   r*   _thnn_fused_lstm_cell_metaP  s
    r  c                 C   s*  t |dk}|r,t |}|d }| jd }n4|
r:| jd n| jd }|
rR| jd n| jd }d}|rhdnd}|dkrx|n|}|r||| g}n |
r|||| gn|||| g}| |}|	| ||g}|d krtjd| jd}n
||}||	| ||g}|rdnd}| j|tjd}|||||fS )Nr   rm   rH   r   r   r>   )ro   rE   rD   r.   r]   r\   uint8)r   r  Zweight_stride0Z
weight_bufhxr  rH  hidden_sizeZ	proj_size
num_layersbatch_firstZdropouttrainbidirectionalbatch_sizesZdropout_stateZis_input_packed
seq_length
mini_batchZbatch_sizes_sumZnum_directionsZout_sizerR   r   Z
cell_shaper  r  Zreserve_shapeZreserver)   r)   r*   
_cudnn_rnn[  s2    

r  c                 C   s   |r| j d n| j d }|r&| j d n| j d }|
}|rB|||gn|||g}| |}|d krptjd| jd}n||j }|d krtjd| jd}n||j }tjd| jtjd}||||fS )Nrm   r   r   r[   )rE   rD   r.   r]   r\   r  )r   Zw0Zw1Zw2Zw3hx_Zcx_rl   r  rH  r  r  
has_biasesr  r  r  r  r  Zoutput_chanelsrR   r   r  r  r  r)   r)   r*   mkldnn_rnn_layer  s     
r  c                    sR   | j dkr.t dkp dk fdd n t|  dk fdd d S )Nr   rH   c                      s    d  S )Nz4: Expected reduction dim -1 or 0 for scalar but got r)   r)   rJ   r  r)   r*   r9     r:   z'zero_numel_check_dims.<locals>.<lambda>c                      s    d  dS )Nz: Expected reduction dim z to have non-zero size.r)   r)   r  r)   r*   r9     r:   )rQ   r.   rB   rN   )rF   rJ   r  r)   r  r*   zero_numel_check_dims  s    
r  c                    sD   |d k	r$t || }t||  nt| dk fdd d S )Nr   c                      s
     dS )Nz@: Expected reduction dim to be specified for input.numel() == 0.r)   r)   r+  r)   r*   r9     r:   z%check_argmax_argmin.<locals>.<lambda>)r_   rJ   r  r.   r<   rC   )r   rF   rJ   r)   r+  r*   check_argmax_argmin  s    

r  c                 C   sD   t d| | t| j|d k	r"|fnd }t| ||}| j|tjdS )Nargmaxr>   )r  r   r   rE   r   rD   r.   r^   )rF   rJ   r   r  rE   r)   r)   r*   argmax_argmin_meta  s    r   c                 C   s   t jd||||dS )Nr)   r   r   )r  r5   r   r\   r   r)   r)   r*   scalar_tensor  s        r  c                 C   s   t ||  dd}t|dko:||  dkr6| |ndkdd  |  dkrTdn| |}t|dkop||kdd  t| j}t|dkr|||< | || j|tj	dfS )	NT)rs  r   rm   c                   S   s   dS )Nzselected index k out of ranger)   r)   r)   r)   r*   r9     r:   ztopk_meta.<locals>.<lambda>c                   S   s   dS )Nzk not in range for dimensionr)   r)   r)   r)   r*   r9     r:   r>   )
r_   rJ   r.   r<   rN   rp   rE   ro   rD   r^   )rF   r<  rJ   largestsortedZ	sliceSizeZtopKSizer)   r)   r*   	topk_meta  s    $
r  c                 C   s   | d k	r| n|}t | dkdd  | }| d k	rPt |  |kdd  |d k	rpt | |kdd  t | |kdd  t | |kdd  t | dkdd  t | |d	 |d
  d kdd  d S )Nr   c                   S   s   dS N r)   r)   r)   r)   r*   r9     r:   z(checkLSTMBackwardSizes.<locals>.<lambda>c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS r  r)   r)   r)   r)   r*   r9      r:   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   r   rm   r  c                   S   s   dS r  r)   r)   r)   r)   r*   r9     r:   )r.   r<   rJ   rN   rC   )grad_hygrad_cyr  r  r  Zdefined_gradZexp_sizer)   r)   r*   checkLSTMBackwardSizes  s    r	  c           	      C   s`   | d kr|d krdS t | |||| tj|td}tj|td}|rR|jdddnd }|||fS )N)NNNr   r   F)r   )r	  r.   rV   legacy_contiguous_memory_formatr|  )	r  r  r  r  r  Zhas_biasZ
grad_gatesZgrad_cxr  r)   r)   r*   #_thnn_fused_lstm_cell_backward_impl  s     r  c                    s   t jdkr$jd ||  dks:tdj d| dd   fdd	}jd ||  }jd
 | }jd | }jd d |||f}|}|j| d}|S )Nr   r5  r   z'Invalid input shape for pixel_shuffle: z with upscale_factor = c                 S   s   t j| t jkS r$   r  r  r)   r)   r*   r    s    z,meta_pixel_shuffle.<locals>.is_channels_lastc                      sN    r"t dkrtjS tjS n(jtjdr6tjS jtjdrJtjS d S r	  )rY  r.   r   r  rr  r
  r)   r  rF   r)   r*   r    s    z.meta_pixel_shuffle.<locals>.pick_memory_formatr   rH   r   )ro   rE   r   rD   r   )rF   Zupscale_factorr  ra  ZHrZWrrR   ry   r)   r  r*   meta_pixel_shuffle  s    
r  c                 C   sZ   |  | j}| |j}| |j}| |j}| |j}| |j}|||||||fS r$   r  )r   Zweight0Zweight1Zweight2Zweight3r  Zcx_tmpr   Zhy_Zcy_Zgrad_output_r_optZgrad_hy_r_optZgrad_cy_r_optrl   rH  r  r  r  r  r  r  r  r  Zdiff_xZdiff_hxZdiff_cxZdiff_w1Zdiff_w2Zdiff_br)   r)   r*   mkldnn_rnn_layer_backward2  s    r  )	out_int32r   c                C   s   t j| |rt jnt jd S r   )r.   rV   r  r^   ra   )rF   Z
boundariesr  r   r)   r)   r*   meta_bucketizeU  s     r  c                    sd   t   |dd}t  dkp>tdd   dd  D  fdd  |jt	 d	S )
Nr   r  r   c                 s   s   | ]}|d kV  qdS r  r)   )rd   rN   r)   r)   r*   rg  e  s     z.meta_upsample_bilinear2d_aa.<locals>.<genexpr>rm   c                      s   d    S r  rM   r)   ro  r)   r*   r9   f  r:   z-meta_upsample_bilinear2d_aa.<locals>.<lambda>r   )
r  rN   r.   r<   rC   rk  rD   r   r   r  )r   rb  r^  r  r  r  r)   ro  r*   meta_upsample_bilinear2d_aa]  s      (

r  c                 C   s\   t | dkdd  t | dkdd  t |jjdd  t |jjdd  d S )Nrm   c                   S   s   dS )Nz%found_inf must be a 1-element tensor.r)   r)   r)   r)   r*   r9   q  r:   z<_amp_foreach_non_finite_check_and_unscale_.<locals>.<lambda>c                   S   s   dS )Nz%inv_scale must be a 1-element tensor.r)   r)   r)   r)   r*   r9   t  r:   c                   S   s   dS )Nz!found_inf must be a float tensor.r)   r)   r)   r)   r*   r9   x  r:   c                   S   s   dS )Nz!inv_scale must be a float tensor.r)   r)   r)   r)   r*   r9   |  r:   )r.   r<   rC   r5   r   )rF   r  Z	inv_scaler)   r)   r*   *_amp_foreach_non_finite_check_and_unscale_n  s     
 
 r  c                 C   s   t |  }| |S r$   )rp   rN   rD   )rF   nanZposinfZneginfr   r)   r)   r*   
nan_to_num  s    r  c                 C   s   | j tjtjtjtjhks,td| j  d| j}t||}t||}||krR| S t	| 
 }t	|  }|| ||  ||< ||< || ||  ||< ||< | || | S )Nz>torch.transpose_: in-place transposition is not supported for z layout)r   r.   rz  Z
sparse_cscr{  Z
sparse_bscr   rQ   r_   rp   rN   rs   r   )rF   Zdim0r  ndimsrN   rs   r)   r)   r*   rt    s&    

rt  c                 C   sx   | j }| jrD|  }|  }|dkr,|dks`td| d| dn|  dks`td| dt| d|dk rrdndS )	Nr   r   zEt_ expects a tensor with <= 2 sparse and 0 dense dimensions, but got z sparse and z dense dimensionsz6t_ expects a tensor with <= 2 dimensions, but self is r  rm   )rQ   re  rf  rg  r   rJ   rt  )rF   r  rf  rg  r)   r)   r*   t_  s    

r  )r  r   sidesorterc                C   sD   |r
t jnt j}t|t jr.t j||d S t jd|| jdS d S )Nr>   r)   r  )	r.   r  r^   r   r
   rV   ra   r]   r\   )Zsorted_sequencerF   r  r   r  r  r5   r)   r)   r*   meta_searchsorted  s    r  )r   rF   r   c                 C   s4   t | dkdd  t|tjd\}}t j||dS )Nr   c                   S   s   dS )Nz,polygamma(n, x) does not support negative n.r)   r)   r)   r)   r*   r9     r:   z meta_polygamma.<locals>.<lambda>r   r>   )r.   r<   r   r   r   rV   )r   rF   re   r   r)   r)   r*   meta_polygamma  s    
r  c                 C   s   t | t dd }|S )Nc                 S   s   t | tjdS r  )r   r   r   rg   r)   r)   r*   _f  s     z)_create_unary_float_meta_func.<locals>._fr-   r   funcr  r)   r)   r*   _create_unary_float_meta_func  s    r  c                 C   s   t | t dd }|S )Nc                 S   s   t | |\} }t| |tjdS r  )r   r   r   r   )rh   r"  r)   r)   r*   r    s      z*_create_binary_float_meta_func.<locals>._fr  r  r)   r)   r*   _create_binary_float_meta_func  s    r   c                  C   s
  i } dD ]*}t | }|D ]}|| kr|| | |< qq|  D ]\}}t|tsRt|tjjj	| tj
| dr|t d krt| dq<|jrq<| dkrq<d| krt|| q<d| krt|| q<d| krt|| q<t|| q<d S )	N)r   Zpost_autogradZpre_autogradZCompositeImplicitAutogradr   z is a CompositeImplicitAutograd op, we shouldn't register meta function for it. Instead, we should let the decomposition run and write meta kernels for the base operators.>   aten::_to_copyaten::copy_aten::cloneaten::as_strided_scatteraten::rot90aten::empty_stridedaten::constant_pad_ndzmkldnn::zmkl::zonednn::)r   itemsr   r   r   Zpy_implr.   _CZDispatchKeyr#   Z%_dispatch_has_kernel_for_dispatch_keyr   r  Zis_view2_meta_lib_dont_use_me_use_register_meta_for_mkldnnimpl/_meta_lib_dont_use_me_use_register_meta_for_mkl2_meta_lib_dont_use_me_use_register_meta_for_onednn'_meta_lib_dont_use_me_use_register_meta)Zactivate_meta_tabler  registryZopoZop_overloadr(   r)   r)   r*   activate_meta  s:     	r0  )F)F)F)NN)NNN)NN)T)r   )r   )r  T)F)F)F)FF)F)TT)rI  )FTN)TFF)TF)r   )r  N)r  N)FF)N)r)   rn   FTN)r)   rn   FTN)N)rm   )rm   )rm   )rm   )rm   )rm   )rm   )F)Fr   FNFrH   )T)NF)rH   F)rm   )F)F)N)F)r)   rn   r  F)r)   rn   r  F)NNNNN)r   NNrm   )T)F)F)N)N)NNF)N)N)r  FFN)N)r  FN)FN)T)T)F)N)NN)NN)NNN)NrH   FNN)NN)NF)NNNN)rH   TT)NN)NNN(  r  enumr   typingr   r   r   r   r   r.   Ztorch._prims_commonr  r   r   r	   r
   Ztorch._decompr   r   r   r   Z
torch._opsr   Ztorch._primsr   r   r   r   r   r   r   r   r   Ztorch._prims_common.wrappersr   r   r   r   r  r   r   Z%torch.fx.experimental.symbolic_shapesr   r    Ztorch.utils._pytreer!   Zopsr"   ZlibraryLibraryr.  r-   r6   r=   Ztaker   ry   rG   rS   rX   ZcummaxZcumminr`   rb   r   Z_fft_c2cr   Z_fft_r2cr   ZrandpermZgenerator_outr   rA   r   randintr   r   r   Zrandr   Z_fft_c2rr   r   r   r   Z
unsqueeze_r   Zindex_reducer/  r  r  r   Zindex_reduce_r   r   r   r   r   Z	unary_outr   rJ   r   r   r   r   r   r   r   Z_assert_asyncr   msgr   Z_make_dep_tokenr   r   Z_functional_sym_constrain_ranger   r   Z(_functional_sym_constrain_range_for_sizer   Z_functional_assert_asyncr   rT   r   rU   r   r   r  r
  Z_linalg_eighr  r  r  r  r  r  r  r   r(  Zlinalg_inv_exr*  Zlinalg_ldl_factor_exr0  Zlinalg_ldl_solver7  Z	linalg_lur=  Zlinalg_lu_factor_exr?  Zlinalg_lu_solverC  Z	lu_unpackrG  rN  Z	linalg_qrrQ  rT  rR  Z_linalg_svdr\  r5  r  rd  rp  Zlinalg_solve_triangularru  rx  r|  Z_linalg_detr}  r  r  r  Zreflection_pad1dr  Zreplication_pad1dr  r  Zreflection_pad1d_backwardr  Zreplication_pad1d_backwardr  r  Zreflection_pad2dr  Zreplication_pad2dr  Zreflection_pad2d_backwardrL  Zreplication_pad2d_backwardr  r  Zreflection_pad3dr  Zreplication_pad3dr  Zreflection_pad3d_backwardZreplication_pad3d_backwardr  Z_pdist_forwardr1   r  Z_pdist_backwardr  Zbaddbmmr  Z	bernoullir  Z
bernoulli_r  r  r  Z_fused_moving_avg_obs_fq_helperr  r  r  r  mmr  r   rY  r   r  Zconvolutionr  r)  Z_has_mkldnnr*  r  Z_convolution_pointwiser  Z_linear_pointwiser  Zhas_mklr,  r  Z_mkl_linearr  r-  r  Zqconv2d_pointwiser#  Zqlinear_pointwiser$  r(  Z
avg_pool2drG  rJ  Zavg_pool2d_backwardrL  Z
avg_pool3dr_  Zavg_pool3d_backwardra  Z_adaptive_avg_pool2drc  Z_adaptive_avg_pool3drd  Z_adaptive_avg_pool2d_backwardri  Z_adaptive_avg_pool3d_backwardrl  rj  Zadaptive_max_pool2dru  rw  ry  Zadaptive_max_pool3drz  r{  r|  Zrepeat_interleaver~  complexr  r  r5   r  r  r  r@   Z_unsafe_indexr  Zconvolution_backwardr  Zaddbmmr  Z_foreach_neg_Z_foreach_reciprocal_Z_foreach_sqrt_Z_foreach_sign_r  Z_foreach_negZ_foreach_reciprocalZ_foreach_sqrtZ_foreach_signr  r  Z_foreach_addZ_foreach_subZ_foreach_mulZ_foreach_divZ_foreach_maximumZ_foreach_minimumr  Z_foreach_add_Z_foreach_sub_Z_foreach_mul_Z_foreach_div_Z_foreach_maximum_Z_foreach_minimum_r  ZScalarr  r  Z_foreach_addcdiv_Z_foreach_addcmul_r  Z_foreach_lerp_r  Z_foreach_addcdivZ_foreach_addcmulr  Z_foreach_powZScalarAndTensorr  r  Z_foreach_copy_r  Z_fused_adam_r  Z_fused_adamr  Z_int_mmr  Z_cdist_forwardr  Z_cdist_backwardr  Z_embedding_bagr  Z_embedding_bag_forward_onlyr  r  Znansumr  ZmedianZ	nanmedianr  Z
dim_valuesrH  rY   r  Zlogical_not_r  repeatr  Zzero_r   Zmul_Zdiv_Zlogical_and_Zlogical_or_Zlogical_xor_r  Zadd_Zsub_r  roundZdecimalsr  r  
__rshift__r  
__lshift__r  zeror  rh  r  fillr  Zrelu_r  Z	index_putZ_unsafe_index_putr  Zmasked_fill_r  Z
index_put_r  aliasr  r   Zbmmr!  r$  r'  r7  r8  rT  r5  r`  r6  Z max_pool2d_with_indices_backwardr8  Zmax_pool2d_with_indicesr9  Zmax_unpool2drA  rB  Zmax_unpool3drC  Zmax_pool3d_with_indicesrK  Z max_pool3d_with_indices_backwardrM  rR  rS  rZ  Zgrid_sampler_2d_backwardr`  rb  rc  rd  r  r  rk  Zselect_scatterrm  Zslice_scatterrq  r_   rt  ry  gatherr{  r  r  r  r  r  Zscatter_addr  Zscatter_add_r  r  r   r  r   Zvalue_reducer  Zscatter_r  Z#_scaled_dot_product_flash_attentionr  Z,_scaled_dot_product_flash_attention_backwardr  Z'_scaled_dot_product_efficient_attentionr  Z0_scaled_dot_product_efficient_attention_backwardr  Zscatter_reducetwoZtwo_outr  Zscatter_reduce_r  Zmultinomialr  r  r  r  r  r  typesZSymIntr  rt   r  Zvalues_stabler  Zargsortr  r  Z_thnn_fused_lstm_cellr  r  r  r  r  r  Zargminr   r  Ztopkr  r   r
  r	  r  Zpixel_shuffler  r  Z	bucketizeZ
Tensor_outr  Z_upsample_bilinear2d_aar  r  r  rt  r  Zsearchsortedr  Z	polygammar  r  r   Zspecial_airy_aiZspecial_bessel_y0Zspecial_bessel_y1Zspecial_modified_bessel_i0Zspecial_modified_bessel_i1Zspecial_modified_bessel_k0Zspecial_modified_bessel_k1Z!special_scaled_modified_bessel_k0Z!special_scaled_modified_bessel_k1Zspecial_chebyshev_polynomial_tZn_scalar_outZspecial_chebyshev_polynomial_uZspecial_hermite_polynomial_hZspecial_hermite_polynomial_heZspecial_laguerre_polynomial_lZtorch._refs.nn.functionalZtorch._refs.specialr0  r)   r)   r)   r*   <module>   s  $
		6

   
   


	








	
	















)      
2

   &
&
   7
 (
 
  &   
;  
/

 Z&5 ?'  



 
e
'
  
    !
    M,
H    TN



.


*
"c 














$#
     h	







!
T]?6G+      !
7/


   g
e(

	    ,/	








	   [-  ' 4 


"  
7'
"  
   

	






9