
    rhl%                         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                 ~    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     z/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/transformers/utils/attention_visualizer.py	<genexpr>z6generate_attention_matrix_from_mask.<locals>.<genexpr>7   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>J   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>w   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.   r/   r   s   ```        `             @@@r   #generate_attention_matrix_from_maskrW   '   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>rD   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)selfre   rZ   s      r   rb   z@AttentionMaskVisualizer.__init__.<locals>._ModelWrapper.__init__   s-    		""4($&IIaO!$    N)__name__
__module____qualname__rb    rg   r   _ModelWrapperr^      s    %rg   rl   )r   from_pretrainedimage_tokenhasattrget_text_configgetattrrD   r   r   	Exceptionr   
ValueError
mapped_clsr`   ra   modeltotorch_dtyperepo_idre   )rf   rZ   re   rt   rl   s        r   rb   z AttentionMaskVisualizer.__init__   s    ++J7"6))+-=>")&*@*@*BDTVZ"[D	Q)&-@J {:,6cdee$	%J		 	% #6:6


f(()!!  	Q)&2OPJ	Qs   C C87C8input_sentencec                 *    | j                  ||       y )N)suffix)visualize_attention_mask)rf   ry   r{   s      r   __call__z AttentionMaskVisualizer.__call__   s    %%nV%Drg   c           
         | 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                  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      |      }tC        |       tC        |        y ) Nzchttps://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg?download=trueT)streamr&   )rF   rn   r   r\   pt)imagestextr{   return_tensorsattention_maskrE   	input_ids)r   zModel type z) does not support attention visualizationeagerr   )r   input_tensorcache_positionpast_key_valuesz##zAttention visualization for z | r   r0   z"  Attention visualization for [1m:z[0m z    rD   )r+   rD   rE   rF   rk   )&ru   re   
model_typer	   r   openrequestsgetrawr
   rm   rx   ro   rn   	tokenizerconvert_ids_to_tokensimage_token_idreplacer   r   tokenizers   _attn_implementationtrain_update_causal_maskrv   dtyper7   r;   shaper:   r   rt   printrh   centerrW   rq   )rf   ry   r{   ru   kwargsrF   img	processorrn   inputsr   tokensr   top_bottom_borderside_borderrO   s                   r   r|   z0AttentionMaskVisualizer.visualize_attention_mask   s9   

;;!!%<<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)3%33 
)'**4::+;+;< <<(<(<Q(?@ 	

 
 $& !.t{{/E/E.Fc$//IZ[\_``
 $%&'5dkk6L6L5MQt||n\deietete}e}d~  G  G%& 	
 	
 	"#%6&&"4;;0@$G!::&67-
 	h"#%rg   N)r(   )rh   ri   rj   r@   rb   r}   r|   rk   rg   r   rY   rY      s*    3 2Es E@&s @&rg   rY   )r\   NNN)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   r7   torch.nnr`   r!   r   r    r   r"   rW   rY   rk   rg   r   <module>r      sb       7 7 T P R ,  		 `diX]& ]&rg   