ó
    pyüi¬/  ã                   óœ   • S SK r S SKJs  Jr  SSKJr  SSKJrJ	r	J
r
  SSKJr  \" 5       (       a  S SKJr   " S S	\5      r       SS
 jrg)é    Né   )Úis_vision_availableé   )Ú	DFineLossÚ_set_aux_lossÚ_set_aux_loss2)Úbox_iou)Úcenter_to_corners_formatc                   óF   ^ • \ rS rSrU 4S jrS rS rS rU 4S jrSr	U =r
$ )Ú
Deimv2Lossé   c                 óø   >• [         TU ]  U5        UR                  UR                  UR                  UR
                  UR                  S.U l        / SQU l        UR                  U l	        UR                  U l
        g )N)Úloss_malÚ	loss_bboxÚ	loss_giouÚloss_fglÚloss_ddf)ÚmalÚboxesÚlocal)ÚsuperÚ__init__Úweight_loss_malÚweight_loss_bboxÚweight_loss_giouÚweight_loss_fglÚweight_loss_ddfÚweight_dictÚlossesÚ	mal_alphaÚuse_dense_one_to_one)ÚselfÚconfigÚ	__class__s     €ÚZ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/transformers/loss/loss_deimv2.pyr   ÚDeimv2Loss.__init__   sk   ø€ Ü‰Ñ˜Ô à×.Ñ.Ø×0Ñ0Ø×0Ñ0Ø×.Ñ.Ø×.Ñ.ñ
ˆÔò 0ˆŒØ×)Ñ)ˆŒØ$*×$?Ñ$?ˆÕ!ó    c           	      ó>  • U R                  U5      nUS   U   n[        R                  " [        X#5       VVV	s/ s H  u  nu  p‰US   U	   PM     sn	nnSS9n
[	        [        U5      [        U
5      5      u  p¸[        R                  " U5      R                  5       nUS   n[        R                  " [        X#5       VVV	s/ s H  u  nu  p‰US   U	   PM     sn	nn5      n[        R                  " UR                  SS U R                  [        R                  UR                  S	9nXÞU'   [        R                  " XàR                  S
-   S9SSS24   n[        R                  " XìR                   S9nUR#                  UR                   5      UU'   UR%                  S5      U-  n[        R&                  " U5      R                  5       nUR)                  U R*                  5      nU R,                  b2  U R,                  UR)                  U R*                  5      -  S
U-
  -  U-   nO$UR)                  U R*                  5      S
U-
  -  U-   n[        R.                  " UUUSS9nUR1                  S
5      R3                  5       UR                  S
   -  U-  nSU0$ s  sn	nnf s  sn	nnf )z¢Compute the Matching Aware Loss (MAL), which uses IoU-weighted soft labels
instead of hard one-hot targets, with focal-style weighting controlled by `mal_alpha`.
Ú
pred_boxesr   r   ©ÚdimÚlogitsÚclass_labelsNr   ©ÚdtypeÚdevicer   )Únum_classes.éÿÿÿÿ)r/   Únone)ÚweightÚ	reductionr   )Ú_get_source_permutation_idxÚtorchÚcatÚzipr	   r
   ÚdiagÚdetachÚfullÚshaper1   Úint64r0   ÚFÚone_hotÚ
zeros_liker/   ÚtoÚ	unsqueezeÚsigmoidÚpowÚgammar    Ú binary_cross_entropy_with_logitsÚmeanÚsum)r"   ÚoutputsÚtargetsÚindicesÚ	num_boxesÚidxÚ	src_boxesÚtÚ_ÚiÚtarget_boxesÚiousÚ
src_logitsÚtarget_classes_originalÚtarget_classesÚtargetÚtarget_score_originalÚtarget_scoreÚ
pred_scorer4   Úlosss                        r%   Úloss_labels_malÚDeimv2Loss.loss_labels_mal*   sR  € ð ×.Ñ.¨wÓ7ˆà˜LÑ)¨#Ñ.ˆ	Ü—y’yÄÀWÔAVÕ!WÒAV±I°A±v¸ ! G¡*¨Q¤-ÑAVÓ!WÐ]^Ñ_ˆÜÔ2°9Ó=Ô?WÐXdÓ?eÓf‰ˆÜ�zŠz˜$Ó×&Ñ&Ó(ˆà˜XÑ&ˆ
Ü"'§)¢)ÔSVÐW^ÔShÕ,iÒShÁiÀaÉÈ!¨Q¨~Ñ->¸qÔ-AÑShÓ,iÓ"jÐÜŸšØ×Ñ˜R˜aÐ  $×"2Ñ"2¼%¿+¹+Èj×N_ÑN_ñ
ˆð 6�sÑÜ—’˜>×7GÑ7GÈ!Ñ7KÑLÈSÐRUÐSUÐRUÈXÑVˆä %× 0Ò 0°×GWÑGWÑ XÐØ%)§W¡WÐ-B×-HÑ-HÓ%IÐ˜cÑ"Ø,×6Ñ6°rÓ:¸VÑCˆä—Y’Y˜zÓ*×1Ñ1Ó3ˆ
Ø#×'Ñ'¨¯
©
Ó3ˆØ�>‰>Ñ%Ø—^‘^ j§n¡n°T·Z±ZÓ&@Ñ@ÀAÈÁJÑOÐRXÑX‰Fà—^‘^ D§J¡JÓ/°1°v±:Ñ>ÀÑGˆFä×1Ò1°*¸lÐSYÐekÑlˆØ�y‰y˜‹|×ÑÓ! J×$4Ñ$4°QÑ$7Ñ7¸)ÑCˆØ˜DÐ!Ð!ùô3 "Xùô
 -js   ¹JÃ Jc                 ó¼  • / nU Hy  n[        UR                  5       UR                  5       5       VVs/ s HA  u  pV[        R                  " US   US   /5      [        R                  " US   US   /5      4PMC     nnnM{     U Vs/ s H0  n[        R                  " US   S S 2S 4   US   S S 2S 4   /S5      PM2     sn GH  n[        R                  " USSS9u  pš[        R
                  " U
SS9nX›   n0 nU H4  nUS   R                  5       US   R                  5       nnXý;  d  M0  UXß'   M6     [        R                  " [        UR                  5       5      UR                  S9n[        R                  " [        UR                  5       5      UR                  S9nUR                  UR                  5       UR                  5       45        GM     U$ s  snnf s  snf )Nr   r   T)Úreturn_countsr+   )Ú
descending)r0   )r9   Úcopyr7   r8   ÚuniqueÚargsortÚitemÚtensorÚlistÚkeysr0   ÚvaluesÚappendÚlong)r"   rL   Úindices_aux_listÚresultsÚindices_auxÚidx1Úidx2rN   Úindexrc   ÚcountsÚcount_sort_indicesÚunique_sortedÚcolumn_to_rowÚidx_pairÚrow_idxÚcol_idxÚ
final_rowsÚ
final_colss                      r%   Ú_get_dense_o2o_indicesÚ!Deimv2Loss._get_dense_o2o_indicesL   sª  € ØˆÛ+ˆKô #& g§l¡l£n°k×6FÑ6FÓ6HÔ"Iôâ"I‘J�Dô —’˜D ™G T¨!¡WÐ-Ó.´·	²	¸4À¹7ÀDÈÁGÐ:LÓ0MÓNÙ"Ið ñ ‰Gñ ,ñ SZÓZÒRYÈ3”e—i’i  Q¡ª¨4¨¡°#°a±&º¸D¸±/Ð BÀAÖFÑRYÕZˆEÜ"Ÿ\š\¨%¸tÈÑK‰NˆFÜ!&§¢¨vÀ$Ñ!GÐØ"Ñ6ˆMØˆMÛ)�Ø#+¨A¡;×#3Ñ#3Ó#5°xÀ±{×7GÑ7GÓ7I˜�ØÕ/Ø-4�MÓ*ñ *ô Ÿš¤d¨=×+=Ñ+=Ó+?Ó&@ÈÏÉÑVˆJÜŸš¤d¨=×+?Ñ+?Ó+AÓ&BÈ5Ï<É<ÑXˆJØ�N‰N˜JŸO™OÓ-¨z¯©Ó/@ÐA×Bñ [ð ˆùó#ùò
 [s   ³AGÂ7Gc                 óÊ   • U R                   U R                  U R                  U R                  U R                  U R
                  S.nX;  a  [        SU S35      eXa   " X#XE5      $ )N)Úcardinalityr   r   ÚfocalÚvflr   zLoss z not supported)Úloss_cardinalityÚ
loss_localÚ
loss_boxesÚloss_labels_focalÚloss_labels_vflr]   Ú
ValueError)r"   r\   rJ   rK   rL   rM   Úloss_maps          r%   Úget_lossÚDeimv2Loss.get_lossb   sf   € à×0Ñ0Ø—_‘_Ø—_‘_Ø×+Ñ+Ø×'Ñ'Ø×'Ñ'ñ
ˆð ÓÜ˜u T F¨.Ð9Ó:Ð:ØŠ~˜g°ÓCÐCr'   c           
      ó\  >• U R                   (       d  [        TU ]	  X5      $ UR                  5        VVs0 s H  u  p4SU;  d  M  X4_M     nnnU R	                  XR5      n[        S U 5       5      n[        R                  " U/[        R                  [        [        UR                  5       5      5      R                  S9n[        R                  " USS9R                  5       n/ n/ n	SU;   a?  US    H6  n
U R	                  X¢5      nUR                  U5        U	R                  U5        M8     U R!                  Xi5      n[        S U 5       5      n[        R                  " U/[        R                  [        [        UR                  5       5      5      R                  S9n[        R                  " USS9R                  5       n0 nU R"                   Hz  nUS;   nU(       a  UOUnU(       a  UOUnU R%                  XñUUU5      nU Vs0 s H*  o3U R&                  ;   d  M  UUU   U R&                  U   -  _M,     nnUR)                  U5        M|     SU;   aÐ  [+        US   5       H¾  u  nn
U R"                   H¨  nUS;   nU(       a  UOUU   nU(       a  UOUnU R%                  XúUUU5      nU Vs0 s H*  o3U R&                  ;   d  M  UUU   U R&                  U   -  _M,     nnUR                  5        VVs0 s H  u  p4USU 3-   U_M     nnnUR)                  U5        Mª     MÀ     S	U;   aâ  S
U;  a  [-        S5      eU R/                  US
   U5      nXqS
   S   -  n[+        US	   5       H   u  nn
U R"                   HŠ  nU R%                  XúUUU5      nU Vs0 s H*  o3U R&                  ;   d  M  UUU   U R&                  U   -  _M,     nnUR                  5        VVs0 s H  u  p4USU 3-   U_M     nnnUR)                  U5        MŒ     M¢     U$ s  snnf s  snf s  snf s  snnf s  snf s  snnf )aj  
This performs the loss computation.

Args:
     outputs (`dict`, *optional*):
        Dictionary of tensors, see the output specification of the model for the format.
     targets (`list[dict]`, *optional*):
        List of dicts, such that `len(targets) == batch_size`. The expected keys in each dict depends on the
        losses applied, see each loss' doc.
Úauxiliary_outputsc              3   ó>   #   • U  H  n[        US    5      v •  M     g7f)r-   N©Úlen)Ú.0rP   s     r%   Ú	<genexpr>Ú%Deimv2Loss.forward.<locals>.<genexpr>‚   s   é € Ð@º°1œ˜A˜nÑ-×.Ð.ºùó   ‚r.   r   )Úminc              3   ó>   #   • U  H  n[        US    5      v •  M     g7f)r   Nr�   )r�   Úxs     r%   r�   r‘   ‘   s   é € Ð9ªj¨œ3˜q ™tŸ9˜9ªjùr’   )r   r   Ú_aux_Údn_auxiliary_outputsÚdenoising_meta_valuesz}The output must have the 'denoising_meta_values` key. Please, ensure that 'outputs' includes a 'denoising_meta_values' entry.Údn_num_groupÚ_dn_)r!   r   ÚforwardÚitemsÚmatcherrI   r7   Ú	as_tensorÚfloatÚnextÚiterri   r0   Úclampre   rj   r{   r   rˆ   r   ÚupdateÚ	enumerater†   Úget_cdn_matched_indices)r"   rJ   rK   ÚkÚvÚoutputs_without_auxrL   rM   Úcached_indicesrl   r‹   Úaux_indicesÚ
indices_goÚnum_boxes_gor   r\   Ú	use_unionÚ
indices_inÚnum_boxes_inÚl_dictrR   Ú
dn_indicesÚdn_num_boxesr$   s                          €r%   r›   ÚDeimv2Loss.forwardo   s  ø€ ð ×(×(Ü‘7‘? 7Ó4Ð4ð 18·±´Ô`²©¨ÐCVÐ^_ÑC_›t˜qšt±ÐÑ`Ø—,‘,Ð2Ó<ˆô Ñ@¹Ó@Ó@ˆ	Ü—O’O Y K´u·{±{Ì4ÔPTÐU\×UcÑUcÓUeÓPfÓKg×KnÑKnÑoˆ	Ü—K’K 	¨qÑ1×6Ñ6Ó8ˆ	ð ˆØÐØ 'Ó)Ø%,Ð-@Ô%AÐ!Ø"Ÿl™lÐ+<ÓF�Ø×%Ñ% kÔ2Ø ×'Ñ'¨Ö4ñ &Bð ×0Ñ0°ÓKˆ
ÜÑ9©jÓ9Ó9ˆÜ—’¨ ~¼U¿[¹[ÔQUÔVZÐ[b×[iÑ[iÓ[kÓVlÓQm×QtÑQtÑuˆÜ—{’{ <°QÑ7×<Ñ<Ó>ˆð ˆØ—K”KˆDØÐ 2Ñ2ˆIÞ'0™°gˆJÞ+4™<¸)ˆLØ—]‘] 4°'¸:À|ÓTˆFÙBHÓbÂ&¸QÐQU×QaÑQaÑLaÓ8�a˜ ™ T×%5Ñ%5°aÑ%8Ñ8Ò8Á&ˆFÐbØ�M‰M˜&Ö!ñ  ð  'Ó)Ü(1°'Ð:MÑ2NÖ(OÑ$�Ð$Ø ŸKœK�DØ $Ð(:Ñ :�IÞ/8¡¸nÈQÑ>O�JÞ3<¡<À)�LØ!Ÿ]™]¨4ÀGÈZÐYeÓf�FÙJPÓjÊ&ÀQÐY]×YiÑYiÑTiÓ@˜a ¨¡¨T×-=Ñ-=¸aÑ-@Ñ!@Ò@É&�FÐjØ=C¿\¹\¼^ÔLº^±T°Q˜a E¨!¨ +™o¨qÒ0¹^�FÑLØ—M‘M &Ö)ó (ñ )Pð " WÓ,Ø&¨gÓ5Ü ð^óð ð ×5Ñ5°gÐ>UÑ6VÐX_Ó`ˆJØ$Ð/FÑ'GÈÑ'WÑWˆLÜ(1°'Ð:PÑ2QÖ(RÑ$�Ð$Ø ŸKœK�DØ!Ÿ]™]¨4ÀGÈZÐYeÓf�FÙJPÓjÊ&ÀQÐY]×YiÑYiÑTiÓ@˜a ¨¡¨T×-=Ñ-=¸aÑ-@Ñ!@Ò@É&�FÐjØ<B¿L¹L¼NÔKºN±D°A˜a D¨¨ *™n¨aÒ/¹N�FÑKØ—M‘M &Ö)ó	 (ñ )Sð ˆùó{ aùò< cùò kùÛLùò kùÛKs;   µPÁPÈPÈPÊ,PËPË2P
ÎP#Î+P#ÏP(
)r   r    r!   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r]   r{   rˆ   r›   Ú__static_attributes__Ú__classcell__)r$   s   @r%   r   r      s&   ø† õ@ò "òDò,D÷Ló Lr'   r   c           
      óÔ  • [        U5      nUR                  U5        XR                  SSS9S.nS nUR                  (       Ga  U	bÊ  [        R
                  " UR                  SSS9U	S   SS9u  nn[        R
                  " XYS   SS9u  nn[        R
                  " X	S   SS9u  nn[        R
                  " X9S   SS9u  nn[        R
                  " X©S   SS9u  nn[        R
                  " X¹S   SS9u  nnUUS'   UR                  SSS9US	'   OUR                  SSS9nUnU
nUn[        US S 2S S
24   R                  SS5      US S 2S S
24   R                  SS5      US S 2S S
24   R                  SS5      US S 2S S
24   R                  SS5      US S 2S
4   US S 2S
4   5      nXþS'   US   R                  [        U/UR                  SSS9/5      5        U	bg  [        WR                  SS5      WR                  SS5      WR                  SS5      WR                  SS5      US S 2S
4   US S 2S
4   5      nUUS'   XžS'   U" Xá5      n[        UR                  5       5      nUUU4$ )Nr   r   )r“   Úmax)r,   r)   Údn_num_splitr   r*   r,   r)   r2   r‹   r—   r˜   )r   rB   r¢   Úauxiliary_lossr7   Úsplitr   Ú	transposeÚextendr   rI   ri   )r,   Úlabelsr0   r)   r#   Úoutputs_classÚoutputs_coordÚenc_topk_logitsÚenc_topk_bboxesr˜   Úpredicted_cornersÚinitial_reference_pointsÚkwargsÚ	criterionÚoutputs_lossr‹   Údn_out_coordÚnormal_out_coordÚdn_out_classÚnormal_out_classrQ   Únormal_logitsÚnormal_pred_boxesÚdn_out_cornersÚout_cornersÚdn_out_refsÚout_refsr—   Ú	loss_dictr\   s                                 r%   ÚDeimv2ForObjectDetectionLossrÖ   ¾   sÝ  € ô ˜6Ó"€IØ‡L�L�Ôà$×4DÑ4DÈÐPQÐ4DÐ4RÑS€LØÐà××ÐØ Ñ,Ü-2¯[ª[Ø×#Ñ#¨¨qÐ#Ð1Ð3HÈÑ3XÐ^_ñ.Ñ*ˆLÐ*ô .3¯[ª[¸Ð^lÑHmÐstÑ-uÑ*ˆLÐ*ô  %Ÿ{š{¨6ÈÑ3XÐ^_Ñ`ÑˆAˆ}Ü#(§;¢;¨zÐQ_Ñ;`ÐfgÑ#hÑ ˆAÐ Ü*/¯+ª+Ð6GÐ_mÑInÐtuÑ*vÑ'ˆN˜KÜ$)§K¢KÐ0HÐ`nÑJoÐuvÑ$wÑ!ˆK˜à%2ˆL˜Ñ"Ø):×)@Ñ)@ÀQÈAÐ)@Ð)NˆL˜Ò&à,×2Ñ2°q¸aÐ2Ð@ÐØ,ÐØ+ˆKØ/ˆHä*ØšQ   ˜VÑ$×.Ñ.¨q°!Ó4ØšQ   ˜VÑ$×.Ñ.¨q°!Ó4Øš˜3˜B˜3˜Ñ×)Ñ)¨!¨QÓ/Ø’Q˜˜˜�VÑ×&Ñ& q¨!Ó,Øš˜2˜ÑØšQ ˜UÑ#ó
Ðð ->Ð(Ñ)ØÐ(Ñ)×0Ñ0Ü˜?Ð+¨o×.CÑ.CÈÈqÐ.CÐ.QÐ-RÓSô	
ð !Ñ,Ü#1Ø×&Ñ& q¨!Ó,Ø×&Ñ& q¨!Ó,Ø×(Ñ(¨¨AÓ.Ø×%Ñ% a¨Ó+Øšq "˜uÑ%ØšQ ˜UÑ#ó$Ð ð 4HˆLÐ/Ñ0Ø4IÐ0Ñ1á˜,Ó/€Iäˆy×ÑÓ!Ó"€DØ�Ð-Ð-Ð-r'   )NNNNNNN)r7   Útorch.nn.functionalÚnnÚ
functionalr?   Úutilsr   Úloss_d_finer   r   r   Úloss_for_object_detectionr	   Útransformers.image_transformsr
   r   rÖ   © r'   r%   Ú<module>rß      sV   ðó  ß Ð å 'ß AÑ AÝ .ñ ×ÑÝFô_�ô _ðP ØØØØØØ!õG.r'   