Ë
    T^(hà"  ã                   ó¾   — d dl 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é   )Ú_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                 ór  ‡ ‡‡‡
‡— ‰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 «       «      }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 ]¹  \  Š
}t%        |«      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     úe/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/transformers/utils/attention_visualizer.pyú	<genexpr>z6generate_attention_matrix_from_mask.<locals>.<genexpr>5   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>H   sj   øè ø€ ò 	ð ð ��1�Š:ô ˆ(”<�.¤ Ñ(ð �Š6ô ˆw”|�n¤U GÑ,ð ��1�Š:õ äó	ñ	ùs   ƒAAz: i == j (diagonal)   z: token_type_idsé   zAttention MatrixzSliding Window Maskz	    |    Ú c              3   óÈ   •K  — | ]Y  }‰‰|   v r"‰‰|f   r‰‰‰   v rt         › t        › t        › �n+‰|k(  rt        › t        › t        › �n‰‰|f   rt        nt        –— Œ[ y ­wr   r   )r   r"   ÚiÚ	img_tokenr#   Úwordss     €€€€r   r   z6generate_attention_matrix_from_mask.<locals>.<genexpr>n   s€   øè ø€ ò 	
ð ð ˜E !™HÑ$¨¨a°¨dª¸	ÀUÈ1ÁXÑ8Mô ˆh”|�n¤U GÑ,ð �AŠvô �7œ<˜.¬¨Ñ0ð �A�q�DŠzõ äóñ	
ùs   ƒAA"c              3   ó¼   •K  — | ]S  }‰‰|   v r‰‰‰   v rt         › t        › t        › �n,‰|k(  rt        › t        › t        › �n‰‰   |   rt        nt        –— ŒU y ­wr   r   )r   r"   r'   r(   Úsliding_window_maskr)   s     €€€€r   r   z6generate_attention_matrix_from_mask.<locals>.<genexpr>z   sx   øè ø€ ò 	*ð ð   a¡Ñ(¨Y¸%À¹(Ñ-Bô �(œ<˜.¬¨Ñ0ð ˜’6ô �wœ|˜n¬U¨GÑ4ð ' qÑ)¨!Ò,õ "ä!ó"ñ	*ùs   ƒAAz: ú
)ÚintÚndimr   ÚmaxÚ	enumerateÚrangeÚjoinr    r   r   r   ÚappendÚljustÚlistÚstrÚrjustÚmapÚzipr   )r)   r#   r(   Úsliding_windowÚtoken_type_idsÚnÚmax_word_lengthÚfirst_img_idxÚoutputÚkr'   r"   Ú	row_dummyÚlegendÚf_stringÚvertical_headerÚidxr   ÚrowÚ	word_reprÚcolored_wordÚrow_displayÚsliding_window_rowr+   s   ```       `            @r   Ú#generate_attention_matrix_from_maskrK   '   sÊ  ü€ ð �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ô ˆ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ÓÐùòC  ]ùÓoùò0 $fs   ÃN.Ã#N)Ã?N.ÈN4
Î)N.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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>r:   r$   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)ÚselfrY   rN   s      r   rV   z@AttentionMaskVisualizer.__init__.<locals>._ModelWrapper.__init__š   s-   € Ü—	‘	×"Ñ" 4Ô(Ü$&§I¡I¨a°£O�Ô!Ø$�•ó    N)Ú__name__Ú
__module__Ú__qualname__rV   © r[   r   Ú_ModelWrapperrR   ™   s   „ ó%r[   r`   )r   Úfrom_pretrainedÚimage_tokenÚhasattrÚget_text_configr:   r   r   Ú	Exceptionr   Ú
ValueErrorÚ
mapped_clsrT   rU   ÚmodelÚtoÚtorch_dtypeÚrepo_idrY   )rZ   rN   rY   rg   r`   s        r   rV   z AttentionMaskVisualizer.__init__‹   sÒ   € Ü×+Ñ+¨JÓ7ˆØ"ˆÔÜ�6×)Ñ)Ó+Ð-=Ô>Ø$%ˆFÔ!ð	QÜ)¨&´-Ó@ˆJð ÐÜ˜{¨:¨,Ð6cÐdÓeÐeØ$ˆŒô	%˜J¬¯	©	ô 	%ñ # 6¨:Ó6ˆŒ
Ø�
‰
�‰�f×(Ñ(Ô)Ø!ˆŒØˆ�øô! ò 	QÜ)¨&Ô2OÓPŠJð	Qús   ¿C ÃCÃCÚinput_sentencec                 ó*   — | j                  ||¬«       y )N)Úsuffix)Úvisualize_attention_mask)rZ   rl   rn   s      r   Ú__call__z AttentionMaskVisualizer.__call__¤   s   € Ø×%Ñ% n¸VÐ%ÕDr[   c           
      ó¸  — | j                   }i }| j                  j                  t        v �rd}t	        j
                  t        j                  |d¬«      j                  «      }t        j                  | j                  d¬«      }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                  d|	|	j3                  | j                   j4                  «      t7        j8                  |	j:                  d   «      d dœ|¤Žj=                  «        }	dt?        d| j                  j                  › d| j@                  › �«      dz   z  }d}tC        d|› �«       tC        dd| j                  j                  › d| j                  › d| j@                  jD                  › �jG                  t?        |«      «      z   dz   |z   «       tC        |› «       tI        |
|	| j                  tK        | j                  dd «      |j                  dd «      ¬«      }tC        |«       tC        |› «       y ) Nzchttps://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg?download=trueT)Ústreamr$   )Úimage_seq_lengthrb   r   rP   Úpt)rn   Úreturn_tensorsÚattention_maskr;   Ú	input_ids)ru   zModel type z) does not support attention visualizationÚeagerr   )rv   Úinput_tensorÚcache_positionÚpast_key_valuesz##zAttention visualization for z | r   r,   z"  Attention visualization for [1mú:z[0m z    r:   )r(   r:   r;   r_   )&rh   rY   Ú
model_typer	   r   ÚopenÚrequestsÚgetÚrawr
   ra   rk   rc   rb   Ú	tokenizerÚconvert_ids_to_tokensÚimage_token_idÚreplacer   r   Útokenizerf   Ú_attn_implementationÚtrainÚ_update_causal_maskri   ÚdtypeÚtorchÚarangeÚshapeÚboolr   rg   Úprintr\   ÚcenterrK   Úgetattr)rZ   rl   rn   rh   ÚkwargsÚimgÚ	processorrb   Úinputsrv   Útokensr‚   Útop_bottom_borderÚside_borderrC   s                  r   ro   z0AttentionMaskVisualizer.visualize_attention_mask§   s,  € Ø—
‘
ˆØˆØ�;‰;×!Ñ!Ô%<Ò<ØwˆCÜ—*‘*œXŸ\™\¨#°dÔ;×?Ñ?Ó@ˆCÜ%×5Ñ5°d·l±lÐUVÔWˆIÜ�y -Ô0Ø'×3Ñ3‘à'×1Ñ1×GÑGÈ×IaÑIaÐHbÓcÐdeÑf�áØ!/×!7Ñ!7¸ÀÓ!M�á˜s N¸6ÐRVÔWˆ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ˆ�‰Ô)Ø�‰ŒØ3˜%×3Ñ3ð 
Ø)Ø'×*Ñ*¨4¯:©:×+;Ñ+;Ó<Ü Ÿ<™<¨×(<Ñ(<¸QÑ(?Ó@Ø ñ	
ð
 ñ
÷ ‰$‹&ðˆð !ÜÐ.¨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¸Ó=ô
ˆô 	ˆhŒÜÐ"Ð#Õ%r[   N)r%   )r\   r]   r^   r6   rV   rp   ro   r_   r[   r   rM   rM   Š   s(   „ ð 3ó ñ2E só Eñ=&°sô =&r[   rM   )rP   NN)r   ÚPILr   Ú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   r‹   Útorch.nnrT   r    r   r   r   r!   rK   rM   r_   r[   r   ú<module>r¡      s[   ðó  Ý å 7Ý 7ß Tß Pß RÝ ,ñ ÔÛÝð 	€Ø	€Ø€Ø€Ø€ó`÷FZ&ò Z&r[   