§
    ‚ŠtjÌ  ã                   óÄ   — 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	           	      óZ
  — d}	||	vr3t          d|› dd                     d„ |	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 |dk    r|.|z                       ¦   «         S |dk    r|.                     ¦   «         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_batchr   ÚsumÚnonezInvalid reduction mode "z". Expected one of z, c              3   ó4   K  — | ]}t          |¦  «        V — Œd S )N)Úrepr)Ú.0Úrs     úX/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/loss/loss_tdt.pyú	<genexpr>ztdt_loss.<locals>.<genexpr>>   s*   è è € ÐNqÐNqÐ[\ÍtÐTUÉwÌwÐNqÐNqÐNqÐNqÐNqÐNqó    ú.éÿÿÿÿ)Údimz-inf)Údevicer   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ÐØÐ(Ð(Ð(ÝØt yÐtÐtÀTÇYÂYÐNqÐNqÐ`pÐNqÑNqÔNqÑEqÔEqÐtÐtÐtñ
ô 
ð 	
ð Ô €FØ".Ô"4Ñ€J��u˜aà×%Ò%Ñ'Ô'€LØ%×+Ò+Ñ-Ô-€Oõ Ô'¨¸"Ð=Ñ=Ô=ÀÑE€OÝÔ*¨?ÀÐCÑCÔCÐå”
˜J¨¨uÐ5µu¸V±}´}ÈVÐTÑTÔT€IØ€Iˆaˆaˆa��AˆgÑð & a a a¨¨¨¨A¨A¨A¨~Ð&=Ô>€Oàˆq‚y€yØ"×,Ò,¨QÑ/Ô/×6Ò6°r¸5À"ÑEÔEÐÝœ,Ø˜A˜A˜A˜q˜q˜q + E¨A¡I +¨q¨q¨qÐ0Ô1ØØ"×,Ò,¨RÑ0Ô0ð
ñ 
ô 
÷ Š'�"‰+Œ+ð	 	õ Œl�5 ™=œ=°Ð8Ñ8Ô8€Gõ �1�e˜e‘m aÑ'Ñ(Ô(ð )Qñ )QˆÝ�a˜˜U™ Q™Ñ'Ô'ˆÝ�A˜‘E˜5Ñ!Ô!ˆÝ”L ¨%¸Ð?Ñ?Ô?ˆ	à˜	‘Mˆ	ØˆÝ 	Ñ*Ô*ð 	/ñ 	/‰FˆAˆsØ ‘_ˆFØ ’kˆGØ—;’;‘=”=ð ØØ—L’L Q�LÑ'Ô'ˆEð �QŠwˆwà˜a˜a˜a ¨	Ð1Ô2Ø% a a a¨°	Ð&9Ô:ñ;à(¨¨¨¨E°9¸aÐ)?Ô@ñAð õ
  œ+ g×&7Ò&7¸Ñ&:Ô&:¸GÀWÑMÔM�Ø×%Ò% gÑ.Ô.Ð.ð   !’mˆGØ  7Ñ*ˆJØ�~Š~ÑÔð 
/Ø" Q™×-Ò-°!Ð-Ñ4Ô4�Ø<AÀAºI¸I˜eŸkšk¨e°a©i˜kÑ8Ô8Ð8È5�ð ˜a˜a˜a ¨˜oÔ.Ø% a a a¨°Ð&;Ô<ñ=à(¨¨¨¨E°5¸!Ð);Ô<ñ=ð õ
  œ+ j×&:Ò&:¸1Ñ&=Ô&=¸wÈÑPÔP�Ø×%Ò% gÑ.Ô.Ð.ùàð 	QÝ”k .°aÐ8Ñ8Ô8ˆGÝ16´ÀÈaÐ1PÑ1PÔ1PˆI�a�a�a˜ IÐ-Ñ.ùõ ”˜Z°Ð7Ñ7Ô7€IÝ”
˜J˜=­%°©-¬-ÀÐGÑGÔG€IÝ˜IÑ&Ô&ð Tð T‰ˆˆ3Ø�!Š8ˆ8ØØ #Ñ%ˆØ˜1’ˆØ�yŠy‰{Œ{ð 	Øà—M’M a�MÑ(Ô(ˆ	à�i ¨NÐ:Ô;Ø˜i¨°NÀNÐRÔSñTà  ¨I°~ÀqÐ!HÔIñJð 	õ
 ”; 	¨8Ð4¸!Ð<Ñ<Ô<ˆÝ”K ¥u¤°xÀQÐ'GÑ'GÔ'GÈÑSÔSˆ	ˆ	àˆZ€Fà#×)Ò)Ñ+Ô+€NØ�MÒ!Ð!Ø�zŠz‰|Œ|˜n×0Ò0Ñ2Ô2Ñ2Ð2Ø	�lÒ	"Ð	"Ø�{Š{‰}Œ}ÐØ	�fÒ	Ð	Ø˜Ñ'×-Ò-Ñ/Ô/Ð/Ø	�eÒ	Ð	Ø�zŠz‰|Œ|ÐØ€Mr   c	                 ó  — | j         }
t          | ||                     |
¦  «                             ¦   «         |                     |
¦  «                             ¦   «         |                     |
¦  «                             ¦   «         ||||¬¦	  «	        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   ª   sŠ   € ð Ô €FÝØ!Ø'Ø—	’	˜&Ñ!Ô!×%Ò%Ñ'Ô'Ø#×&Ò& vÑ.Ô.×2Ò2Ñ4Ô4Ø$×'Ò'¨Ñ/Ô/×3Ò3Ñ5Ô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ð ”<ð	Pð
 ”LðPð ðPð �CŒyðPð ðPð ðPð „\ðPð Pð Pð Pðv Øðð ð ð ð ð r   