U
    <ºc©	  ã                   @   sl   d dl Z d dlm  mZ ddlmZ ddlmZm	Z	m
Z
 d dlmZmZ eejƒG dd„ de jjƒƒZdS )é    Né   )Úimplements_per_sample_grads)Ústandard_kwargsÚforward_helperÚset_grad_sample_if_exists)ÚListÚOptionalc                   @   s$   e Zd Zedd„ ƒZedd„ ƒZdS )ÚEmbeddingPerSampleGradc                 G   sp   t ||ƒ\}}t|d jƒdkr2td|d › ƒ‚ttj||ƒ}|\| _| _|d |d  | _	| _
|d | _|S )Nr   r   zDExpanded Weights needs an input with a batch size, got a 1D tensor, Úpadding_idxÚscale_grad_by_freqÚsparse)r   ÚlenÚshapeÚRuntimeErrorr   ÚFÚ	embeddingÚinputÚweightr
   r   r   )ÚctxZkwarg_namesÚ_Zexpanded_args_and_kwargsZexpanded_argsZexpanded_kwargsÚoutput© r   ú_/tmp/pip-unpacked-wheel-gikjz4vx/torch/nn/utils/_expanded_weights/embedding_expanded_weights.pyÚforward
   s    
zEmbeddingPerSampleGrad.forwardc           	   	      s¤   | j | j ‰}| j| j| j  }}}‡ ‡fdd„}g }| d ¡ | d ¡ ˆjrztjj	j
}| |ˆ ˆ|jd |||ƒ¡ n
| d ¡ |d gd  }t||ƒ t|ƒS )Nc              	      sl   ˆj d }| j d }ˆ d¡jˆj |fžŽ  |d|¡}tj|f| j ž| jˆ jdœŽ}| d|ˆ  |d|¡¡S )Nr   r   éÿÿÿÿ)ÚdeviceÚdtype)	r   Z	unsqueezeÚexpandZreshapeÚtorchÚzerosr   r   Zscatter_add_)r   Z
batch_sizeZembedding_dimÚindexZgrad_sample©Úgrad_outputr   r   r   Úweight_per_sample_grad   s(    


 ÿ  þÿÿÿ ÿz?EmbeddingPerSampleGrad.backward.<locals>.weight_per_sample_gradr   é   )r   r   r
   r   r   ÚappendZrequires_gradr   ÚopsZatenZembedding_backwardr   r   Útuple)	r   r"   r   r
   r   r   r#   ÚresultsZbw_fnr   r!   r   Úbackward   s    


 

zEmbeddingPerSampleGrad.backwardN)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr   r)   r   r   r   r   r	      s   

r	   )r   Ztorch.nn.functionalÚnnZ
functionalr   Zexpanded_weights_implr   Zexpanded_weights_utilsr   r   r   Útypingr   r   r   ZautogradZFunctionr	   r   r   r   r   Ú<module>   s   