Ë
    kQêjò  ã                   óä   — d dl Zd dlZd dlZd dlmZ d dlmZm	Z	m
Z
 d dlm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 dd
lmZ ddlmZmZ erd dlZd dlZ ed«       G d„ de«      «       Zy)é    N)ÚTYPE_CHECKINGÚListÚUnion)Úurl2pathname)ÚPrivateAttr)Útqdmé   )Úattempt_import_or_raiseé   )ÚEmbeddingFunction)Úregister)ÚIMAGESÚurl_retrieveú	open-clipc                   óÞ  ‡ — 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d<    e«       Z e«       Z e«       Zˆ fd„Zd„ Zdeedf   deej,                     fd„Zdedej,                  fd„Zdedeee   ej,                  f   fd„Zdedeej8                     fd„Zdeee   ee   f   deej,                     fd„Zdeeedf   dej,                  fd„Zdeeef   fd„Z dd„Z!ˆ xZ"S )ÚOpenClipEmbeddingsz“
    An embedding function that uses the OpenClip API
    For multi-modal text-to-image search

    https://github.com/mlfoundations/open_clip
    zViT-B-32ÚnameÚlaion2b_s34b_b79kÚ
pretrainedÚcpuÚdeviceé@   Ú
batch_sizeTÚ	normalizec                 óT  •— t        ‰| �  |i |¤Ž t        dd«      }|j                  | j                  | j
                  ¬«      \  }}}|j                  | j                  «       |j                  «        ||c| _	        | _
        |j                  | j                  «      | _        d | _        y )NÚ	open_clipr   )r   )ÚsuperÚ__init__r
   Úcreate_model_and_transformsr   r   Útor   ÚevalÚ_modelÚ_preprocessÚget_tokenizerÚ
_tokenizerÚ_ndims)ÚselfÚargsÚkwargsr   ÚmodelÚ_Ú
preprocessÚ	__class__s          €úa/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/lancedb/embeddings/open_clip.pyr   zOpenClipEmbeddings.__init__-   s–   ø€ Ü‰Ñ˜$Ð) &Ò)Ü+¨K¸ÓEˆ	Ø(×DÑDØ�I‰I $§/¡/ð  Eó  
Ñˆˆq�*ð 	�‰�—‘Ôð 	�
‰
ŒØ(-¨zÐ%ˆŒ�TÔ%Ø#×1Ñ1°$·)±)Ó<ˆŒØˆ�ó    c                 óx   — | j                   €#| j                  d«      j                  d   | _         | j                   S )NÚfoor   )r&   Úgenerate_text_embeddingsÚshape)r'   s    r.   ÚndimszOpenClipEmbeddings.ndims;   s3   € Ø�;‰;ÐØ×7Ñ7¸Ó>×DÑDÀQÑGˆDŒKØ�{‰{Ðr/   ÚqueryzPIL.Image.ImageÚreturnc                 óÄ   — t        |t        «      r| j                  |«      gS t        dd«      }t        ||j                  «      r| j                  |«      gS t        d«      ‚)zÚ
        Compute the embeddings for a given user query

        Parameters
        ----------
        query : Union[str, PIL.Image.Image]
            The query to embed. A query can be either text or an image.
        ú	PIL.ImageÚpillowz+OpenClip supports str or PIL Image as query)Ú
isinstanceÚstrr2   r
   ÚImageÚgenerate_image_embeddingÚ	TypeError)r'   r5   r(   r)   Ú	PIL_Images        r.   Úcompute_query_embeddingsz+OpenClipEmbeddings.compute_query_embeddings@   s\   € ô �eœSÔ!Ø×1Ñ1°%Ó8Ð9Ð9ä/°¸XÓFˆIÜ˜% §¡Ô1Ø×5Ñ5°eÓ<Ð=Ð=äÐ MÓNÐNr/   Útextc                 óä  — t        d«      }| j                  |«      }| j                  |«      }|j                  | j                  «        |j
                  «       5  | j                  j                  |j                  | j                  «      «      }| j                  r||j                  dd¬«      z  }|j                  «       j                  «       j                  «       cd d d «       S # 1 sw Y   y xY w)NÚtorchéÿÿÿÿT©ÚdimÚkeepdim)r
   Úsanitize_inputr%   r    r   Úno_gradr"   Úencode_textr   Únormr   ÚnumpyÚsqueeze)r'   rA   rC   Útext_featuress       r.   r2   z+OpenClipEmbeddings.generate_text_embeddingsT   sº   € Ü'¨Ó0ˆØ×"Ñ" 4Ó(ˆØ�‰˜tÓ$ˆØ�‰�—‘ÔØˆU�]‰]‹_ñ 	9Ø ŸK™K×3Ñ3°D·G±G¸D¿K¹KÓ4HÓIˆMØ�~Š~Ø ×!3Ñ!3¸ÀDÐ!3Ó!IÑI�Ø ×$Ñ$Ó&×,Ñ,Ó.×6Ñ6Ó8÷		9÷ 	9ò 	9ús   ÁBC&Ã&C/Úimagesc                 ó  — t        |t        t        f«      r|g}|S t        |t        j                  «      r|j                  «       }|S t        |t        j                  «      r|j                  «       j                  «       }|S )z?
        Sanitize the input to the embedding function.
        )r:   r;   ÚbytesÚpaÚArrayÚ	to_pylistÚChunkedArrayÚcombine_chunks)r'   rO   s     r.   rH   z!OpenClipEmbeddings.sanitize_input_   sq   € ô �fœs¤E˜lÔ+Ø�XˆFð
 ˆô	 ˜¤§¡Ô)Ø×%Ñ%Ó'ˆFð ˆô ˜¤§¡Ô0Ø×*Ñ*Ó,×6Ñ6Ó8ˆFØˆr/   c                 ó  — | j                  |«      }g }t        dt        |«      | j                  «      D ]I  }t	        || j                  z   t        |«      «      }||| }|j                  | j                  |«      «       ŒK |S )z9
        Get the embeddings for the given images
        r   )rH   ÚrangeÚlenr   ÚminÚextendÚ_parallel_get)r'   rO   r(   r)   Ú
embeddingsÚiÚjÚbatchs           r.   Úcompute_source_embeddingsz,OpenClipEmbeddings.compute_source_embeddingsk   s~   € ð ×$Ñ$ VÓ,ˆØˆ
Ü�qœ#˜f›+ t§¡Ó7ò 	9ˆAÜ�A˜Ÿ™Ñ'¬¨V«Ó5ˆAØ˜1˜Q�KˆEØ×Ñ˜d×0Ñ0°Ó7Õ8ð	9ð Ðr/   c                 ó  — t         j                  j                  «       5 }|D �cg c]  }|j                  | j                  |«      ‘Œ  }}t        |«      D �cg c]  }|j                  «       ‘Œ c}cddd«       S c c}w c c}w # 1 sw Y   yxY w)zF
        Issue concurrent requests to retrieve the image data
        N)Ú
concurrentÚfuturesÚThreadPoolExecutorÚsubmitr=   r   Úresult)r'   rO   ÚexecutorÚimagerd   Úfutures         r.   r\   z OpenClipEmbeddings._parallel_gety   sŒ   € ô ×Ñ×2Ñ2Ó4ð 	A¸ð $öàð —‘ × =Ñ =¸uÕEðˆGð ô 37°w³-Ö@¨�F—M‘M•OÒ@÷	Añ 	Aùòùò A÷	Að 	Aús(   ŸB¤#A9ÁBÁA>Á-BÁ9
BÂBri   c                 óê   — t        d«      }| j                  |«      }| j                  |«      j                  d«      } |j                  «       5  | j                  |«      cddd«       S # 1 sw Y   yxY w)a-  
        Generate the embedding for a single image

        Parameters
        ----------
        image : Union[str, bytes, PIL.Image.Image]
            The image to embed. If the image is a str, it is treated as a uri.
            If the image is bytes, it is treated as the raw image bytes.
        rC   r   N)r
   Ú_to_pilr#   Ú	unsqueezerI   Ú_encode_and_normalize_image)r'   ri   rC   s      r.   r=   z+OpenClipEmbeddings.generate_image_embedding„   se   € ô (¨Ó0ˆà—‘˜UÓ#ˆØ× Ñ  Ó'×1Ñ1°!Ó4ˆØˆU�]‰]‹_ñ 	;Ø×3Ñ3°EÓ:÷	;÷ 	;ò 	;ús   ÁA)Á)A2c                 ó�  — t        dd«      }t        |t        «      r$|j                  t	        j
                  |«      «      S t        ||j                  «      r|S t        |t        «      rÞt        j                  |«      }|j                  dk(  r$|j                  t        |j                  «      «      S |j                  dk(  r4|j                  t        j                  dk(  r|«      S |j                  «      S |j                  j                  d«      r-|j                  t	        j
                  t        |«      «      «      S t!        d«      ‚y )Nr8   r9   ÚfileÚ ÚntÚhttpz)Only local and http(s) urls are supported)r
   r:   rQ   ÚopenÚioÚBytesIOr<   r;   ÚurlparseÚschemer   ÚpathÚosr   Ú
startswithr   ÚNotImplementedError)r'   ri   r?   Úparseds       r.   rl   zOpenClipEmbeddings._to_pil—   sò   € Ü+¨K¸ÓBˆ	Ü�eœUÔ#Ø—>‘>¤"§*¡*¨UÓ"3Ó4Ð4Ü�e˜YŸ_™_Ô-ØˆLÜ˜œsÔ#Ü×&Ñ& uÓ-ˆFà�}‰} Ò&Ø —~‘~¤l°6·;±;Ó&?Ó@Ð@Ø—‘ "Ò$Ø —~‘~¬r¯w©w¸$ª eÓPÐPÀFÇKÁKÓPÐPØ—‘×)Ñ)¨&Ô1Ø —~‘~¤b§j¡j´¸eÓ1DÓ&EÓFÐFä)Ð*UÓVÐVð $r/   c                 ó  — | j                   j                  |j                  | j                  «      «      }| j                  r||j                  dd¬«      z  }|j                  «       j                  «       j                  «       S )zR
        encode a single image tensor and optionally normalize the output
        rD   TrE   )	r"   Úencode_imager    r   r   rK   r   rL   rM   )r'   Úimage_tensorÚimage_featuress      r.   rn   z.OpenClipEmbeddings._encode_and_normalize_image©   sg   € ð Ÿ™×1Ñ1°,·/±/À$Ç+Á+Ó2NÓOˆØ�>Š>Ø˜n×1Ñ1°bÀ$Ð1ÓGÑGˆNØ×!Ñ!Ó#×)Ñ)Ó+×3Ñ3Ó5Ð5r/   )r€   ztorch.Tensor)#Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r;   Ú__annotations__r   r   r   Úintr   Úboolr   r"   r#   r%   r   r4   r   r   ÚnpÚndarrayr@   r2   r   rQ   rH   Úarrayra   r\   r=   rl   rn   Ú__classcell__)r-   s   @r.   r   r      sS  ø… ñð €Dˆ#ÓØ)€J�Ó)Ø€FˆCÓØ€J�ÓØ€IˆtÓÙ‹]€FÙ“-€KÙ“€Jôòð
OØ˜3Ð 1Ð1Ñ2ðOà	ˆb�j‰jÑ	óOð(	9¨Sð 	9°R·Z±Zó 	9ð
 Vð 
°°d¸5±kÀ2Ç:Á:Ð6MÑ0Nó 
ðØðà	ˆb�h‰h‰óð	A E¨$¨s©)°T¸%±[Ð*@Ñ$Að 	AÀdÈ2Ï:É:ÑFVó 	Að;Ø˜3 Ð'8Ð8Ñ9ð;à	�‰ó;ð&W˜U 3¨ :Ñ.ó W÷$6r/   r   ) Úconcurrent.futuresrc   ru   rz   Úurllib.parseÚparserw   Útypingr   r   r   Úurllib.requestr   rL   r‰   ÚpyarrowrR   Úpydanticr   r   Úutilr
   Úbaser   Úregistryr   Úutilsr   r   ÚPILrC   r   © r/   r.   ú<module>rš      sa   ðó
 Û 	Û 	Ý ß -Ñ -Ý 'ã Û Ý  Ý å *Ý #Ý ß 'áÛÛñ 
ˆ+ÓôT6Ð*ó T6ó ñT6r/   