Ë
    ÛÓ^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Ð[\ÌtÐTUÏwÑNqùs   ‚ú.éÿÿÿÿ)Ú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ÐØÐ(Ñ(ÜØ& y kÐ1DÀTÇYÁYÑNqÐ`pÔNqÓEqÐDrÐrsÐtó
ð 	
ð × Ñ €FØ".×"4Ñ"4Ñ€J��u˜aà×%Ñ%Ó'€LØ%×+Ñ+Ó-€Oô ×'Ñ'¨¸"Ô=ÀÑE€OÜ×*Ñ*¨?ÀÔCÐä—
‘
˜J¨¨uÐ5´u¸V³}ÈVÔT€IØ€IŠa��AˆgÑð &¢aªªA¨~Ð&=Ñ>€Oàˆq‚yØ"×,Ñ,¨QÓ/×6Ñ6°r¸5À"ÓEÐÜŸ,™,ØšAšq + E¨A¡I +ªqÐ0Ñ1ØØ"×,Ñ,¨RÓ0ô
÷ ‰'�"‹+ð	 	ô �l‰lœ5 ›=°Ô8€Gô �1�e˜e‘m aÑ'Ó(ó )QˆÜ�a˜˜U™ Q™Ó'ˆÜ�A˜‘E˜5Ó!ˆÜ—L‘L ¨%¸Ô?ˆ	à˜	‘Mˆ	ØˆÜ 	Ó*ó 	/‰FˆAˆsØ ‘_ˆFØ ‘kˆGØ—;‘;”=ØØ—L‘L Q�LÓ'ˆEð �QŠwàša ¨	Ð1Ñ2Ø%¢a¨°	Ð&9Ñ:ñ;à(ª¨E°9¸aÐ)?Ñ@ñAð ô
  Ÿ+™+ g×&7Ñ&7¸Ó&:¸GÀWÓM�Ø×%Ñ% gÔ.ð   !‘mˆGØ  7Ñ*ˆJØ�~‰~ÕØ" Q™×-Ñ-°!Ð-Ó4�Ø<AÀAºI˜eŸk™k¨e°a©i˜kÔ8È5�ð ša ¨˜oÑ.Ø%¢a¨°Ð&;Ñ<ñ=à(ª¨E°5¸!Ð);Ñ<ñ=ð ô
  Ÿ+™+ j×&:Ñ&:¸1Ó&=¸wÈÓP�Ø×%Ñ% gÖ.ð=	/ó@ Ü—k‘k .°aÔ8ˆGÜ16·±ÀÈaÔ1PˆI’a˜ IÐ-Ó.ðS)QôX —‘˜Z°Ô7€IÜ—
‘
˜J˜=¬%°«-ÀÔG€IÜ˜IÓ&ò T‰ˆˆ3Ø�!Š8ØØ #Ñ%ˆØ˜1‘ˆØ�y‰yŒ{Øà—M‘M a�MÓ(ˆ	à�i ¨NÐ:Ñ;Ø˜i¨°NÀNÐRÑSñTà  ¨I°~ÀqÐ!HÑIñJð 	ô
 —;‘; 	¨8Ð4¸!Ô<ˆÜ—K‘K ¤u§¡°xÀQÔ'GÈÓS‰	ðTð" ˆZ€Fà#×)Ñ)Ó+€NØ�MÒ!Ø�z‰z‹|˜n×0Ñ0Ó2Ñ2Ð2Ø	�lÒ	"Ø�{‰{‹}ÐØ	�fÒ	Ø˜Ñ'×-Ñ-Ó/Ð/Ø	�eÒ	Ø�z‰z‹|ÐØ€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ð
 —L‘LðPð ðPð �C‰yðPð ðPð ðPð ‡\�\óPðv Øôr`   