
    ^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y)    N   )loggingtoken_logitsduration_logitstargetslogit_lengthstarget_lengthsblank_token_id	durationssigma	reductionreturnc	           	      8	   d}	||	vr(t        d| ddj                  d |	D               d      | j                  }
| j                  \  }}}}| 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kD  rj|j                  d      j                  d|d      }t        j                  |ddddd|dz
  ddf   d|j                  d            j                  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 ]4  \  }}||z
  }|dk\  }|j%                         s"|j'                  d      } |dkD  rX|dd| |f   |dd| |f   z   |dd| ||f   z   }!t        j(                  |j                  d      |!|      }!|j+                  |!       |dkD  }"||"z  }#|#j%                         s|dz
  j'                  d      }$|dkD  r|$j'                  |dz
        n|$}%|dd| |$f   dd| |%f   z   |dd| |$|f   z   }!t        j(                  |#j                  d      |!|      }!|j+                  |!       7 |st        j,                  |d      }&t        j.                  |&d      |dd||f<    t        j                   ||

      }'t        j                  |ft	        d	      |

      }(t#        |      D ]  \  }}|dk(  r||z
  })|)dk\  }*|*j%                         s'|)j'                  d      }+||'|+|f   ||'|+||f   z   ||'|+||f   z   },t        j,                  |(|,gd      }-t        j(                  |*t        j.                  |-d      |(      }( |( }.|j	                         }|dk(  r!|.j1                         |j1                         z  S |dk(  r|.j3                         S |dk(  r|.|z  j3                         S |dk(  r|.j1                         S |.S )ab  
    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_volume"`, `"mean_batch"`, `"mean"`, `"sum"`, or `"none"`,
            mirroring NeMo's `RNNTLoss` (TDT shares the same reduction knob as RNN-T). Defaults to `"mean"`,
            the `rnnt_reduction` of the released Parakeet TDT checkpoints.

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

    )mean_volume
mean_batchmeansumnonezInvalid reduction mode "z". Expected one of z, c              3   2   K   | ]  }t        |        y w)N)repr).0rs     e/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/loss/loss_tdt.py	<genexpr>ztdt_loss.<locals>.<genexpr>>   s     Nq[\tTUwNqs   .)dimz-inf)device        Nr         )r   index)minr   )maxr   r   r   r   )
ValueErrorjoinr   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   valid_reductionsr   
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/                                                  r   tdt_lossr_      s   H L((&yk1DTYYNq`pNqEqDrrst
 	
   F"."4"4Jua%%'L%++-O ''"=EO**?C

Ju5uV}VTIIaAg &aA~&=>Oqy",,Q/66r5"E,,Aq+EAI+q01",,R0
 '"+	 	 ll5=8G 1eema'( )QaUQ'AE5!LL%?		M		* 	/FAs_FkG;;=LLQL'E Qwa	12%a	&9:;(E9a)?@A 
  ++g&7&7&:GWM%%g.  !mG 7*J~~"Q--!-4<AAIekkeaik85 ao.%a&;<=(E5!);<= 
  ++j&:&:1&=wP%%g.=	/@ kk.a8G16a1PIaI-.S)QX Z7I

J=%-GII& T3!8#%1yy{MMaM(	iN:;iNNRST I~q!HIJ 	
 ;;	84!<KKuxQ'GS	T" ZF#))+NM!zz|n00222	l	"{{}	f	'--//	e	zz|M    c	                     | j                   }
t        | ||j                  |
      j                         |j                  |
      j                         |j                  |
      j                         ||||	      S )N)	r   r   r   r   r	   r
   r   r   r   )r   r_   toint)r   r   labelsr   label_lengthsr
   r   r   r   kwargsr   s              r   ParakeetForTDTLossrg      sq       F!'		&!%%'#&&v.224$''/335%
 
r`   )r   r   )r)   utilsr   
get_logger__name__loggerTensorrc   listr(   strr_   rg    r`   r   <module>rp      s      
		H	% P,,P\\P \\P <<	P
 LLP P CyP P P \\Pv r`   