
    |-j                         d dl Z ddlmZ  ej        e          Z	 	 dde j        de j        de j        d	e j        d
e j        dedee         de	de
de j        fdZ	 	 ddZdS )    N   )logging        meantoken_logitsduration_logitstargetslogit_lengthstarget_lengthsblank_token_id	durationssigma	reductionreturnc	                 	   |dvrt          d| d          | j        }	| j        \  }
}}}|                                 } |                                }t	          j        | d          |z
  }t	          j        |d          }t	          j        |
||ft          d          |	          }d|d	d	d
d
f<   |d	d	d	d	d	d	|f         }|dk    r||                    d                              d|d          }t	          j	        |d	d	d	d	d	|dz
  d	d	f         d|                    d                    
                    d          }t	          j        t          d          |	          }t          d||z   dz
            D ]}t          d
||z
  dz             }t          |dz   |          }t	          j        |||	          }||z
  }g }t!          |          D ]k\  }}||z
  }|d
k    }|                                s&|                    d
          }|d
k    rh|d	d	||f         |d	d	||f         z   |d	d	|||f         z   } t	          j        |                    d
          | |          } |                    |            |d
k    }!||!z  }"|"                                r|dz
                      d
          }#|dk    r|#                    |dz
            n|#}$|d	d	||#f         |d	d	||$f         z   |d	d	||#|f         z   } t	          j        |"                    d
          | |          } |                    |            m|r4t	          j        |d
          }%t	          j        |%d
          |d	d	||f<   t	          j        |
|	          }&t	          j        |
ft          d          |	          }'t!          |          D ]\  }}|d
k    r||z
  }(|(d
k    })|)                                s,|(                    d
          }*||&|*|f         ||&|*||f         z   ||&|*||f         z   }+t	          j        |'|+gd
          },t	          j        |)t	          j        |,d
          |'          }'|' }-|dk    r)|-|                                z                                  S |dk    r|-                                S |-S )a  
    Compute TDT (Token-and-Duration Transducer) loss (https://arxiv.org/abs/2304.06795).

    Ported from NeMo's `TDTLossPytorch` with anti-diagonal processing. Unlike standard RNNT loss, this loss trains both
    the token prediction head and the duration prediction head. It uses vectorized anti-diagonal processing for
    efficiency: all (t, u) pairs on each anti-diagonal t+u=n are computed in parallel as batched tensor operations.

    Args:
        token_logits: Token logits of shape `(batch, T, U+1, vocab_size+1)`.
        duration_logits: Duration logits of shape `(batch, T, U+1, num_durations)`.
        targets: Target labels of shape `(batch, U)`.
        logit_lengths: Encoder output lengths of shape `(batch,)`.
        target_lengths: Target lengths of shape `(batch,)`.
        blank_token_id: Blank token id.
        durations: List of duration values (e.g., `[0, 1, 2, 3, 4]`).
        sigma: Logit undernormalization constant (see TDT paper). Defaults to `0.0`.
        reduction: Loss reduction method. One of `"mean"`, `"sum"`, or `"none"`. Defaults to `"mean"`.

    Returns:
        Scalar loss tensor (or per-example losses if `reduction="none"`).

    )r   sumnonezInvalid reduction mode "z,". Expected one of "mean", "sum", or "none".)dimz-inf)devicer   Nr         )r   index)minr   )maxr   r   )
ValueErrorr   shapefloattorchlog_softmaxfull	unsqueezeexpandgathersqueezetensorranger   r   arange	enumerateanyclampwhereappendstack	logsumexpr   r   ).r   r   r	   r
   r   r   r   r   r   r   
batch_sizemax_tmax_u_token_log_probsduration_log_probs	log_alphablank_log_probstargets_expandedlabel_log_probsneg_infnu_startu_end	u_indices	t_indicesall_candidatesidurt_prevvalid_tt_srccontribvalid_u
valid_bothu_srcu_src_labelstacked	batch_idx	log_probst_finalvalid	t_clampedterminalcombinedlossess.                                                 Z/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/transformers/loss/loss_tdt.pytdt_lossrU      s   D ///kIkkklll F"."4Jua%%''L%++--O '"===EO*?CCC
Ju5uV}}VTTTIIaaaAg &aaaAAA~&=>Oqyy",,Q//66r5"EE,AAAqqq+EAI+qqq01",,R00
 
 
 '"++	 	 l5==888G 1eema'(( )Q )QaUQ''AE5!!L%???		M		** 	/ 	/FAs_FkG;;== LLQL''E Qwwaaa	12%aaa	&9:;(E9a)?@A 
  +g&7&7&:&:GWMM%%g...  !mG 7*J~~ 
/"Q--!-44<AAIIekkeaik8885 aaao.%aaa&;<=(E5!);<= 
  +j&:&:1&=&=wPP%%g... 	Qk.a888G16a1P1P1PIaaaI-. Z777I
J=%--GGGII&& T T3!88#%1yy{{ 	MMaM((	iN:;iNNRST I~q!HIJ 	
 ;	84!<<<KuxQ'G'G'GSS		ZFF--///55777	e		zz||M    c	                    | j         }
t          | ||                    |
                                          |                    |
                                          |                    |
                                          ||||	  	        S )N)	r   r   r	   r
   r   r   r   r   r   )r   rU   toint)r   r   labelsr
   label_lengthsr   r   r   r   kwargsr   s              rT   ParakeetForTDTLossr]      s      F!'		&!!%%''#&&v..2244$''//3355%
 
 
 
rV   )r   r   )r   utilsr   
get_logger__name__loggerTensorrY   listr   strrU   r]    rV   rT   <module>rf      s           
	H	%	% F F,F\F \F <	F
 LF F CyF F F \F F F Fb      rV   