
    ##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     d/var/www/html/sandstorm/venv/lib/python3.12/site-packages/transformers/utils/attention_visualizer.py	<genexpr>z6generate_attention_matrix_from_mask.<locals>.<genexpr>5   s     <d#d4j/<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|nUG, 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	U1X8M h|nUG, Av 7<.0 AqDz 	
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|nUG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    88:DyyA~Aq!G}yyA~Aq!QJE
A<e<<OMF%  1	>-MDAJ1!y.AQJAEzQ56Dq-/12M !fklmfnoabSXYZS[\aa1q5&A>&A I\o 	 q	 	I w|nUG+A&,X]W^^noF
MM#,o)*-?-E-Ec)nXYFY-ZZH!))
MM(Ou% F	TS>Q""4CWZ[^_`[aWbHcCd#eavhqc%$9#ef""4Cs3q6{(C#DE	F 3tS/%:;<O 
) q C'#((3-7+EQTU	

 U# g4J$$_5	8AT8I&)UG4yhh 	
 1X	
 	
  %!$ 	* q	* 	" 	bQa(9;-yQcPdef5g8 99VC  ]o0 $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($&IIa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PJ	Qs   C CCinput_sentencec                 *    | j                  ||       y )N)suffix)visualize_attention_mask)rZ   rl   rn   s      r   __call__z AttentionMaskVisualizer.__call__   s    %%nV%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,   

;;!!%<<wC**X\\#d;??@C%55dllUVWIy-0'33'11GGIaIaHbcdef!/!7!7!MsN6RVWF(22HH)JbJbIcdefgD#$45N6)+12B+C'(((>>vk?RST?UVF[[##'>>%55dllCI''7F&~dKL\]N{5<<+B+B*CClmnn,3)3%33 
)'**4::+;+;< <<(<(<Q(?@ 	

 
 $& !.t{{/E/E.Fc$//IZ[\_``
 $%&'5dkk6L6L5MQt||n\deietete}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[   