
    bi'                         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     b/root/projects/butler/venv/lib/python3.11/site-packages/transformers/utils/attention_visualizer.py	<genexpr>z6generate_attention_matrix_from_mask.<locals>.<genexpr>8   s.      <<d#d4jj//<<<<<<    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    \\\aa1q5&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oab\\\\\SXYZS[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(<(((( 66 ,|,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#eav$9q$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$	T8I8I ,|,U,,, Avv 0<0000 AqDz	
 	
 	
 	
 	
 	
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$->->CUVWYZVZC[_qrsuvrv_wCwCw 0<0000 66 4|4U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    88::DyA~~Aqqq!!!G}yA~~Aq!!!QQQJE

A<<e<<<<<OMF%    1	>>->MDAJ1!y..AQJJAEzzQ56Dq-/12M !ooooofklmfnfnooo 	 	 	 	 q	 	 	 	 	I !#q(
"[""2&&*Z7==??AVAVWYAZAZ\]
 
 \!%5%9;KLL
"_-?JWWW o|oUoo&o,oX]oooF
MM#,o)*-?-E-Ec)nnXYFY-Z-ZZH!))
MM(Ou%% F F	TS>Q""#e#e4CWZ[^_`[a[aWbWbHcHcCdCd#e#e#effff""4Cs3q66{{(C(C#D#DEEEE3tS/%:;;<<O 
 
) q C'#((3--7+EQTUU	
 	
 	
 	

 U## g g4JJ$$_55	8AT8I8I&4)4U444yhh 	
 	
 	
 	
 	
 	
 	
 	
 1XX	
 	
 	
 	
 	
  %!$ 	* 	* 	* 	* 	* 	* 	* 	* 	* q	* 	* 	* 	" 	" 	eeQaee;eeQceeffff99V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((($&IaOO!$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*BDTVZ"["[D	Q)&-@@JJ 	Q 	Q 	Q)&2OPPJJJ	Q d:dddeee$	% 	% 	% 	% 	%J	 	% 	% 	% #]6:66

fl###!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!    %%nV%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                   }n`t)          j        | j                  }|                    |          } ||d	          d         }
|
t-          d| j        j         d          d|j        _        |                                 |
j        \  }}t5          j        |||j        j        f| j         j                  }t5          j        |          }t?          |j        ||
|d           }||                                  }
n>|
!                    d          !                    d          "                    |d||          }
dtG          d| j        j         d| j$                   dz   z  }d}tK          d|            tK          dd| j        j         d| j         d| j$        j&         '                    tG          |                    z   dz   |z              tK          |            tQ          ||
| j        tS          | j        dd           |	                    d          |          }tK          |           tK          |            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_ids)r   zModel type z) does not support attention visualizationeager)r{   )rk   inputs_embedsr   cache_position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   tokenizerw   _attn_implementationtrainshaperA   zeroshidden_sizer{   rE   r   rD   	unsqueezeexpandr   rx   printrm   centerr^   ru   )rl   r}   r   ry   kwargsrO   img	processorrr   inputsr   tokensr   
batch_size
seq_lengthr   r   causal_masktop_bottom_borderside_borderrV   s                        r   r   z0AttentionMaskVisualizer.visualize_attention_mask   s   
;!%<<<wC*RZ	#(M(M(M(UVVWWC %5dlUefffIy-00 g'3'1GGIaHbccdef N!/!7!7!M!MYcv^bcccF(2HH)JbIcddefgD#$45N6))+12B+C'((>>vk?RST?UVVFF%5dlCCI''77F&Y~dKKKL\]N% !pt{/E!p!p!pqqq,3)!/!5
JZU\=U$V^b^h^noooj11(<')) 
 
 
 ")..000NN+55a88BB1EELLZYZ\fhrssN [t{/E[[$/[[\\_``
 &$&&'''dk6Lt|eiete}  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J& J&s J& J& J& J& J& J&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 , , , , , ,  LLL 		 `di i i iXg& g& g& g& g& g& g& g& g& g&r   