o
    Gi                     @   s   d dl mZ d dlZddlmZ d dlZd dlZG dd dejjZ	G dd dejjZ
G d	d
 d
ejjZdedejddfddZdedejdejddfddZdedejdejddfddZdS )    )TupleN   )Fsac                   @   sL   e Zd ZededejdejfddZedejdedejf fdd	Z	dS )
_PhantomSetScoresFunctionout_fsaunused_in_fsa_scoresreturnc                 C   s   	 |jS N)torchalleqscores)ctxr   r    r   E/home/ubuntu/.local/lib/python3.10/site-packages/k2/autograd_utils.pyforward%   s   z!_PhantomSetScoresFunction.forwardout_fsa_scores_gradNc                 C   s   d |fS r	   r   )r   r   r   r   r   backward-   s   z"_PhantomSetScoresFunction.backward
__name__
__module____qualname__staticmethodr   r
   Tensorr   r   r   r   r   r   r   r   #   s    r   c                	   @   sT   e Zd ZededejdejdejfddZedejdedejdf fd	d
Z	dS )!_PhantomIndexSelectScoresFunctionr   r   arc_mapr   c                 C   s   	 | || |jS r	   )_k2index_selectr
   r   r   r   save_for_backwardr   r   r   r   expected_scoresr   r   r   r   5   s   z)_PhantomIndexSelectScoresFunction.forwardr   Nc                 C   s:   | j \}}tj|jtj|jdd}t||| d |d fS )NFdtypedevicerequires_grad)saved_tensorsr
   zerosshapefloat32r#   r   	index_add)r   r   r   r   ansr   r   r   r   @   s   
z*_PhantomIndexSelectScoresFunction.backwardr   r   r   r   r   r   3   s    
r   c                	   @   sT   e Zd ZededejdejdejfddZ	edejde
dejdf fd	d
ZdS )!_PhantomIndexAndSumScoresFunctionr   r   r   r   c                 C   s   	 | | || _	|jS r	   )
r   raggedindex_and_sum
contiguousr
   r   r   r   r   r   r   r   r   r   r   S   s   
z)_PhantomIndexAndSumScoresFunction.forwardr   Nc                 C   sT   | j \}| j}t||jd}tj|jtj|j	dd}t
|j|| d |d fS )Nr   Fr!   )r%   r   r   r   r'   row_idsr
   r&   r(   r#   r)   values)r   r   r   r   expandedr*   r   r   r   r   `   s   
z*_PhantomIndexAndSumScoresFunction.backward)r   r   r   r   r   r
   r   k2RaggedTensorr   r   r   r   r   r   r   r+   Q   s    r+   fsascores_valuer   c                 C   s   t | | d S r	   )r   apply)r4   r5   r   r   r   phantom_set_scores_tou   s   r7   r   c                 C      t | || d S r	   )r   r6   r4   r5   r   r   r   r   phantom_index_select_scores}      r:   c                 C   r8   r	   )r+   r6   r9   r   r   r   phantom_index_and_sum_scores   r;   r<   )typingr   r
   r4   r   r   r2   autogradFunctionr   r   r+   r   r7   r:   r3   r<   r   r   r   r   <module>   s&   $
