§
    ‚Štjµ'  ã                   óÞ   — 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dS )é    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   â¬šú<img>c                 ó^	  ‡ ‡‡‡‡‡‡‡‡— ‰                      ¦   «         Š‰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 ]F\  Š}	|	‰k    r|s	‰}d‰‰‰f<   |dk    r*|	‰k    s	‰‰dz
  k    r‰‰dz
  k    r‰dz  Šd‰|‰…|‰…f<   d}ŒGdŠ‰�ˆˆfd„t          ‰¦  «        D ¦   «         Šd	                     ˆfd
„t          ‰¦  «        D ¦   «         ¦  «        }
|�‰|dk    }t          j        | 	                    d¦  «        dz  |z    
                    ¦   «         | 	                    d¦  «        d¦  «        Št          j        d|dz   |¦  «        }t          j        ‰|¬¦  «        Št          › t          › t          › dt           › t          › t          › d�}|                     d	|z   ¦  «         d	|dz   z  d                     t          |
¦  «        dz  ¦  «        z   }‰�|dz  }|                     |¦  «         g }t	          ‰ ¦  «        D ]Ö\  }Š‰||f         dk    rg|                     d„ t'          t)          |¦  «                             t          t)          ‰¦  «        ¦  «        ¦  «        ¦  «        D ¦   «         ¦  «         Œz|                     t'          t)          |¦  «                             t          t)          ‰¦  «        ¦  «        ¦  «        ¦  «        ¦  «         Œ×t'          t-          t&          t/          |Ž ¦  «        ¦  «        }|D ]P}|                     ‰�7|dz   d	z  d	                     |¦  «        z   dz   d	                     |¦  «        z   nd¦  «         ŒQt	          ‰ ¦  «        D ]è\  ŠŠt1          ‰¦  «                             |¦  «        }‰‰v rt           › |› t          › �n|}d	                     ˆˆˆˆˆ fd„t          ‰¦  «        D ¦   «         ¦  «        }d}‰�3d	                     ˆˆˆˆˆˆ fd„t          ‰¦  «        D ¦   «         ¦  «        }|                     |› dt)          ‰¦  «                             d¦  «        › d	|› d|› �¦  «         Œéd                     |¦  «        S )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   óN   K  — | ] }t          t          |¦  «        ¦  «        V — Œ!d S ©N)ÚlenÚrepr)Ú.0Úwords     úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/utils/attention_visualizer.pyú	<genexpr>z6generate_attention_matrix_from_mask.<locals>.<genexpr>8   s.   è è € Ð<Ð<¨d�#�d 4™jœj™/œ/Ð<Ð<Ð<Ð<Ð<Ð<ó    r   r   c                 óJ   •‡— g | ]Šˆˆfd „t          ‰¦  «        D ¦   «         ‘ŒS )c                 ó>   •— g | ]}d ‰|z
  cxk    r‰k     rn ndnd ‘ŒS )r   r   © )r   ÚjÚiÚsliding_windows     €€r   ú
<listcomp>zBgenerate_attention_matrix_from_mask.<locals>.<listcomp>.<listcomp>I   sB   ø€ Ð\Ð\Ð\Èa a¨1¨q©5Ð&AÐ&AÒ&AÐ&A°>Ò&AÐ&AÐ&AÐ&AÐ&A  ÈÐ\Ð\Ð\r   )Úrange)r   r    Únr!   s    @€€r   r"   z7generate_attention_matrix_from_mask.<locals>.<listcomp>I   s=   øø€ ÐoÐoÐoÐabÐ\Ð\Ð\Ð\Ð\ÕSXÐYZÑS[ÔS[Ð\Ñ\Ô\ÐoÐoÐor   ú c              3   óÄ   •K  — | ]Z}‰d |f         rt           › t          › t          › �n4|d k    rt          › t          › t          › �n‰d |f         rt          nt          V — Œ[dS ©r   N©ÚYELLOWÚBLACK_SQUAREÚRESETÚGREENÚWHITE_SQUARE)r   r   Úmasks     €r   r   z6generate_attention_matrix_from_mask.<locals>.<genexpr>K   s—   øè è € ð 	ð 	ð ð ��1�Œ:ð	�6Ð(•<Ð(¥Ð(Ð(Ð(ð �Š6ˆ6õ Ð,•|Ð,¥UÐ,Ð,Ð,ð ��1�Œ:ð�\ˆ\åð	ð 	ð 	ð 	ð 	ð 	r   éÿÿÿÿé   )Ú
boundariesz: i == j (diagonal)   z: token_type_idszAttention MatrixzSliding Window Maskc                 ó2   — g | ]}t           › |› t          › �‘ŒS r   )r)   r+   )r   Úks     r   r"   z7generate_attention_matrix_from_mask.<locals>.<listcomp>i   s(   € Ð#eÐ#eÐ#e¸a¥vÐ$9¨qÐ$9µ%Ð$9Ð$9Ð#eÐ#eÐ#er   z	    |    Ú c              3   óà   •K  — | ]h}‰‰|         v r%‰‰|f         r‰‰v rt           › t          › t          › �n4‰|k    rt          › t          › t          › �n‰‰|f         rt          nt          V — Œid S r   r(   )r   r   r    Ú	img_tokenr.   r   Úwordss     €€€€€r   r   z6generate_attention_matrix_from_mask.<locals>.<genexpr>x   s°   øè è € ð 	
ð 	
ð ð ˜E !œHÐ$Ð$¨¨a°¨d¬Ð$¸	ÀTÐ8IÐ8Iõ Ð,•|Ð,¥UÐ,Ð,Ð,ð �AŠvˆvõ Ð0�<Ð0­Ð0Ð0Ð0ð �A�q�DŒzð•�åð	
ð 	
ð 	
ð 	
ð 	
ð 	
r   c              3   ó   •K  — | ]x}‰‰|         v r1‰‰v r-‰d ‰f         ‰d |f         k    rt           › t          › t          › �n8‰|k    rt          › t          › t          › �n‰‰         |         rt          nt          V — ŒydS r'   r(   )r   r   r    r6   Úsliding_window_maskÚtoken_type_bucketsr   r7   s     €€€€€€r   r   z6generate_attention_matrix_from_mask.<locals>.<genexpr>„   sÉ   øè è € ð 	*ð 	*ð ð   a¤Ð(Ð(¨Y¸$Ð->Ð->ÐCUÐVWÐYZÐVZÔC[Ð_qÐrsÐuvÐrvÔ_wÒCwÐCwõ Ð0�<Ð0­Ð0Ð0Ð0ð ˜’6�6õ Ð4�|Ð4­UÐ4Ð4Ð4ð ' qÔ)¨!Ô,ð"•\�\å!ð	*ð 	*ð 	*ð 	*ð 	*ð 	*r   z: ú
)ÚintÚndimr   ÚmaxÚ	enumerater#   ÚjoinÚtorchÚwhereÚcumsumÚboolÚarangeÚ	bucketizer,   r*   r+   r)   ÚappendÚljustÚlistÚstrÚrjustÚmapÚzipr   )r7   r.   r6   r!   Útoken_type_idsÚimage_seq_lengthÚmax_word_lengthÚfirst_img_idxÚoutputr3   Ú	row_dummyÚ
is_specialr1   ÚlegendÚf_stringÚvertical_headerÚidxÚrowÚ	word_reprÚcolored_wordÚrow_displayÚsliding_window_rowr    r$   r9   r:   r   s   ````                  @@@@@r   Ú#generate_attention_matrix_from_maskr^   (   sv  øøøøøøøøø€ ð �8Š8‰:Œ:€DØ„y�A‚~€~Ø�A�q�q�q˜!˜!˜!�GŒ}ˆØ„y�A‚~€~Ø�A�q˜!˜!˜!˜Q˜Q˜Q�JÔˆåˆE‰
Œ
€AÝÐ<Ð<°eÐ<Ñ<Ô<Ñ<Ô<€OØ€MØ€Få˜%Ñ Ô ð ð ‰ˆˆ1Ø�	Š>ˆ> -ˆ>ØˆMØˆD��A�‰JØ˜1ÒÐ ! y¢. .°A¸¸Q¹²J°JØ�A˜‘EŠzˆzØ�Q‘�Ø56ˆD�˜q� -° /Ð1Ñ2ØˆMøð ÐØÐ!ØoÐoÐoÐoÐoÕfkÐlmÑfnÔfnÐoÑoÔoÐà—’ð 	ð 	ð 	ð 	õ �q‘”ð	ñ 	ô 	ñ 	ô 	€Ið Ð!Ø# qÒ(ˆ
Ý"œ[Ø×"Ò" 2Ñ&Ô&¨Ñ*¨ZÑ7×=Ò=Ñ?Ô?À×AVÒAVÐWYÑAZÔAZÐ\]ñ
ô 
Ðõ ”\ !Ð%5¸Ñ%9Ð;KÑLÔLˆ
Ý"œ_Ð-?ÈJÐWÑWÔWÐõ Ðo•|Ðo¥UÐoÐoÅ&ÐoÍ,ÐoÕX]ÐoÐoÐo€FØ
‡M‚M�#˜‘,ÑÔÐØ�o¨Ñ)Ñ*Ð-?×-EÒ-EÅcÈ)ÁnÄnÐXYÑFYÑ-ZÔ-ZÑZ€HØÐ!ØÐ)Ñ)ˆØ
‡M‚M�(ÑÔÐà€OÝ˜uÑ%Ô%ð Fð F‰	ˆˆTØ��S�Œ>˜QÒÐØ×"Ò"Ð#eÐ#eÅ4ÍÈCÉÌÏÊÕWZÕ[^Ð_`Ñ[aÔ[aÑWbÔWbÑHcÔHcÑCdÔCdÐ#eÑ#eÔ#eÑfÔfÐfÐfà×"Ò"¥4­¨C©¬¯ªµs½3¸q¹6¼6±{´{Ñ(CÔ(CÑ#DÔ#DÑEÔEÐEÐEå�3�t¥S¨/Ð%:Ñ;Ô;Ñ<Ô<€Oàð 
ð 
ˆØ�ŠàÐ)ð ˜qÑ  CÑ'¨#¯(ª(°3©-¬-Ñ7¸+ÑEÈÏÊÐQTÉÌÑUÐUàñ	
ô 	
ð 	
ð 	
õ
 ˜UÑ#Ô#ð gð g‰ˆˆ4Ý˜‘J”J×$Ò$ _Ñ5Ô5ˆ	Ø8AÀTÐ8IÐ8I�&Ð4 )Ð4­UÐ4Ð4Ð4ÈyˆØ—h’hð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ ˜1‘X”Xð	
ñ 	
ô 	
ñ 	
ô 	
ˆð  ÐØÐ%Ø!$§¢ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*õ ˜q™œð	*ñ 	*ô 	*ñ 	"ô 	"Ðð 	�Š˜ÐeÐe­¨Q©¬¯ª°a©¬ÐeÐe¸;ÐeÐeÐQcÐeÐeÑfÔfÐfÐfà�9Š9�VÑÔÐr   c                   ó6   — e Zd Zdefd„Zddefd„Zddefd„ZdS )	ÚAttentionMaskVisualizerÚ
model_namec                 ó.  — t          j        |¦  «        }d| _        t          |                     ¦   «         d¦  «        r(t          |                     ¦   «         dd ¦  «        | _        	 t          |t          ¦  «        }n%# t          $ r t          |t          ¦  «        }Y nw xY w|€t          d|› d�¦  «        ‚|| _         G d„ d|t          j        ¦  «        } |||¦  «        | _        | j                             |j        ¦  «         || _        || _        d S )Nr   r!   zModel name z- is not supported for attention visualizationc                   ó   — e Zd Zd„ ZdS )ú7AttentionMaskVisualizer.__init__.<locals>._ModelWrapperc                 ó†   — t           j                             | ¦  «         t          j        dd¦  «        | _        || _        d S )Nr   )ÚnnÚModuleÚ__init__ÚLinearÚdummy_moduleÚconfig)Úselfrk   ra   s      r   rh   z@AttentionMaskVisualizer.__init__.<locals>._ModelWrapper.__init__¤   s5   € Ý”	×"Ò" 4Ñ(Ô(Ð(Ý$&¤I¨a°¡O¤O�Ô!Ø$�”��r   N)Ú__name__Ú
__module__Ú__qualname__rh   r   r   r   Ú_ModelWrapperrd   £   s#   € € € € € ð%ð %ð %ð %ð %r   rp   )r   Úfrom_pretrainedÚimage_tokenÚhasattrÚget_text_configÚgetattrr!   r   r	   Ú	Exceptionr   Ú
ValueErrorÚ
mapped_clsrf   rg   ÚmodelÚtoÚdtypeÚrepo_idrk   )rl   ra   rk   rx   rp   s        r   rh   z AttentionMaskVisualizer.__init__•   s:  € ÝÔ+¨JÑ7Ô7ˆØ"ˆÔÝ�6×)Ò)Ñ+Ô+Ð-=Ñ>Ô>ð 	\Ý")¨&×*@Ò*@Ñ*BÔ*BÐDTÐVZÑ"[Ô"[ˆDÔð	QÝ)¨&µ-Ñ@Ô@ˆJˆJøÝð 	Qð 	Qð 	QÝ)¨&Õ2OÑPÔPˆJˆJˆJð	Qøøøð ÐÝÐd¨:ÐdÐdÐdÑeÔeÐeØ$ˆŒð	%ð 	%ð 	%ð 	%ð 	%˜J­¬	ñ 	%ô 	%ð 	%ð #�] 6¨:Ñ6Ô6ˆŒ
ØŒ
�Š�f”lÑ#Ô#Ð#Ø!ˆŒØˆŒˆˆs   Á'A= Á=BÂBr4   Úinput_sentencec                 ó4   — |                       ||¬¦  «         d S )N)Úsuffix)Úvisualize_attention_mask)rl   r}   r   s      r   Ú__call__z AttentionMaskVisualizer.__call__®   s!   € Ø×%Ò% n¸VÐ%ÑDÔDÐDÐDÐDr   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        g¦  «        d         }|r|                     d|¦  «        } ||||d	¬
¦  «        }	|j                             |j        g¦  «        d         | _        |	d         }
d|	v r|	d         |d<   |j                             |	d         d         ¦  «        }nyt)          j        | j        ¦  «        }|€t+          d| j        › �¦  «        ‚|                     |¦  «        } ||d	¬¦  «        d         }
|
€t+          d| j        j        › d�¦  «        ‚d|j        _        |                     ¦   «          |
j        \  }}t5          j        |||j        j        f| j         j        ¬¦  «        }t=          |j        ||
d ¬¦  «        }|€?|
                     d¦  «                             d¦  «                              |d||¦  «        }
n?tC          |t4          j"        ¦  «        r"| #                    t4          j$        ¬¦  «         }
n| }
dtK          d| j        j        › d| j&        › �¦  «        dz   z  }d}tO          d|› �¦  «         tO          dd| j        j        › d| j        › d| j&        j(        › � )                    tK          |¦  «        ¦  «        z   dz   |z   ¦  «         tO          |› ¦  «         tU          ||
| j        tW          | j        dd ¦  «        | 	                    d¦  «        |¬ ¦  «        }tO          |¦  «         tO          |› ¦  «         d S )!Nzchttps://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg?download=trueT)Úfollow_redirectsr0   )rO   rr   r   r   Úpt)ÚimagesÚtextr   Úreturn_tensorsÚattention_maskrN   Ú	input_idszCould not load tokenizer for )r‡   zModel type z) does not support attention visualizationÚeager)r{   )rk   Úinputs_embedsrˆ   Úpast_key_valuesr   z##zAttention visualization for z | r   r;   z"  Attention visualization for [1mú:z[0m z    r!   )r6   r!   rN   rO   ),ry   rk   Ú
model_typer
   r   ÚopenÚioÚBytesIOÚhttpxÚgetÚcontentr   rq   r|   rs   rr   Ú	tokenizerÚconvert_ids_to_tokensÚimage_token_idÚreplacer   rw   ÚtokenizeÚ_attn_implementationÚtrainÚshaperA   ÚzerosÚhidden_sizer{   r   Ú	unsqueezeÚexpandÚ
isinstanceÚTensorrz   rD   r   rx   Úprintrm   Úcenterr^   ru   )rl   r}   r   ry   ÚkwargsrO   ÚimgÚ	processorrr   Úinputsrˆ   Útokensr•   Ú
batch_sizeÚ
seq_lengthr‹   Úcausal_maskÚtop_bottom_borderÚside_borderrV   s                       r   r€   z0AttentionMaskVisualizer.visualize_attention_mask±   s	  € Ø”
ˆØˆØÐØŒ;Ô!Õ%<Ð<Ñ<ØwˆCÝ”*�RœZ­¬	°#ÈÐ(MÑ(MÔ(MÔ(UÑVÔVÑWÔWˆCØ ÐÝ%Ô5°d´lÐUeÐfÑfÔfˆIÝ�y -Ñ0Ô0ð gØ'Ô3��à'Ô1×GÒGÈÔIaÐHbÑcÔcÐdeÔf�àð NØ!/×!7Ò!7¸ÀÑ!MÔ!M�à�Y c°ÀvÐ^bÐcÑcÔcˆFà(Ô2×HÒHÈ)ÔJbÐIcÑdÔdÐefÔgˆDÔà#Ð$4Ô5ˆNØ 6Ð)Ð)Ø+1Ð2BÔ+C�Ð'Ñ(ØÔ(×>Ò>¸vÀkÔ?RÐSTÔ?UÑVÔVˆFˆFå%Ô5°d´lÑCÔCˆIØÐ Ý Ð!OÀÄÐ!OÐ!OÑPÔPÐPØ×'Ò'¨Ñ7Ô7ˆFØ&˜Y ~ÀdÐKÑKÔKÐL\Ô]ˆNØÐ%Ý Ð!p¨t¬{Ô/EÐ!pÐ!pÐ!pÑqÔqÐqà,3ˆŒÔ)Ø�Š‰Œˆà!/Ô!5Ñˆ
�JÝœ Z°¸U¼\Ô=UÐ$VÐ^bÔ^hÔ^nÐoÑoÔoˆå(Ø”<Ø'Ø)Ø ð	
ñ 
ô 
ˆð Ðà+×5Ò5°aÑ8Ô8×BÒBÀ1ÑEÔE×LÒLÈZÐYZÐ\fÐhrÑsÔsˆNˆNÝ˜¥U¤\Ñ2Ô2ð 	*Ø)Ÿnšnµ5´:˜nÑ>Ô>Ð>ˆNˆNà)˜\ˆNà ÝÐ[¨t¬{Ô/EÐ[Ð[È$Ì/Ð[Ð[Ñ\Ô\Ð_`Ñ`ñ
Ðð ˆÝÐ&Ð$Ð&Ð&Ñ'Ô'Ð'ÝØØ°d´kÔ6LÐÐÈtÌ|ÐÐÐeiÔetÔe}ÐÐ÷  Gò  GÝÐ%Ñ&Ô&ñô ñð ñ	ð
 ññ	
ô 	
ð 	
õ 	Ð"Ð$Ñ%Ô%Ð%Ý6ØØØÔ&Ý" 4¤;Ð0@À$ÑGÔGØ!Ÿ:š:Ð&6Ñ7Ô7Ø-ð
ñ 
ô 
ˆõ 	ˆh‰ŒˆÝÐ"Ð$Ñ%Ô%Ð%Ð%Ð%r   N)r4   )rm   rn   ro   rJ   rh   r�   r€   r   r   r   r`   r`   ”   s}   € € € € € ð 3ð ð ð ð ð2Eð E sð Eð Eð Eð EðN&ð N&°sð N&ð N&ð N&ð N&ð N&ð N&r   r`   )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   rA   Útorch.nnrf   r,   r)   r+   r*   r-   r^   r`   r   r   r   ú<module>r¸      sZ  ðð 
€	€	€	à €€€Ø Ð Ð Ð Ð Ð à .Ð .Ð .Ð .Ð .Ð .Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø TÐ TÐ TÐ TÐ TÐ TÐ TÐ TØ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PØ 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,ð ÐÑÔð Ø€L€L€LØÐÐÐÐÐð 	€Ø	€Ø€Ø€Ø€ð `dðið ið ið iðXk&ð k&ð k&ð k&ð k&ñ k&ô k&ð k&ð k&ð k&r   