Ë
    îÍ:j'  ã                   óÌ   — d dl Z d dlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlmZmZ dd	lmZmZ d
dlmZ  e«       r
d dlZd dlmZ dZdZdZdZdZ	 dd„Z G d„ d«      Zy)é    N)ÚImageé   )Úcreate_causal_mask)Ú_get_model_class)Ú
AutoConfig)ÚMODEL_FOR_PRETRAINING_MAPPINGÚMODEL_MAPPING)ÚPROCESSOR_MAPPING_NAMESÚAutoProcessor)ÚTOKENIZER_MAPPING_NAMESÚAutoTokenizeré   )Úis_torch_availablez[92mz[93mz[0mu   â– u   â¬šc                 ó~  ‡ ‡‡‡‡‡‡— ‰j                  «       Š‰j                  dk(  r‰ddd…dd…f   Š‰j                  dk(  r‰dddd…dd…f   Št        ‰ «      }t        d„ ‰ D «       «      }d}g }	t	        ‰ «      D ]C  \  Š}
|
‰k(  r|s	‰}d‰‰‰f<   |dkD  sŒ|
‰k7  s	‰|dz
  k(  sŒ*‰|dz
  k(  r‰dz  Šd‰|‰…|‰…f<   d}ŒE dŠ|�Et        |«      D ��cg c].  }t        |«      D �cg c]  }d||z
  cxk  r|k  rn ndnd‘Œ c}‘Œ0 c}}Šdj                  ˆfd	„t        |«      D «       «      }|�|dk(  }t        j                  |j                  d
«      dz  |z   j                  «       |j                  d
«      d«      Št        j                  d|dz   |«      }t        j                  ‰|¬«      Št        › t        › t        › dt         › t        › t        › d�}|	j#                  d|z   «       d|dz   z  dj%                  t        |«      dz  «      z   }|�|dz  }|	j#                  |«       g }t	        ‰ «      D ]´  \  }Š‰||f   dk(  ra|j#                  t'        t)        |«      j+                  t        t)        |«      «      «      «      D �
cg c]  }
t         › |
› t        › �‘Œ c}
«       Œq|j#                  t'        t)        |«      j+                  t        t)        |«      «      «      «      «       Œ¶ t'        t-        t&        t/        |Ž «      «      }|D ]D  }|	j#                  |�/|dz   dz  dj                  |«      z   dz   dj                  |«      z   nd«       ŒF t	        ‰ «      D ]¼  \  ŠŠt1        ‰«      j%                  |«      }‰‰v rt         › |› t        › �n|}dj                  ˆˆˆˆˆ fd„t        |«      D «       «      }d}|�(dj                  ˆˆˆˆˆˆ fd„t        |«      D «       «      }|	j#                  |› dt)        ‰«      j+                  d«      › d|› d|› �«       Œ¾ dj                  |	«      S c c}w c c}}w c c}
w )zÚ
    Generates an attention matrix from a given attention mask.

    Optionally applies a sliding window mask (e.g., for Gemma2/3) and
    marks regions where image tokens occur based on the specified `img_token`.
    é   r   Né   c              3   óD   K  — | ]  }t        t        |«      «      –— Œ y ­w©N)ÚlenÚrepr)Ú.0Úwords     ú|/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/transformers/utils/attention_visualizer.pyú	<genexpr>z6generate_attention_matrix_from_mask.<locals>.<genexpr>8   s   è ø€ Ò<¨dœ#œd 4›jŸ/Ñ<ùs   ‚ r   r   ú c              3   ó¬   •K  — | ]K  }‰d |f   rt         › t        › t        › �n+d |k(  rt        › t        › t        › �n‰d |f   rt        nt        –— ŒM y­w©r   N©ÚYELLOWÚBLACK_SQUAREÚRESETÚGREENÚWHITE_SQUARE)r   ÚjÚmasks     €r   r   z6generate_attention_matrix_from_mask.<locals>.<genexpr>K   sj   øè ø€ ò 	ð ð ��1�Š:ô ˆ(”<�.¤ Ñ(ð �Š6ô ˆw”|�n¤U GÑ,ð ��1�Š:õ äó	ñ	ùs   ƒAAéÿÿÿÿé   )Ú
boundariesz: i == j (diagonal)   z: token_type_idszAttention MatrixzSliding Window Maskz	    |    Ú c              3   óÂ   •K  — | ]V  }‰‰|   v r‰‰|f   r‰‰v rt         › t        › t        › �n+‰|k(  rt        › t        › t        › �n‰‰|f   rt        nt        –— ŒX y ­wr   r   )r   r$   ÚiÚ	img_tokenr%   r   Úwordss     €€€€€r   r   z6generate_attention_matrix_from_mask.<locals>.<genexpr>x   s|   øè ø€ ò 	
ð ð ˜E !™HÑ$¨¨a°¨dª¸	ÀTÑ8Iô ˆh”|�n¤U GÑ,ð �AŠvô �7œ<˜.¬¨Ñ0ð �A�q�DŠzõ äóñ	
ùs   ƒAAc              3   óÔ   •K  — | ]_  }‰‰|   v r'‰‰v r#‰d ‰f   ‰d |f   k(  rt         › t        › t        › �n,‰|k(  rt        › t        › t        › �n‰‰   |   rt        nt        –— Œa y­wr   r   )r   r$   r+   r,   Úsliding_window_maskÚtoken_type_bucketsr   r-   s     €€€€€€r   r   z6generate_attention_matrix_from_mask.<locals>.<genexpr>„   s•   øè ø€ ò 	*ð ð   a¡Ñ(¨Y¸$Ñ->ÐCUÐVWÐYZÐVZÑC[Ð_qÐrsÐuvÐrvÑ_wÒCwô �(œ<˜.¬¨Ñ0ð ˜’6ô �wœ|˜n¬U¨GÑ4ð ' qÑ)¨!Ò,õ "ä!ó"ñ	*ùs   ƒA%A(z: ú
)ÚintÚndimr   ÚmaxÚ	enumerateÚrangeÚjoinÚtorchÚwhereÚcumsumÚboolÚarangeÚ	bucketizer"   r    r!   r   ÚappendÚljustÚlistÚstrÚrjustÚmapÚzipr   )r-   r%   r,   Úsliding_windowÚtoken_type_idsÚimage_seq_lengthÚnÚmax_word_lengthÚfirst_img_idxÚoutputÚkr+   r$   Ú	row_dummyÚ
is_specialr(   ÚlegendÚf_stringÚvertical_headerÚidxÚrowÚ	word_reprÚcolored_wordÚrow_displayÚsliding_window_rowr/   r0   r   s   ```        `             @@@r   Ú#generate_attention_matrix_from_maskrX   (   sP  þ€ ð �8‰8‹:€DØ‡y�y�A‚~Ø�A’qš!�G‰}ˆØ‡y�y�A‚~Ø�A�qš!šQ�JÑˆäˆE‹
€AÜÑ<°eÔ<Ó<€OØ€MØ€Fä˜%Ó ò ‰ˆˆ1Ø�	Š>¡-ØˆMØˆD��A�‰JØ˜1Ó ! y¢.°A¸¸Q¹³JØ�A˜‘EŠzØ�Q‘�Ø56ˆD�˜q� -° /Ð1Ñ2Ø‰Mðð ÐØÐ!ÜfkÐlmÓfn×oÐabÔSXÐYZÓS[Ö\Èa a¨1¨q©5Ô&A°>Õ&A¡ÈÑ IÔ\ÓoÐà—‘ó 	ô �q“ô	ó 	€Ið Ð!Ø# qÑ(ˆ
Ü"Ÿ[™[Ø×"Ñ" 2Ó&¨Ñ*¨ZÑ7×=Ñ=Ó?À×AVÑAVÐWYÓAZÐ\]ó
Ðô —\‘\ !Ð%5¸Ñ%9Ð;KÓLˆ
Ü"Ÿ_™_Ð-?ÈJÔWÐô ˆw”|�n¤U GÐ+AÄ&ÀÌ,ÈÔX]ÐW^Ð^nÐo€FØ
‡M�M�#˜‘,ÔØ�o¨Ñ)Ñ*Ð-?×-EÑ-EÄcÈ)ÃnÐXYÑFYÓ-ZÑZ€HØÐ!ØÐ)Ñ)ˆØ
‡M�M�(Ôà€OÜ˜uÓ%ò F‰	ˆˆTØ��S�‰>˜QÒØ×"Ñ"Ä4ÌÈCËÏÉÔWZÔ[^Ð_`Ó[aÓWbÓHcÓCdÖ#e¸a¤v h¨q¨c´%°Ò$9Ò#eÕfà×"Ñ"¤4¬¨C«¯©´s¼3¸q»6³{Ó(CÓ#DÕEð	Fô œ3œt¤S¨/Ð%:Ó;Ó<€Oàò 
ˆØ�‰àÐ)ð ˜qÑ  CÑ'¨#¯(©(°3«-Ñ7¸+ÑEÈÏÉÐQTËÒUàõ	
ð
ô ˜UÓ#ò g‰ˆˆ4Ü˜“J×$Ñ$ _Ó5ˆ	Ø8AÀTÑ8Iœ&˜ ) ¬U¨GÑ4ÈyˆØ—h‘h÷ 	
ô ˜1“Xô	
ó 	
ˆð  ÐØÐ%Ø!$§¡÷ 	*ð 	*ô ˜q›ô	*ó 	"Ðð 	�‰˜˜ b¬¨Q«¯©°a«Ð(9¸¸;¸-ÀyÐQcÐPdÐeÕfð5gð8 �9‰9�VÓÐùòQ  ]ùÓoùò@ $fs   ÃP4Ã%P/ÄP4ÊP:
Ð/P4c                   ó4   — e Zd Zdefd„Zddefd„Zddefd„Zy)ÚAttentionMaskVisualizerÚ
model_namec                 óö  — t        j                  |«      }d| _        t        |j	                  «       d«      r t        |j	                  «       dd «      | _        	 t        |t        «      }|€t        d|› d�«      ‚|| _         G d„ d|t        j                  «      } |||«      | _        | j                  j!                  |j"                  «       || _        || _        y # t        $ r t        |t        «      }Y Œ�w xY w)Nú<img>rE   zModel name z- is not supported for attention visualizationc                   ó   — e Zd Zd„ Zy)ú7AttentionMaskVisualizer.__init__.<locals>._ModelWrapperc                 ó†   — t         j                  j                  | «       t        j                  dd«      | _        || _        y )Nr   )ÚnnÚModuleÚ__init__ÚLinearÚdummy_moduleÚconfig)Úselfrf   r[   s      r   rc   z@AttentionMaskVisualizer.__init__.<locals>._ModelWrapper.__init__¤   s-   € Ü—	‘	×"Ñ" 4Ô(Ü$&§I¡I¨a°£O�Ô!Ø$�•ó    N)Ú__name__Ú
__module__Ú__qualname__rc   © rh   r   Ú_ModelWrapperr_   £   s   „ ó%rh   rm   )r   Úfrom_pretrainedÚimage_tokenÚhasattrÚget_text_configÚgetattrrE   r   r	   Ú	Exceptionr   Ú
ValueErrorÚ
mapped_clsra   rb   ÚmodelÚtoÚdtypeÚrepo_idrf   )rg   r[   rf   ru   rm   s        r   rc   z AttentionMaskVisualizer.__init__•   sä   € Ü×+Ñ+¨JÓ7ˆØ"ˆÔÜ�6×)Ñ)Ó+Ð-=Ô>Ü")¨&×*@Ñ*@Ó*BÐDTÐVZÓ"[ˆDÔð	QÜ)¨&´-Ó@ˆJð ÐÜ˜{¨:¨,Ð6cÐdÓeÐeØ$ˆŒô	%˜J¬¯	©	ô 	%ñ # 6¨:Ó6ˆŒ
Ø�
‰
�‰�f—l‘lÔ#Ø!ˆŒØˆ�øô! ò 	QÜ)¨&Ô2OÓPŠJð	Qús   ÁC ÃC8Ã7C8Úinput_sentencec                 ó*   — | j                  ||¬«       y )N)Úsuffix)Úvisualize_attention_mask)rg   rz   r|   s      r   Ú__call__z AttentionMaskVisualizer.__call__®   s   € Ø×%Ñ% n¸VÐ%ÕDrh   c           
      óz  — | j                   }i }d }| j                  j                  t        v �rd}t	        j
                  t        j                  |d¬«      j                  «      }d}t        j                  | j                  |¬«      }t        |d«      r|j                  }n)|j                  j                  |j                   g«      d   }|r|j#                  d|«      } ||||d	¬
«      }	|j                  j                  |j                   g«      d   | _        |	d   }
d|	v r|	d   |d<   |j                  j                  |	d   d   «      }n}| j                  j                  t$        v r>t'        j                  | j                  «      }|j)                  |«      } ||d	¬«      d   }
n#t+        d|j                  j                  › d�«      ‚d|j                  _        |j/                  «        |
j0                  \  }}t3        j4                  |||j                  j6                  f| j                   j8                  ¬«      }t3        j:                  |«      }t=        |j                  ||
|d ¬«      }|�|j?                  «        }
n2|
jA                  d«      jA                  d«      jC                  |d||«      }
dtE        d| j                  j                  › d| jF                  › �«      dz   z  }d}tI        d|› �«       tI        dd| j                  j                  › d| j                  › d| jF                  jJ                  › �jM                  tE        |«      «      z   dz   |z   «       tI        |› «       tO        ||
| j                  tQ        | j                  dd «      |j                  d«      |¬«      }tI        |«       tI        |› «       y ) Nzchttps://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg?download=trueT)Ústreamr'   )rG   ro   r   r]   Úpt)ÚimagesÚtextr|   Úreturn_tensorsÚattention_maskrF   Ú	input_ids)r„   zModel type z) does not support attention visualizationÚeager)rx   )rf   Úinput_embedsr…   Úcache_positionÚpast_key_valuesr   z##zAttention visualization for z | r   r1   z"  Attention visualization for [1mú:z[0m z    rE   )r,   rE   rF   rG   ))rv   rf   Ú
model_typer
   r   ÚopenÚrequestsÚgetÚrawr   rn   ry   rp   ro   Ú	tokenizerÚconvert_ids_to_tokensÚimage_token_idÚreplacer   r   Útokenizert   Ú_attn_implementationÚtrainÚshaper8   ÚzerosÚhidden_sizerx   r<   r   r;   Ú	unsqueezeÚexpandr   ru   Úprintri   ÚcenterrX   rr   )rg   rz   r|   rv   ÚkwargsrG   ÚimgÚ	processorro   Úinputsr…   Útokensr‘   Ú
batch_sizeÚ
seq_lengthrˆ   r‰   Úcausal_maskÚtop_bottom_borderÚside_borderrP   s                        r   r}   z0AttentionMaskVisualizer.visualize_attention_mask±   s„  € Ø—
‘
ˆØˆØÐØ�;‰;×!Ñ!Ô%<Ò<ØwˆCÜ—*‘*œXŸ\™\¨#°dÔ;×?Ñ?Ó@ˆCØ ÐÜ%×5Ñ5°d·l±lÐUeÔfˆIÜ�y -Ô0Ø'×3Ñ3‘à'×1Ñ1×GÑGÈ×IaÑIaÐHbÓcÐdeÑf�áØ!/×!7Ñ!7¸ÀÓ!M�á c°ÀvÐ^bÔcˆFà(×2Ñ2×HÑHÈ)×JbÑJbÐIcÓdÐefÑgˆDÔà#Ð$4Ñ5ˆNØ 6Ñ)Ø+1Ð2BÑ+C�Ð'Ñ(Ø×(Ñ(×>Ñ>¸vÀkÑ?RÐSTÑ?UÓV‰FØ�[‰[×#Ñ#Ô'>Ñ>Ü%×5Ñ5°d·l±lÓCˆIØ×'Ñ'¨Ó7ˆFÙ& ~ÀdÔKÐL\Ñ]‰Nä˜{¨5¯<©<×+BÑ+BÐ*CÐClÐmÓnÐnà,3ˆ�‰Ô)Ø�‰Œà!/×!5Ñ!5Ñˆ
�JÜ—{‘{ J°
¸E¿L¹L×<TÑ<TÐ#UÐ]a×]gÑ]g×]mÑ]mÔnˆÜŸ™ jÓ1ˆä(Ø—<‘<Ø%Ø)Ø)Ø ô
ˆð Ð"Ø)×.Ñ.Ó0Ð0‰Nà+×5Ñ5°aÓ8×BÑBÀ1ÓE×LÑLÈZÐYZÐ\fÐhrÓsˆNØ ÜÐ.¨t¯{©{×/EÑ/EÐ.FÀcÈ$Ï/É/ÐIZÐ[Ó\Ð_`Ñ`ñ
Ðð ˆÜ�Ð$Ð%Ð&Ô'ÜØØ5°d·k±k×6LÑ6LÐ5MÈQÈtÏ|É|ÈnÐ\dÐei×etÑet×e}Ñe}Ðd~Ð÷  Gñ  GÜÐ%Ó&óñð ñ	ð
 ñô	
ô 	Ð"Ð#Ô%Ü6ØØØ×&Ñ&Ü" 4§;¡;Ð0@À$ÓGØ!Ÿ:™:Ð&6Ó7Ø-ô
ˆô 	ˆhŒÜÐ"Ð#Õ%rh   N)r)   )ri   rj   rk   rA   rc   r~   r}   rl   rh   r   rZ   rZ   ”   s*   „ ð 3ó ñ2E só EñJ&°sô J&rh   rZ   )r]   NNN)rŽ   ÚPILr   Úmasking_utilsr   Úmodels.auto.auto_factoryr   Úmodels.auto.configuration_autor   Úmodels.auto.modeling_autor   r	   Úmodels.auto.processing_autor
   r   Úmodels.auto.tokenization_autor   r   Úimport_utilsr   r8   Útorch.nnra   r"   r   r!   r    r#   rX   rZ   rl   rh   r   ú<module>r²      se   ðó  Ý å .Ý 7Ý 7ß Tß Pß RÝ ,ñ ÔÛÝð 	€Ø	€Ø€Ø€Ø€ð `dói÷Xg&ò g&rh   