U
    Kc                     @   s  d dl Z d dlmZmZmZ d dlZd dlmZ d dlm	Z	 d dlm
Z
mZmZmZmZ d dlmZ d dlmZ d dlmZ ejjZejdd	d
Zi ZdddZdd Zeejjdd Zeej jdd Z!eej"j#ddddZ$eej%jej%j&ge dd Z'eej(jdddddZ)eej*jdd Z+eej*j&dd  Z,eej-jej.jgd!d" Z/eej0jd#d$ Z1eej0j&d%d& Z2d'd( Z3e4d)d*d+Z5dd-d.Z6eej7jd/d0 Z8d1d2 Z9eej:jd3d4 Z;eej<jgddd5d6 Z=d7d8 Z>eej?j&ddd9d:Z@eejAjej	ej	ej	eeB eeB eeB eCeeB eBd;	d<d=ZDd>d? ZEeejFjddddBdCZGdDdE ZHeejIjdFdG ZJeejKjdHdI ZLeejMj	ddJdKZNeejOjejOj&ge dLdM ZPeejQjdNdO ZQeejRj	dddPdQ ZSeejTjejTj&ge dRdRdSdTdUZUeejVjdVdW ZWeejXjddYdZZYeejZjejZj&ge dd[d\Z[eej\jd]d^ Z]dd_d`Z^eej_jej_j&ge dddadbdcZ`eejajddde ZbeejajcejajdgedfdgddhdiZeeejfjdjdk Zgeejhjdldm Zieejjjdddndo Zkeejlj	ejljmejnj	ejnjmgdddpdq Zoeejpjdddrds ZqeejrjddddtduZseejtjmdddvdw ZueejvjddddxdyZweejxjdddzd{ Zydd|d}Zzeej{jddd~d Z|dd Z}dd Z~dd Zdd ZeejjdddddZeejjgdd Zeejjejjejjejjejjejjejjgdd Zeejjdd Zeejjdd Zd dlZd dlZd dlZdS )    N)ListOptionalUnion)Tensor)checkcorresponding_complex_dtypecorresponding_real_dtypeelementwise_dtypesELEMENTWISE_TYPE_PROMOTION_KIND)out_wrapper)_broadcast_shapestree_mapatenZIMPLMetaTc                    s    fdd}|S )Nc                    s    fdd}t |  S )Nc                    sH    t | < r0| jdkr| jn| jj}t|  | tjj	j
  d S )Ndefault)
meta_tableZ_overloadname__name__Zoverloadpacket'_meta_lib_dont_use_me_use_register_metaimplZpy_impltorchZ_CZDispatchKeyr   )opname)fregister_dispatcher =/tmp/pip-unpacked-wheel-gikjz4vx/torch/_meta_registrations.pyadd_func   s    z0register_meta.<locals>.wrapper.<locals>.add_funcr   )r   r   r   r   )r   r   wrapper   s    
zregister_meta.<locals>.wrapperr   )r   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 N)r   Z	complex32halfZcfloatfloatZcdoubledoubleget)dtypeZfrom_complexr   r   r   toRealValueType.   s       r'   c                 C   s   | j jst| |  S r!   )r&   
is_complexAssertionError	new_emptysize)selfdimnormalizationZforwardr   r   r   meta_fft_c2c7   s    r/   c                 C   sR   | j jstt|  }|r<|d }|| d d }|||< | j|t| j dS )N      r&   )r&   is_floating_pointr)   listr+   r*   utilsr   )r,   r-   r.   Zonesidedoutput_sizesZlast_dimZlast_dim_halfsizer   r   r   meta_fft_r2c=   s     
r8   )	generatorc                C   s    |j dkr|d| kst|S Nr2   r   )ndimr+   r)   )nr9   outr   r   r   meta_randpermL   s    r>   c                 C   s8   | j jstt|  }|||d < | j|t| j dS )Nr0   r3   )r&   r(   r)   r5   r+   r*   r'   )r,   r-   r.   Zlastdimr7   r   r   r   meta_fft_c2rR   s    r?   F)r   c                 C   s   | S r!   r   )r,   srcZnon_blockingr   r   r   
meta_copy_[   s    rA   c                 C   s.   t |  }|  dkr$| ||< | |S )Nr   )r5   r+   r-   numelr*   )r,   r-   indexZresult_sizer   r   r   meta_index_selecta   s    rD   c                 C   s(   t ||  | j |t | ||S r!   )r   _resize_output_r+   devicecopy_index_select)r,   r-   rC   r=   r   r   r   meta_index_select_outi   s    rI   c                 C   s
   |  dS Nr   )r*   r,   r   r   r   meta_maxo   s    rL   c                 C   s8   |   rt| j}nt| tjd\}}| j|  |dS )N)Ztype_promotion_kindr3   )r(   r   r&   r	   r
   ZINT_TO_FLOATr*   r+   )r,   Zresult_dtype_r   r   r   
meta_anglet   s     
rN   c                 C   s$   t ||  | j |t | S r!   )r   rE   r+   rF   rG   angle)r,   r=   r   r   r   meta_angle_out   s    rP   c                 C   sX   |   dkst| d| d| dksTt| d| d d| d dd S )Nr1   z3: The input tensor must have at least 2 dimensions.r0   z5: A must be batches of square matrices, but they are z by z	 matrices)r-   r)   r+   )r,   f_namer   r   r   squareCheckInputs   s    
 rS   )uploc                 C   s6   |   }t| dkr|dks2|dks2td|  d S )Nr2   ULz1Expected UPLO argument to be 'L' or 'U', but got )upperlenr)   )rT   Zuplo_uppercaser   r   r   	checkUplo   s    
rY   rV   c                 C   sd   t | d t| t| j}|  dks,t| j| j|d}|dd | | jd d }||fS )NZlinalg_eighr1   r3   rQ   r0   )	rS   rY   r'   r&   r-   r)   r*   shapeZ
transpose_)r,   rT   Z
real_dtypevaluesZvectorsr   r   r   meta_linalg_eigh   s    

r\   c                    s     ddko  ddk}t jdkr,|pF jdkoF|oF  ddk fdd  jdkrn j\}}}}nd} j\}}}|\}}}	}
||	 |
 }|| | } jdkr |||fS  ||||fS d S )Nr2   r   r1         c                      s
   d  S )Nz:3D or 4D (batch mode) tensor expected for input, but got: r   r   rK   r   r   <lambda>       zmeta_pad2d.<locals>.<lambda>)r+   r   r;   rZ   r*   )r,   padding
valid_dimsnbatchZnplaneZinput_hZinput_wpad_lpad_rZpad_tZpad_bZoutput_hZoutput_wr   rK   r   
meta_pad2d   s     


rf   c                    s,   t  dko  dk fdd d S )Nr2   c                      s   d   d    dS )Nz1D tensors expected, but got zD and z	D tensorsr-   r   otherr,   r   r   r_      r`   zdot_check.<locals>.<lambda>)r   r-   r,   ri   r   rh   r   	dot_check   s    rk   c                 C   s   t | | | dS rJ   )rk   r*   )r,   tensorr   r   r   meta_dot   s    
rm   c                 C   s^   t |  dkdd  t | dkdd  | j\}}|j\}}t ||kdd  | ||S )Nr1   c                   S   s   dS )Nza must be 2Dr   r   r   r   r   r_      r`   zmeta_mm.<locals>.<lambda>c                   S   s   dS )Nzb must be 2Dr   r   r   r   r   r_      r`   c                   S   s   dS )Nz$a and b must have same reduction dimr   r   r   r   r   r_      r`   )r   r-   rZ   r*   )abNZM1ZM2Pr   r   r   meta_mm   s    

rr   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 )r2   NrZ   .0idimsr,   r   r   	<genexpr>   s     z+_compute_reduction_shape.<locals>.<genexpr>)tupleranger;   r6   compute_reduction_output_shaperZ   )r,   rx   keepdimr   rw   r   _compute_reduction_shape   s    r~   c                C   s   t ||  | j |S r!   )r   rE   r+   rF   )r,   r9   r=   r   r   r   meta_bernoulli   s    r   )	input_tensorweightbiasstridera   dilationis_transposedoutput_paddinggroupsc	              
      sv  t t t t t t ddd t t t t t t t ddddtjtjttt  t f ttt  t f ttt  t f tttt  t f  d fdd	}	d
d fdd}
jdd  }jdd  }|r|jd  }|	||||||}n<jd }jd | jd krtd|	|||||}jd |f|}ddl	m
} t|rZjj}nd}|
|}|j|d}|S )N)lnpdksreturnc                 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
        r1   r2   r   )r   r   r   r   r   r   r   r   _formula   s    zmeta_conv.<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
        r2   r1   r   )r   r   r   r   r   r   r   r   r   _formula_transposed   s    z&meta_conv.<locals>._formula_transposed)rx   kernel_sizer   ra   r   r   c           	         sj  g }t |tr|gt|  }nt|dkr<|d gt|  }t |trV|gt|  }nt|dkrt|d gt|  }t |tr|gt|  }nt|dkr|d gt|  }d }|rt |tr|gt|  }n$t|dkr|d gt|  }n|}tt| D ]f}|r:|| | || || || || ||  q| | | || || || ||  q|S r:   )
isinstanceintrX   r{   append)	rx   r   r   ra   r   r   Z	ret_shapeZoutput_padding_listrv   )r   r   r   r   calc_conv_nd_return_shape  sT    



    z,meta_conv.<locals>.calc_conv_nd_return_shapec                 S   s   t j| t jkS r!   )r   _prims_commonsuggest_memory_formatchannels_last)Ztenr   r   r   is_channels_lastD  s    z#meta_conv.<locals>.is_channels_lastc                    sZ   | dkr  sr.t jS n r.t jS  jt jdrBt jS  jt jdrVt jS d S )Ncudamemory_format)r   r   Zis_contiguouscontiguous_formatZpreserve_format)device_hint)r   r   r   r   r   pick_memory_formatG  s    z%meta_conv.<locals>.pick_memory_formatr1   r2   r   zInvalid channel dimensions)
FakeTensorr   r   )N)r   r   Sizer   r   r   rZ   RuntimeErrorr*   Ztorch._subclasses.fake_tensorr   r   Zfake_devicetypeto)r   r   r   r   ra   r   r   r   r   r   r   r   rx   Zout_channelsZ	shape_outr=   r   r   Zmem_fmtr   )r   r   r   r   r   r   	meta_conv   sV     6

    
r   c                    s2   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] == , zbut got : dimension z] = )r-   rZ   r   r-   dim_sizer+   rl   r   r   r_   z  s   z check_dim_size.<locals>.<lambda>)r   r-   rZ   )rl   r-   r   r+   r   r   r   check_dim_sizew  s    r   r   r   c                 C   s`  dd }|d|\}}	t t|dkdd  t|dkrD||	 }
}n.t|dkrd|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r>|||g}n||||g}tj	|| j
| j|dS )Nc                    sB   t t|dk fdd |d }t|dkr2|n|d }||fS )Nr2   r1   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   r_     r`   z1meta_avg_pool2d.<locals>.unpack.<locals>.<lambda>r   r2   r   rX   r   valHWr   r   r   unpack  s    

zmeta_avg_pool2d.<locals>.unpackr   r   r2   r1   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   r_     r`   z!meta_avg_pool2d.<locals>.<lambda>r   r2   r   ra   c                   S   s   dS )Nzdivisor must be not zeror   r   r   r   r   r_     r`   r^   rQ   r0   r]   r&   rF   r   )r   rX   r-   r+   pooling_output_shaper6   r   pool2d_shape_checkr   emptyr&   rF   )inputr   r   ra   	ceil_modeZcount_include_padZdivisor_overrider   kHkWdHdWpadHpadWrc   nInputPlaneinputHeight
inputWidthoutputHeightoutputWidthr   r+   r   r   r   meta_avg_pool2d  sb    
	




   r   c                 C   sj   t | ||||||dd|	|
|||| |  }|	}t|||d | t|||d | t|||d | d S )Nr2   r]   r1   )r   r-   r   )r   Z
gradOutputrc   r   r   r   r   r   r   r   r   r   r   r   Z
mem_formatr;   nOutputPlaner   r   r   avg_pool2d_backward_shape_check  s,    r   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 3D or 4D tensor, but got rs   r   rK   r   r   r_     r`   z*meta_adaptive_avg_pool2d.<locals>.<lambda>rQ   r   r;   r*   rZ   rz   r,   output_sizer   rK   r   meta_adaptive_avg_pool2d  s
    
r   c                    s>   t  jdkp jdk fdd   jd d t| S )Nr^      c                      s   d j  S )Nz"Expected 4D or 5D tensor, but got rs   r   rK   r   r   r_     r`   z*meta_adaptive_avg_pool3d.<locals>.<lambda>r   r   r   r   rK   r   meta_adaptive_avg_pool3d  s
    
r   c                 C   s   |d krt d| |S )Nz:cannot repeat_interleave a meta tensor without output_size)r   r*   )repeatsr   r   r   r   meta_repeat_interleave_Tensor  s    r   c                 C   s:   | j jst|j jstt| j|j}| j|t| j dS Nr3   )r&   r4   r)   r   rZ   r*   r   )realimagZ	out_shaper   r   r   meta_complex  s    r   c                 C   sx   | j st| |S |  rH| r6t| |  S t|  |S n| rdt| |  S t| | | dS rJ   )r(   r   dotZis_conjvdotZconjrk   r*   rj   r   r   r   r     s    
r   c              	      s  t dd  g }tD ]\ d k	rt 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
 tj	D ]Ft j j  k fddt
 ||d qq| q| q|t tj	kfdd dd lm} t|j tj	k rRd  q4d}d	}D ]J|dkr|d k	rd}n*|dkrd krd
}nd k	r^ qq^d}|s.g }g }tD ](\ d k	r|  | qtD ](\ d kr|  | q||g }	g }
g }tD ]H\}d kr~|rl|
j|  n|	j|  n
tj}qB|	| |
 S )Nc                   S   s   dS )Nz#at least one index must be providedr   r   r   r   r   r_   .  r`   z#meta_index_Tensor.<locals>.<lambda>c                   S   s   dS )Nz:tensors used as indices must be long, byte or bool tensorsr   r   r   r   r   r_   6  r`   c                      s   d j  S )N)too many indices for tensor of dimension r;   r   rK   r   r   r_   =  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 rs   r   )rv   rC   jr   r,   r   r   r_   C  r`   r2   c                      s   dj  dt  dS )Nr   z (got ))r;   rX   r   )indicesr,   r   r   r_   O  r`   r   Fr1   T)r   	enumerater&   r   longZint8boolnonzerorX   r;   
IndexErrorr{   rZ   r   selecttorch._refsZ_refsr5   Z_maybe_broadcastZpermuter*   )r,   r   resultr   refsstateZhas_contiguous_subspacerx   Ztransposed_indicesZbefore_shapeZafter_shapeZreplacement_shaper-   r   )rv   rC   r   r   r   r,   r   meta_index_Tensor,  s    












r   r2   )betaalphac                   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 )Nr2   r1   r]   c                   S   s   dS Nzbatch1 must be a 3D tensorr   r   r   r   r   r_     r`   zmeta_addbmm.<locals>.<lambda>c                   S   s   dS Nzbatch2 must be a 3D tensorr   r   r   r   r   r_     r`   r   c                      s   d  d d d S )Nz8batch1 and batch2 must have same number of batches, got r    and r+   r   batch1batch2r   r   r_     r`   c                
      s6   d  d d  d d d d d d	S )Nz#Incompatible matrix sizes for bmm (r2   xr1   r   r   r   r   r   r   r   r_     s    c                   S   s   dS )Nz.self tensor does not match matmul output shaper   r   r   r   r   r_     r`   )r+   expandr   r-   r*   )r,   r   r   r   r   Zdim1Zdim2r   r   r   meta_addbmm  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o dk fdd d}d}jd d }jd d }tt	||}|
||g |S )Nr1   c                      s   d    dS )Nz1cdist only supports at least 2D tensors, X1 got: Drg   r   )x1r   r   r_     r`   z$meta_cdist_forward.<locals>.<lambda>c                      s   d    dS )Nz1cdist only supports at least 2D tensors, X2 got: r   rg   r   )x2r   r   r_     r`   r0   c                      s   d  d d d S )Nz4X1 and X2 must have the same number of columns. X1: r0   z X2: r   r   )r   r   r   r   r_     r`   c                   S   s   dS )Nz=cdist only supports floating-point dtypes, X1 got: {x1.dtype}r   r   r   r   r   r_     r`   c                   S   s   dS )Nz=cdist only supports floating-point dtypes, X2 got: {x2.dtype}r   r   r   r   r   r_     r`   r   c                   S   s   dS )Nz)cdist only supports non-negative p valuesr   r   r   r   r   r_     r`   c                      s
   d  S )Nz"possible modes: 0, 1, 2, but was: r   r   )compute_moder   r   r_     r`   rQ   )r   r-   r+   r6   is_float_dtyper&   rZ   r5   r   Zbroadcast_shapesextendr*   )	r   r   r   r   Zr1Zr2Zbatch_tensor1Zbatch_tensor2output_shaper   )r   r   r   r   meta_cdist_forward  s@    








r   r0   c	                    s  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}jjdkr  d}  }||kr~ |	d}n
 d}n\||
|}||ks||ks|sĈ d}n
d}|	}| }|
|||fS )Nc                      s   d j  S )Nz(expected indices to be long or int, got r3   r   )r   r   r   r_     r`   z$meta_embedding_bag.<locals>.<lambda>c                      s   d j  S )Nz(expected offsets to be long or int, got r3   r   )offsetsr   r   r_     r`   c                      s   d j  S )Nz/expected weight to be floating point type, got r3   r   )r   r   r   r_     r`   r   r2   c                   S   s   dS )Nz1include_last_offset: numBags should be at least 1r   r   r   r   r   r_     r`   r]   c                   S   s   dS )Nz@embedding_bag: per_sample_weights only supported with mode='sum'r   r   r   r   r   r_     r`   c                      s   dj  d j  dS )Nzexpected weight (z) and per_sample_weights (z) to have same dtyper3   r   )per_sample_weightsr   r   r   r_     r`   c                      s   d j  dS )Nz1expected per_sample_weights to be 1D tensor, got r   r   r   )r   r   r   r_     r`   c                      s   d   d    dS )Nz%expected per_sample_weights.numel() (z$ to be the same as indices.numel() (r   )rB   r   )r   r   r   r   r_     s    c                    s    | ||o| ddkS Nr   r2   )r   r@   Zscaleoutput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:   )r&   r   r#   r"   r   )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cpu)r   r&   r   r   r   r6   r   r+   r*   r{   r;   rB   rF   r   )r   r   r   Zscale_grad_by_freqmodesparser   Zinclude_last_offsetr  Znum_bagsr   ZMODE_SUMZ	MODE_MEANZMODE_MAXr  
offset2bagbag_sizemax_indicesZfast_path_sumr   )r   r  r  r   r   r   r   meta_embedding_bag  sl    




 





r  c                 C   s   t |  dkdd  |  dkrB| dt| }| ||fS |dkrft| d| d| }nt| d| | d}| |fS )Nr   c                   S   s   dS )Nzmatrix or a vector expectedr   r   r   r   r   r_   0  r`   zmeta_diag.<locals>.<lambda>r2   r   )r   r-   r+   absr*   min)r,   r-   szr   r   r   	meta_diag-  s    r  c                 G   s@   t | ||f| \}}}}|jjdkr4|| }||||fS )Nr  )r  rF   r   r*   r+   )r   r   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!   )r&   r4   r(   r   r   )r   r&   promote_int_to_longr   r   r   _get_reduction_dtypeG  s    r  r3   c                C   s6   t | |dd}t| j|}t| ||}| j||dS )NT)r  r3   )r  r6   reduction_dimsrZ   r~   r*   )r   rx   r}   r&   Zoutput_dtyper   r   r   r   meta_nansumT  s    r  c                 C   s$   t | jtt|  }| |S r!   )r6   r|   rZ   rz   r{   r-   r*   )r   r   r   r   r   meta_nanmedian]  s
     r  r[   r   c                 C   s6   t | j|f}t| ||}| || j|tjdfS r   )r6   r  rZ   r~   r*   r   r   )r   r-   r}   r   r   r   r   meta_nanmedian_dime  s
    r  c                 C   s   | S r!   r   rK   r   r   r   meta_logical_not_p  s    r  c                    sb   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   r_   y  r`   zmeta_repeat.<locals>.<lambda>r2   c                    s   g | ]} | |  qS r   r   rt   Zpadded_sizer   r   r   
<listcomp>  s     zmeta_repeat.<locals>.<listcomp>)r   rX   r-   rz   rZ   r{   r*   )r,   r   Znum_new_dimensionsZtarget_sizer   r  r   meta_repeatu  s    r  c                 C   s   | S r!   r   rK   r   r   r   
meta_zero_  s    r  c                 C   s   | S r!   r   )r,   r   r   r   r   
meta_fill_  s    r  c                 C   s   | S r!   r   rK   r   r   r   
meta_relu_  s    r  c                 C   s   |  |  S r!   )r*   r+   r,   r   r[   
accumulater   r   r   meta_index_put  s    r"  c                 C   s   | S r!   r   )r,   mask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!   )viewrZ   rK   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d
d  |S )Nr]   c                   S   s   dS r   r   r   r   r   r   r_     r`   z)common_meta_baddbmm_bmm.<locals>.<lambda>c                   S   s   dS r   r   r   r   r   r   r_     r`   r   r1   r2   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   r2   z].r   r   Zbatch2_sizesbsZcontraction_sizer   r   r_     r`   c                   S   s   dS )Nzself must be a 3D tensorr   r   r   r   r   r_     r`   c                   S   s   dS )NzTExpected an input tensor shape with shape {output_size} but got shape: {self.size()}r   r   r   r   r   r_     r`   )r   r-   r+   r*   )	r   r   Zis_bmmZself_baddbmmZbatch1_sizesZres_rowsZres_colsr   r   r   r)  r   common_meta_baddbmm_bmm  s*    


r+  c                 C   s   t | |dS )NT)r+  )r,   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   )r   yqrr   r   r   div_rtn  s
     r0  c                 C   sZ   t | | | ||d   d |r(|d nd |d }|rV|d | | | krV|d8 }|S r:   )r0  )	inputSize
kernelSizerd   re   r   r   r   Z
outputSizer   r   r   pooling_output_shape_pad_lr  s*    
	r3  c                    sX   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   r_     r`   z&pooling_output_shape.<locals>.<lambda>c                      s
   d  S )Nz'pad must be non-negative, but got pad: r   r   )padr   r   r_     r`   r1   c                      s   d d  S )Nz7pad should be at most half of kernel size, but got pad=z and kernel_size=r   r   r2  r4  r   r   r_     r`   )r   r3  )r1  r2  r4  r   r   r   r   r5  r   r     s    
      r   c                    sD     }tdkodkdd  t|dko6|dkdd  t|dkoP|dkdd   ddkot ddk}|tjkrt|dko|o d	dkd
d  nBt|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o(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   r_     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   r_     r`   c                   S   s   dS )Nz\dilation should be greater than zero, but got dilationH: {dilationH}, dilationW: {dilationW}r   r   r   r   r   r_     r`   r2   r1   r^   r]   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   r_   !  r`   c                      s   d    S )NzYExpected 3D or 4D (batch mode) tensor with optional 0 dim batch size for input, but got: r   r   )r   r   r   r_   (  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   r   r   r   r_   -  r`   c                      s*   d d  d d d d dS )NzGiven input size: (r   z). Calculated output size: (z). Output size is too smallr   r   )r   r   r   r   r   r   r   r   r_   3  r`   )r-   r   r+   r   r   )r   r   r   r   r   r   r   	dilationH	dilationWr   r   r   r   r   r   r;   rb   r   )r   r   r   r   r   r   r   r   r   r   r   r   r     sB    

r   r  c                 C   s  dd }|d|\}}t t|dkdd  t|dkrD|| }	}
n|d|\}	}
|d	|\}}|d
|\}}t| }|tjkrt |  dkdd  n0|tjkrt |  dkdd  nt ddd  |  dkr| dnd}| d}| d}| d}t	||||	||}t	||||
||}t
| |||	|
|||||||||| |  dkrd|||g}n||||g}tj|| j| j|dtj|tj| j|dfS )Nc                    sB   t t|dk fdd |d }t|dkr2|n|d }||fS )Nr   c                      s   d  dS )Nzmax_pool2d: r   r   r   r   r   r   r_   A  r`   z>meta_max_pool2d_with_indices.<locals>.unpack.<locals>.<lambda>r   r2   r   r   r   r   r   r   >  s    

z,meta_max_pool2d_with_indices.<locals>.unpackr   r   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   r_   K  r`   z.meta_max_pool2d_with_indices.<locals>.<lambda>r   r   ra   r   r^   c                   S   s   dS )NzMnon-empty 4D (batch mode) tensor expected for input with channels_last layoutr   r   r   r   r   r_   Y  r`   )r]   r^   c                   S   s   dS )Nz9non-empty 3D or 4D (batch mode) tensor expected for inputr   r   r   r   r   r_   ^  r`   Fc                   S   s   dS )Nz?Unsupport memory format. Supports only ChannelsLast, Contiguousr   r   r   r   r   r_   c  r`   r   r2   r   rQ   r0   r]   r   )r   rX   r6   r   r   r   r-   r   r+   r   r   r   r&   rF   int64)r   r   r   ra   r   r   r   r   r   r   r   r   r   r6  r7  r   rc   r   r   r   r   r   r+   r   r   r   meta_max_pool2d_with_indices9  s    	








      r9  c                 O   s   t j| f||S r!   )r   r   )r+   Z
fill_valuer  kwargsr   r   r   full  s    r;  c                 O   s   t jj| f|S r!   )r   Z
empty_liker   )r,   r  r:  r   r   r   	meta_like  s    r<  c                 K   sR   t | trt| } dd }|dd d ko2|| }|rBtj|d< tj| gf|S )Nc                 S   s   t | tpt | tS r!   )r   r   r   )r   r   r   r   is_integral  s    zarange.<locals>.is_integralr&   )	r   r#   mathceilr%   r   r8  r   r   )endr:  r=  Zset_to_integral_dtyper   r   r   arange  s    


rA  c                 K   s   t j||  f|S r!   )r   rA  )startr@  r:  r   r   r   arange_start  s    rC  )T)F)rV   )r   r   FTN)N)Fr   FNFr0   )r   )T)NF)r0   F)F)F)N)r   r   r  F)r>  typingr   r   r   r   Ztorch._prims_commonr   r6   r   r   r   r   r	   r
   Ztorch._prims_common.wrappersr   r   r   Ztorch.utils._pytreer   opsr   ZlibraryLibraryr   r   r    r'   Z_fft_c2cr   r/   Z_fft_r2cr8   ZrandpermZgenerator_outr>   Z_fft_c2rr=   r?   rG   rA   rH   rD   rI   maxr  rL   rO   rN   rP   rS   strrY   r\   Zreflection_pad2drf   rk   r   rm   mmrr   r~   Z	bernoullir   Zconvolutionr   r   r   r   Z
avg_pool2dr   r   Z_adaptive_avg_pool2dr   Z_adaptive_avg_pool3dr   Zrepeat_interleaver   complexr   r   rC   r   Zaddbmmr   Z_cdist_forwardr   Z_embedding_bagr  Zdiagr  Z_embedding_bag_forward_onlyr  r  Znansumr  Z	nanmedianr  r-   Z
dim_valuesr  Zlogical_not_r  repeatr  Zzero_r  fillZScalarZfill_r  Zrelu_r  Z	index_putr"  Zmasked_fill_r%  Z
index_put_r&  aliasr(  r+  Zbmmr,  r0  r3  r   r   Zmax_pool2d_with_indicesr9  r;  Zrandint_likeZ	low_dtypeZ
randn_likeZ	rand_likeZ	full_likeZ
zeros_likeZ	ones_liker<  rA  rB  rC  Ztorch._refs.nn.functionalZtorch._refs.specialr   r   r   r   <module>   sD  
	














	





	

      J+







e

#
      \

	


	









!

>       T





