
    ^Nj                         d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
 d dl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mZmZ d d
lmZ d dlmZ d dl m!Z!  G d dee         Z" G d dee         Z#y)    N)get_all_start_methods)Path)AnyIterableSequenceType)Image)Compose)
NumpyArrayDevice)
ImageInputOnnxProvider)EmbeddingWorker	OnnxModelOnnxOutputContextT)load_preprocessor)
iter_batch)ParallelWorkerPoolc                       e Zd Zeded   fd       Zdededee	   fdZ
d" fdZd	eeef   dedeeef   fd
Zdej"                  ddfdedededz  dee   dz  deez  dedz  deeef   dz  ddf fdZd"dZdedeeef   fdZdee   dedefdZdddej"                  ddddfdededeee   z  dededz  dee   dz  deez  dee   dz  ded edz  deeef   dz  dedee	   fd!Z xZS )#OnnxImageModelreturnzImageEmbeddingWorker[T]c                     t        d      N%Subclasses must implement this methodNotImplementedError)clss    q/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastembed/image/onnx_image_model.py_get_worker_classz OnnxImageModel._get_worker_class   s    !"IJJ    outputkwargsc                     t        d      )ah  Post-process the ONNX model output to convert it into a usable format.

        Args:
            output (OnnxOutputContext): The raw output from the ONNX model.
            **kwargs: Additional keyword arguments that may be needed by specific implementations.

        Returns:
            Iterable[T]: Post-processed output as an iterable of type T.
        r   r   )selfr"   r#   s      r   _post_process_onnx_outputz(OnnxImageModel._post_process_onnx_output   s     ""IJJr!   Nc                 0    t         |           d | _        y N)super__init__	processor)r%   	__class__s    r   r*   zOnnxImageModel.__init__&   s    )-r!   
onnx_inputc                     |S )z,
        Preprocess the onnx input.
         )r%   r-   r#   s      r   _preprocess_onnx_inputz%OnnxImageModel._preprocess_onnx_input*   s
     r!   	model_dir
model_filethreads	providerscuda	device_idextra_session_optionsc           	      T    t         |   |||||||       t        |      | _        y )N)r1   r2   r3   r4   r5   r6   r7   )r1   )r)   _load_onnx_modelr   r+   )	r%   r1   r2   r3   r4   r5   r6   r7   r,   s	           r   r9   zOnnxImageModel._load_onnx_model2   s:     	 !"7 	! 	
 +Y?r!   c                     t        d      r   r   )r%   s    r   load_onnx_modelzOnnxImageModel.load_onnx_modelG   s    !"IJJr!   encodedc                 X    | j                   j                         d   j                  }||iS )Nr   )model
get_inputsname)r%   r<   
input_names      r   _build_onnx_inputz OnnxImageModel._build_onnx_inputJ   s*    ZZ**,Q/44
G$$r!   imagesc           	      6   t        j                         5 }|D cg c]B  }t        |t        j                        s$|j	                  t        j
                  |            n|D }}| j                  J d       t        j                  | j                  |            }d d d        | j                        }| j                  |      }| j                  j                  d |      }|d   j                  t        |      d      }	t        |	      S c c}w # 1 sw Y   vxY w)NzProcessor is not initializedr   )model_output)
contextlib	ExitStack
isinstancer	   enter_contextopenr+   nparrayrB   r0   r>   runreshapelenr   )
r%   rC   r#   stackimageimage_filesr<   r-   rF   
embeddingss
             r   
onnx_embedzOnnxImageModel.onnx_embedN   s    !!#u
 $	 $E "%5 ##EJJu$56 $	   >>-M/MM-hht~~k:;G $ ++G4
00<
zz~~dJ7!!_,,S["=
 j99 $#s   DAD
!9D
DD   F
model_name	cache_dir
batch_sizeparallel
device_idslocal_files_onlyspecific_model_pathc              +     K   d}t        |t        t        t        j                  f      r|g}d}t        |t              rt        |      |k  rd}||rdt        | d      r| j                  | j                          t        ||      D ],  } | j                  | j                  |      fi |E d {    . y |dk(  rt        j                         }dt               v rdnd}||||	|
d|}||j                  |       t!        |xs d| j#                         |||	      } |j$                  t        ||      fi |D ]  } | j                  |fi |E d {     y 7 7 	w)
NFTr>   r   
forkserverspawn)rW   rX   r4   r\   r]      )num_workersworkerr5   r[   start_method)rI   strr   r	   listrP   hasattrr>   r;   r   r&   rU   os	cpu_countr   updater   r    ordered_map)r%   rW   rX   rC   rY   rZ   r4   r5   r[   r\   r]   r7   r#   is_smallbatchrd   paramspools                     r   _embed_imageszOnnxImageModel._embed_images^   su     fsD%++67XFHfd#Fj(@Hx4)TZZ-?$$&#FJ79499$//%:P[TZ[[[ 8 1}<<>+7;P;R+R<X_L(&&$4': F %034%$M--/%)D *))*VZ*HSFS9499%J6JJJ T3 \4 Ks%   B-E!/E0B%E!EE!E!)r   N)__name__
__module____qualname__classmethodr   r    r   r   r   r   r&   r*   dictre   r   r0   r   AUTOr   intr   r   boolr9   r;   rB   rf   r   rU   rp   __classcell__)r,   s   @r   r   r      s=   K$'@"A K K
K0A 
KS 
KU]^_U` 
K.sJ/;>	c:o	 48$kk $7;@@ @ t	@
 L)D0@ Vm@ :@  $CH~4@ 
@*K% %S*_8M %:j!1 :S :EV :* #37$kk'+!&*.7;7K7K 7K Xj11	7K
 7K *7K L)D07K Vm7K I$7K 7K !4Z7K  $CH~47K 7K 
!7Kr!   r   c                   <    e Zd Zdeeeef      deeeef      fdZy)ImageEmbeddingWorkeritemsr   c              #   b   K   |D ]&  \  }}| j                   j                  |      }||f ( y wr(   )r>   rU   )r%   r|   idxrm   rT   s        r   processzImageEmbeddingWorker.process   s2     JC..u5Jz/!  s   -/N)rq   rr   rs   r   tuplerw   r   r   r/   r!   r   r{   r{      s/    "XeCHo6 "8E#s(O;T "r!   r{   )$rG   rh   multiprocessingr   pathlibr   typingr   r   r   r   numpyrL   PILr	   #fastembed.image.transform.operatorsr
   fastembed.common.typesr   r   fastembed.commonr   r   fastembed.common.onnx_modelr   r   r   r   #fastembed.common.preprocessor_utilsr   fastembed.common.utilsr   fastembed.parallel_processorr   r   r{   r/   r!   r   <module>r      s[     	 1  0 0   7 5 5 X X A - ;
@KYq\ @KF"?1- "r!   