
    ^Nj                         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mZ d dlmZ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)NDArray)Encoding	Tokenizer)
NumpyArrayOnnxProviderDevice)EmbeddingWorker	OnnxModelOnnxOutputContextT)load_tokenizer)
iter_batch)ParallelWorkerPoolc                   H    e Zd ZU dZee   dz  ed<   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eej(                     z  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e   dedee   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"d&d"eee   z  ded#edefd$Z# xZ$S )'OnnxTextModelNONNX_OUTPUT_NAMESreturnzTextEmbeddingWorker[T]c                     t        d      N%Subclasses must implement this methodNotImplementedError)clss    o/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/fastembed/text/onnx_text_model.py_get_worker_classzOnnxTextModel._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'OnnxTextModel._post_process_onnx_output   s     ""IJJr"   c                 >    t         |           d | _        i | _        y N)super__init__	tokenizerspecial_token_to_id)r&   	__class__s    r    r+   zOnnxTextModel.__init__$   s    +/35 r"   
onnx_inputc                     |S )z,
        Preprocess the onnx input.
         )r&   r/   r$   s      r    _preprocess_onnx_inputz$OnnxTextModel._preprocess_onnx_input)   s
     r"   	model_dir
model_filethreads	providerscuda	device_idextra_session_optionsc           	      d    t         |   |||||||       t        |      \  | _        | _        y )N)r3   r4   r5   r6   r7   r8   r9   )r3   )r*   _load_onnx_modelr   r,   r-   )	r&   r3   r4   r5   r6   r7   r8   r9   r.   s	           r    r;   zOnnxTextModel._load_onnx_model1   sC     	 !"7 	! 	
 4BI3V00r"   c                     t        d      r   r   )r&   s    r    load_onnx_modelzOnnxTextModel.load_onnx_modelF   s    !"IJJr"   	documentsc                 8    | j                   j                  |      S r)   )r,   encode_batch)r&   r>   r$   s      r    tokenizezOnnxTextModel.tokenizeI   s    ~~**955r"   c           
          | j                   |fi |}t        j                  |D cg c]  }|j                   c}      }t        j                  |D cg c]  }|j                   c}      }| j
                  j                         D ch c]  }|j                   }}dt        j                  |t        j                        i}	d|v r(t        j                  |t        j                        |	d<   d|v rbt        j                  |D cg c]0  }t        j                  t        |      t        j                        2 c}t        j                        |	d<    | j                  |	fi |}	| j
                  j                  | j                  |	      }
t        |
d   |	j                  d|      |	j                  d|            S c c}w c c}w c c}w c c}w )N	input_ids)dtypeattention_masktoken_type_idsr   )model_outputrE   rC   )rA   nparrayidsrE   model
get_inputsnameint64zeroslenr2   runr   r   get)r&   r>   r$   encodederC   rE   nodeinput_namesr/   rG   s              r    
onnx_embedzOnnxTextModel.onnx_embedL   s   
  $--	4V4HHW5WaeeW56	W"EW1#3#3W"EF-1ZZ-B-B-DE-DTtyy-DE)288<-

 {*+-88N"((+SJ'({*+-88;DE9a#a&19ERXX,J'( 1T00FvF
zz~~d&<&<jI %a%>>*:NK nn[)<
 	
 6"EE Fs   GG
G	5G   F
model_name	cache_dir
batch_sizeparallel
device_idslocal_files_onlyspecific_model_pathc              +     K   d}t        |t              r|g}d}t        |t              rt        |      |k  rd}||rft	        | d      r| j
                  | j                          t        ||      D ].  } | j                   | j                  |fi |fi |E d {    0 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)
NFTrK   r   
forkserverspawn)rY   rZ   r6   r^   r_      )num_workersworkerr7   r]   start_method)
isinstancestrlistrP   hasattrrK   r=   r   r'   rW   os	cpu_countr   updater   r!   ordered_map)r&   rY   rZ   r>   r[   r\   r6   r7   r]   r^   r_   r9   r$   is_smallbatchrf   paramspools                     r    _embed_documentszOnnxTextModel._embed_documentsg   sz     i%"IHi&9~
*x4)TZZ-?$$&#Iz:9499#DOOE4V48>   ;
 1}<<>+7;P;R+R<X_L(&&$4': F %034%$M--/%)D *))*Y
*KVvV9499%J6JJJ W78 Ks%   BEE
B%EEEEtexts_c                 2   t        | d      r| j                  | j                          d}| j                  J t	        |t
              r|gn|}t        ||      D ]:  }| j                  j                  |      D ]  }|t        |j                        z  } < |S )NrK   r   )
rj   rK   r=   r,   rg   rh   r   r@   sumrE   )r&   rt   r[   ru   	token_numrp   tokenss          r    _token_countzOnnxTextModel._token_count   s    tW%);  "	~~)))%eS1uz2E..55e<S!6!677	 = 3 r"   )r   N)i   )%__name__
__module____qualname__r   ri   rh   __annotations__classmethodr   r!   r   r   r   r   r'   r+   dictr   r	   rH   rN   r2   r   AUTOr   intr   r   boolr;   r=   r
   rA   rW   rs   rz   __classcell__)r.   s   @r    r   r      s   *.tCy4'.K$'?"@ K K
K0A 
KS 
KU]^_U` 
K6
sJ/;>	c: 111	2 48$kk $7;WW W t	W
 L)D0W VmW :W  $CH~4W 
W*K6$s) 6s 6tH~ 6
9
 
 
	
@ #37$kk'+!&*.7;9K9K 9K #&	9K
 9K *9K L)D09K Vm9K I$9K 9K !4Z9K  $CH~49K 9K 
!9Kv#"5 3 TW \_ r"   r   c                   <    e Zd Zdeeeef      deeeef      fdZy)TextEmbeddingWorkeritemsr   c              #   b   K   |D ]&  \  }}| j                   j                  |      }||f ( y wr)   )rK   rW   )r&   r   idxrp   onnx_outputs        r    processzTextEmbeddingWorker.process   s3     JC**//6K{""  s   -/N)	r{   r|   r}   r   tupler   r   r   r   r1   r"   r    r   r      s2    #XeCHo6 #8E#O`J`Da;b #r"   r   )"rk   multiprocessingr   pathlibr   typingr   r   r   r   numpyrH   numpy.typingr	   
tokenizersr
   r   fastembed.common.typesr   r   r   fastembed.common.onnx_modelr   r   r   r   #fastembed.common.preprocessor_utilsr   fastembed.common.utilsr   fastembed.parallel_processorr   r   r   r1   r"   r    <module>r      sV    	 1  0 0    * C C X X > - ;\IaL \~#/!, #r"   