Ë
    kQêj4  ã                   ó´   — d dl mZ d dlmZ d dlmZmZmZmZm	Z	 d dl
Z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mZmZ  ed«       G d„ de«      «       Zy)é    )Ú	lru_cache)Úwarning)ÚListÚUnionÚOptionalÚAnyÚCallableNé   )Úattempt_import_or_raiseé   )ÚEmbeddingFunction)Úregister)ÚTEXTÚIMAGESÚis_flash_attn_2_availableÚcolpalic                   óÚ  ‡ — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	e
ed	<   d
Zee   ed<   dZee   ed<   dZeed<   dZee   ed<   dZeed<   dZee   ed<   dZdZdZdZˆ fd„Ze ed¬«      dedededee   dee   dee   fd„«       «       Zd„ Zd„ Zdede e e e!         fd„Z"de#de fd„Z$de#de e e e!         fd„Z%de&ee#f   de e e e!         fd „Z'de#de e e e!         fd!„Z(ˆ xZ)S )"ÚColPaliEmbeddingsaø  
    An embedding function that uses the ColPali engine for
    multimodal multi-vector embeddings.

    This embedding function supports ColPali models, producing multivector outputs
    for both text and image inputs.

    Parameters
    ----------
    model_name : str
        The name of the model to use (e.g., "Metric-AI/ColQwen2.5-3b-multilingual-v1.0")
        Supports models based on these engines:
        - ColPali: "vidore/colpali-v1.3" and others
        - ColQwen2.5: "Metric-AI/ColQwen2.5-3b-multilingual-v1.0" and others
        - ColQwen2: "vidore/colqwen2-v1.0" and others
        - ColSmol: "vidore/colSmol-256M" and others

    device : str
        The device for inference (default "auto").
    dtype : str
        Data type for model weights (default "bfloat16").
    use_token_pooling : bool
        DEPRECATED. Whether to use token pooling. Use `pooling_strategy` instead.
    pooling_strategy : str, optional
        The token pooling strategy to use, by default "hierarchical".
        - "hierarchical": Progressively pools tokens to reduce sequence length.
        - "lambda": A simpler pooling that uses a custom `pooling_func`.
    pooling_func : typing.Callable, optional
        A function to use for pooling when `pooling_strategy` is "lambda".
    pool_factor : int
        Factor to reduce sequence length if token pooling is enabled (default 2).
    quantization_config : Optional[BitsAndBytesConfig]
        Quantization configuration for the model. (default None, bitsandbytes needed)
    batch_size : int
        Batch size for processing inputs (default 2).
    offload_folder : str, optional
        Folder to offload model weights if using CPU offloading (default None). This is
        useful for large models that do not fit in memory.
    z)Metric-AI/ColQwen2.5-3b-multilingual-v1.0Ú
model_nameÚautoÚdeviceÚbfloat16ÚdtypeTÚuse_token_poolingÚhierarchicalÚpooling_strategyNÚpooling_funcr
   Úpool_factorÚquantization_configÚ
batch_sizeÚoffload_folderc                 óf  •— t        ‰| �  |i |¤Ž t        dd«      }| j                  s#t	        j
                  dt        d¬«       d | _        | j                  dk(  r| j                  €t        d«      ‚| j                  }|dk(  rF|j                  j                  «       rd}n)|j                  j                  j                  «       rd	}nd
}| j                  }|d	k(  r|dk(  rd}| j!                  | j"                  ||| j                  | j                  | j$                  «      \  | _        | _        | _        y )NÚtorchzBuse_token_pooling is deprecated, use pooling_strategy=None insteadr
   )Ú
stacklevelÚlambdaz?pooling_func must be provided when pooling_strategy is 'lambda'r   ÚcudaÚmpsÚcpur   Úfloat32)ÚsuperÚ__init__r   r   ÚwarningsÚwarnÚDeprecationWarningr   r   Ú
ValueErrorr   r&   Úis_availableÚbackendsr'   r   Ú_load_modelr   r   Ú_modelÚ
_processorÚ_token_pooler)ÚselfÚargsÚkwargsr#   r   r   Ú	__class__s         €ú_/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/lancedb/embeddings/colpali.pyr+   zColPaliEmbeddings.__init__L   s#  ø€ Ü‰Ñ˜$Ð) &Ò)Ü'¨°Ó9ˆà×%Ò%Ü�M‰MØTÜ"Øõð
 %)ˆDÔ!à× Ñ  HÒ,°×1BÑ1BÐ1JÜØQóð ð —‘ˆØ�VÒØ�z‰z×&Ñ&Ô(Ø‘Ø—‘×#Ñ#×0Ñ0Ô2Ø‘à�à—
‘
ˆØ�UŠ?˜u¨
Ò2ØˆEð ×ÑØ�O‰OØØØ×!Ñ!Ø×ÑØ×$Ñ$ó
ñ		
ØŒKØŒOØÕó    r   )Úmaxsizec                 óF  — |j                  d«      rt        d«       t        dd«      }t        dd«      }t        dd«      }ddlm}	m}
 |�!t        ||j                  «      st        d	«      ‚|d
k(  r|j                  }n0|dk(  r|j                  }n|dk(  r|j                  }n|j                  }d\  }}| j                  «       }d|v r-|j                  j                  }|j                  j                   }n–d|v sd|v r-|j                  j"                  }|j                  j$                  }nad|v r-|j                  j&                  }|j                  j(                  }n0d|v r,|j                  j*                  }|j                  j,                  }|€t        d| › �«      ‚|j/                  | ||�|ndt1        «       rdndd¬«      j3                  «       }|j5                  |«      }|j5                  |«      }|j/                  | «      }d}|dk(  r |	«       }n|dk(  r	 |
|¬«      }|||fS )zV
        Initialize and cache the ColPali model, processor, and token pooler.
        r'   zyMPS device detected. Some operations may result in NaNs. If you encounter issues, consider using 'cpu' or 'cuda' devices.r#   ÚtransformersÚcolpali_enginer   )ÚHierarchicalTokenPoolerÚLambdaTokenPoolerNz0quantization_config must be a BitsAndBytesConfigr   Úfloat16Úfloat64)NNz
colqwen2.5ÚcolsmolÚcolidefics3Úcolqwenr   zUnsupported model: Úflash_attention_2T)Útorch_dtyper   Úattn_implementationÚlow_cpu_mem_usager   r%   )Ú	pool_func)Ú
startswithr   r   Ú(colpali_engine.compression.token_poolingr@   rA   Ú
isinstanceÚBitsAndBytesConfigr/   r   rB   rC   r)   ÚlowerÚmodelsÚ
ColQwen2_5ÚColQwen2_5_ProcessorÚColIdefics3ÚColIdefics3ProcessorÚColQwen2ÚColQwen2ProcessorÚColPaliÚColPaliProcessorÚfrom_pretrainedr   ÚevalÚto)r   r   r   r   r   r   r#   r>   r?   r@   rA   rH   Úmodel_classÚprocessor_classÚmodel_name_lowerÚmodelÚ	processorÚtoken_poolers                     r:   r2   zColPaliEmbeddings._load_modelw   s<  € ð ×Ñ˜UÔ#äðSôô (¨°Ó9ˆÜ.¨~¸~ÓNˆÜ0Ð1AÐCSÓTˆ÷	
ð
 Ð*ÜÐ1°<×3RÑ3RÔSÜ Ð!SÓTÐTà�JÒØŸ.™.‰KØ�iÒØŸ-™-‰KØ�iÒØŸ-™-‰KàŸ-™-ˆKà'1Ñ$ˆ�_Ø%×+Ñ+Ó-ÐØÐ+Ñ+Ø(×/Ñ/×:Ñ:ˆKØ,×3Ñ3×HÑH‰OØÐ*Ñ*¨mÐ?OÑ.OØ(×/Ñ/×;Ñ;ˆKØ,×3Ñ3×HÑH‰OØÐ*Ñ*Ø(×/Ñ/×8Ñ8ˆKØ,×3Ñ3×EÑE‰OØÐ*Ñ*Ø(×/Ñ/×7Ñ7ˆKØ,×3Ñ3×DÑDˆOàÐÜÐ2°:°,Ð?Ó@Ð@à×+Ñ+ØØ#à"Ð.ñ !4àä(Ô*ñ !4àØ"ð ,ó 

÷ ‰$‹&ð 	ð —‘˜Ó ˆØ—‘˜Ó%ˆØ#×3Ñ3°JÓ?ˆ	àˆØ˜~Ò-Ù2Ó4‰LØ Ò)Ù,°|ÔDˆLà�i Ð-Ð-r;   c                 ó&  — t        dd«      }| j                  €âd}| j                  j                  |g«      j	                  | j
                  j                  «      }|j                  «       5   | j
                  di |¤Ž}ddd«       | j                  rS| j                  �G| j                  j                  | j                  d| j                  j                  j                  ¬«      }d   j                  d   | _        | j                  S # 1 sw Y   Œ‹xY w)	zY
        Return the dimension of a vector in the multivector output (e.g., 128).
        r#   NÚtestT©r   ÚpaddingÚpadding_sider   éÿÿÿÿ© )r   Ú_vector_dimr4   Úprocess_queriesr\   r3   r   Úno_gradr   r5   Úpool_embeddingsr   Ú	tokenizerrg   Úshape)r6   r#   Údummy_queryÚbatch_queriesÚquery_embeddingss        r:   ÚndimszColPaliEmbeddings.ndimsÈ   s  € ô (¨°Ó9ˆØ×ÑÐ#Ø ˆKØ ŸO™O×;Ñ;¸[¸MÓJ×MÑMØ—‘×"Ñ"óˆMð —‘“ñ @Ø#. 4§;¡;Ñ#?°Ñ#?Ð ÷@ð ×$Ò$¨×);Ñ);Ð)GØ#'×#5Ñ#5×#EÑ#EØ$Ø $× 0Ñ 0Ø Ø!%§¡×!:Ñ!:×!GÑ!Gð	 $Fó $Ð ð  0°Ñ2×8Ñ8¸Ñ<ˆDÔØ×ÑÐ÷@ð @ús   Á*DÄDc                 ó:  — t        dd«      }| j                  r®| j                  �¢| j                  dk(  rH| j                  j                  || j                  d| j
                  j                  j                  ¬«      }nK| j                  dk(  r<| j                  j                  |d| j
                  j                  j                  ¬«      }t        ||j                  «      r¾|j                  «       j                  «       }|j                  |j                  k(  r|j                  |j                  «      }|j!                  «       j#                  | j                  dk(  r"t$        j&                  «      j)                  «       S t$        j                  «      j)                  «       S g S )zg
        Format model embeddings into List[List[float]].
        Use token pooling if enabled.
        r#   r   Tre   r%   )rf   rg   rC   )r   r   r5   rm   r   r4   rn   rg   rN   ÚTensorÚdetachr(   r   r   r\   r)   ÚnumpyÚastypeÚnprC   Útolist)r6   Ú
embeddingsr#   Útensorss       r:   Ú_process_embeddingsz%ColPaliEmbeddings._process_embeddingsà   sI  € ô
 (¨°Ó9ˆØ× Ò  T×%7Ñ%7Ð%CØ×$Ñ$¨Ò6Ø!×/Ñ/×?Ñ?ØØ $× 0Ñ 0Ø Ø!%§¡×!:Ñ!:×!GÑ!Gð	 @ó ‘
ð ×&Ñ&¨(Ò2Ø!×/Ñ/×?Ñ?ØØ Ø!%§¡×!:Ñ!:×!GÑ!Gð @ó �
ô �j %§,¡,Ô/Ø ×'Ñ'Ó)×-Ñ-Ó/ˆGØ�}‰} §¡Ò.Ø!Ÿ*™* U§]¡]Ó3�à—‘“ß‘ d§j¡j°IÒ&=œŸ
™
ÓNß‘“ðäCEÇ:Á:ÓNß‘“ðð
 ˆ	r;   ÚtextÚreturnc                 óþ  — t        dd«      }| j                  |«      }g }t        dt        |«      | j                  «      D ]®  }|||| j                  z    }| j
                  j                  |«      j                  | j                  j                  «      }|j                  «       5   | j                  di |¤Ž}ddd«       |j                  «      }|j                  | j                  |«      «       Œ° |S # 1 sw Y   Œ>xY w)z5
        Generate embeddings for text input.
        r#   r   Nri   )r   Úsanitize_inputÚrangeÚlenr    r4   rk   r\   r3   r   rl   Ú
nan_to_numÚextendr}   )r6   r~   r#   Úall_embeddingsÚiÚ
batch_textrq   rr   s           r:   Úgenerate_text_embeddingsz*ColPaliEmbeddings.generate_text_embeddings   sô   € ô (¨°Ó9ˆØ×"Ñ" 4Ó(ˆØˆä�qœ#˜d›) T§_¡_Ó5ò 	NˆAØ˜a ! d§o¡oÑ"5Ð6ˆJØ ŸO™O×;Ñ;¸JÓG×JÑJØ—‘×"Ñ"óˆMð —‘“ñ @Ø#. 4§;¡;Ñ#?°Ñ#?Ð ÷@à$×/Ñ/Ð0@ÓAÐØ×!Ñ! $×":Ñ":Ð;KÓ"LÕMð	Nð Ð÷	@ð @úó   Â#C3Ã3C<	Úimagesc                 óî  — t        dd«      }t        dd«      }| j                  |«      }g }	 |D �]  }t        |t        «      r¬|j	                  d«      ra|j                  |d¬«      }|j                  «        |j                  |j                  t        j                  |j                  «      «      «       Œ†|j                  |«      5 }|j                  |j                  «       «       ddd«       ŒÀt        |t        «      r5|j                  |j                  t        j                  |«      «      «       �Œ|j                  |«       �Œ 	 |S # 1 sw Y   �Œ&xY w# t        $ r}t        d|› �«      ‚d}~ww xY w)	z5
        Convert image inputs to PIL Images.
        z	PIL.ImageÚpillowÚrequests)zhttp://zhttps://é
   )ÚtimeoutNzFailed to process image: )r   r�   rN   ÚstrrL   ÚgetÚraise_for_statusÚappendÚopenÚioÚBytesIOÚcontentÚcopyÚbytesÚ	Exceptionr/   )	r6   r‹   Ú	PIL_ImagerŽ   Ú
pil_imagesÚimageÚresponseÚimÚes	            r:   Ú_prepare_imagesz!ColPaliEmbeddings._prepare_images  sD  € ô ,¨K¸ÓBˆ	Ü*¨:°zÓBˆØ×$Ñ$ VÓ,ˆØˆ
ð	>Øó -�Ü˜e¤SÔ)Ø×'Ñ'Ð(?Ô@Ø#+§<¡<°¸r <Ó#B˜Ø ×1Ñ1Ô3Ø"×)Ñ)¨)¯.©.¼¿¹ÀH×DTÑDTÓ9UÓ*VÕWà&Ÿ^™^¨EÓ2ð 9°bØ&×-Ñ-¨b¯g©g«iÔ8÷9ð 9ä ¤uÔ-Ø×%Ñ% i§n¡n´R·Z±ZÀÓ5FÓ&GÖHð ×%Ñ% eÖ,ñ-ð" Ð÷9ñ 9ûô ò 	>ÜÐ8¸¸Ð<Ó=Ð=ûð	>ús1   ­BE Ã EÃ&A"E ÅE	ÅE Å	E4Å!E/Å/E4c                 óþ  — t        dd«      }| j                  |«      }g }t        dt        |«      | j                  «      D ]®  }|||| j                  z    }| j
                  j                  |«      j                  | j                  j                  «      }|j                  «       5   | j                  di |¤Ž}ddd«       |j                  «      }|j                  | j                  |«      «       Œ° |S # 1 sw Y   Œ>xY w)z<
        Generate embeddings for a batch of images.
        r#   r   Nri   )r   r¢   r‚   rƒ   r    r4   Úprocess_imagesr\   r3   r   rl   r„   r…   r}   )r6   r‹   r#   r�   r†   r‡   Úbatch_imagesÚimage_embeddingss           r:   Úgenerate_image_embeddingsz+ColPaliEmbeddings.generate_image_embeddings/  sð   € ô (¨°Ó9ˆØ×)Ñ)¨&Ó1ˆ
Øˆä�qœ#˜j›/¨4¯?©?Ó;ò 	NˆAØ% a¨!¨d¯o©oÑ*=Ð>ˆLØŸ?™?×9Ñ9¸,ÓG×JÑJØ—‘×"Ñ"óˆLð —‘“ñ ?Ø#. 4§;¡;Ñ#>°Ñ#>Ð ÷?à$×/Ñ/Ð0@ÓAÐØ×!Ñ! $×":Ñ":Ð;KÓ"LÕMð	Nð Ð÷	?ð ?úrŠ   Úqueryc                 ó\   — t        |t        «      st        d«      ‚| j                  |g«      S )zI
        Compute embeddings for a single user query (text only).
        z>Query must be a string, image to image search is not supported)rN   r‘   r/   r‰   )r6   r¨   r7   r8   s       r:   Úcompute_query_embeddingsz*ColPaliEmbeddings.compute_query_embeddingsB  s3   € ô ˜%¤Ô%ÜØPóð ð ×,Ñ,¨e¨WÓ5Ð5r;   c                 óF   — | j                  |«      }| j                  |«      S )zú
        Compute embeddings for a batch of source images.

        Parameters
        ----------
        images : Union[str, bytes, List, pa.Array, pa.ChunkedArray, np.ndarray]
            Batch of images (paths, URLs, bytes, or PIL Images).
        )r�   r§   )r6   r‹   r7   r8   s       r:   Úcompute_source_embeddingsz+ColPaliEmbeddings.compute_source_embeddingsN  s%   € ð ×$Ñ$ VÓ,ˆØ×-Ñ-¨fÓ5Ð5r;   )*Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r‘   Ú__annotations__r   r   r   Úboolr   r   r   r   r   Úintr   r    r!   r3   r4   r5   rj   r+   Ústaticmethodr   r	   r2   rs   r}   r   r   Úfloatr‰   r   r¢   r§   r   rª   r¬   Ú__classcell__)r9   s   @r:   r   r      s»  ø… ñ&ðP B€J�ÓAØ€FˆCÓØ€Eˆ3ÓØ"Ð�tÓ"Ø&4Ð�h˜s‘mÓ4Ø"&€L�(˜3‘-Ó&Ø€K�ÓØ)-Ð˜ #™Ó-Ø€J�ÓØ$(€N�H˜S‘MÓ(à€FØ€JØ€MØ€Kô)
ðV Ù�qÔðM.ØðM.àðM.ð ðM.ð # 3™-ð	M.ð
 ˜xÑ(ðM.ð & c™]òM.ó ó ðM.ò^ ò0ð@¨Tð °d¸4ÀÀUÁÑ;LÑ6Mó ð& fð °ó ð8°ð ¸4ÀÀTÈ%Á[Ñ@QÑ;Ró ð&
6Ø˜3 ˜;Ñ'ð
6à	ˆd�4˜‘;ÑÑ	 ó
6ð6Øð6à	ˆd�4˜‘;ÑÑ	 ÷6r;   r   )Ú	functoolsr   Úloggingr   Útypingr   r   r   r   r	   rw   ry   r–   r,   Úutilr   Úbaser   Úregistryr   Úutilsr   r   r   r   ri   r;   r:   ú<module>r¾      sO   ðõ
  Ý ß 7Õ 7Û Û 	Û å *Ý #Ý ß :Ñ :ñ 
ˆ)ÓôG6Ð)ó G6ó ñG6r;   