a
    ==ic                     @   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   m/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/torch/_decomp/decompositions.pyr      s   r   ftype_promotionc                    s   t   fdd}|S )Nc                     sj   dd t | |fd D }tj|di\  fdd}fdd}t|| i t||}t||S )	Nc                 S   s   g | ]}t |tr|qS r   )
isinstancer   ).0xr   r   r   
<listcomp>       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)ranger0   	unsqueeze)r   r0   _r   r   r   _unsqueeze_to_dim:   s    r5   out_gradyc                 C   s   | d||     S Nr   Zconj_physicalr6   r   r   r   tanh_backward@   s    r;   c                 C   s   | |d|     S r9   r:   r6   r   r   r   sigmoid_backwardF   s    r<   )r7   r   beta	thresholdc                 C   s.   ||   }t|| |k| | | |d  S N      ?)exptorchwhere)r7   r   r=   r>   zr   r   r   softplus_backwardL   s    rE   r   )selfalphascaleinput_scalereturnc                 C   s8   || }|}|}t | dk| | t | | d | S )Nr   r   rB   rC   rA   )rF   rG   rH   rI   negcoefposcoef
negiptcoefr   r   r   eluS   s     rO   )grad_outputrG   rH   rI   	is_resultself_or_resultc           	      C   sf   || }|}|}|r6t |dk| | ||  || S t |dk| | | t ||  | | S d S Nr   rK   )	rP   rG   rH   rI   rQ   rR   rL   rM   rN   r   r   r   elu_backward`   s    
rT   )rF   rJ   c                 C   s    t jt j| d ddddd S N   r   min   maxrB   clamprF   r   r   r   hardsigmoid{   s    r_   rP   rF   c                 C   s$   t |dk|dk @ | d | dS )Ng      g      @gUUUUUU?r   rB   rC   	new_zerosr`   r   r   r   hardsigmoid_backward   s
    rc   r1   )rF   min_valmax_valrJ   c                 C   s   t | ||S r    r\   )rF   rd   re   r   r   r   hardtanh   s    rf   rP   rF   rd   re   c                 C   s    t ||k||kB | d| S Nr   ra   rg   r   r   r   hardtanh_backward   s    ri   grad_outrF   lambdc                 C   s"   t || k||k@ | d| S rh   ra   rj   r   r   r   hardshrink_backward   s    rm   c                 C   s$   | t jt j| d dddd d S rU   r\   r^   r   r   r   	hardswish   s    rn   )rP   rF   rJ   c              
   C   s2   t |dk | dt |dk| |d d  | S )Nr   rV         ?ra   r`   r   r   r   hardswish_backward   s
    rq   rP   rF   r>   c                 C   s   t ||k| d| S rh   ra   rr   r   r   r   threshold_backward   s    rs   {Gz?)rF   negative_sloperJ   c                 C   s   t | dk| | | S rS   rB   rC   )rF   ru   r   r   r   
leaky_relu   s    rw   rP   rF   ru   self_is_resultc                 C   s   t |dk| | | S rS   rv   rx   r   r   r   leaky_relu_backward   s    rz   none)rF   approximaterJ   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?tanhrp   Hm?r   )rB   r   erf)
rF   r|   M_SQRT2	M_SQRT1_2
M_2_SQRTPIkBetakKappax_cuber,   kAlphar   r   r   gelu   s    r   )gradrF   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   rp   r   r   rV   g      )rB   r   r   rA   )r   rF   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   )rP   inputc                 C   s:   t t|}t |}|| d||   }| ||  S r9   )rB   r   FZsoftplussigmoid)rP   r   Zinput_tanh_softplusZinput_sigmoidoutr   r   r   mish_backward   s    
r   c                 C   s   | t |  S r    )rB   r   r^   r   r   r   silu  s    r   c                 C   s,   ddt |   }| | d|d|    S r9   )rB   rA   )rP   rF   r   r   r   r   silu_backward  s    r   )rP   rF   rl   rJ   c                 C   s"   t || k||k@ | d| S rh   ra   )rP   rF   rl   r   r   r   softshrink_backward  s    r   )rP   rF   weightrJ   c                 C   s   |}t d|  D ]}|d}qt|dk| ||  }t|dk| d||  }||j}| | kr||d}q`||fS )Nr   r1   r   r   )	r2   r0   r3   rB   rC   rb   Zsum_to_sizeshapesqueeze)rP   rF   r   Z
cur_weightr4   Z
input_gradZweight_grad_collectorr   r   r   r   prelu_backward  s    	r   )rP   rF   noiseloweruppertrainingry   rJ   c                 C   s:   |r|| dkr|  |S || d }t| |||S d S )Ngư>r   )mulatenrz   )rP   rF   r   r   r   r   ry   ru   r   r   r   rrelu_with_noise_backward,  s    
r   )rP   rF   bufferrJ   c                 C   sN   |dk }t |dd}t |dd}t t | }| |||d|     S )Nr   r   r1   )rB   rC   rA   abs)rP   rF   r   Zin_negativeZ	max_derivsignrD   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   valuerB   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    )rB   Z	complex32float16Z	complex64float32Z
complex128float64r   r   r   r   to_real_dtypeS  s    


r   )rF   targetr   rJ   c                 C   s&   | |   }t| j}t|||S r    )r   r   r   r   r"   )rF   r   r   r   Z
float_typer   r   r   l1_loss`  s    
r   )rP   rF   r   r   c                 C   s2   t || }|tjjkr&||  n|}| | S r    )rB   r   r   r   r   numel)rP   rF   r   r   r   normr   r   r   l1_loss_backwardl  s    r   c                 C   s   | | d }t ||S )Nr   )r   )rF   r   r   r   r   r   r   mse_lossz  s    r   )rP   r   r   r   c                 C   s,   |t jjkrd|  nd}|||  |  S )Ng       @)r   r   r   r   )rP   r   r   r   r   r   r   r   mse_loss_backward  s    r   r@   )rF   r   r   deltarJ   c                 C   sL   |dksJ d| |   }t||k d| | ||d|   }t||S )Nr   z:huber_loss does not support non-positive values for delta.rp   )r   rB   rC   r   )rF   r   r   r   rD   r   r   r   r   
huber_loss  s    &r   )rP   rF   r   r   r   c              
   C   s`   |t jjkrd|  nd}|| }t|| k | |  | t||k||  | || |  S r?   )r   r   r   r   rB   rC   )rP   rF   r   r   r   r   r   r   r   r   huber_loss_backward  s     r   )rP   rF   r   r   r   ignore_indextotal_weightrJ   c                 C   s   |  dk rdnd}|tjjkr(| | } ||}t|}t|||d}|  |     krhdkrvn n
| |} |d urdd t|  D }	|j	d |	|< |
|	}| | } |dk}
|
r||k}| | } ||  S )Nr   r   r         c                 S   s   g | ]}d qS )r   r   )r   r4   r   r   r   r     r   z&_nll_loss_backward.<locals>.<listcomp>)r0   r   r   r   r3   rB   Z
zeros_likeZscatterr2   r   reshape)rP   rF   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 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   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)r1   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: )r0   r   r   r   r   r   r   )rP   rF   r   r   r   r   r   Zno_batch_dimr   r   r   nll_loss_backward  sH    
"
&


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: rV   zUonly batches of spatial targets supported (3D tensors) but got targets of dimension: r   r   r   r   r   r   z ( z, elements))r0   r   r   r   )rP   rF   r   r   r   r   r   r   r   r   nll_loss2d_backward  s2    


r   )rF   r   r   r   rJ   c              	   C   s^   |d t t d|  | dd |t t | | dd  }|d urT|| }t||S )Nr   r   i)rB   maximumlognew_fullr   )rF   r   r   r   r   r   r   r   binary_cross_entropy  s    
r   )rP   rF   r   r   r   rJ   c                 C   sR   d}| ||  t j|d|  |d }|d ur6|| }|tjjkrN||  }|S )Ng-q=r   rW   )rB   r]   r   r   r   r   )rP   rF   r   r   r   ZEPSILONresultr   r   r   binary_cross_entropy_backward'  s    	"r   )x1x2rJ   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   r1   TZmemory_formatr   )powr   rB   	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   )rP   input_sizesr0   startendstepc                 C   s   |  |}t|| ||||S r    )rb   rB   Zslice_scatter)rP   r   r0   r   r   r   r   r   r   r   slice_backwardE  s    	
r   )rP   r   r0   indexc                 C   s   |  |}t|| ||S r    )rb   rB   Zselect_scatter)rP   r   r0   r   r   r   r   r   select_backwardR  s    
r   )rP   r   offsetdim1dim2c                 C   s   |  |}t|| |||S r    )rb   rB   Zdiagonal_scatter)rP   r   r   r   r   r   r   r   r   diagonal_backwardX  s    
r   )rP   outputr0   input_dtypec                 C   s    | | }||t j||dd  S NT)r0   keepdim)rB   r   )rP   r   r0   r   Znew_gradr   r   r   _softmax_backward_data`  s    r   c                 C   s"   | t |t j| |dd  }|S r   )rB   rA   r   )rP   r   r0   r   r   r   r   r   _log_softmax_backward_datai  s    
r   )rP   
input_sizekernel_sizedilationpaddingstriderJ   c                 C   s   t | |||||S r    )r   fold)rP   r   r   r   r   r   r   r   r   im2col_backwardw  s    	r   )rP   r   r   r   r   rJ   c                 C   s   t | ||||S r    )r   Zunfold)rP   r   r   r   r   r   r   r   col2im_backward  s    r   )rF   maskr   rJ   c                 C   s   t |t| j|| S r    )rB   rC   r(   Zdtype_to_typer   rF   r   r   r   r   r   masked_fill_Scalar  s    r   c                 C   s   t ||| S r    rv   r   r   r   r   masked_fill_Tensor  s    r   rP   r   rH   c                 C   s   | | | |  S r    )type_asr   r   r   r   native_dropout_backward  s    r   )rF   epsrJ   c                 C   s6   |d u rd}|}d| }t | ||} | d|    S )Nr   r   )rB   r]   r   )rF   r   lohir   r   r   logit  s    r   )rP   rF   r   rJ   c              	   C   s~   |d u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)rB   rC   logical_andrb   r   float)rP   rF   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   )rB   	rand_liker  r   bool)r   r  r  Z	bool_maskresr   r   r   native_dropout  s
    r
  )r   r0   half_to_floatc                 C   s6   t j| |ddd }t | | }|t j||dd S NTr   r   )rB   r[   rA   r   )r   r0   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  )rB   r[   r   r   rA   )r   r0   r  r  ZshiftedZshifted_logsumexpr   r   r   _log_softmax  s    r  rF   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  )rF   otherrG   rJ   c                 C   s   t j|| |dS N)rG   rB   subrF   r  rG   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sparserJ   c                 C   sl   |   dksJ d|  dkr,| d|S t|j}| jdd  D ]}|| qD| d|d|S )Nr   z'weight' must be 2-Dr   r   r1   )r0   Zindex_selectlistr   appendr   view)r   r  r  r   r!  sizedr   r   r   	embedding  s    
r'  )rP   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 )Nr1   T)
accumulater   r   )r   r$  r%  rb   r   new_onesZ	index_putr3   Z	expand_asrB   Z	full_likerC   )rP   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 r9   r   )r   r+   ir   r   r   prod'  s    
r.  )rF   split_sizesr0   rJ   c                 C   sF   t |}g }d}t|D ](}|| }|| ||| ||7 }q|S rS   )lenr2   r#  Znarrow)rF   r/  r0   Z
num_splitsZsplitsZ	start_idxr-  lengthr   r   r   split_with_sizes.  s    
r2  )rF   
split_sizer0   rJ   c                    st   | j }|| } dkr(|dks"J | gS |  d   } fddt|D }  | |  ||d < t| ||S )Nr   r   c                    s   g | ]} qS r   r   )r   r-  r3  r   r   r   D  r   zsplit.<locals>.<listcomp>)r   r2   rB   split)rF   r3  r0   r   Zdim_sizechunksr/  r   r4  r   r5  <  s    r5  )rF   mat1mat2r=   rG   c                 C   sH   |   s |  s t|}t|}|t|| }|dkr<|S ||  | S rS   )r  r  r  rB   mm)rF   r7  r8  r=   rG   r   r   r   r   addmmJ  s    r:  )r   normalized_shaper   biasr   rJ   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 ur|
| }
|d ur|
| }
t|d | }t	||  D ]}|
d q||}||}|
||fS )Nr   r   r1   r   Tr   )r   r<  running_meanrunning_varr   momentumr   )r   r0   r0  r.  r$  rb   r   native_batch_normr"  r2   r#  )r   r;  r   r<  r   input_shape
input_ndimaxisMZinput_reshapedr   r   rstdZ
stat_shaper4   r   r   r   native_layer_normW  s8    	



rG  )	rk   r   r;  r   rF  r   r<  output_maskrJ   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 ur| | }n| }|| }t||d}t	||}t||d}t	||}|| | }|d r4|| | }nd }|d rx|d urxt|dkrnt| | |d}n| | }nd }|d r|d urt|dkrt| |d}n| }nd }|||fS )Nr   Tr   Fr   )
r   r0   r0  r2   r#  r.  rb   rB   r   r   )rk   r   r;  r   rF  r   r<  rH  rB  rC  rD  Z
inner_dimsZ
outer_dimsZinner_dim_indicesZouter_dim_indicesr-  NrE  Zx_hatZ
grad_x_hatabc1c2c3r,   Zd_inputZd_weightZd_biasr   r   r   native_layer_norm_backward  sX    



rO  )	r   r   r<  r>  r?  r   r@  r   rJ   c                 C   s  dgt td|   }|rtj| |dd\}	}
dt|	|  }|d urd|||
 d| |   |d ur|  | jd  }|	||d   }||| d| |   |
}|}nT|d ur|d usJ |}dt||  }| j	j
dkr|}
|}n| d}
| d}|d u r| d}|d u r.| d}t||  d }t||  d }t||  d }t||  d }| | | | | }||
|fS )	Nr   r   F)r0   Zunbiasedr   cudar=  r   )r"  r2   r0   rB   Zvar_meanr   Zcopy_r   r   Zdevicetyperb   r*  r5   )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   rA    s@    






rA  rF   rX   c                 C   s   t j| |dS )NrW   r\   rT  r   r   r   r     s    r   rF   r[   c                 C   s   t j| |dS )NrZ   r\   rU  r   r   r   	clamp_max  s    rV  c                 C   s6   t | |k jt jd}|| |  d|  }||fS )Nr   r@   )rB   r  r"   uint8r   )r   r  	generatorr   r	  r   r   r   _fused_dropout_decomposition  s    rY  )rF   r  rJ   c                 C   s   | j tjd|j tjdA S Nr   r"   rB   r  rF   r  r   r   r   logical_xor!  s    r]  c                 C   s   | j tjd S rZ  r[  r^   r   r   r   logical_not&  s    r^  c                 C   s<   t t | | t | t | dkt | d| t | S rh   )r   rC   isnanrb   r   r\  r   r   r   xlogy+  s    
r`  r   dims
correctionr   c                 C   s   |d u rg }|   rL| j}tj||||d}| j}tj||||d}|| S |d u rXd}t|dkrpt| j}nd}|D ]}	|| j|	 9 }qxt| |d}
| |
 }|| }t	|||}|r|| }|| S )Nrc  r   r   r   T)
r  realrB   varimagr0  r.  r   r   r   )r   rb  rc  r   Zreal_inZvar_realZimag_inZvar_imagrS  r0   r   r  sqr   r   r   r   var_correction5  s,    ri  c                 C   s   t t j| |||dS )Nrd  )rB   r   rf  ra  r   r   r   std_decomposition^  s    rj  T)Zdisable_metac                 C   s   | S r    r   r#   r   r   r   detach_decompositioni  s    rk  )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   rA  rb   rB   rW  )r   r   r<  r>  r?  r   rl  rm  rJ  rK  cr   r   r   cudnn_batch_normn  s    
ro  	r   rP   r   r>  r?  rR  Zsave_varrm  ZreserveSpacec	           	      C   s    t || |||||d|g d
S )NT)TTT)r   Znative_batch_norm_backwardrp  r   r   r   cudnn_batch_norm_backward  s    rq  )rF   krb  rJ   c                 C   sV  |   }t|}|dks&J d| |dks<J d| |d |d krdt|d |d  |ksJ d|d  d|d  |d |k r|d | ksJ d|d  |d |k r|d | ksJ 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   rV   r   )r0   r0  r   flip	transposeclonerB   r   )rF   rr  rb  Z
total_dimsZtotal_rot_dimsr   r   r   rot90  s"    *,,



rv  )rF   dim0r   rJ   c                 C   sj   t |  ||f\}}|  dkr(| S ||kr4| S tt|  }|| ||  ||< ||< t| |S r9   )r(   canonicalize_dimsr0   r"  r2   rB   Zpermute)rF   rw  r   permr   r   r   transpose_int  s    rz  c                 C   s   |  d|  dk rdndS )Nr   r   r   )rt  r0   r^   r   r   r   t  s    r{  )tensorsc                 C   sP   | d j }tdt| D ]2}| | j |ksJ 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   r2   r0  )r|  Zentry_shaper-  r   r   r   check_stack_inputs  s    
r}  r|  r0   c                    s   t |   fdd| D S )Nc                    s   g | ]}|  qS r   )r3   )r   r{  r0   r   r   r     r   z$get_stack_inputs.<locals>.<listcomp>)r}  r~  r   r  r   get_stack_inputs  s    r  )r|  r0   rJ   c                 C   s   t | dksJ 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   )r0  r(   Zcanonicalize_dimr0   Z	is_sparser}  r"  r   insertrB   r   r$  r  )r|  r0   Zwrapped_dimZresult_sizesr   r   r   r   stack  s    
r  )rF   rb  rJ   c                 C   sN   |   }t||}t|ts"J t|d ddD ]}||v r2| |} q2| S )Nr   r1   )r0   r(   rx  r   tupler2   r   )rF   rb  ndimZwrapped_dimsidxr   r   r   _squeeze_multiple  s    r  )rF   r0   r   rJ   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   rB   r   rA   r   Zamaxr  masked_fillr   r  add)rF   r0   r   ZmaxesZmaxes_squeezedr   r   r   r   	logsumexp  s    r  c                 C   s   t t | S r    )rB   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=  )rB   minimumrb   rA   r   Zis_cudalog1p)rF   rX   rD   r   r   r   r   log_sigmoid_forward  s    r  )r   r   r   )r1   r   )rt   )r{   )r{   )N)N)r   )r   )r   )r   )r1   FF)r   )r   )r   r   )N)NF)r   F)r   )F)rB   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  r5   r;   r<   rE   r  rO   rT   r  r_   rc   rf   ri   rm   rn   rq   rs   rw   rz   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.  r2  r5  r:  rG  rO  rA  r   rV  Z_fused_dropoutrY  r]  r^  r`  rf  rc  ri  Zstdrj  detachrk  ro  rq  rv  defaultrt  rz  r{  r}  r  r  r  r  r  r  r   r   r   r   <module>   sD  
	

	
!(

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

&

