§
    ‚Štj»5  ã                  óx   — d Z ddlmZ ddlZddlmc mZ ddd	„Z	 	 dd d„Z		 dd!d„Z
	 dd"d„Z	 dd#d„Z	 dd$d„ZdS )%uÿ  Vision utility functions for pre-computing very dynamic and
data-dependent tensors that can break model graph capturing.

All functions are standalone (no model weights) and compute tensors from
`grid_thw` + config scalars. They are used by vision encoders and can be
precomputed before `torch.compile` / `torch.export` tracing since they
use untraceable ops (`repeat_interleave`, `.tolist()`, `nonzero()`, loops).

Each `get_*` accepts an optional `kwargs` dict; if it contains the
precomputed tensor under the natural key (`"cu_seqlens"`, `"position_ids"`,
â€¦), the function pops and returns it instead of computing. Vision encoders
write `x = get_vision_x(..., kwargs=kwargs)` and the matching key is
removed from the caller's kwargs as a side-effect of the pop.
é    )ÚannotationsNÚgrid_thwútorch.TensorÚkwargsúdict | NoneÚreturnc                ó\  — |�|                      dd¦  «        x}�|S t          j        | dd…df         | dd…df         z  | dd…df         ¦  «                             dt          j                             ¦   «         r| j        nt          j        ¬¦  «        }t          j	        |dd¬¦  «        S )	u…  Get cumulative sequence lengths from vision grid info, or pop from `kwargs` if precomputed.

    Args:
        grid_thw: `(num_images_or_videos, 3)` â€” temporal, height, width per entry.
        kwargs: optional caller kwargs â€” if it contains `"cu_seqlens"` it is popped and returned.

    Returns:
        `cu_seqlens`: `(total_patches + 1,)` int32 cumulative sequence boundaries.
    NÚ
cu_seqlensé   é   r   )ÚdimÚdtype)r   r   )Úvalue)
ÚpopÚtorchÚrepeat_interleaveÚcumsumÚjitÚ
is_tracingr   Úint32ÚFÚpad)r   r   r
   s      úW/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/vision_utils.pyÚget_vision_cu_seqlensr   #   s·   € ð Ð¨V¯ZªZ¸ÀdÑ-KÔ-KÐK˜zÐXØÐÝÔ(¨°!°!°!°Q°$¬¸(À1À1À1ÀaÀ4¼.Ñ)HÈ(ÐSTÐSTÐSTÐVWÐSWÌ.ÑYÔY×`Ò`Ø¥u¤y×';Ò';Ñ'=Ô'=ÐN�X”^�^Å5Ä;ð añ ô €Jõ Œ5�˜V¨1Ð-Ñ-Ô-Ð-ó    FÚspatial_merge_sizeúint | torch.TensorÚinclude_temporalÚboolc           
     óš  — |�|                      dd¦  «        x}�|S | j        }t          |t          ¦  «        r7t	          j        |g|¬¦  «                             t          | ¦  «        ¦  «        }g }t          |  	                    ¦   «         | 	                    ¦   «         ¦  «        D �]�\  \  }}}}	t	          j
        t	          j        ||¬¦  «        t	          j        ||¬¦  «        d¬¦  «        \  }
}||	z  |	||	z  |	f}|
                     |¦  «                             dd¦  «                             ¦   «         }
|                     |¦  «                             dd¦  «                             ¦   «         }|r€t	          j        ||¬¦  «                             ||z  ¦  «        }|                     t	          j        ||
                     |¦  «        |                     |¦  «        gd¬	¦  «        ¦  «         �ŒP|                     t	          j        |
|gd¬	¦  «                             |d¦  «        ¦  «         �Œ‘t	          j        |d
¬	¦  «        S )u  Get position IDs for vision rotary embeddings, or pop from `kwargs` if precomputed.

    Args:
        grid_thw: `(num_images_or_videos, 3)`
        spatial_merge_size: merge block size â€” either a single `int` (same for all images)
            or a `(num_images_or_videos,)` tensor (per-image).
        kwargs: optional caller kwargs â€” if it contains `"position_ids"` it is popped and returned.
        include_temporal: when ``True``, prepend a temporal-index column and return
            `(total_tokens, 3)` â€” for encoders whose rotary embedding rotates T/H/W axes
            (minimax_m3_vl). When ``False`` (default), return `(total_tokens, 2)` for the
            2-axis (h, w) case (qwen2_5_vl / qwen3_vl / glm4v / paddleocr_vl); the h/w
            indices are still repeated ``t`` times for video inputs.

    Returns:
        `position_ids`: `(total_tokens, 3)` long if ``include_temporal`` else `(total_tokens, 2)`,
        with the spatial indices laid out block-major over ``mÃ—m`` spatial-merge blocks.
    NÚposition_ids©ÚdeviceÚij)Úindexingr   r   éÿÿÿÿ©r   r   )r   r#   Ú
isinstanceÚintr   ÚtensorÚexpandÚlenÚzipÚtolistÚmeshgridÚarangeÚreshapeÚ	transposeÚflattenr   ÚappendÚstackÚrepeatÚcat)r   r   r   r   r!   r#   ÚtÚhÚwÚ
merge_sizeÚhpos_idsÚwpos_idsÚblock_shapeÚtpos_idss                 r   Úget_vision_position_idsr@   5   s6  € ð. Ð¨v¯zªz¸.È$Ñ/OÔ/OÐO˜|Ð\ØÐàŒ_€FÝÐ$¥cÑ*Ô*ð eÝ"œ\Ð+=Ð*>ÀvÐNÑNÔN×UÒUÕVYÐZbÑVcÔVcÑdÔdÐà€LÝ!$ X§_¢_Ñ%6Ô%6Ð8J×8QÒ8QÑ8SÔ8SÑ!TÔ!Tð Xñ XÑ‰	ˆˆAˆq�:Ý"œ^ÝŒL˜ 6Ð*Ñ*Ô*ÝŒL˜ 6Ð*Ñ*Ô*Øð
ñ 
ô 
Ñˆ�(ð
 ˜J‘¨
°A¸±OÀZÐPˆØ×#Ò# KÑ0Ô0×:Ò:¸1¸aÑ@Ô@×HÒHÑJÔJˆØ×#Ò# KÑ0Ô0×:Ò:¸1¸aÑ@Ô@×HÒHÑJÔJˆØð 	XÝ”| A¨fÐ5Ñ5Ô5×GÒGÈÈAÉÑNÔNˆHØ×Ò¥¤¨X°x·²ÀqÑ7IÔ7IÈ8Ï?Ê?Ð[\ÑK]ÔK]Ð,^ÐdfÐ gÑ gÔ gÑhÔhÐhÑhà×Ò¥¤¨X°xÐ,@ÀbÐ IÑ IÔ I× PÒ PÐQRÐTUÑ VÔ VÑWÔWÐWÑWåŒ9�\ qÐ)Ñ)Ô)Ð)r   r)   Úwindow_sizeÚ
patch_sizeú!tuple[torch.Tensor, torch.Tensor]c                óÄ  — |�4|                      dd¦  «        }|                      dd¦  «        }|�|�||fS g }dg}d}||z  |z  }|dz  }	|                      ¦   «         D �]­\  }
}}t          |
¦  «        t          |¦  «        t          |¦  «        }}}
||z  }||z  }t          j        |
|z  |z  ¦  «                             |
||¦  «        }|||z  z
  }|||z  z
  }||z   |z  }||z   |z  }t          j        |d|d|fdd¦  «        }|                     |
||||¦  «        }|                     ddd	dd
¦  «                             |
||z  ||¦  «        }|dk     	                    dd	g¦  «                             d¦  «        }|                     d¦  «        }||dk             }| 
                    ||z   ¦  «         |                     d¦  «        |	z  |d         z   }|                     |                     ¦   «         ¦  «         ||
|z  |z  z  }�Œ¯t          j        |d¬¦  «        }t          j        || j        t          j        ¬¦  «        }t          j        |¦  «        }||fS )u   Get window attention indices, or pop `"window_index"`/`"cu_window_seqlens"` from `kwargs` if both precomputed.

    Args:
        grid_thw: `(num_images_or_videos, 3)`
        spatial_merge_size: merge block size from vision config.
        window_size: window size from vision config.
        patch_size: patch size from vision config.
        kwargs: optional caller kwargs â€” if it contains both `"window_index"` and `"cu_window_seqlens"` they are popped and returned.

    Returns:
        `window_index`: `(total_tokens,)` long â€” reorder indices for windowed attention.
        `cu_window_seqlens`: `(num_windows + 1,)` int32 â€” cumulative window boundaries.
    NÚwindow_indexÚcu_window_seqlensr   r   Úconstantiœÿÿÿr   é   é   r&   r'   )r#   r   )r   r.   r)   r   r0   r1   r   r   ÚpermuteÚsumr4   r   Úextendr7   r*   r#   r   Úunique_consecutive)r   r   rA   rB   r   rE   rF   Úwindow_index_idÚvit_merger_window_sizeÚspatial_merge_unitÚgrid_tÚgrid_hÚgrid_wÚ
llm_grid_hÚ
llm_grid_wÚindexÚpad_hÚpad_wÚnum_windows_hÚnum_windows_wÚindex_paddedÚseqlensÚ	index_newÚcu_seqlens_tmps                           r   Úget_vision_window_indexr_   f   sÆ  € ð( ÐØ—z’z .°$Ñ7Ô7ˆØ"ŸJšJÐ':¸DÑAÔAÐØÐ#Ð(9Ð(EØÐ!2Ð2Ð2Ø€LØ ˜cÐØ€OØ(Ð,>Ñ>À*ÑLÐØ+¨QÑ.Ðà"*§/¢/Ñ"3Ô"3ð <ñ <Ñˆ�˜Ý!$ V¡¤­c°&©k¬k½3¸v¹;¼;˜�ˆØÐ1Ñ1ˆ
ØÐ1Ñ1ˆ
Ý”˜V jÑ0°:Ñ=Ñ>Ô>×FÒFÀvÈzÐ[eÑfÔfˆØ&¨Ð6LÑ)LÑLˆØ&¨Ð6LÑ)LÑLˆØ# eÑ+Ð0FÑFˆØ# eÑ+Ð0FÑFˆÝ”u˜U Q¨¨q°%Ð$8¸*ÀdÑKÔKˆØ#×+Ò+Ø�MÐ#9¸=ÐJ`ñ
ô 
ˆð $×+Ò+¨A¨q°!°Q¸Ñ:Ô:×BÒBØ�M MÑ1Ð3IÐKañ
ô 
ˆð   4Ò'×,Ò,¨a°¨VÑ4Ô4×<Ò<¸RÑ@Ô@ˆØ#×+Ò+¨BÑ/Ô/ˆØ  °Ò!5Ô6ˆ	Ø×Ò˜I¨Ñ7Ñ8Ô8Ð8Ø Ÿš¨Ñ*Ô*Ð-?Ñ?ÐBSÐTVÔBWÑWˆØ× Ò  ×!6Ò!6Ñ!8Ô!8Ñ9Ô9Ð9Ø˜6 JÑ.°Ñ;Ñ;ˆ‰å”9˜\¨qÐ1Ñ1Ô1€LÝœÐ%6¸x¼ÕV[ÔVaÐbÑbÔbÐÝÔ0Ð1BÑCÔCÐØÐ*Ð*Ð*r   Únum_grid_per_sidec           	     ó>  — |�4|                      dd¦  «        }|                      dd¦  «        }|�|�||fS |}|}| j        }d„ t          d¦  «        D ¦   «         }	d„ t          d¦  «        D ¦   «         }
|                      ¦   «         D �]U\  }}}t	          |¦  «        t	          |¦  «        t	          |¦  «        }}}t          j        d|dz
  ||¬	¦  «        }t          j        d|dz
  ||¬	¦  «        }|                     ¦   «         }|                     ¦   «         }|dz                        |dz
  ¬
¦  «        }|dz                        |dz
  ¬
¦  «        }||z
  }||z
  }||z  }||z  }|dd…df         |ddd…f         z                        ¦   «         |dd…df         |ddd…f         z                        ¦   «         |dd…df         |ddd…f         z                        ¦   «         |dd…df         |ddd…f         z                        ¦   «         g}d|z
  dd…df         d|z
  ddd…f         z                       ¦   «         d|z
  dd…df         |ddd…f         z                       ¦   «         |dd…df         d|z
  ddd…f         z                       ¦   «         |dd…df         |ddd…f         z                       ¦   «         g}t          j	        ||¬	¦  «         
                    ||z  |¦  «        }t          j	        ||¬	¦  «         
                    ||z  |¦  «        }|dd…dd…ddf         |z  |dddd…dd…f         z                        dd¦  «                             ¦   «                              |¦  «        }t          d¦  «        D ]P}|	|                              ||         |         ¦  «         |
|                              ||         |         ¦  «         ŒQ�ŒWt          j        d„ |	D ¦   «         ¦  «        }t          j        d„ |
D ¦   «         ¦  «        }||fS )už  Get bilinear interpolation indices/weights, or pop `"bilinear_indices"`/`"bilinear_weights"` from `kwargs` if both precomputed.

    Args:
        grid_thw: `(num_images_or_videos, 3)`
        num_grid_per_side: `int(num_position_embeddings ** 0.5)` from vision config.
        spatial_merge_size: merge block size from vision config.
        kwargs: optional caller kwargs â€” if it contains both `"bilinear_indices"` and `"bilinear_weights"` they are popped and returned.

    Returns:
        `bilinear_indices`: `(4, total_thw)` long â€” bilinear corner indices into pos_embed table.
        `bilinear_weights`: `(4, total_thw)` float â€” interpolation weights.
    NÚbilinear_indicesÚbilinear_weightsc                ó   — g | ]}g ‘ŒS © re   ©Ú.0Ú_s     r   ú
<listcomp>z;get_vision_bilinear_indices_and_weights.<locals>.<listcomp>¾   s   € Ð*@Ð*@Ð*@°!¨2Ð*@Ð*@Ð*@r   rI   c                ó   — g | ]}g ‘ŒS re   re   rf   s     r   ri   z;get_vision_bilinear_indices_and_weights.<locals>.<listcomp>¿   s   € Ð-CÐ-CÐ-C°Q¨bÐ-CÐ-CÐ-Cr   r   r   r"   )Úmaxr   c                ó6   — g | ]}t          j        |¦  «        ‘ŒS re   ©r   r7   ©rg   Úps     r   ri   z;get_vision_bilinear_indices_and_weights.<locals>.<listcomp>ç   s    € Ð#DÐ#DÐ#D°Q¥E¤I¨a¡L¤LÐ#DÐ#DÐ#Dr   c                ó6   — g | ]}t          j        |¦  «        ‘ŒS re   rm   rn   s     r   ri   z;get_vision_bilinear_indices_and_weights.<locals>.<listcomp>è   s    € Ð#GÐ#GÐ#G°Q¥E¤I¨a¡L¤LÐ#GÐ#GÐ#Gr   )r   r#   Úranger.   r)   r   ÚlinspaceÚclampr3   r0   Úviewr2   r6   r4   r5   )r   r`   r   r   rb   rc   Úsider;   r#   Ú	idx_partsÚweight_partsr8   r9   r:   Úh_gridÚw_gridÚh_floorÚw_floorÚh_ceilÚw_ceilÚh_fracÚw_fracÚh_floor_offsetÚh_ceil_offsetÚcorner_indicesÚcorner_weightsÚh_idxÚw_idxÚreorderÚis                                 r   Ú'get_vision_bilinear_indices_and_weightsrˆ   £   st  € ð$ ÐØ!Ÿ:š:Ð&8¸$Ñ?Ô?ÐØ!Ÿ:š:Ð&8¸$Ñ?Ô?ÐØÐ'Ð,<Ð,HØ#Ð%5Ð5Ð5Ø€DØ#€JØŒ_€Fà*@Ð*@µu¸Q±x´xÐ*@Ñ*@Ô*@€IØ-CÐ-C½%À¹(¼(Ð-CÑ-CÔ-C€Là—?’?Ñ$Ô$ð $?ñ $?‰ˆˆ1ˆaÝ�a‘&”&�#˜a™&œ&¥# a¡&¤&ˆaˆ1ˆå”  4¨!¡8¨Q°vÐ>Ñ>Ô>ˆÝ”  4¨!¡8¨Q°vÐ>Ñ>Ô>ˆà—*’*‘,”,ˆØ—*’*‘,”,ˆØ˜A‘+×$Ò$¨°©Ð$Ñ2Ô2ˆØ˜A‘+×$Ò$¨°©Ð$Ñ2Ô2ˆà˜'Ñ!ˆØ˜'Ñ!ˆà  4™ˆØ ™ˆð ˜A˜A˜A˜t˜GÔ$ w¨t°Q°Q°Q¨wÔ'7Ñ7×@Ò@ÑBÔBØ˜A˜A˜A˜t˜GÔ$ v¨d°A°A°A¨g¤Ñ6×?Ò?ÑAÔAØ˜1˜1˜1˜d˜7Ô# g¨d°A°A°A¨gÔ&6Ñ6×?Ò?ÑAÔAØ˜1˜1˜1˜d˜7Ô# f¨T°1°1°1¨W¤oÑ5×>Ò>Ñ@Ô@ð	
ˆð �&‰j˜!˜!˜!˜T˜'Ô" a¨&¡j°$¸¸¸°'Ô%:Ñ:×CÒCÑEÔEØ�&‰j˜!˜!˜!˜T˜'Ô" V¨D°!°!°!¨G¤_Ñ4×=Ò=Ñ?Ô?Ø�A�A�A�t�GŒ_  F¡
¨D°!°!°!¨GÔ4Ñ4×=Ò=Ñ?Ô?Ø�A�A�A�t�GŒ_˜v d¨A¨A¨A gœÑ.×7Ò7Ñ9Ô9ð	
ˆõ ”˜Q vÐ.Ñ.Ô.×3Ò3°A¸±OÀZÑPÔPˆÝ”˜Q vÐ.Ñ.Ô.×3Ò3°A¸±OÀZÑPÔPˆØ˜˜˜˜A˜A˜A˜t TÐ)Ô*¨QÑ.°°t¸TÀ1À1À1ÀaÀaÀaÐ7GÔ1HÑH×SÒSÐTUÐWXÑYÔY×aÒaÑcÔc×jÒjÐklÑmÔmˆå�q‘”ð 	?ð 	?ˆAØ�aŒL×Ò ¨qÔ 1°'Ô :Ñ;Ô;Ð;Ø˜ŒO×"Ò" >°!Ô#4°WÔ#=Ñ>Ô>Ð>Ð>ñ	?õ ”{Ð#DÐ#D¸)Ð#DÑ#DÔ#DÑEÔEÐÝ”{Ð#GÐ#G¸,Ð#GÑ#GÔ#GÑHÔHÐØÐ-Ð-Ð-r   Útarget_sizesÚnum_patches_per_sidec                óN  — |�|                      dd¦  «        x}�|S | j        }t          j        d|z  dd|z  |¬¦  «        }g }|                      ¦   «         D ]º\  }}t          |¦  «        t          |¦  «        }}t          j        ||¬¦  «        |z  }	t          j        ||¬¦  «        |z  }
t          j        |	|d¬¦  «        }t          j        |
|d¬¦  «        }|                     |dd…df         |z  |z                        ¦   «         ¦  «         Œ»t          j	        |¦  «        S )u  Get nearest-neighbor position IDs into a `num_patches_per_side**2` 2-D table, or pop
    from `kwargs` if precomputed.

    For each image of size `(h, w)`, maps fractional grid coordinates `i/h` to the nearest
    bucket on a `num_patches_per_side` grid (via `bucketize`) and flattens to 1-D embedding
    indices, concatenated across all images. Used by NaViT-style packers (e.g. MiniCPM-V).

    Args:
        target_sizes: `(num_images, 2)` int â€” `(h, w)` per image.
        num_patches_per_side: side length of the learned 2-D position-embedding grid.
        kwargs: optional caller kwargs â€” if it contains `"position_ids"` it is popped and returned.

    Returns:
        `position_ids`: `(sum(h_i * w_i),)` long â€” flat indices into a `num_patches_per_side**2` table.
    Nr!   r   g      ð?r"   T)Úright)
r   r#   r   r0   r.   r)   Ú	bucketizer4   r3   r7   )r‰   rŠ   r   Úpos_idsr#   Ú
boundariesÚpos_ids_listÚheightÚwidthÚh_coordsÚw_coordsÚbucket_hÚbucket_ws                r   Úget_vision_nearest_position_idsr—   ì   s8  € ð$ Ð¨&¯*ª*°^ÀTÑ*JÔ*JÐJ˜wÐWØˆØÔ €FÝ”˜aÐ"6Ñ6¸¸QÐAUÑ=UÐ^dÐeÑeÔe€JØ€LØ%×,Ò,Ñ.Ô.ð ]ð ]‰ˆ�Ý˜F™œ¥S¨¡Z¤Z�ˆÝ”< ¨vÐ6Ñ6Ô6¸Ñ?ˆÝ”< ¨fÐ5Ñ5Ô5¸Ñ=ˆÝ”? 8¨Z¸tÐDÑDÔDˆÝ”? 8¨Z¸tÐDÑDÔDˆØ×Ò˜X a a a¨ gÔ.Ð1EÑEÈÑP×YÒYÑ[Ô[Ñ\Ô\Ð\Ð\ÝŒ9�\Ñ"Ô"Ð"r   Úwindow_kernel_sizeútuple[int, int]c                óì   — |�|                      dd¦  «        x}�|S |\  }}t          | d                              ¦   «         ¦  «        |z  t          | d                              ¦   «         ¦  «        |z  fS )uÔ  Get post-window-merge `(merged_h, merged_w)` Python ints, or pop from `kwargs` if precomputed.

    `.view()` needs Python ints, but `target_sizes[0].item()` is non-traceable. Callers must pop
    the precomputed value from `kwargs` when running under `torch.export`. Assumes uniform
    `target_sizes` across the batch (standard NaViT preprocessing output).

    Args:
        target_sizes: `(num_images, 2)` int â€” `(h, w)` per image.
        window_kernel_size: `(window_h, window_w)` window-attention kernel.
        kwargs: optional caller kwargs â€” if it contains `"merged_shape"` it is popped and returned.

    Returns:
        `(merged_h, merged_w)`: per-image grid size after window merging, as Python ints.
    NÚmerged_shape)r   r   )r   r   )r   r)   Úitem)r‰   r˜   r   ÚmergedÚwindow_hÚwindow_ws         r   Úget_vision_merged_shaper      sy   € ð" Ð¨¯ª°NÀDÑ)IÔ)IÐI˜vÐVØˆØ+Ñ€HˆhÝˆ|˜DÔ!×&Ò&Ñ(Ô(Ñ)Ô)¨XÑ5µs¸<ÈÔ;M×;RÒ;RÑ;TÔ;TÑ7UÔ7UÐYaÑ7aÐaÐar   )N)r   r   r   r   r   r   )FN)
r   r   r   r   r   r   r   r   r   r   )r   r   r   r)   rA   r)   rB   r)   r   r   r   rC   )
r   r   r`   r)   r   r)   r   r   r   rC   )r‰   r   rŠ   r)   r   r   r   r   )r‰   r   r˜   r™   r   r   r   r™   )Ú__doc__Ú
__future__r   r   Útorch.nn.functionalÚnnÚ
functionalr   r   r@   r_   rˆ   r—   r    re   r   r   ú<module>r¦      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ð Ð Ð ð.ð .ð .ð .ð .ð* #Øð	.*ð .*ð .*ð .*ð .*ðl ð:+ð :+ð :+ð :+ð :+ðB ð	F.ð F.ð F.ð F.ð F.ðT RVð#ð #ð #ð #ð #ðD \`ðbð bð bð bð bð bð br   