U
    d                     @   s  U d dl Z d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
 d dlm  mZ d dlZd dlmZmZ d dlm  mZ d dlmZ g Ze	e ed< e jjZG d	d
 d
eZe
ejdddZej eejj!dZ"ej eejj#dZ$ej eejj%dZ&ee'dddZ(eej)e"eedddZ)eej*e"eedddZ*eej+e"eee,e,dddZ+eej-e"dee,e,e,edddZ-eej.e"ee,e,e,e/eddd Z.eej0e"eed!d"d#Z0eej1e"eed$d%d&Z1eej2e"dee,e,ed(d)d*Z2eej3e"eee,e,d+d,d-Z3eej4e"eee,d.d/d0Z4eej5e"eed!d1d2Z5eej6e"eeed3d4d5Z6eej7e"eee,d6d7d8Z7eej8e"dee,ed:d;d<Z8eej9e"eee,e/d=d>d?Z9eej:e"deeedAdBdCZ:eej;e"deeedDdEdFZ;eej<e"eedGdHdIZ<eej=e"eed!dJdKZ=eej>e"eeed3dLdMZ>eej?eee,edNdOdPZ?eej@e"eeeeeef dQdRdSZ@eejAe"eeee,e,e/e/edTdUdVZAeejBe"eeeedWdXdYZBee'dZd[d\ZCe jDd]d^d_ZEeejFejGjHfeee'ed`dadbZFeejIe"ejGjHfeeee'dcdddeZIeejJe"ejGjHfeee'ed`dfdgZJeejKe"eeee'dhdidjZKeejLe"ejGjHdkfeee'e,edldmdnZLeejMe"eeee'e,dodpdqZMeeeee e'e'eedrdsdtZNeejOeeeee e'e'eedrdudvZOeejPeeeee e'e'eedrdwdxZPeejQe"dejGjHfeeee e'edydzd{ZQeejRe"dejGjHfeeeee e'ed|d}d~ZReejSeeedddZSeejTee	e' e'e'e'e'dddZTeejUee	e' e'e'dddZUeejVee	e' e'e'e'dddZVeejWe"eee'e'dddZWeejXe"eee'e'dddZXeejYee	e' e	e' e	e' e	e' e	e' edddZYeejZee	e' e	e' e	e' e	e' edddZZeej[j\eee,edddZ]eej[jeeeedddZ^eej_e"eee,dddZ_eej`e&deee, edddZ`eejae"deeee, edddZaeejbe"ee,ee/ dddZbeejce"ee'e/dddZceejde"ee'e/dddZdeejee"deeee,dddZeeejfe"deeee,dddZfeejgjdeee,edddZheejgj\dee,e,edddZieejjdeee'e/e/edddZjeejkeee'e'e/dddZke	e' dddZleejmdee	e' e'e	e dddZmeejnjdee'e'e	e dÜddńZneejoe"deeee'e'dƜddȄZoeejpe"ee	e' ee ee e,eeeef dɜdd˄Zpeejqe"eee	e' eeee ee e	e/ eee ee ee f d̜	dd΄Zqeejre"eee ee ee ee e/e,e,eeeef dϜ	ddфZreejsee,dҜddԄZseejtee,d՜ddׄZteejue"dddلZveejweeedڜdd܄Zweejxeed!ddބZxeejyje&eeedڜddZyeejzj{e$deee	e'  ee' e/dddZ|eej}j{e$dee	e' e'e/dddZ~eejdddd Zeejeeee ee ee e/e,e,dddZeejeeeee ee ee ee e,ed	ddZeejjdd dgfee'e	e' edddZeejj'ee'e'edddZeejjeed!ddZe	e dddZe	e e'dddZeejjde	e e'eddd Zee	e' edddZeejje&d ee	e' e/edddZeejjeed!ddZeejed	d
e"eeeef d!ddZdS (!      N)Tensor)register_decomposition)Enum)TupleOptionalListCallable)tree_maptree_flatten)out_wrapper_multi__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   @/tmp/pip-unpacked-wheel-ua33x9lu/torch/_decomp/decompositions.pyr      s   r   ftype_promotionc                    s   t   fdd}|S )Nc                     sf   dd t | |fd D }tj|di\  fdd}fdd}t|| t||}t||S )	Nc                 S   s   g | ]}t |tr|qS r   )
isinstancer   ).0xr   r   r   
<listcomp>   s     
 z-type_casts.<locals>.inner.<locals>.<listcomp>r   Z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 r   r    r"   )result_dtyper   r   decrease_prec*   s    

z0type_casts.<locals>.inner.<locals>.decrease_prec)r
   utilsZelementwise_dtypesr	   )argskwargsZ	flat_argsr$   r&   rr   )r#   r%   r   inner   s    
ztype_casts.<locals>.inner)	functoolswraps)r   r   r+   r   r   r   
type_casts   s    r.   )r   )r   dimc                 C   s$   t ||   D ]}| d} q| S )N)ranger/   	unsqueeze)r   r/   _r   r   r   _unsqueeze_to_dim:   s    r4   out_gradyc                 C   s   | d||     S Nr   Zconj_physicalr5   r   r   r   tanh_backward@   s    r:   c                 C   s   | |d|     S r8   r9   r5   r   r   r   sigmoid_backwardF   s    r;   )r6   r   beta	thresholdc                 C   s.   ||   }t|| |k| | | |d  S N      ?)exptorchwhere)r6   r   r<   r=   zr   r   r   softplus_backwardL   s    rD   r   )selfalphascaleinput_scalereturnc                 C   s8   || }|}|}t | dk| | t | | d | S )Nr   r   rA   rB   r@   )rE   rF   rG   rH   negcoefposcoef
negiptcoefr   r   r   eluS   s      rN   )grad_outputrF   rG   rH   	is_resultself_or_resultc           	      C   sf   || }|}|}|r6t |dk| | ||  || S t |dk| | | t ||  | | S d S Nr   rJ   )	rO   rF   rG   rH   rP   rQ   rK   rL   rM   r   r   r   elu_backward`   s    
rS   )rE   rI   c                 C   s    t jt j| d ddddd S N   r   min   maxrA   clamprE   r   r   r   hardsigmoid{   s    r^   rO   rE   c                 C   s$   t |dk|dk @ | d | dS )Ng      g      @gUUUUUU?r   rA   rB   	new_zerosr_   r   r   r   hardsigmoid_backward   s
    rb   r0   )rE   min_valmax_valrI   c                 C   s   t | ||S r   r[   )rE   rc   rd   r   r   r   hardtanh   s    re   rO   rE   rc   rd   c                 C   s    t ||k||kB | d| S Nr   r`   rf   r   r   r   hardtanh_backward   s
      rh   grad_outrE   lambdc                 C   s"   t || k||k@ | d| S rg   r`   ri   r   r   r   hardshrink_backward   s
      rl   c                 C   s$   | t jt j| d dddd d S rT   r[   r]   r   r   r   	hardswish   s    rm   )rO   rE   rI   c              
   C   s2   t |dk | dt |dk| |d d  | S )Nr   rU         ?r`   r_   r   r   r   hardswish_backward   s
    rp   rO   rE   r=   c                 C   s   t ||k| d| S rg   r`   rq   r   r   r   threshold_backward   s    rr   {Gz?)rE   negative_sloperI   c                 C   s   t | dk| | | S rR   rA   rB   )rE   rt   r   r   r   
leaky_relu   s    rv   rO   rE   rt   self_is_resultc                 C   s   t |dk| | | S rR   ru   rw   r   r   r   leaky_relu_backward   s    ry   none)rE   approximaterI   c           
      C   sx   d}d}d}|dkrV|| d }d}| |  |  }|| ||   }d|  dt |  S |}	| d dt | |	   S d S )N;f?;f?mBP?tanhro   Hm?r   )rA   r   erf)
rE   r{   M_SQRT2	M_SQRT1_2
M_2_SQRTPIkBetakKappax_cuber+   kAlphar   r   r   gelu   s    r   )gradrE   r{   c                 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 )
Nr|   r}   r~   r   ro   r   r   rU   g      )rA   r   r   r@   )r   rE   r{   r   r   r   r   r   Zx_sqr   r+   Z
tanh_innerleftrightZleft_derivativeZtanh_derivativeZinner_derivativeZright_derivativer   ZcdfZpdfr   r   r   gelu_backward   s,    
r   )rO   inputc                 C   s:   t t|}t |}|| d||   }| ||  S r8   )rA   r   FZsoftplussigmoid)rO   r   Zinput_tanh_softplusZinput_sigmoidoutr   r   r   mish_backward   s    
r   c                 C   s   | t |  S r   )rA   r   r]   r   r   r   silu  s    r   c                 C   s,   ddt |   }| | d|d|    S r8   )rA   r@   )rO   rE   r   r   r   r   silu_backward  s    r   )rO   rE   rk   rI   c                 C   s"   t || k||k@ | d| S rg   r`   )rO   rE   rk   r   r   r   softshrink_backward  s
      r   )rO   rE   weightrI   c                 C   s   |}t d|  D ]}|d}qt|dk| ||  }t|dk| d||  }||j}| | kr||d}q`||fS )Nr   r0   r   r   )	r1   r/   r2   rA   rB   ra   Zsum_to_sizeshapesqueeze)rO   rE   r   Z
cur_weightr3   Z
input_gradZweight_grad_collectorr   r   r   r   prelu_backward  s    	  r   )rO   rE   noiseloweruppertrainingrx   rI   c                 C   s:   |r|| dkr|  |S || d }t| |||S d S )Ngư>r   )mulatenry   )rO   rE   r   r   r   r   rx   rt   r   r   r   rrelu_with_noise_backward,  s    
r   )rO   rE   bufferrI   c                 C   sN   |dk }t |dd}t |dd}t t | }| |||d|     S )Nr   r   r0   )rA   rB   r@   abs)rO   rE   r   Zin_negativeZ	max_derivsignrC   r   r   r   log_sigmoid_backward>  s
    r   loss	reductionc                 C   s4   |t jjkrt| S |t jjkr,t| S | S d S r   )r   r   valuerA   meanr   sumr   r   r   r   apply_loss_reductionJ  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 r   )rA   Z	complex32Zfloat16Z	complex64Zfloat32Z
complex128Zfloat64r   r   r   r   to_real_dtypeS  s    


r   )rE   targetr   rI   c                 C   s&   | |   }t| j}t|||S r   )r   r   r   r   r!   )rE   r   r   r   Z
float_typer   r   r   l1_loss`  s    
r   )rO   rE   r   r   c                 C   s2   t || }|tjjkr&||  n|}| | S r   )rA   r   r   r   r   numel)rO   rE   r   r   r   normr   r   r   l1_loss_backwardl  s    r   c                 C   s   | | d }t ||S )Nr   )r   )rE   r   r   r   r   r   r   mse_lossz  s    r   )rO   r   r   r   c                 C   s,   |t jjkrd|  nd}|||  |  S )Ng       @)r   r   r   r   )rO   r   r   r   r   r   r   r   mse_loss_backward  s    r   r?   )rE   r   r   deltarI   c                 C   sL   |dkst d| |  }t||k d| | ||d|   }t||S )Nr   z:huber_loss does not support non-positive values for delta.ro   )AssertionErrorr   rA   rB   r   )rE   r   r   r   rC   r   r   r   r   
huber_loss  s    &r   )rO   rE   r   r   r   c              
   C   s`   |t jjkrd|  nd}|| }t|| k | |  | t||k||  | || |  S r>   )r   r   r   r   rA   rB   )rO   rE   r   r   r   r   r   r   r   r   huber_loss_backward  s     r   )rO   rE   r   r   r   ignore_indextotal_weightrI   c                 C   s   |  dk rdnd}|tjjkr(| | } ||}t|}t|||d}|  |     krhdkrvn n
| |} |d k	rdd t|  D }	|j	d |	|< |
|	}| | } |dk}
|
r||k}| | } ||  S )Nr   r   r         c                 S   s   g | ]}d qS )r   r   )r   r3   r   r   r   r     s     z&_nll_loss_backward.<locals>.<listcomp>)r/   r   r   r   r2   rA   Z
zeros_likeZscatterr1   r   reshape)rO   rE   r   r   r   r   r   Zchannel_dim
grad_inputZ	new_shapeZhas_ignore_indexZignore_index_maskr   r   r   _nll_loss_backward  s$    	

 

r   c                 C   sx  d|    krdks"n td|  dks6td|  dkoL|  dk}|s|jd |jd kstd|j d|j d| dkstd	|j d
|  df|d ks| |jd kstd|tjjkr8|  dkr8|   dkr| jd |jd ksdtd|jd  d|    d| jd  n,|   dkrT|  dksdtd| j t| ||||||S )Nr   r   zinput tensor should be 1D or 2Dr   z;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)r0   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: )r/   r   r   r   r   r   r   r   )rO   rE   r   r   r   r   r   Zno_batch_dimr   r   r   nll_loss_backward  s@    
"
&$


r   c                 C   s   |  dkstd|   |  dks<td|   |jd |jd krx|jd |jd krx|jd |jd kstd|j d	|j | dkstd
|j d|  dt| ||||||S )N   zSonly batches of spatial inputs supported (4D tensors), but got input of dimension: rU   zUonly batches of spatial targets supported (3D tensors) but got targets of dimension: r   r   r   r   r   r   z ( z, elements))r/   r   r   r   r   )rO   rE   r   r   r   r   r   r   r   r   nll_loss2d_backward  s*    


r   )rE   r   r   r   rI   c              	   C   s^   |d t t d|  | dd |t t | | dd  }|d k	rT|| }t||S )Nr   r   i)rA   maximumlognew_fullr   )rE   r   r   r   r   r   r   r   binary_cross_entropy  s    
 
r   )rO   rE   r   r   r   rI   c                 C   sR   d}| ||  t j|d|  |d }|d k	r6|| }|tjjkrN||  }|S )Ng-q=r   rV   )rA   r\   r   r   r   r   )rO   rE   r   r   r   ZEPSILONresultr   r   r   binary_cross_entropy_backward'  s    	"r   )x1x2rI   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   r0   TZmemory_formatr   )powr   rA   	ones_likecontiguous_formatcatr   matmulZmT	clamp_minsqrt)	r   r   Zx1_normZx1_padZx2_normZx2_padZx1_Zx2_r   r   r   r   _euclidean_dist9  s    r   )rO   input_sizesr/   startendstepc                 C   s   |  |}t|| ||||S r   )ra   rA   Zslice_scatter)rO   r   r/   r   r   r   r   r   r   r   slice_backwardE  s    	
r   )rO   r   r/   indexc                 C   s   |  |}t|| ||S r   )ra   rA   Zselect_scatter)rO   r   r/   r   r   r   r   r   select_backwardR  s    
r   )rO   r   offsetdim1dim2c                 C   s   |  |}t|| |||S r   )ra   rA   Zdiagonal_scatter)rO   r   r   r   r   r   r   r   r   diagonal_backwardX  s    
r   )rO   outputr/   input_dtypec                 C   s    | | }||t j||dd  S NT)r/   keepdim)rA   r   )rO   r   r/   r   Znew_gradr   r   r   _softmax_backward_data`  s    r   c                 C   s"   | t |t j| |dd  }|S r   )rA   r@   r   )rO   r   r/   r   r   r   r   r   _log_softmax_backward_datai  s      
r   )rO   
input_sizekernel_sizedilationpaddingstriderI   c                 C   s   t | |||||S r   )r   fold)rO   r   r   r   r   r   r   r   r   im2col_backwardw  s    	r   )rO   r   r   r   r   rI   c                 C   s   t | ||||S r   )r   Zunfold)rO   r   r   r   r   r   r   r   col2im_backward  s    r   )rE   maskr   rI   c                 C   s   t |t| j|| S r   )rA   rB   r'   Zdtype_to_typer   rE   r   r   r   r   r   masked_fill_Scalar  s    r   c                 C   s   t ||| S r   ru   r   r   r   r   masked_fill_Tensor  s    r   rO   r   rG   c                 C   s   | | | |  S r   )type_asr   r   r   r   native_dropout_backward  s    r   )rE   epsrI   c                 C   s6   |d krd}|}d| }t | ||} | d|    S )Nr   r   )rA   r\   r   )rE   r   lohir   r   r   logit  s    r   )rO   rE   r   rI   c              	   C   s~   |d k	rD|}d| }t t ||k||k| |d|   |dS t t |dk|dk| |d|   |dtdS d S )Nr?   r           nan)rA   rB   logical_andra   r   float)rO   rE   r   r   r   r   r   r   logit_backward  s    r  )r   ptrainc                 C   sF   |r.t | |k }||  td|  }||fS | t j| t jdfS d S )Nr?   r   )rA   	rand_liker   r   bool)r   r  r  Z	bool_maskresr   r   r   native_dropout  s
    r  )r   r/   half_to_floatc                 C   s6   t j| |ddd }t | | }|t j||dd S NTr   r   )rA   rZ   r@   r   )r   r/   r  x_maxZunnormalizedr   r   r   _softmax  s    r  c                 C   s@   t j| |ddd }| | }t t jt ||dd}|| S r	  )rA   rZ   r   r   r@   )r   r/   r  r  ZshiftedZshifted_logsumexpr   r   r   _log_softmax  s    r  rE   Ztensor1Ztensor2r   c                 C   s   | |||   S r   r   r  r   r   r   addcdiv  s    r  c                 C   s8   |   s|  r | || |  S | t|| |  S d S r   )is_floating_point
is_complexintr  r   r   r   addcmul  s    r  )rE   otherrF   rI   c                 C   s   t j|| |dS N)rF   rA   subrE   r  rF   r   r   r   rsub_Tensor  s    r  c                 C   s   t j|| |dS r  r  r  r   r   r   rsub_Scalar  s    r  F)r   indicespadding_idxscale_grad_by_freqsparserI   c                 C   sl   |   dkstd|  dkr,| d|S t|j}| jdd  D ]}|| qD| d|d|S )Nr   z'weight' must be 2-Dr   r   r0   )r/   r   Zindex_selectlistr   appendr   view)r   r  r  r  r  sizedr   r   r   	embedding  s    
r$  )rO   r  num_weightsr  r  c                 C   s   |  }| || d}| || jd f}||}|r|||f}	||f}
|	j|g|
dd}	|	| }||d }||kd}||}t	
|d}|j|gt	|||ddS )Nr0   T)
accumulater   r   )r   r!  r"  ra   r   new_onesZ	index_putr2   Z	expand_asrA   Z	full_likerB   )rO   r  r%  r  r  r   r   Zgrad_weightZindices_rank1countsZonesZgrad_weights_scaleZskip_paddingZ	zero_gradr   r   r   embedding_dense_backward  s$    

  r)  r"   c                 C   s   d}| D ]}||9 }q|S r8   r   )r   r*   ir   r   r   prod'  s    
r+  )rE   split_sizesr/   rI   c                 C   sF   t |}g }d}t|D ](}|| }|| ||| ||7 }q|S rR   )lenr1   r   Znarrow)rE   r,  r/   Z
num_splitssplitsZ	start_idxr*  lengthr   r   r   split_with_sizes.  s    
r0  )rE   
split_sizer/   rI   c                    st   | j }|| } dkr(|dks"t| gS |  d   } fddt|D }  | |  ||d < t| ||S )Nr   r   c                    s   g | ]} qS r   r   )r   r*  r1  r   r   r   D  s     zsplit.<locals>.<listcomp>)r   r   r1   rA   split)rE   r1  r/   r   Zdim_sizechunksr,  r   r2  r   r3  <  s    r3  )rE   mat1mat2r<   rF   c                 C   sH   |   s |  s t|}t|}|t|| }|dkr<|S ||  | S rR   )r  r  r  rA   mm)rE   r5  r6  r<   rF   r   r   r   r   addmmJ  s    r8  )r   normalized_shaper   biasr   rI   c              
   C   s   | j }|  }|t| }t|d | }|dkrB| d|d}	n| | d| dfS tj|	d d d d dd|d\}
}}|
|}
|d k	r|
| }
|d k	r|
| }
t|d | }t	||  D ]}|
d q||}||}|
||fS )Nr   r   r0   r   Tr   )r   r:  running_meanrunning_varr   momentumr   )r   r/   r-  r+  r!  ra   r   native_batch_normr  r1   r   )r   r9  r   r:  r   input_shape
input_ndimaxisMZinput_reshapedr   r   rstdZ
stat_shaper3   r   r   r   native_layer_normW  s8    	



rE  )	rj   r   r9  r   rD  r   r:  output_maskrI   c                 C   s  |j }| }	|	t| }
||
d  }|d |
 }g }g }t|	D ]"}||
krZ|| qB|| qBt|}t|}|dks|dkr|||||
d  |||
d  fS || | }|d k	r| | }n| }|| }t||d}t	||}t||d}t	||}|| | }|d r4|| | }nd }|d rx|d k	rxt|dkrnt| | |d}n| | }nd }|d r|d k	rt|dkrt| |d}n| }nd }|||fS )Nr   Tr   Fr   )
r   r/   r-  r1   r   r+  ra   rA   r   r   )rj   r   r9  r   rD  r   r:  rF  r@  rA  rB  Z
inner_dimsZ
outer_dimsZinner_dim_indicesZouter_dim_indicesr*  NrC  Zx_hatZ
grad_x_hatabZc1c2c3r+   Zd_inputZd_weightZd_biasr   r   r   native_layer_norm_backward  s\    

  
rL  )	r   r   r:  r<  r=  r   r>  r   rI   c                 C   s  dgt td|   }|rtj| |dd\}	}
dt|	|  }|d k	rd|||
 d| |   |d k	r|  | jd  }|	||d   }||| d| |   |
}|}nT|d k	r|d k	st	|}dt||  }| j
jdkr|}
|}n| d}
| d}|d kr| d}|d kr.| d}t||  d }t||  d }t||  d }t||  d }| | | | | }||
|fS )	Nr   r   F)r/   Zunbiasedr   Zcudar;  r   )r  r1   r/   rA   Zvar_meanr   Zcopy_r   r   r   Zdevicetypera   r'  r4   )r   r   r:  r<  r=  r   r>  r   Zreduction_dimsZ
biased_var	save_meanZsave_invstdnZunbiased_varr   Zinvstdr   r   r   r   r?    sD      






r?  rE   rW   c                 C   s   t j| |dS )NrV   r[   rP  r   r   r   r     s    r   rE   rZ   c                 C   s   t j| |dS )NrY   r[   rQ  r   r   r   	clamp_max  s    rR  c                 C   s6   t | |k jt jd}|| |  d|  }||fS )Nr   r?   )rA   r  r!   uint8r   )r   r  	generatorr   r  r   r   r   _fused_dropout_decomposition  s    rU  )rE   r  rI   c                 C   s   | j tjd|j tjdA S Nr   r!   rA   r  rE   r  r   r   r   logical_xor!  s    rY  c                 C   s   | j tjd S rV  rW  r]   r   r   r   logical_not&  s    rZ  c                 C   s<   t t | | t | t | dkt | d| t | S rg   )r   rB   isnanra   r   rX  r   r   r   xlogy+  s    
r\  r   dims
correctionr   c                 C   s   |d krg }|   rL| j}tj||||d}| j}tj||||d}|| S |d krXd}t|dkrpt| j}nd}|D ]}	|| j|	 9 }qxt| |d}
| |
 }|| }t	|||}|r|| }|| S )Nr_  r   r   r   T)
r  realrA   varimagr-  r+  r   r   r   )r   r^  r_  r   Zreal_inZvar_realZimag_inZvar_imagrO  r/   r   r  sqr   r   r   r   var_correction5  s,    re  c                 C   s   t t j| |||dS )Nr`  )rA   r   rb  r]  r   r   r   std_decomposition^  s    rf  T)Zdisable_metac                 C   s   | S r   r   r"   r   r   r   detach_decompositioni  s    rg  )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?  ra   rA   rS  )r   r   r:  r<  r=  r   rh  ri  rH  rI  cr   r   r   cudnn_batch_normn  s    
rk  	r   rO   r   r<  r=  rN  Zsave_varri  ZreserveSpacec	           	      C   s"   t || |||||d|dddg
S )NT)r   Znative_batch_norm_backwardrl  r   r   r   cudnn_batch_norm_backward  s    rm  )rE   kr^  rI   c                 C   sV  |   }t|}|dks&td| |dks<td| |d |d krdt|d |d  |kstd|d  d|d  |d |k r|d | kstd|d  |d |k r|d | kstd	|d  |d
 }|dkr| |d |d |d S |dkr| |S |dkrD| |d |d |d S | jtjdS d S )Nr   z2expected total rotation dims == 2, but got dims = z/expected total dims >= 2, but got total dims = r   r   z7expected rotation dims to be different, but got dim0 = z and dim1 = z#Rotation dim0 out of range, dim0 = z#Rotation dim1 out of range, dim1 = r   rU   r   )	r/   r-  r   r   Zflip	transposeclonerA   r   )rE   rn  r^  Z
total_dimsZtotal_rot_dimsr   r   r   rot90  s"    *,,



rq  )rE   dim0r   rI   c                 C   sj   t |  ||f\}}|  dkr(| S ||kr4| S tt|  }|| ||  ||< ||< t| |S r8   )r'   canonicalize_dimsr/   r  r1   rA   Zpermute)rE   rr  r   permr   r   r   transpose_int  s    ru  c                 C   s   |  d|  dk rdndS )Nr   r   r   )ro  r/   r]   r   r   r   t  s    rv  )tensorsc                 C   sP   | d j }tdt| D ]2}| | j |kstd| d| | j  d| qd S )Nr   r   z4stack expects each tensor to be equal size, but got z at entry 0and z
 at entry )r   r1   r-  r   )rw  Zentry_shaper*  r   r   r   check_stack_inputs  s    
rx  rw  r/   c                    s   t |   fdd| D S )Nc                    s   g | ]}|  qS r   )r2   )r   rv  r/   r   r   r     s     z$get_stack_inputs.<locals>.<listcomp>)rx  ry  r   rz  r   get_stack_inputs  s    r{  )rw  r/   rI   c                 C   s   t | dkstdt| d  d |}|| d  k r| d jst|  t| d j}|	|t |  t
| |}||S t
t| ||S d S )Nr   z$stack expects a non-empty TensorListr   )r-  r   r'   Zcanonicalize_dimr/   Z	is_sparserx  r  r   insertrA   r   r!  r{  )rw  r/   Zwrapped_dimZresult_sizesr   r   r   r   stack  s    
r}  )rE   r^  rI   c                 C   sN   |   }t||}t|ts"tt|d ddD ]}||kr2| |} q2| S )Nr   r0   )r/   r'   rs  r   tupler   r1   r   )rE   r^  ndimZwrapped_dimsidxr   r   r   _squeeze_multiple  s    r  )rE   r/   r   rI   c                 C   s   |   dkr$tt| || S tj| |dd}|r<|nt||}t|| t	dkd}tt| | ||}| 
|S )Nr   Tr
  inf)r   rA   r   r@   r   Zamaxr  masked_fillr   r   add)rE   r/   r   ZmaxesZmaxes_squeezedr   r   r   r   	logsumexp  s    r  c                 C   s   t t | S r   )rA   r   Zdiagr]   r   r   r   trace  s    r  r   r   c                 C   sL   t | d| }t t |  }| jr6| d}n|}|t | |fS )Nr   r;  )rA   Zminimumra   r@   r   Zis_cudalog1p)rE   rW   rC   r   r   r   r   log_sigmoid_forward  s    r  )r   r   r   )r0   r   )rs   )rz   )rz   )N)N)r   )r   )r   )r   )r0   FF)r   )r   )r   r   )N)NF)r   F)r   )F)rA   r   Ztorch._decompr   enumr   typingr   r   r   r   Ztorch.nn.functionalnnZ
functionalr   r,   Ztorch.utils._pytreer	   r
   Ztorch._prims.utilsZ_primsr'   Ztorch._prims.wrappersr   r   str__annotations__opsr   r   ZELEMENTWISE_TYPE_PROMOTION_KINDr.   partialDEFAULTZpw_cast_for_opmathZCOMPLEX_TO_FLOATZreduction_complex_to_realZINT_TO_FLOATZpw_cast_for_int_to_realr  r4   r:   r;   rD   r   rN   rS   r  r^   rb   re   rh   rl   rm   rp   rr   rv   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  ZScalarr   r   r   r   r  r  r  r  r  r  Zrsubr  r  r$  r)  r+  r0  r3  r8  rE  rL  r?  r   rR  Z_fused_dropoutrU  rY  rZ  r\  rb  r_  re  Zstdrf  detachrg  rk  rm  rq  defaultro  ru  rv  rx  r{  r}  r  r  r  r  r   r   r   r   <module>   s   	               

	           !(          


	  


    
2H7

 
'
     	

$




&

