Ë
    Hêñiµ'  ã                   óÐ   — d dl Z 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 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)Ú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     úi/var/www/pod-logistic/pod-ai/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.   r/   r   s   ```        `             @@@r   Ú#generate_attention_matrix_from_maskrW   (   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>rD   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)Úselfre   rZ   s      r   rb   z@AttentionMaskVisualizer.__init__.<locals>._ModelWrapper.__init__¤   s-   € Ü—	‘	×"Ñ" 4Ô(Ü$&§I¡I¨a°£O�Ô!Ø$�•ó    N)Ú__name__Ú
__module__Ú__qualname__rb   © rg   r   Ú_ModelWrapperr^   £   s   „ ó%rg   rl   )r   Úfrom_pretrainedÚimage_tokenÚhasattrÚget_text_configÚgetattrrD   r   r	   Ú	Exceptionr   Ú
ValueErrorÚ
mapped_clsr`   ra   ÚmodelÚtoÚdtypeÚrepo_idre   )rf   rZ   re   rt   rl   s        r   rb   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)rf   ry   r{   s      r   Ú__call__z AttentionMaskVisualizer.__call__®   s   € Ø×%Ñ% n¸VÐ%ÕDrg   c           
      óÎ  — | j                   }i }d }| j                  j                  t        v �r/d}t	        j
                  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|t)        j                  | j                  «      }|€t+        d| j                  › �«      ‚|j-                  |«      } ||d	¬«      d   }
|
€#t+        d| j                  j                  › d�«      ‚d|j                  _        |j1                  «        |
j2                  \  }}t5        j6                  |||j                  j8                  f| j                   j:                  ¬«      }t=        |j                  ||
d ¬«      }|€3|
j?                  d«      j?                  d«      jA                  |d||«      }
n?tC        |t4        jD                  «      r"|jG                  t4        jH                  ¬«       }
n| }
dtK        d| j                  j                  › d| jL                  › �«      dz   z  }d}tO        d|› �«       tO        dd| j                  j                  › d| j                  › d| jL                  jP                  › �jS                  tK        |«      «      z   dz   |z   «       tO        |› «       tU        ||
| j                  tW        | j                  dd «      |j                  d«      |¬ «      }tO        |«       tO        |› «       y )!Nzchttps://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg?download=trueT)Úfollow_redirectsr&   )rF   rn   r   r\   Úpt)ÚimagesÚtextr{   Úreturn_tensorsÚattention_maskrE   Ú	input_idszCould not load tokenizer for )rƒ   zModel type z) does not support attention visualizationÚeager)rw   )re   Úinputs_embedsr„   Úpast_key_valuesr   z##zAttention visualization for z | r   r0   z"  Attention visualization for [1mú:z[0m z    rD   )r+   rD   rE   rF   ),ru   re   Ú
model_typer
   r   ÚopenÚioÚBytesIOÚhttpxÚgetÚcontentr   rm   rx   ro   rn   Ú	tokenizerÚconvert_ids_to_tokensÚimage_token_idÚreplacer   rs   ÚtokenizeÚ_attn_implementationÚtrainÚshaper7   ÚzerosÚhidden_sizerw   r   Ú	unsqueezeÚexpandÚ
isinstanceÚTensorrv   r:   r   rt   Úprintrh   ÚcenterrW   rq   )rf   ry   r{   ru   ÚkwargsrF   ÚimgÚ	processorrn   Úinputsr„   Útokensr‘   Ú
batch_sizeÚ
seq_lengthr‡   Úcausal_maskÚtop_bottom_borderÚside_borderrO   s                       r   r|   z0AttentionMaskVisualizer.visualize_attention_mask±   s§  € Ø—
‘
ˆØˆØÐØ�;‰;×!Ñ!Ô%<Ò<ØwˆCÜ—*‘*œRŸZ™Z¬¯	©	°#ÈÔ(M×(UÑ(UÓVÓWˆ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ØÐ Ü Ð#@ÀÇÁÀÐ!OÓPÐPØ×'Ñ'¨Ó7ˆFÙ& ~ÀdÔKÐL\Ñ]ˆNØÐ%Ü  ;¨t¯{©{×/EÑ/EÐ.FÐFoÐ!pÓqÐqà,3ˆ�‰Ô)Ø�‰Œà!/×!5Ñ!5Ñˆ
�JÜŸ™ Z°¸U¿\¹\×=UÑ=UÐ$VÐ^b×^hÑ^h×^nÑ^nÔoˆä(Ø—<‘<Ø'Ø)Ø ô	
ˆð Ðà+×5Ñ5°aÓ8×BÑBÀ1ÓE×LÑLÈZÐYZÐ\fÐhrÓs‰NÜ˜¤U§\¡\Ô2Ø)Ÿn™n´5·:±:˜nÓ>Ð>‰Nà)˜\ˆ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ŒÜÐ"Ð#Õ%rg   N)r(   )rh   ri   rj   r@   rb   r}   r|   rk   rg   r   rY   rY   ”   s*   „ ð 3ó ñ2E só EñN&°sô N&rg   rY   )r\   NNN)rŒ   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   Úimport_utilsr   r7   Útorch.nnr`   r!   r   r    r   r"   rW   rY   rk   rg   r   ú<module>r´      sh   ðó 
ã Ý å .Ý 7Ý 7ß Tß PÝ 9Ý ,ñ ÔÛÝð 	€Ø	€Ø€Ø€Ø€ð `dói÷Xk&ò k&rg   