
    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 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   )create_causal_mask)_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                 ~    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     e/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/transformers/utils/attention_visualizer.py	<genexpr>z6generate_attention_matrix_from_mask.<locals>.<genexpr>8   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>K   sj      	  1: (<.( 6 w|nUG, 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	T8I h|nUG, Av 7<.0 AqDz 	
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$->CUVWYZVZC[_qrsuvrv_wCw (<.0 6 w|nUG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/   r0   r   s   ```        `             @@@r   #generate_attention_matrix_from_maskrX   (   sP    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 !#q(
"[[""2&*Z7==?AVAVWYAZ\]
 \\!%5%9;KL
"__-?JW 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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>rE   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)selfrf   r[   s      r   rc   z@AttentionMaskVisualizer.__init__.<locals>._ModelWrapper.__init__   s-    		""4($&IIaO!$    N)__name__
__module____qualname__rc    rh   r   _ModelWrapperr_      s    %rh   rm   )r   from_pretrainedimage_tokenhasattrget_text_configgetattrrE   r   r	   	Exceptionr   
ValueError
mapped_clsra   rb   modeltodtyperepo_idrf   )rg   r[   rf   ru   rm   s        r   rc   z AttentionMaskVisualizer.__init__   s    ++J7"6))+-=>")&*@*@*BDTVZ"[D	Q)&-@J {:,6cdee$	%J		 	% #6:6


fll#!!  	Q)&2OPJ	Qs   C C87C8input_sentencec                 *    | j                  ||       y )N)suffix)visualize_attention_mask)rg   rz   r|   s      r   __call__z AttentionMaskVisualizer.__call__   s    %%nV%Drh   c           
      z   | j                   }i }d }| j                  j                  t        v rd}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}| j                  j                  t$        v r>t'        j                  | j                        }|j)                  |      } ||d	      d   }
n#t+        d|j                  j                   d      d|j                  _        |j/                          |
j0                  \  }}t3        j4                  |||j                  j6                  f| j                   j8                        }t3        j:                  |      }t=        |j                  ||
|d       }||j?                          }
n2|
jA                  d      jA                  d      jC                  |d||      }
dtE        d| j                  j                   d| jF                         dz   z  }d}tI        d|        tI        dd| j                  j                   d| j                   d| jF                  jJ                   jM                  tE        |            z   dz   |z          tI        |        tO        ||
| j                  tQ        | j                  dd       |j                  d      |      }tI        |       tI        |        y ) Nzchttps://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg?download=trueT)streamr'   )rG   ro   r   r]   pt)imagestextr|   return_tensorsattention_maskrF   	input_ids)r   zModel type z) does not support attention visualizationeager)rx   )rf   input_embedsr   cache_positionpast_key_valuesr   z##zAttention visualization for z | r   r1   z"  Attention visualization for [1m:z[0m z    rE   )r,   rE   rF   rG   ))rv   rf   
model_typer
   r   openrequestsgetrawr   rn   ry   rp   ro   	tokenizerconvert_ids_to_tokensimage_token_idreplacer   r   tokenizert   _attn_implementationtrainshaper8   zeroshidden_sizerx   r<   r   r;   	unsqueezeexpandr   ru   printri   centerrX   rr   )rg   rz   r|   rv   kwargsrG   img	processorro   inputsr   tokensr   
batch_size
seq_lengthr   r   causal_masktop_bottom_borderside_borderrP   s                        r   r}   z0AttentionMaskVisualizer.visualize_attention_mask   s   

;;!!%<<wC**X\\#d;??@C %55dllUefIy-0'33'11GGIaIaHbcdef!/!7!7!Mcv^bcF(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)!/!5!5
J{{J
ELL<T<T#U]a]g]g]m]mnj1(<<%)) 
 ")..00N+55a8BB1ELLZYZ\fhrsN .t{{/E/E.Fc$//IZ[\_``
 $%&'5dkk6L6L5MQt||n\deietete}e}d~  G  G%& 	
 	
 	"#%6&&"4;;0@$G!::&67-
 	h"#%rh   N)r)   )ri   rj   rk   rA   rc   r~   r}   rl   rh   r   rZ   rZ      s*    3 2Es EJ&s J&rh   rZ   )r]   NNN)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   r   import_utilsr   r8   torch.nnra   r"   r   r!   r    r#   rX   rZ   rl   rh   r   <module>r      se       . 7 7 T P R ,  		 `diXg& g&rh   