a
    d
                    @   s  U d dl Z d dlZd dlZd dlmZ d dl mZmZ d dlmZ d dl	m
Z
mZmZmZmZmZmZ d dlZd dlmZ d dlmZ d dlm  mZ d dlmZmZmZ d dlm Z  d dlm!Z!m"Z"m#Z#m$Z$ d d	l%m&Z&m'Z'm(Z(m)Z) d d
l*m+Z+ d dl,m-Z-m.Z. ej/j0Z0g Z1ee2 e3d< ej4j5j6Z6G dd deZ7de
ej8e9dddZ:ee:ej8j;ddZ<ee:ej8j;dZ=ee:ej8j>dZ?ee@dddZAe e6jBe=eedddZBe e6jCe=eedddZCe e6jDe=eeeEeEddd ZDe e6jFe=eeEeEeEe9ed!d"d#ZFe e6jGjHgd$d% ZIe e6jGjged&d'd(ZJe e6jKe=eed)d*d+ZKe e6jLe=eed,d-d.ZLe e6jMeeeEeEd/d0d1ZMe e6jNeeeEd2d3d4ZNe e6jOe=eed)d5d6ZOe e6jPe=eeed7d8d9ZPe e6jQeeeEd:d;d<ZQe e6jRe=eeeEe9d=d>d?ZRe e6jSe=deee2dAdBdCZSe e6jTe=eedDdEdFZTe e6jUe=eed)dGdHZUe e6jVe=eeed7dIdJZVe e6jWeeeEedKdLdMZWe e6jXeeedNdOdPZXe e6jYeeeeeef dQdRdSZYe e6jZe=eeeeEeEe9e9edTdUdVZZe e6j[e=eeeedWdXdYZ[ee@dZd[d\Z\ej]d]d^d_Z^e e6j_e=e7j`jafeee@ed`dadbZ_e e6jbe=eeee@dcdddeZbe e6jcjde=eeee@eEdfdgdhZce e6jcjee=eeee@eEedidjdkZfeeeee e@e@eedldmdnZge e6jhe=eee@edodpdqZhe e6jieeeee e@e@eedldrdsZie e6jjeeeee e@e@eedldtduZje e6jke=de7j`jafeeee e@edvdwdxZke e6jle=de7j`jafeeeee e@edydzd{Zle e6jme) e=e7j`jafeee@ed|d}d~Zme e6jne=e7j`jafeeee@edddZne e6joeeedddZoe e6jpeee@ e@e@e@e@dddZpe e6jqjdee@ee@ ee@ e@dddZre e6jseee@ e@e@dddZse e6jteee@ e@e@e@dddZteeej]dddZue e6jve<eee@ej]dddZve e6jwe<eee@ej]dddZwdd Zxe e6jye) e=eee@ ee@ ee@ ee@ edddZye e6jze) e=eee@ ee@ ee@ ee@ ee@ edddZze e6j{eeeEdddZ{e e6j|eee@ e@e@e@edddZ|e e6j}jde=deeeeE edddZ}e e6j~eeEee9 dddZ~e e6je) ee@e9dddZe e6je) ee@e9dddZe e6jjdeeeEedddZe e6jjHdeeEeEedddZe e6jdeee@e9e9edddZe e6jeee@e@e9dddZee@ dddZe e6je6jgdeee@ e@ee dddĄZe e6jje6jjgdee@e@ee dŜddǄZe e6je) e=deeee@e@dȜddʄZe e6je=eeeeee e@e@e@e@ee9 eee ee ee f d˜dd̈́Zee ee dΜddЄZe e6jeeee@ eeee ee ee9 eee ee ee f dќ	ddӄZeee ee ee ee e9eEeEe9eeeeee ee f dԜ
ddքZe e6jeee ee ee ee e9eEeEeeeef dל	ddلZe6jjde0jeee ee ee ee e9eEeEeeeef dל	ddۄZe6jjde0jdee dܜddބZe e6jjdeee ee eee9eEeEeeeef dל	ddZe e6jjeee ee e9eEeEeeeef dddZe e6jjdeee ee eee9eEeEeeeeeef dל	ddZe e6je=dddZe e6jdddddddeeej] eej e9e9eej dddZe e6je6je6jgdd Ze6jjde0je e6jeeee ee ee e9eEeEdddZdd Ze e6jeeee ee ee ee ee e9eEee9 eeee ee f dddZe e6jeeeee ee ee ee eEed	ddZe e6je=eee@e@f dddZe e6jdde#e@e#e#e"dddZe e6je) dde#e@e#e#e"dd dZdde#e@e#e#e9e"dddZe e6je#e@e#e#dddZe e6je) e#e@e#e#ddd	Ze#e@e#e#e9d
ddZe e6je)dde=eeeef d)ddZe e6jdeee9e@eEf ee9e@eEf dddZe e6jdddZdd Zdd Ze e6jje6jje0je6jje0jdd Ze e6jje6jje0je6jje0jdd Ze e6jje6jje0je6jje0jd d! Zd"d# Ze e6jjde6jjde0je=deee@ eeE ed$d%d&Ze e6jjde6jjde0je=deee@ eeE eeE ed'd(d)Ze e6jjde6jjde0je=deee@ eeE eeE eeE ed*d+d,Zd-d. Zd/d0 Zd1d2 Zd3d4 Zdd5d6Zd7d8 Zd9d: ZÐdd;d<ZĐd=d> Ze e6jjǃe6jjǠe0je6jjǠe0jd?d@ Ze e6jjǃe6jjǠe0je6jjǠe0jdAdB Ze e6jj˃e6jjˠe0je6jjˠe0jdCdD Ze e6jj˃e6jjˠe0je6jjˠe0jdEdF Z͐dGdH ZΐddIdJZϐddKdLZe e6jjǃe6jjǠe0je6jjǠe0jdMdN Ze e6jj˃e6jjˠe0je6jjˠe0jdOdP ZӐdQdR ZԐdSdT Ze e6jj˃e6jjˠe0je6jjˠe0jdUdV Ze e6jjǃe6jjǠe0je6jjǠe0jdWdX Ze e6jje6jje0je6jje0jdYdZ Ze e6jjde6jjde0je=deee@ e9eeE eeE ed[d\d]Ze e6jjdeee9d^d_d`Ze e6je6jgdadb Ze e6jރeeee e@e@eeef dcdddeZeeEedfdgdhZeeEedfdidjZee$dkdldmZe$eedndodpZee edqdrdsZe e6je=deee@e@e9edtdudvZe e6je) e=dwdx Ze e6je) e=dydz Ze e6jdde7j`jafd{d|Zeje@e9d}d~dZe6jjde0jdd Ze e6jjde=deee@e@f e9eeE eeE edddZe e6jje6jje0je6jje0je) e=deeee@e@f  e9eeeEeEf  edddZdd Zee6je6j ee6je6j ee6je6j ee6je6j ee6je6j ee6je6jG ee6je6j ee6je6jO ee6je6j ee6je6jK ee6je6j ee6j e6j ee6je6j ee6je6j ee6je6j ee6je6j	 ee6j
e6j ee6je6j ee6je6j ee6je6j ee6je6jU dS (      N)Enum)partialreduce)product)CallablecastIterableListOptionalTupleUnion)	sym_floatsym_intTensorregister_decomposition)IntLike
NumberType
TensorLikeTensorSequenceType)_maybe_convert_to_dtype_maybe_resize_out_safe_copy_outout_wrapper)	guard_int)tree_flattentree_map__all__c                   @   s   e Zd ZdZdZdZdS )	Reductionr         N)__name__
__module____qualname__NONEMEANSUM r'   r'   e/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/_decomp/decompositions.pyr   "   s   r   F)ftype_promotioncompute_dtype_onlyc                    s   t  fdd}|S )Nc                     sv   dd t | |fd D }tj|di\  fdd}fdd}t|| i t||}rh|S t||S d S )	Nc                 S   s   g | ]}t |tr|qS r'   )
isinstancer   .0xr'   r'   r(   
<listcomp>2   s   z-type_casts.<locals>.inner.<locals>.<listcomp>r   type_promotion_kindc                    s   t | tr|  S | S d S Nr,   r   tor/   computation_dtyper'   r(   increase_prec:   s    

z0type_casts.<locals>.inner.<locals>.increase_precc                    s   t | tr|  S | S d S r2   r3   r5   )result_dtyper'   r(   decrease_prec@   s    

z0type_casts.<locals>.inner.<locals>.decrease_prec)r   utilselementwise_dtypesr   )argskwargsZ	flat_argsr8   r:   rr+   r)   r*   )r7   r9   r(   inner0   s    
ztype_casts.<locals>.inner)	functoolswraps)r)   r*   r+   rA   r'   r@   r(   
type_casts+   s    rD   T)r*   r+   )r*   )r/   dimc                 C   s$   t ||   D ]}| d} q| S )N)rangerE   	unsqueeze)r/   rE   _r'   r'   r(   _unsqueeze_to_dim\   s    rJ   out_gradyc                 C   s   | d||     S Nr   Zconj_physicalrK   r'   r'   r(   tanh_backwardb   s    rP   c                 C   s   | |d|     S rN   rO   rK   r'   r'   r(   sigmoid_backwardh   s    rQ   )rL   r/   beta	thresholdc                 C   s.   ||   }t|| |k| | | |d  S N      ?)exptorchwhere)rL   r/   rR   rS   zr'   r'   r(   softplus_backwardn   s    rZ   )grad_outputalphascaleinput_scale	is_resultself_or_resultc           	      C   sf   || }|}|}|r6t |dk| | ||  || S t |dk| | | t ||  | | S d S Nr   )rW   rX   rV   )	r[   r\   r]   r^   r_   r`   ZnegcoefZposcoefZ
negiptcoefr'   r'   r(   elu_backwardu   s    
rb   c                 C   s   t | |S r2   )rW   	full_likeselfvaluer'   r'   r(   fill_scalar   s    rg   rf   c                    s,   t   dk fdd t|   S )Nr   c                      s   d    dS )Nz@fill only supports 0-dimension value tensor but got tensor with z dimensionsrE   r'   rh   r'   r(   <lambda>       zfill_tensor.<locals>.<lambda>)r;   checkrE   rW   rc   itemrd   r'   rh   r(   fill_tensor   s
    

rn   )re   returnc                 C   s    t jt j| d ddddd S N   r   min   maxrW   clampre   r'   r'   r(   hardsigmoid   s    rz   r[   re   c                 C   s   t |dk|dk @ | d dS )Ng      g      @gUUUUUU?        rW   rX   r{   r'   r'   r(   hardsigmoid_backward   s
    r~   r[   re   Zmin_valmax_valc                 C   s   t ||k||kB d| S Nr|   r}   r   r'   r'   r(   hardtanh_backward   s    r   grad_outre   lambdc                 C   s   t || k||k@ d| S r   r}   r   r'   r'   r(   hardshrink_backward   s    r   c                 C   s$   | t jt j| d dddd d S rp   rw   ry   r'   r'   r(   	hardswish   s    r   )r[   re   ro   c              
   C   s,   t |dk dt |dk| |d d  | S )Nr|   rq         ?r}   r{   r'   r'   r(   hardswish_backward   s
    r   r[   re   rS   c                 C   s   t ||kd| S r   r}   r   r'   r'   r(   threshold_backward   s    r   r[   re   negative_slopeself_is_resultc                 C   s   t |dk| | | S ra   r}   r   r'   r'   r(   leaky_relu_backward   s    r   none)gradre   approximatec                 C   s   d}d}d}|dkr|| d }d}|| }|| }	||||	   }
t |
}d| }d| }d| }d||  }|dd| |   }|| | }| ||  S |}|| d }ddt ||   }|t || d	  }| |||   S d S )
Ng;f?g;f?gmBP?tanhr   gHm?r   rq   g      )rW   r   erfrV   )r   re   r   ZM_SQRT2Z	M_SQRT1_2Z
M_2_SQRTPIZkBetaZkKappaZx_sqZx_cuberA   Z
tanh_innerleftrightZleft_derivativeZtanh_derivativeZinner_derivativeZright_derivativeZkAlphaZcdfZpdfr'   r'   r(   gelu_backward   s,    
r   )r[   inputc                 C   s:   t t|}t |}|| d||   }| ||  S rN   )rW   r   FZsoftplussigmoid)r[   r   Zinput_tanh_softplusZinput_sigmoidoutr'   r'   r(   mish_backward   s    
r   c                 C   s   | t |  S r2   )rW   r   ry   r'   r'   r(   silu   s    r   c                 C   s,   ddt |   }| | d|d|    S rN   )rW   rV   )r[   re   r   r'   r'   r(   silu_backward  s    r   )r[   re   r   ro   c                 C   s   t || k||k@ d| S r   r}   )r[   re   r   r'   r'   r(   softshrink_backward  s    r   )re   weightro   c                 C   s   t | dk| ||  S ra   r}   )re   r   r'   r'   r(   _prelu_kernel  s    r   )r[   re   r   ro   c                 C   s4   t |dk| ||  }t |dkd||  }||fS )Nr   r|   r}   )r[   re   r   Z
input_gradZweight_gradr'   r'   r(   _prelu_kernel_backward  s    r   )r[   re   noiseloweruppertrainingr   ro   c                 C   s:   |r|| dkr|  |S || d }t| |||S d S )Ngư>r    )mulatenr   )r[   re   r   r   r   r   r   r   r'   r'   r(   rrelu_with_noise_backward"  s    
r   )r[   re   bufferro   c                 C   sN   |dk }t |dd}t |dd}t t | }| |||d|     S )Nr   r   rF   )rW   rX   rV   abs)r[   re   r   Zin_negativeZ	max_derivsignrY   r'   r'   r(   log_sigmoid_backward6  s
    r   loss	reductionc                 C   s4   |t jjkrt| S |t jjkr,t| S | S d S r2   )r   r%   rf   rW   meanr&   sumr   r'   r'   r(   apply_loss_reductionB  s
    

r   dtypec                 C   s4   | t jkrt jS | t jkr t jS | t jkr0t jS d S r2   )rW   Z	complex32float16Z	complex64float32Z
complex128float64r   r'   r'   r(   to_real_dtypeK  s    


r   )re   targetr   ro   c                 C   s   | | d }t ||S )Nr    )r   )re   r   r   r   r'   r'   r(   mse_lossZ  s    r   )r[   r   r   r   c                 C   s,   |t jjkrd|  nd}|||  |  S )N       @)r   r%   rf   numel)r[   r   r   r   normr'   r'   r(   mse_loss_backwardc  s    r   )r[   re   r   r   deltac              
   C   s`   |t jjkrd|  nd}|| }t|| k | |  | t||k||  | || |  S rT   )r   r%   rf   r   rW   rX   )r[   re   r   r   r   r   r/   r'   r'   r(   huber_loss_backwardl  s     r   )r[   re   r   r   r   
grad_inputc                 C   s*   t | ||||}t||j t||ddS )NT)Z	copy_fromZcopy_toZexact_dtype)r   r   shaper   )r[   re   r   r   r   r   resultr'   r'   r(   huber_loss_backward_out{  s    
r   )r[   re   r   r   r   ignore_indextotal_weightro   c                 C   s   |  dk rdnd}|tjjkr(| | } ||}t||k|d}t|}	t|	||d}	|	  |     krzdkrn n
| |} |d urdd t	|  D }
|j
d |
|< ||
}| | } t||k| d} |	|  S )Nr    r   r   g      c                 S   s   g | ]}d qS )r   r'   r.   rI   r'   r'   r(   r0     rk   z&_nll_loss_backward.<locals>.<listcomp>)rE   r   r%   rf   rH   rW   rX   
zeros_likescatterrG   r   reshape)r[   re   r   r   r   r   r   channel_dimsafe_targetr   Z	new_shaper'   r'   r(   _nll_loss_backward  s     	

 

r   )r[   re   rE   ro   c           
      C   s   |  dksJ dt|  |}||}|d dksNJ d| d| |d }||d|}||||}t|}d| | | |  }	||  }tj||	g|dS )Nr   z*glu does not support 0-dimensional tensorsr    z.Halving dimension must be even, but dimension z	 is size rU   ri   )rE   r;   canonicalize_dimsizenarrowrW   r   cat)
r[   re   rE   Zwrap_dimZnInZ	inputSizeZ	firstHalfZ
secondHalfZgradInputFirstHalfZgradInputSecondHalfr'   r'   r(   glu_backward  s    


r   c                 C   sx  d|    krdks"n J d|  dks6J d|  dkoL|  dk}|s|jd |jd ksJ d|j d|j d| dksJ d	|j d
|  df|d u s| |jd ksJ d|tjjkr8|  dkr8|   dkr| jd |jd ksdJ d|jd  d|    d| jd  n,|   dkrT|  dksdJ d| j t| ||||||S )Nr   r    input tensor should be 1D or 2Dr   ;0D or 1D target tensor expected, multi-target not supportedsize mismatch (got input: 
, target: ):expected total_weight to be a single element tensor, got: z (z
 elements)rF   z<weight tensor should be defined either for all or no classesz7Expected a tensor of dimension 1 and tensor.size[0] == z but got: dimension z and tensor.size[0] == z7Expected a single element grad_output tensor, but got: )rE   r   r   r   r$   rf   r   )r[   re   r   r   r   r   r   no_batch_dimr'   r'   r(   nll_loss_backward  sL    
"
&


r   c                 C   s   |  dksJ d|   |  dks<J d|   |jd |jd krx|jd |jd krx|jd |jd ksJ d|j d	|j | dksJ d
|j d|  dt| ||||||S )N   zSonly batches of spatial inputs supported (4D tensors), but got input of dimension: rq   zUonly batches of spatial targets supported (3D tensors) but got targets of dimension: r   r    r   r   r   r   z ( z, elements))rE   r   r   r   )r[   re   r   r   r   r   r   r'   r'   r(   nll_loss2d_backward  s4    

r   )re   r   r   r   ro   c              	   C   s\   |d t t |  | dd |t t | | dd  }|d urR|| }t||S )Nr   r'   i)rW   maximumlog1pnew_fulllogr   )re   r   r   r   r   r'   r'   r(   binary_cross_entropy  s    
r   )r[   re   r   r   r   ro   c                 C   sR   d}| ||  t j|d|  |d }|d ur6|| }|tjjkrN||  }|S )Ng-q=r   rr   )rW   rx   r   r%   rf   r   )r[   re   r   r   r   ZEPSILONr   r'   r'   r(   binary_cross_entropy_backward   s    	"r   )r   r   r   ro   c                 C   s    t t |  | }t||S r2   )rW   r   rV   r   )r   r   r   r   r'   r'   r(   soft_margin_loss2  s    r   )r[   re   r   r   ro   c                 C   s6   ||  t || d  }|tjjkr2||  }|S rN   )rW   r   r   r%   rf   r   )r[   re   r   r   r   r'   r'   r(   soft_margin_loss_backward>  s    r   )x1x2ro   c           	      C   s   |  ddd}tj|tjd}| ddd}tj|tjd}t| d||gd}t|||gd}||j}|	d
 S )Nr    rF   Tmemory_formatr   )powr   rW   	ones_likecontiguous_formatr   r   matmulmT	clamp_minsqrt)	r   r   Zx1_normZx1_padZx2_normZx2_padZx1_Zx2_r   r'   r'   r(   _euclidean_distL  s    r   )r[   input_sizesrE   startendstepc                 C   s   |  |}t|| ||||S r2   )	new_zerosrW   Zslice_scatter)r[   r   rE   r   r   r   r   r'   r'   r(   slice_backwardX  s    	
r   r   )re   rE   r   r   r   c                 C   sB  |   }|dkrtdt|   |}t|  }t|  }|dkrPtd|d ur\|nd}|d url|ntj}	|dk r||| 7 }|	dk r|	|| 7 }	|dk rd}n||| kr|| }|	|k r|}	n|	|| kr|| }	| 	 |||   }
|	| }|| d | ||< ||  |9  < | j
r0tdn| |||
S d S )Nr   z,slice() cannot be applied to a 0-dim tensor.zslice step must be positiver   z<Slice decomposition for quantized tensors aren't implemented)rE   RuntimeErrorr;   r   listr   stridesysmaxsizestorage_offsetZis_quantizedNotImplementedErrorZ
as_strided)re   rE   r   r   r   ndimsizesstridesZ	start_valZend_valr   lenr'   r'   r(   slice_forwarde  s>    
r  )r[   r   rE   indexc                 C   s   |  |}t|| ||S r2   )r   rW   Zselect_scatter)r[   r   rE   r  r   r'   r'   r(   select_backward  s    
r  )r[   r   offsetdim1dim2c                 C   s   |  |}t|| |||S r2   )r   rW   Zdiagonal_scatter)r[   r   r  r	  r
  r   r'   r'   r(   diagonal_backward  s    
r  r[   r   input_dtypec                 C   s   | j |kr||}|S r2   )r   r4   r  r'   r'   r(   _cast_grad_to_input_dtype  s    

r  )r[   outputrE   r  c                 C   s0   | | }||t j||dd  }t| || S NT)rE   keepdim)rW   r   r  
contiguous)r[   r  rE   r  Znew_grad_outputr   r'   r'   r(   _softmax_backward_data  s
    
r  c                 C   s*   | t |t j| |dd  }t| ||S r  )rW   rV   r   r  )r[   r  rE   r  r   r'   r'   r(   _log_softmax_backward_data  s    
r  c           
      C   sZ   | |d  ||d   }t tjtj|d}|d||d}|d|| |d}	||	 S )z/Utility function to implement im2col and col2imr    r   r   devicer   rF   )r   rW   arangeint64rH   )
Zinput_dZkernel_dZ
dilation_dZ	padding_dZstride_dr  Zblocks_dZ	arange_kwZblocks_d_indicesZkernel_gridr'   r'   r(    _im2col_col2im_indices_along_dim  s
    r  )r   kernel_sizedilationpaddingr   ro   c              	      s(  t tdkdd  t t dkdd  t tdkdd  t tdkdd  ddd	}|d
 | d | ddd |d | jt}t |dv otdd dd  D fdd tdd tdd   D t tdd D  fdd |dk}|s@| d} | j\}}	}
}\}}\}} \}}\}}t|
||||| j	}t|||||| j	}t
| ||||f}|dd}|d d d d ||f }|dddddd}|d}|d}|||	| | || }|s$|d}|S ) Nr    c                   S   s   dS )Nz"im2col(): only 2D kernel supportedr'   r'   r'   r'   r(   rj     rk   zim2col.<locals>.<lambda>c                   S   s   dS )Nz$im2col(): only 2D dilation supportedr'   r'   r'   r'   r(   rj     rk   c                   S   s   dS )Nz#im2col(): only 2D padding supportedr'   r'   r'   r'   r(   rj     rk   c                   S   s   dS )Nz"im2col(): only 2D stride supportedr'   r'   r'   r'   r(   rj     rk   Tc                 S   s<   |rt dd | D nt dd | D }t|dd  d S )Nc                 s   s   | ]}|d kV  qdS r   Nr'   r.   pr'   r'   r(   	<genexpr>  rk   z1im2col.<locals>.check_positive.<locals>.<genexpr>c                 s   s   | ]}|d kV  qdS r  r'   r  r'   r'   r(   r     rk   c                   S   s   dS )Nz<{param_name} should be greater {'than' zero, but got {param}r'   r'   r'   r'   r(   rj     rk   z0im2col.<locals>.check_positive.<locals>.<lambda>allr;   rl   param
param_namestrictcondr'   r'   r(   check_positive  s    (zim2col.<locals>.check_positiver  r  r  Fr&  r   rq   r   c                 s   s   | ]}|d kV  qdS r  r'   r.   dr'   r'   r(   r     rk   zim2col.<locals>.<genexpr>r   c                      s   dt   S )NzmExpected 3D or 4D (batch mode) tensor for input with possible 0 batch size and non-zero dimensions, but got: tupler'   r   r'   r(   rj     s   c                 s   s<   | ]4\}}}}}d |d|  ||d    d  |  V  qdS )r   r    Nr'   r.   r   padZdilZkerstr'   r'   r(   r     s   r   c                 s   s   | ]}|d kV  qdS r  r'   )r.   cr'   r'   r(   r     rk   c                      s6   dt dd   d d  d d d dS )	Nz!Given an input with spacial size r   , kernel_size=, dilation=
, padding=	, stride=z9, the calculated shape of the array of sliding blocks is z*, but its components must be at least one.r-  r'   r  r  output_sizer  r   r   r'   r(   rj     s   r   r   rF   r   rq      )T)r;   rl   r  r   r"  r.  ziprH   r  r  r   r1  permuter   r   squeeze)r   r  r  r  r   r(  r  batched_inputZ	batch_dimr   Zinput_hZinput_wstride_hstride_w	padding_h	padding_w
dilation_h
dilation_wkernel_hkernel_wZblocks_row_indicesZblocks_col_indicesZpadded_inputr  Znum_blocks_rowZnum_blocks_colr'   r8  r(   im2col  sd    




 




rG  )r   r9  r  r  r  r   ro   c              
      s  t tdkdd  t tdkdd  t tdkdd  t tdkdd  t tdkdd  d$d	d
}|d |d |ddd |d |d | jt}t |dv otdd dd  D fdd d d  }t d | dkfdd dd tD }	|	d |	d   t d  k fdd t  dk fdd |dk}
|
s| d} | j\}}\}}\}}\}}\}}| d d | g |	 } | dddd dd!} t	|||||| j
}t|d }t	|||||| j
}d"d tD }| d d t g| }d d ||f}tj||| dd#}t|| | | | f}|
s|d}|S )%Nr    c                   S   s   dS )Nzonly 2D output_size supportedr'   r'   r'   r'   r(   rj   <  rk   zcol2im.<locals>.<lambda>c                   S   s   dS )Nzonly 2D kernel supportedr'   r'   r'   r'   r(   rj   =  rk   c                   S   s   dS )Nzonly 2D dilation supportedr'   r'   r'   r'   r(   rj   >  rk   c                   S   s   dS )Nzonly 2D padding supportedr'   r'   r'   r'   r(   rj   ?  rk   c                   S   s   dS )Nzonly 2D stride supportedr'   r'   r'   r'   r(   rj   @  rk   Tc                 S   s<   |rt dd | D nt dd | D }t|dd  d S )Nc                 s   s   | ]}|d kV  qdS r  r'   r  r'   r'   r(   r   C  rk   z1col2im.<locals>.check_positive.<locals>.<genexpr>c                 s   s   | ]}|d kV  qdS r  r'   r  r'   r'   r(   r   C  rk   c                   S   s   dS )Nz9{param_name} should be greater than zero, but got {param}r'   r'   r'   r'   r(   rj   E  rk   z0col2im.<locals>.check_positive.<locals>.<lambda>r!  r#  r'   r'   r(   r(  B  s    (zcol2im.<locals>.check_positiver  r  r  Fr)  r   r9  )r    rq   c                 s   s   | ]}|d kV  qdS r  r'   r+  r'   r'   r(   r   Q  rk   zcol2im.<locals>.<genexpr>r   c                      s   dt   S )NzmExpected 2D or 3D (batch mode) tensor for input with possible 0 batch size and non-zero dimensions, but got: r-  r'   r/  r'   r(   rj   R  s   r   r   c                      s   dd  d  S )Nz|Expected size of input's first non-batch dimension to be divisible by the product of kernel_size, but got input.shape[-2] = r   z and kernel_size=r'   r'   )r  r   r'   r(   rj   X  s   c                 S   s:   g | ]2\}}}}}d |d|  ||d    d  |  qS )r   r    r'   r0  r'   r'   r(   r0   \  s   zcol2im.<locals>.<listcomp>rF   c                      s4   d d d d d d  dd  d	S 
NzGiven output_size=r4  r5  r6  r7  z , expected input.size(-1) to be z	 but got rF   .r'   r'   Lr  r  r9  r  r   r   r'   r(   rj   e  s   c                      s4   d d d d d d  dd  d	S rH  r'   r'   rJ  r'   r(   rj   k  s   rq   r   r:  c                 S   s   g | ]\}}|d |  qS )r    r'   )r.   or  r'   r'   r(   r0     rk   
accumulate)T)r;   rl   r  r   r"  r;  rH   r   r<  r  r  rJ   r   prodr   	index_putr   r1  r=  )r   r9  r  r  r  r   r(  r  Zprod_kernel_sizecolr>  out_hout_wr?  r@  rA  rB  rC  rD  rE  rF  Zindices_rowZindices_colZoutput_padded_sizer  idxr'   rJ  r(   col2im1  s    




 



"

rU  )r[   maskr]   c                 C   s$   | | | |  jt| d}|S )Nr   )type_ascloner;   suggest_memory_format)r[   rV  r]   r?   r'   r'   r(   native_dropout_backward  s    rZ  )r   
input_size	dimensionr   r   ro   c                 C   s   t |dkrt| dS tt ||}tj|| | jtjd}|d||	 }| 
d|d 	||d } | |}t|||| S )Nr   r  r   rF   r   )r  rW   Zsqueeze_copyr;   r   r  r  int32ZunfoldflattenZmovedimr   	index_add)r   r[  r\  r   r   rE   rT  r   r'   r'   r(   unfold_backward  s    
ra  )r[   re   epsro   c              	   C   sx   |d ur>|}d| }t t ||k||k| |d|   dS t t |dk|dk| |d|   |dtdS d S )NrU   r|   r'   nan)rW   rX   logical_andr   float)r[   re   rb  lohir'   r'   r(   logit_backward  s    rh  )r   r  trainc                 C   sJ   |r2t | |k}||  tdd|   }||fS | t j| t jdfS d S )NrU   r   )rW   	rand_likere  r   bool)r   r  ri  Z	bool_maskresr'   r'   r(   native_dropout  s
    rm  )r/   rE   half_to_floatc                 C   s   |   } |r| jtjksJ tj| tjjd\}}| |} | 	 dkrTt
| }ntj| |dd}t
| | }|tj||dd }|s||}|S Nr1   r   T)r  )r  r   rW   halfr;   r<   ELEMENTWISE_TYPE_PROMOTION_KINDDEFAULTr4   r   rV   amaxr   )r/   rE   rn  r7   r9   Zunnormalizedx_maxr   r'   r'   r(   _softmax  s    


rv  c           	      C   s   |   } |r| jtjksJ tj| tjjd\}}| |} | 	 dkrN| }ntj
| |dd}| | }ttjt||dd}|| }|s||}|S ro  )r  r   rW   rq  r;   r<   rr  rs  r4   r   rt  r   r   rV   )	r/   rE   rn  r7   r9   Zshiftedru  Zshifted_logsumexpr   r'   r'   r(   _log_softmax  s     


rw  )re   otherr\   ro   c                 C   s   t j|| |dS Nr\   rW   subre   rx  r\   r'   r'   r(   rsub_Tensor  s    r~  c                 C   s   t j|| |dS ry  r{  r}  r'   r'   r(   rsub_Scalar  s    r  rF   )r   indicespadding_idxscale_grad_by_freqsparsero   c                 C   sN   |   dksJ d|jdkrB| d|}|jdkr>|d}|S | | S d S )Nr    z'weight' must be 2-Dr   r   )rE   r  Zindex_selectr=  )r   r  r  r  r  r   r'   r'   r(   	embedding  s    


r  )r[   r  num_weightsr  r  c                 C   s   t j| t jjd\}}| |} t|tj}|rn||f}t	|}|j
|g|dd}|| }	| |	d } t||k| j}
| |
d}| |f| j|jd   }|j
|g|dd|S )Nrp  TrM  r   r   )r;   r<   rr  rs  r4   r   rW   longr   r   rP  rH   rJ   r  masked_fillr   )r[   r  r  r  r  r7   r9   countsonesZgrad_weights_scalerV  r   grad_weightr'   r'   r(   embedding_dense_backward  s"    


r  r5   c                 C   s   d}| D ]}||9 }q|S rN   r'   )r/   r?   ir'   r'   r(   rO  ;  s    
rO  )re   split_sizesrE   ro   c                 C   sF   t |}g }d}t|D ](}|| }|| ||| ||7 }q|S ra   )r  rG   appendr   )re   r  rE   Z
num_splitssplitsZ	start_idxr  lengthr'   r'   r(   split_with_sizesB  s    
r  )re   
split_sizerE   ro   c                    sx   | j }|| } dkr(|dks"J | gS |  d   }t|} fddt|D }  | |  |d< t| ||S )Nr   r   c                    s   g | ]} qS r'   r'   r.   r  r  r'   r(   r0   Y  rk   zsplit.<locals>.<listcomp>rF   )r   r   rG   rW   split)re   r  rE   r   dim_sizechunksr  r'   r  r(   r  P  s    r  )re   mat1mat2rR   r\   c                 C   sH   |   s |  s t|}t|}|t|| }|dkr<|S |||   S ra   )Zis_floating_point
is_complexintrW   mm)re   r  r  rR   r\   r   r'   r'   r(   addmm_  s    r  )r[   r   r   rstdgammaNCHxWgroupoutput_maskro   c
              	      s  t j| ||dd t j|| dd t j|dd t |    k fdd t jfkfdd t d u p  k fdd t \}
}t |dk fdd t| |	 j
d	gd
}| 	 j
d	gd
}d }d }d }|	d rvd|
  }d urt|d|

d	}t|d|

d	}t|dd|
}nL||

d	}||

d	}t|dtjd|
f|jd}| | | | | | }|  || |  }|d}t|d}t|d}t| |
|t||
| | }||j|j}|	d r|	|
|	|
d  |d j
dgd
 }|	d	 r|j
dgd
}|||fS )NF)Zallow_cpu_scalar_tensorsc                      s   d    dS )NzExpect input to have z	 elementsr'   r'   )r  r  r  r'   r(   rj     rk   z,native_group_norm_backward.<locals>.<lambda>c                      s   d  d dj  S )NzExpect mean to have shape (, z
, but got r/  r'   )r  r  r   r'   r(   rj     rk   c                      s    d  dd ur  nd S )NzExpect gamma to have z elements but got rF   r   r'   )r  r  r'   r(   rj     rk   r   c                      s   d  d S )NzExpect number of channels z, to be evenly-divisible by number of groups r'   r'   )r  r  r'   r(   rj     rk   r    ri   rU   rF   r   r  r   )r;   Zcheck_same_deviceZcheck_same_shaperl   r   r   divmodrW   r   viewr   rH   r   r  r  rJ   r4   r   )r[   r   r   r  r  r  r  r  r  r  ZcpgZ_remZdsdbd_inputZd_gammad_biassZds_valZdb_valc1c2c3r'   )r  r  r  r  r  r   r(   native_group_norm_backwards  s    
 

""



$
r  )r/   ro   c                 C   s   | d ur|  |S | S r2   r4   )r/   r   r'   r'   r(   _maybe_cast  s    
r  )	r   r   normalized_shaper   r  r   biasr  ro   c           !         s<  |j }| }	t|j  fdd| |||fD \}
}}}|
d usHJ |	t| }||d  }|d | }g }g }t|	D ]"}||kr|| q||| q|t|}t|}|dks|dkr|d r|	|nd |d r|	||d  nd |d r|	||d  nd fS || | }|d ur4|
| }n|
}|| }t
||d}t
||}t
||d}t
||}|| | }d }d }d } |d r|| | }|d r|d urt|dkrt
|
| |d}n|
| }|d r|d urt|dkrt
|
|d} n|
 } t||jt||jt| |jfS )Nc                    s&   g | ]}|d ur|   n|qS r2   )r4   r  r-   r6   r'   r(   r0     s   z.native_layer_norm_backward.<locals>.<listcomp>r   r   r    TF)r   rE   r;   get_computation_dtyper   r  rG   r  rO  r   rW   r   r   rX  r  )!r   r   r  r   r  r   r  r  input_shapeZ
input_ndimgrad_out_cast
input_castweight_castZ	bias_castaxisZ
inner_dimsZ
outer_dimsZinner_dim_indicesZouter_dim_indicesr  r  MZx_hatZ
grad_x_hatabr  r  r  rA   r  Zd_weightr  r'   r6   r(   native_layer_norm_backward  sd    







r  )
r   r   r  running_meanrunning_varr   momentumrb  
functionalro   c	                 C   sb  dgt td|   }	t| j}
|}|}|rt| j}
| j|
d}tj||	ddd\}}t	|| }| | | }t
||	}t
||	}|d ur|| d| |  }|s|| |d ur|  | jd  }t
||	}|||d   }|| d| |  }|s|| n|d ur.|d us2J |j|
dd}|}|j|
dd}|}|}dt||  }| jjdkr|}|}n| d	}| d	}t||  d }t||  d }| | | }|d u r| d
}|d u r| d
}t||  d }t||  d }|| | }| jjdkrJ|j| jd}|j| jd}|j| jd||||fS )Nr   r    r   T)rE   Z
correctionr  r   )r   copycpur   r'   )r   rG   rE   r;   r  r   r4   rW   Zvar_meanrsqrtr=  copy_r   r   r   r  typer   rJ   Znew_ones)r   r   r  r  r  r   r  rb  r  Zreduction_dimsr7   new_running_meannew_running_varZ	input_accZ
biased_varr   r  r  	save_mean	save_rstdnZsqueezed_varZunbiased_varinvstdr'   r'   r(   native_batch_norm_helper  sp    








r  )	r   r   r  r  r  r   r  rb  ro   c              
   C   s,   t | |||||||d	\}}	}
}}||	|
fS NFr  r   r   r  r  r  r   r  rb  r  r  r  rI   r'   r'   r(   native_batch_normp  s    r  c              
   C   s\   |d u r$|d u r$t | |||||S |d u r4td|d u rDtdt | |||||||S )Nz`running_mean is None, but running_var is provided. They should both be None or both be provided.z`running_var is None, but running_mean is provided. They should both be None or both be provided.)r   _native_batch_norm_legitr   )r   r   r  r  r  r   r  rb  r'   r'   r(   native_batch_norm_decomposition  s    r  )ro   c                    s|   |  |}|| d |   dkrh|dkrh fdd|D }  | |  ||d < tjjj| ||S tjjj|  |S )Nr   r   c                    s   g | ]} qS r'   r'   r   r  r'   r(   r0     rk   z(unsafe_chunk_py_impl.<locals>.<listcomp>)r   rW   opsr   unsafe_split_with_sizesdefaultunsafe_splitr   )tensorr  rE   r  r  r'   r  r(   unsafe_chunk_py_impl  s    
r  c              
   C   s,   t | |||||||d	\}}	}
}}||	|
fS r  r  r  r'   r'   r(   r    s    r  )r   r   r  r   r  rb  ro   c           
   
   C   s,   t | ||d d |||d	\}}}}	}	|||fS r  r  )
r   r   r  r   r  rb  r  r  r  rI   r'   r'   r(   !_native_batch_norm_legit_no_stats  s    	r  c              
   C   sP   t | |||||||d	\}}	}
}}|d us2J d|d usBJ d||	|
||fS )NTz#new_running_mean should not be Nonez"new_running_var should not be Noner  )r   r   r  r  r  r   r  rb  r  r  r  r  r  r'   r'   r(   #_native_batch_norm_legit_functional  s    r  c                 C   sB   |d u sJ t | |k jt jd}|| |  d|  }||fS )Nr   rU   )rW   rj  r4   uint8rW  )r   r  	generatorrV  rl  r'   r'   r(   _fused_dropout_decomposition  s    r  )r   layoutr  
pin_memorynon_blockingr   )r/   r   r  r  r  r   c                C   s   |r|t jksJ d|r"J d|d u rB|d u rB|d u rB|  S d}|d ur|| jkr|d ur||jdkr|t j| |} d}t j| |} |d ur|st j| |} |d urt j| |dS | S )NZTODOFr  Tr   )rW   ZstridedrX  r  r  _primsZconvert_element_typeZ
device_put)r/   r   r  r  r  r  r   Zdtype_convertedr'   r'   r(   _to_copy  s    r  c                 C   s
   t | S r2   )r   aliasr5   r'   r'   r(   nop_decomposition  s    r  )r   r   r  r  r  r   exponential_average_factorepsilonc              
   C   s^   t | |||||||\}}	}
|r:||	|
| jdtjdfS ||d|d| jdtjdfS )Nr  r   )r   r  r   rW   r  )r   r   r  r  r  r   r  r  r  r  r3  r'   r'   r(   cudnn_batch_norm  s"    
r  c                 C   sD   t |D ]6\}}|dkr|| jk r4| j| || ks| |} q| S rN   )	enumerater  r   rH   )r/   broadcast_maskr  rV  r'   r'   r(   _broadcast_batch_norm_backward?  s    $r  )r   r   r   r  r  r  save_invstdri  rb  r  ro   c
           &         s  |j }
|d ur|j }n|
}t|j   fdd| ||||||fD \}}}}}}}|j}| }|dksrJ dd}tt|||  }|}|}|r|d ur|d usJ n&|d ur|d usJ |}t|| }dg| }|| ||< g }t	|D ]}||kr|
| qt||}d| }t||}t|||  |}t|| |}tt|| || |} |d u rt||d }!nt|| |}!|r|| |  }"||" | |! }#n||! }#|	d r|| }$nd }$|	d r|}%nd }%|#|
t|$|t|%|fS )Nc                    s"   g | ]}|d ur|  n|qS r2   r  r-   r6   r'   r(   r0   a  s   z.native_batch_norm_backward.<locals>.<listcomp>r    z$rank of the input must be at least 2r   rU   )r   r;   r  r   rE   rO  r   rW   r  rG   r  r  r   r   r4   r  )&r   r   r   r  r  r  r  ri  rb  r  r  Zweight_dtyper  r  r  Zrunning_mean_castZrunning_var_castZsave_mean_castZsave_invstd_castr  Z
input_rankr  Znum_featuresr   r  r  Zreduction_axesr  r   Zgrad_output_sumZdot_pZ	grad_meanZ
proj_scaleZ
grad_scaleZprojr   r  Z	grad_biasr'   r6   r(   native_batch_norm_backwardF  s    	






r  	r   r[   r   r  r  r  Zsave_varr  ZreserveSpacec	           	      C   s    t || |||||d|g d
S )NT)TTT)r   r  r  r'   r'   r(   cudnn_batch_norm_backward  s    r  )r   r9  c                    s  | j  | jttdv fdd | jdd  D ]}t|dkfdd q:d |d  dkrԈd |d  dkrtdd	 tdd  |D }td
d	 tdd  ||D }tjj	
| ||S dd dd  fdd}|d |d \}}}}	|d |d \}
}}}| dt|d|
f }|	sV|sVtj|ddS dd }|||||	dd\}}|||||dd\}}d }tt|jd t|jd D ]B\}}|d u r|d|d d |f }n||d|d d |f  }q|||  S )Nr*  c                      s
   d  S )Nz9adaptive_avg_pool2d(): Expected 3D or 4D tensor, but got r'   r'   r  r'   r(   rj     rk   z%adaptive_avg_pool2d.<locals>.<lambda>r   r   c                      s   dt   dS )Nzjadaptive_avg_pool2d(): Expected input to have non-zero size for non-batch dimensions, but input has shape rI  r-  r'   r/  r'   r(   rj     s   rF   c                 s   s   | ]\}}|| V  qd S r2   r'   )r.   r  rL  r'   r'   r(   r     rk   z&adaptive_avg_pool2d.<locals>.<genexpr>c                 s   s$   | ]\}}}||d  |  V  qdS )r   Nr'   )r.   r  rL  r  r'   r'   r(   r     s   c                 S   s   t j| | |ddS )NtruncZrounding_moderW   divr  r  r3  r'   r'   r(   start_index  s    z(adaptive_avg_pool2d.<locals>.start_indexc                 S   s    t j| d | | d |ddS )Nr   r  r  r  r  r'   r'   r(   	end_index  s    z&adaptive_avg_pool2d.<locals>.end_indexc                    s   t j| t jd}||| }| | d }| | }|dkpD|| dk }|rV|d7 }n|dkrf|d8 }t j| t jd}|d| }|rt j| d |j|jd}	t ||	}||| }
|
| }n|}||||fS )Nr]  r   r   rF   r  )rW   r  r  rH   Zscalar_tensorr   r  minimum)in_sizeout_sizeZorangeZi0Z	maxlengthZin_size_modadaptive	range_maxrT  maxvali1r  )r  r  r  r'   r(   compute_idx  s(    

z(adaptive_avg_pool2d.<locals>.compute_idx.r   )r   rF   ri   c                 S   sd   t |tr| |fS |dk sJ ||dk}|dkr>t|d}t| |d} t|| }| |fS d S )Nr   rF   r   r   r|   )r,   r   rH   rJ   rW   r  )valsr  r  r  rE   rV  r'   r'   r(   
maybe_mask  s    

z'adaptive_avg_pool2d.<locals>.maybe_mask)r  rE   r   )r  r   r  r;   rl   r.  r;  rW   nnr  Z
avg_pool2drJ   r   r   rG   )r   r9  r,  r   kernelr  ZidxhZlength_hZrange_max_hZ
adaptive_hZidxwZlength_wZrange_max_wZ
adaptive_wr  r  retr  jr'   )r  r  r  r   r  r(   adaptive_avg_pool2d  sN    

(  



&
r	  rz  r/   rE   r  r  r\   c                C   s   t | |||d|dS )NTinplacer\   
_index_addr
  r'   r'   r(   
index_add_,  s    	r  c                C   s   t | |||d|dS )NFr  r  r
  r'   r'   r(   r`  8  s    
r`  )r/   rE   r  r  r  r\   c                   s   t | j|}t jdkfdd  dkrnt | jt tkpVt t  fdd |  }| jdk}|r| 	dn| }d| f }|rt
jnt
j}	|	|||dd}
|r| S |r|
dS |
 S d S )	Nr   c                      s   d j  dS Nz(Index should have dimension 1 or 0 (got r   r  r'   r  r'   r(   rj   Q  rk   z_index_add.<locals>.<lambda>c                      s   dt   d dS )Nzalpha argument of type z cannot be safely cast to type !)r  r'   )r\   python_typer'   r(   rj   X  rk   r   r2   TrM  )r;   canonicalize_dimsr  rl   Zdtype_to_typer   rk  Zis_weakly_lesser_typer  rH   r   
index_put_rP  r=  r  )r/   rE   r  r  r  r\   zero_dimr   rT  rP  r   r'   )r\   r  r  r(   r  E  s*    	

r  r/   rE   r  r  c                 C   s   t | |||ddS )NTr  _index_copyr  r'   r'   r(   index_copy_g  s    r  c                 C   s   t | |||ddS )NFr  r  r  r'   r'   r(   
index_copyl  s    r  )r/   rE   r  r  r  c          
         s   t | j|}t  jdk fdd | jdk}|r@| dn| }d|  f }|r\tjntj}||||}	|rv| S |r|	dS |		 S d S )Nr   c                      s   d j  dS r  r  r'   r  r'   r(   rj   x  rk   z_index_copy.<locals>.<lambda>r   r2   )
r;   r  r  rl   rH   r   r  rP  r=  r  )
r/   rE   r  r  r  r  r   rT  rP  r   r'   r  r(   r  r  s    

r  r  r   c                 C   sL   t | d| }t t |  }| jr6| d}n|}|t | |fS )Nr'   r  )rW   r  r   rV   r   Zis_cudar   )re   rs   rY   r   r'   r'   r(   log_sigmoid_forward  s    r  r|   rU   r/   lowhighc                 C   s"   t j| jt|t|| j| jdS )N)r  r   r   r  )primsZ_uniform_helperr   r   r   r  r  r'   r'   r(   uniform  s    r"  c                 C   s(   |d u sJ |  || t|  | S r2   )r  rW   rj  )re   r  r   r  r'   r'   r(   uniform_  s    r#  c                 C   s   t | d }|d urDt|d u dd  tt ||kdd  |S |d urt|d u dd  tt ||kdd  g }t|D ]J\}}t||kr|| |d  t|  q|t| |d  |  q|S tddd  d S )	Nr    c                   S   s   dS Nz9Must specify exactly one of output_size and scale_factorsr'   r'   r'   r'   r(   rj     rk   z.upsample_compute_output_size.<locals>.<lambda>c                   S   s   dS N r'   r'   r'   r'   r(   rj     rk   c                   S   s   dS r$  r'   r'   r'   r'   r(   rj     rk   c                   S   s   dS r%  r'   r'   r'   r'   r(   rj     rk   Fc                   S   s   dS r$  r'   r'   r'   r'   r(   rj     rk   )r  r;   rl   r  r  r  r   )r[  r9  scale_factorsZspatial_dimensionsr  r  r'   r'   r(   upsample_compute_output_size  s.    r(  c                 C   s   | d u rd S | | S r2   r'   )scalesrT  r'   r'   r(   get_scale_value  s    r*  c                 C   s&   t |  ||}t|d}t| ||S ra   )r(  r   r*  upsample_nearest1d)r   r9  r'  osizer]   r'   r'   r(   upsample_nearest1d_vec  s    
r-  c                 C   s2   t |  ||}t|d}t|d}t| |||S Nr   r   )r(  r   r*  upsample_nearest2d)r   r9  r'  r,  scale_hscale_wr'   r'   r(   upsample_nearest2d_vec  s    

r2  c                 C   s>   t |  ||}t|d}t|d}t|d}t| ||||S )Nr   r   r    )r(  r   r*  upsample_nearest3d)r   r9  r'  r,  Zscale_dr0  r1  r'   r'   r(   upsample_nearest3d_vec  s
    


r4  c                 C   s   g }t |}t|D ]}|| }tj|| j| jd}| j| |  }|| d ur`||||   n|| }	||	 tj}
t|d | D ]}|
	d}
q|
|
 qt|S )Nr  r   rF   )r  rG   rW   r  r   r  r   r4   r  rH   r  r.  )r   r9  r)  r  Znum_spatial_dimsr,  r,  Zoutput_indicesisizer]   Zinput_indicesrI   r'   r'   r(   !_compute_upsample_nearest_indices  s    $r6  )r   r9  r)  ro   c                 C   s*   t | ||f\}| d d d d |f }|S r2   r6  )r   r9  r)  Z	l_indicesr   r'   r'   r(   r+    s    r+  )r   r9  scales_hscales_wro   c           
      C   sn   t | |||f\}}| d d d d ||f }t| }| j\}}	}}| jjdkr^|	dk r^tj}|j|d}|S )Ncudar   r   )	r6  r;   rY  r   r  r  rW   r   r  )
r   r9  r8  r9  	h_indices	w_indicesr   r   rI   
n_channelsr'   r'   r(   r/    s    	

r/  )r   r9  scales_dr8  r9  ro   c           	      C   s6   t | ||||f\}}}| d d d d |||f }|S r2   r7  )	r   r9  r>  r8  r9  Z	d_indicesr;  r<  r   r'   r'   r(   r3  +  s
    

r3  c                    sb   |r|rd n|rd n|r"d nd t   dksBJ t  fddtdt  D S )Nr:  r   rq   r    r   c                    s    g | ]}t ||   qS r'   r-  r  Z
group_sizeparamsr'   r(   r0   H  s   z!gather_params.<locals>.<listcomp>)r  rG   )r@  
has_biasesZhas_projectionsr'   r?  r(   gather_params=  s    rB  c                 C   sh   |rB| d|  |d|   }}| d| d  |d| d   }}n| | ||  }}d\}}||||fS )Nr    r   NNr'   )r@  hiddensr  bidirectional
cur_params
cur_hiddenbidir_paramsbidir_hiddenr'   r'   r(   params_hiddensM  s    $rJ  c                 C   s2   ||ksJ | | d|||  | dd|S ra   )r  r   )rG  last_batch_size
batch_sizerD  r'   r'   r(   update_hidden_for_packedX  s    rM  c              	   C   s4   ||kr| S ||k sJ t | |d||| fS ra   )rW   concatr   )rG  rK  rL  Z
inp_hiddenr'   r'   r(    update_hidden_for_packed_reverse^  s    rO  c                 C   s&  |d }|d }|r|d nd }	|r,|d nd }
g }g }|rD|d n|d }| dd|}t| t|}|r||d d d }|D ]Z} | jd }||krn"|rt||||}nt||||}|| |||	||
}|}|| q|r|  n|| |  t	|d}|st	|dn|}||fS )Nr   r   r    rq   rF   )
r   rW   r  r   r   rO  rM  r  reverser   )inphiddenr@  rA  	hidden_fnbatch_sizesrP  	ih_weight	hh_weightih_biashh_biasstep_outputrD  rK  rG  	split_inpr  r   
hidden_outr'   r'   r(   one_layer_rnn_datal  s@    


r\  c                    s    fdd}|S )Nc                    s    t ||||  S r2   r   linearr  rG  rU  rW  rV  rX  nonlinearityr'   r(   rA     s    zrnn_cell.<locals>.innerr'   ra  rA   r'   r`  r(   rnn_cell  s    rc  c                    s    fdd}|S )Nc                    s$   t | ||}  t ||||  S r2   r]  r_  r`  r'   r(   rA     s    zrnn_cell_data.<locals>.innerr'   rb  r'   r`  r(   rnn_cell_data  s    rd  c                 C   s   |d }|d }|r|d nd }|r,|d nd }	t | ||}
|rL|
dn|
}
|d}g }|
D ] }|||||||	}|| qb|r|  t|d}||dfS )Nr   r   r    rq   )	r   r^  fliprH   r  rP  rW   r   r=  )rQ  rR  r@  rA  rS  rP  rU  rV  rW  rX  precomputed_inputrG  rY  r  r   r'   r'   r(   one_layer_rnn  s    
rg  c
                 C   s   |r|  ddn| } g }
t|D ]}t||||\}}}}|rN||d k rN|nd}|	| |||\}}|
| |r|	| |||dd\}}|
| |rt||g| d } n|} |dkr |r ||d k r tj| |dd} q |r|  ddn| } | |
fS )Nr   r   r|   T)rP  )ri  )	transposerG   rJ  r  rW   r   rE   dropout)r   rR  r@  rA  
num_layersri  ri  rE  batch_firstZlayer_fnfinal_hiddensr  rF  rG  rH  rI  Zfwd_inpZ
fwd_hiddenZbwd_inpZ
bwd_hiddenr'   r'   r(   _rnn_helper  s*    



rm  c	                 C   sR   | d}	t||d}t| |	|||||||ttttjd
\}
}|
t|dfS Nr   FrS  )	unbindrB  rm  r   rg  rc  rW   r   stackr   hxr@  rA  rj  ri  ri  rE  rk  rR  r   rl  r'   r'   r(   rnn_tanh_input  s    
rt  c	                 C   sR   | d}	t||d}t| |	|||||||ttttjd
\}
}|
t|dfS rn  )	rp  rB  rm  r   rg  rc  rW   relurq  rr  r'   r'   r(   rnn_relu_input	  s    
rv  c	                 C   sT   | d}	t||d}t| |	||||||dtt|ttjd
\}
}|
t|dfS Nr   FrT  rS  )	rp  rB  rm  r   r\  rd  rW   ru  rq  datarT  rs  r@  rA  rj  ri  ri  rE  rR  r   rl  r'   r'   r(   rnn_relu_data&	  s&    
r{  c	                 C   sT   | d}	t||d}t| |	||||||dtt|ttjd
\}
}|
t|dfS rw  )	rp  rB  rm  r   r\  rd  rW   r   rq  ry  r'   r'   r(   rnn_tanh_dataI	  s&    
r|  c                 C   s   t ||||  }|d|}|d  }	|d  }
|d  }|d  }|
| |	|  }||  }|d u rv|nt ||d }||fS )Nr   r   r   r    rq   r   r^  chunkr   r   )rQ  rs  cxrV  rX  	hr_weight	chunk_dimZgatesZchunked_gatesZin_gateZforget_gateZ	cell_gateZout_gatecyZhyr'   r'   r(   	lstm_celll	  s    r  c              
   C   s   |d }|d }|r|d nd }|r,|d nd }t |dkrD|d nt |dkrX|d nd }	|d d}
|d d}t| ||}|r|dn|}g }|D ](} t| |
||||	dd\}
}||
 q|r|  t	|d}||

d|
dffS )Nr   r   r    rq   r:  r   r  )r  rH   r   r^  re  r  r  rP  rW   r   r=  )rQ  rR  r@  rA  rP  rU  rV  rW  rX  r  rs  r  rf  rY  r   r'   r'   r(   one_layer_lstmz	  s$    *r  c              
   C   s  |d }|d }|r|d nd }|r,|d nd }	t |dkrD|d nt |dkrX|d nd }
g }g }|rp|d n|d }t| t|}|r|d d d }|d }|d }|dd||dd| }}|D ]} | jd }t| ||} ||k r:||d||| |d||| f |dd||dd| }}||krt	||d||| fd}t	||d||| fd}t
| ||||	|
dd\}}|}|| q|r|  ||f}n:|||f |  t| \}}t|dt|df}t|d}||fS )	Nr   r   r    rq   r:  r   rF   r  )r  rW   r  r   r   r   r   r^  r  rN  r  rP  r;  r   )rQ  rR  r@  rA  rT  rP  rU  rV  rW  rX  r  rY  rD  rK  rZ  Zorig_hxZorig_cxrs  r  r  r[  Zhidden0Zhidden1r   r'   r'   r(   one_layer_lstm_data	  s\    *



r  c	                 C   s   t |dksJ dt|||d d|d dk}tt|d |d }	t| |	|||||||t
\}
}tt| }|
t|d dt|d dfS )Nr    lstm expects two hidden statesr   r   )	r  rB  r   r   r;  rm  r  rW   rq  rr  r'   r'   r(   	lstm_impl	  s"    $r  c	                 C   s   t |dksJ dt|||d d|d dk}tt|d |d }	t| |	||||||dtt|d
\}
}tt| }|
t	|d dt	|d dfS )Nr    r  r   r   F)rT  )
r  rB  r   r   r;  rm  r   r  rW   rq  ry  r'   r'   r(   lstm_data_impl	  s"    $
r  c                 C   sr   |  dd}t||| dd}|d |d   }|d |d   }	|d |d |   }
||
 |	 |
 S )Nrq   r   r    r   )r~  r   r^  r   r   rQ  rG  rU  rW  rV  rX  Zchunked_igatesZchunked_hgatesZ
reset_gateZ
input_gateZnew_gater'   r'   r(   gru_cell
  s    r  c                 C   s|   t | ||dd}t |||dd}|d |d   }|d |d   }	|d |d |   }
||
 |	 |
 S )Nrq   r   r   r    r}  r  r'   r'   r(   gru_cell_data
  s    r  c	                 C   sJ   t ||d}t| |d||||||dtt|td
\}	}
|	t|
dfS )NFr   rx  )rB  rm  rp  r   r\  r  rW   rq  )rz  rT  rs  r@  rA  rj  ri  ri  rE  r   rl  r'   r'   r(   gru_impl_data(
  s    r  c	                 C   sH   t ||d}t| |d|||||||tttd
\}	}
|	t|
dfS )NFr   ro  )rB  rm  rp  r   rg  r  rW   rq  )r   rs  r@  rA  rj  ri  ri  rE  rk  r   rl  r'   r'   r(   gru_implF
  s    
r  c                 C   s4   t |  ||}t|d}t|d}t| ||||S r.  )r(  r   r*  upsample_bilinear2d)r   r9  align_cornersr'  r,  r0  r1  r'   r'   r(   upsample_bilinear2d_vecd
  s    

r  )r   r9  r  r8  r9  ro   c           $      C   s~  | j \}}}}|d }	|d }
|	dkrZ|r<|d |	d  }q^|d urP|||  n||	 }nd}|
dkr|r||d |
d  }q|d ur|||  n||
 }nd}tj|	| j| jd}tj|
| j| jd}|r|| }|| }n0||d  d jdd}||d  d jdd}|tj}t|j|d dtj}|tj}t|j|d dtj}|	d}|	d}|	d}| d d d d ||f }| d d d d ||f }| d d d d ||f }| d d d d ||f }|| }d| }|| }d| }t
||t
|| } t
||t
|| }!t
| |t
|!| }"t| }#| jjd	krn|d
k rntj}#|"j|#d}"|"S )Nr   r   r|   r  r   rr   ru   rU   r:     r   )r   rW   r  r   r  rx   r4   r  ceilrH   r   r;   rY  r  r   r  )$r   r9  r  r8  r9  Zn_batchr=  Zin_hZin_wrR  rS  Zh_scale_factorZw_scale_factorr  r  r/   rM   Zx_floorZx_ceilZy_floorZy_ceilZx_viewZx_floor_viewZx_ceil_viewZv1Zv2Zv3Zv4Zxscale2Zxscale1Zyscale2Zyscale1Zq1Zq2r   r   r'   r'   r(   r  n
  sZ    




r  )r  r  ro   c                 C   s   | j |j kS r2   r/  )r  r  r'   r'   r(   is_same_size
  s    r  c                 G   s   t | |S r2   )r   r  )r/   r   r=   r'   r'   r(   _reshape_alias
  s    r  )re   r   r   r   r   ro   c                 C   s  |   dkr|   dks J d|  dks4J d|   dkoJ|  dk}|s~| jd |jd ks~J d| j d|j d| jd	 }|d u s|  dkr| |ksJ d
| d|j |   }d}|dk rd}|d ur|dkr|dn|}	| |	 } t||k|d}
|
|}t| ||| }t||k|d}|tj	j
krl|dkrl| dd}||fS |d ur|dkr|d| jn|}	t|	|||}t||k|d}| }n||k | }|tjj
kr| }n|tjj
kr
| | }||fS )Nr   r    r   r   r   r   r   r   rF   z/weight tensor should be defined either for all z7 classes or no classes but got weight tensor of shape: r'   r|   )rE   r   r   rH   rW   rX   Zgatherr=  r   r$   rf   r   expandr   r4   r&   r%   )re   r   r   r   r   r   Z	n_classesZn_dimsr   wr   Zsafe_target_r   r   Zwsumr'   r'   r(   nll_loss_forward
  sX     





 

r  )r/   Aro   c                 C   s    |d |  |d  |  |  d S )Nr    rq   r   r'   r/   r  r'   r'   r(   _upsample_cubic_convolution1  s    r  c                 C   s(   ||  d|  |  d|  |  d|  S )Nr:     r   r'   r  r'   r'   r(   _upsample_cubic_convolution2  s    r  )tro   c                 C   s4   d}t | d |t| |td|  |t d|  |fS )Ng      rU   r   )r  r  )r  r  r'   r'   r(    _upsample_get_cubic_coefficients  s    r  )coeffstsro   c                 C   s    t |}tdd t| |D S )Nc                 s   s   | ]\}}|| V  qd S r2   r'   )r.   r  r  r'   r'   r(   r   "  rk   z+_upsample_cubic_interp1d.<locals>.<genexpr>)r  _sum_tensorsr;  )r  r  Zcoeffs2r'   r'   r(   _upsample_cubic_interp1d   s    r  )r  ro   c                 C   s   t tj| S r2   )r   rW   add)r  r'   r'   r(   r  &  s    r  )r  gridinterpolation_modepadding_moder  ro   c                    s  t dv fdd t dv fdd tttdfddttttdd	d
tttdfddtttdfdd}j\}
|j\}}tttd
fddtjjddddtj|jdd|dd tttt	dfddtttd fdd|d }|d }	dkr||}
||	
}|

 |
  d  }}d  }}|| }}||
 ||  }|
| ||  }||
 ||  }|
 |  }tfdd|f|||f|||f|||ffD S dkrH||}
||	
}|
 }| }||dS |}
|	
}|

 |
 |
 | }tttd
fdd 	ttd!	fd"d#tfd$dtd%D }t||dS d S )&N)r   r   r    c                      s
   d  S )NzInvalid interpolation mode r'   r'   )r  r'   r(   rj   5  rk   z!grid_sampler_2d.<locals>.<lambda>c                      s
   d  S )NzInvalid padding mode r'   r'   )r  r'   r(   rj   8  rk   )coordsr   ro   c                    s0    r|d d n|d }|d d }| | | S Nr   r'   )r  r   r   ofs)r  r'   r(   unnormalize;  s    z$grid_sampler_2d.<locals>.unnormalize)r  	twice_low
twice_highro   c                 S   sv   ||krt | S |d }|| d }| |  }t ||}||  jt jd}t |d@ dk|| || | S )Nr    r   r   r   )rW   r   r   fmodfloorr4   Zint8rX   )r  r  r  Z
coords_minZcoords_spanZcoords2extraZflipsr'   r'   r(   reflect_coordinatesF  s    
z,grid_sampler_2d.<locals>.reflect_coordinatesc                    sj   dkr| S dkr&t | d|d S  r@| dd|d  }n| dd| d }t |d|d S d S )Nr   r   r    rF   rw   )r  r   Zcoords_reflected)r  r  r  r'   r(   compute_coordinatesR  s    z,grid_sampler_2d.<locals>.compute_coordinatesc                    s   | |} ||S r2   r'   )r  r   Z	coords_un)r  r  r'   r(   compute_source_index^  s    
z-grid_sampler_2d.<locals>.compute_source_index)xsysro   c                    s,   t d| kt | k t d|k| k S ra   )rW   rd  )r  r  )iHiWr'   r(   in_bounds_conde  s    $z'grid_sampler_2d.<locals>.in_bounds_condr  r   )r  r  wsro   c                    s@   | | t  fdd| jtjd|jtjd|fD S )Nc                 3   s(   | ] }t |d  dV  qdS )r   r   N)rW   rX   r  )r.   r  )r  r'  oHoWr'   r(   r   s  s   z0grid_sampler_2d.<locals>.clip.<locals>.<genexpr>r   )r.  r4   rW   r  )r  r  r  )r  r  r  r  )r'  r(   clipm  s    
zgrid_sampler_2d.<locals>.clip)ixiyro   c                    s&   | ||\}}} ||f | S r2   r'   )r  r  r  Zidx_xZidx_yZw_)C_idxN_idxr  r  r'   r(   get_summandx  s    z$grid_sampler_2d.<locals>.get_summand).r   ).r   r   c                 3   s    | ]\}}} |||V  qd S r2   r'   )r.   r  r  r  )r  r'   r(   r     s   z"grid_sampler_2d.<locals>.<genexpr>c                    s     | } |}||dS rN   r'   )r  r  r/   rM   )r  r  r  r  r'   r(   get_value_bounded  s    

z*grid_sampler_2d.<locals>.get_value_bounded)r  ro   c                    sL   | d  } d | | d | d |f}t |dS )Nr   r    )r  rH   )r  Ziy_ofscs)r  ix_nwiy_nwtxr'   r(   	get_coeff  s    z"grid_sampler_2d.<locals>.get_coeffc                 3   s   | ]} |V  qd S r2   r'   )r.   r  )r  r'   r(   r     rk   r   )r;   rl   r   r  r   rW   r  r  r  r   r  r  roundr.  rG   r  rH   )r  r  r  r  r  r  r  rI   r/   rM   r  r  Zix_neZiy_neZix_swZiy_swZix_seZiy_seZw_nwZw_neZw_swZw_seZ
ix_nearestZ
iy_nearesttyr  r'   )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(   grid_sampler_2d*  sl    	




	





r  c                    s`   t   dko dk fdd t  ddk fdd   jddS )Nr    r   c                      s   d    d   S )Nzmatrix @ vector expected, got r  ri   r'   re   vecr'   r(   rj     rk   zmv.<locals>.<lambda>r   c                      s(   d  d d  d d d S )Nzsize mismatch, got r   r/   r   ,)r   r'   r  r'   r(   rj     rk   ri   )r;   rl   rE   r   r   r  r'   r  r(   mv  s    r  c                    s     rZ rB  r0t    S t  S n  rZt  S t dkot  dk fdd tj	 j	k fdd  fdd}t
  
 k|    S )Nr   c                      s   d   d    dS )Nz1D tensors expected, but got zD and z	D tensorsri   r'   rx  re   r'   r(   rj     rk   zdot.<locals>.<lambda>c                      s   dj  d j  S )Nz:dot : expected both vectors to have same dtype, but found  and r   r'   r  r'   r(   rj     rk   c                	      s.   d   d    d   d    d	S )Nz+inconsistent tensor size, expected tensor [z] and src [z.] to have thesame number of elements, but got r  z elements respectivelyr  r'   r  r'   r(   numel_error  s    zdot.<locals>.numel_error)r  Zis_conjrW   dotZconjZvdotr;   rl   rE   r   r   r   )re   rx  r  r'   r  r(   r    s$    
r  c                 C   s   |   d}|d urV|d | d }d| |  ||  |  |    |   }n,d| |  | |  |  |     }|d ur|| }t||S r.  )r   rV   r   r   )re   r   r   Z
pos_weightr   r   Z
log_weightr   r'   r'   r(    binary_cross_entropy_with_logits  s    
r  )tensor1dim_tensor2ro   c                 C   sr   | j }|dkrj|dks|dkrj| j}|  }|dkrd|dkrd|d dkrd|d |d |d  krddS dS ndS d S )Nrq   r   r    rF   r   FT)r  r   r   )r  r  dim_tensor1Zt1_sizes_ptrZ
t1_stridesr'   r'   r(   should_fold  s    
r  c                 C   s  |   }|  }|dkr |dks$J |dkr@|dkr@t| |S |dkr\|dkr\t| |S |dkr|dkrttt| d|dS |dkr|dkrt| |S t| |st||r~||k}|r|jn| }|s|n|dkr| 	 n| }|j
}t|d d }ttj|}	|  dk}
|
r0||j
d  ||	|d }|
rj|||}|rf|j S |S |||S nF|dkr|dkr|dkr| dnd}| d}| j
d d }|dkr|dn|d}|dkr|dnd}g }t|d D ]}||| qtt||}|||g }|||g }t|}| ||||}|||||}|}|dkr|| |dkr|| |||S tddd  d S )	Nr   r   r    rF   r   Fc                   S   s   dS )Nz/both arguments to matmul need to be at least 1Dr'   r'   r'   r'   r(   rj   z  rk   zmatmul.<locals>.<lambda>)rE   rW   r  r  r=  r  rH   r  r   r  r   r   r   operatorr   r  r   r  r  r   rG   Zbroadcast_shapesrO  r  Zbmmr;   rl   )r  Ztensor2r  r  rh  t1t2Zsizes_1Zoutput_shapeZfolded_dim1Zt2_is_matrixZ	t1_foldedr  r  m1Zbatch_tensor1m2r  Zbatch_tensor2r  Zexpand_batch_portionZtensor1_expand_sizeZtensor2_expand_sizeZexpand_batch_productZtensor1_expandedZtensor2_expandedr'   r'   r(   r     sn    		







r   )r  r9  r  r0  r1  ro   c                    s  j \}}|\}}ddd}	dd }
|	|||}|	|||}tj|jd|dddtj|jdd|dd tj|jddd|df}tj|jdddd|f}|
|||}| }|| |jtjd}|
|||}| }|| }|jtjd}|d ||d |d f}|d ||d |d f fd	d
fddtfdd|D }t	||}t
}|j|d}|S )Nc                 S   sD   |r |dkr| d |d  S dS |d ur8|dkr8d| S | | S d S )Nr   r   r'   )r  r  r  r]   r'   r'   r(   compute_scale  s    z1upsample_bicubic2d_default.<locals>.compute_scalec                 S   s    |r| | S | |d  d S d S r  r'   )r]   Z	dst_indexr  r'   r'   r(   r    s    z8upsample_bicubic2d_default.<locals>.compute_source_indexr  r   r   r    c                    s4   t | dd }t |dd } ||f S r.  rw   )r  r  Zy_idxZx_idx)r  r  r  r  r  r'   r(   load_bounded  s    z0upsample_bicubic2d_default.<locals>.load_boundedc                    s"   t  fddD }t|S )Nc                 3   s   | ]} |V  qd S r2   r'   )r.   Zx_ofs)r  rM   r'   r(   r     rk   zCupsample_bicubic2d_default.<locals>.get_x_interp.<locals>.<genexpr>)r.  r  )rM   Zcoeffs_x)ixs_ofsr  t_x)rM   r(   get_x_interp  s    z0upsample_bicubic2d_default.<locals>.get_x_interpc                 3   s   | ]} |V  qd S r2   r'   )r.   Zy_ofs)r  r'   r(   r     rk   z-upsample_bicubic2d_default.<locals>.<genexpr>r   )N)r   rW   r  r  r  r  r4   r  r.  r  r;   rY  r  )r  r9  r  r0  r1  r  r  r  r  r  r  Zheight_scaleZwidth_scaleZout_yZout_xZreal_xZin_xr  Zreal_yZin_yZt_yr  Ziys_ofsZcoeffs_yr   r   r'   )	r  r  r  r  r  r  r  r  r  r(   upsample_bicubic2d_default}  s6    	


r  )r  r9  r  r'  ro   c                 C   s   t t|t| dkdd  |d u rd|d us4J ttttf tdd t| jdd  |D }|rl|nd\}}t	| ||||S )Nr   c                   S   s   dS )Nz:Must specify exactly one of output_size and scale_factors.r'   r'   r'   r'   r(   rj     rk   z(upsample_bicubic2d_vec.<locals>.<lambda>c                 s   s"   | ]\}}t t|| V  qd S r2   )r   r   )r.   r  r]   r'   r'   r(   r     s   z)upsample_bicubic2d_vec.<locals>.<genexpr>r    rC  )
r;   rl   rk  r   r   r  r.  r;  r   r  )r  r9  r  r'  r0  r1  r'   r'   r(   upsample_bicubic2d_vec  s    
r  c                    s   t |  fdd}|S )Nc                     s    | i |}| d  |S ra   )r  )r=   r>   r   outplace_opr'   r(   
inplace_op  s    z$register_inplace.<locals>.inplace_opr   )Zaten_opr  r  r'   r  r(   register_inplace  s    r  )F)r   )r   NNr   )N)r   )r   )rF   FF)r   )r   )r   r   )r   )N)r|   rU   )r   r   N)N)NN)NNN)F)F)F)F)NN)r   r   F)NN)N(  rB   r  r   enumr   r   r   	itertoolsr   typingr   r   r   r	   r
   r   r   rW   Ztorch._primsr  r!  Ztorch._prims_commonZ_prims_commonr;   Ztorch.nn.functionalr  r  r   r   r   r   Ztorch._decompr   r   r   r   r   Ztorch._prims_common.wrappersr   r   r   r   Z%torch.fx.experimental.symbolic_shapesr   Ztorch.utils._pytreer   r   Z_CZDispatchKeyr   str__annotations__Z_opsr  r   r   rr  rk  rD   rs  Zcompute_only_pw_cast_for_opmathZpw_cast_for_opmathZINT_TO_FLOATZpw_cast_for_int_to_realr  rJ   rP   rQ   rZ   re  rb   fillZScalarrg   rn   rz   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   rf   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   slicer  r  r  r  r  r  r  rG  rU  rZ  ra  rh  rm  rv  rw  Zrsubr~  r  r  r  rO  r  r  r  r  r  r  r  r  r  r  Zpy_implZAutogradr  Zunsafe_chunkZCompositeImplicitAutogradr  r  Zno_statsr  r  Z_fused_dropoutr  r  r  r   detachZliftZ
lift_freshr  r  r  r  r  Z_adaptive_avg_pool2dr	  r  r`  r  r  r  r  r  r"  r#  r(  r*  r+  r  r-  r/  r2  r3  r4  r6  rB  rJ  rM  rO  r\  rc  rd  rg  rm  Zrnn_tanhr   rt  Zrnn_relurv  rz  r{  r|  r  r  r  Zlstmr  r  r  r  Zgrur  r  r  r  r  r  Z_unsafe_viewr  r  r  r  r  r  r  r  r  r  r  r   Zupsample_bicubic2dr  r  r  Zaddbmm_ZaddbmmZaddmm_Zaddmv_ZaddmvZbaddbmm_ZbaddbmmZcumprod_ZcumprodZfill_Zgelu_ZgeluZ
hardswish_Z	hardtanh_ZhardtanhZhardsigmoid_r  rP  Zindex_reduce_Zindex_reduceZleaky_relu_Z
leaky_reluZlogit_ZlogitZrelu_ru  Zrenorm_ZrenormZround_r  Zscatter_r   Zscatter_add_Zscatter_addZscatter_reduce_Zscatter_reduceZsilu_r'   r'   r'   r(   <module>   s  
$
$



	


 *!	
   3

	P`

	

  
 VMQ



cf"
"
 


	


 
  .)


 
 ?

		



 R

@
   
^
 
=
	