
    Ig                         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
mZmZmZmZ d dlZd dl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      Z"y)    N)get_all_start_methods)Path)AnyDictIterableListOptionalSequenceTupleType)Image)
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e   fdZ	d fdZ
deeej                  f   deeej                  f   fd	Z	 	 	 dd
ededee   deee      dedee   ddf fdZddZdej                  deeej                  f   fdZdee   defdZ	 	 	 	 	 ddededededee   deee      dedeee      dee   fdZ xZS )OnnxImageModelreturnImageEmbeddingWorkerc                     t        d      Nz%Subclasses must implement this methodNotImplementedError)clss    ]/var/www/html/answerous/venv/lib/python3.12/site-packages/fastembed/image/onnx_image_model.py_get_worker_classz OnnxImageModel._get_worker_class   s    !"IJJ    outputc                     t        d      r   r   )selfr#   s     r    _post_process_onnx_outputz(OnnxImageModel._post_process_onnx_output       !"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.   kwargss      r    _preprocess_onnx_inputz%OnnxImageModel._preprocess_onnx_input   s
     r"   	model_dir
model_filethreads	providerscuda	device_idc                 R    t         |   ||||||       t        |      | _        y )N)r3   r4   r5   r6   r7   r8   )r3   )r*   _load_onnx_modelr   r,   )r%   r3   r4   r5   r6   r7   r8   r-   s          r    r:   zOnnxImageModel._load_onnx_model'   s7     	 ! 	! 	
 +Y?r"   c                     t        d      r   r   )r%   s    r    load_onnx_modelzOnnxImageModel.load_onnx_model:   r'   r"   encodedc                 r    | j                   j                         D ci c]  }|j                  | c}S c c}w r)   )model
get_inputsname)r%   r=   nodes      r    _build_onnx_inputz OnnxImageModel._build_onnx_input=   s,    /3zz/D/D/FGt		7"GGGs   4imagesc                    t        j                         5  |D cg c]3  }t        |t        j                        st        j                  |      n|5 }}| 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)Nr   )model_output)
contextlib	ExitStack
isinstancer   openr,   rC   r2   r?   runreshapelenr   )	r%   rD   r1   imageimage_filesr=   r.   rG   
embeddingss	            r    
onnx_embedzOnnxImageModel.onnx_embed@   s    !!# 	2 $ *4E5;;)G

5!URK  nn[1G	2 ++G4
00<
zz~~dJ7!!_,,S["=
 j99	2 	2s   C8CCCC#
model_name	cache_dir
batch_sizeparallel
device_idsc	              +     K   d}
t        |t        t        t        j                  f      r|g}d}
t        |t              rt        |      |k  rd}
||
rbt        | d      r| j                  | j                          t        ||      D ]*  }| j                  | j                  |            E d {    , y |dk(  rt        j                         }dt               v rdnd}|||d|	}t        |xs d| j!                         |||	      } |j"                  t        ||      fi |D ]  }| j                  |      E d {     y 7 7 	w)
NFTr?   r   
forkserverspawn)rS   rT   r6      )num_workersworkerr7   rW   start_method)rJ   strr   r   listrN   hasattrr?   r<   r   r&   rR   os	cpu_countr   r   r!   ordered_map)r%   rS   rT   rD   rU   rV   r6   r7   rW   r1   is_smallbatchr^   paramspools                  r    _embed_imageszOnnxImageModel._embed_imagesM   sZ     fsD%++67XFHfd#Fj(@Hx4)TZZ-?$$&#FJ7 R99$//%:PQQQR 1}<<>+7;P;R+R<X_L(&& 	F &$M--/%)D *))*VZ*HSFS A99%@@@A) R* As%   B+E-E.BE<E=EE)r   N)NFN)   NNFN)__name__
__module____qualname__classmethodr   r!   r   r   r   r&   r+   r   r_   npndarrayr2   r   r	   intr
   r   boolr:   r<   rC   r   r   rR   ri   __classcell__)r-   s   @r    r   r      s   K$'="> K KK0A Khqk KsBJJ/	c2::o	 7;#'@@ @ #	@
 H\23@ @ C=@ 
@&KH HS"**_8M H:j!1 :@Q :$ "&6:*./A/A /A 	/A
 /A 3-/A H\23/A /A T#Y'/A 
!/Ar"   r   c                   <    e Zd Zdeeeef      deeeef      fdZy)r   itemsr   c              #   b   K   |D ]&  \  }}| j                   j                  |      }||f ( y wr)   )r?   rR   )r%   ru   idxrf   rQ   s        r    processzImageEmbeddingWorker.process   s7      	"JC..u5Jz/!	"s   -/N)rk   rl   rm   r   r   rq   r   rx   r0   r"   r    r   r      s/    "XeCHo6 "8E#s(O;T "r"   r   )#rH   rb   multiprocessingr   pathlibr   typingr   r   r   r   r	   r
   r   r   numpyro   PILr   fastembed.commonr   r   fastembed.common.onnx_modelr   r   r   r   #fastembed.common.preprocessor_utilsr   fastembed.common.utilsr   fastembed.parallel_processorr   r   r   r0   r"   r    <module>r      sS     	 1  M M M   5 X X A - ;
iAYq\ iAX"? "r"   