a
    ^g
                     @   sj   d dl mZ d dlZd dlmZmZ ddlmZ G dd dejZ	dej
eed	d
dZG dd dZdS )    )
ThreadPoolN)ListTuple   )rpcc                   @   sH   e Zd ZdZeejdddZeedddZedd	d
Z	dd Z
dS )SearchServerz, Assign version that can be exposed via RPC )sindexc                 C   s$   t j| | || _t|| _d S N)r   Server__init__r	   faissZextract_index_ivf	index_ivf)selfr   r	    r   i/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/faiss/contrib/client_server.pyr      s    zSearchServer.__init__nprobereturnc                 C   s   || j _dS )z set nprobe field N)r   r   r   r   r   r   r   
set_nprobe   s    zSearchServer.set_nprober   c                 C   s   | j jS r
   )r	   ntotalr   r   r   r   
get_ntotal   s    zSearchServer.get_ntotalc                 C   s   t | j|S r
   )getattrr	   )r   fr   r   r   __getattr__    s    zSearchServer.__getattr__N)__name__
__module____qualname____doc__intr   Indexr   r   r   r   r   r   r   r   r      s
   r   Fr	   portv6c                    s   t j fdd||d dS )z( serve requests for that index forerver c                    s
   t |  S r
   )r   )r   r	   r   r   <lambda>(       z"run_index_server.<locals>.<lambda>)r&   N)r   Z
run_serverr$   r   r'   r   run_index_server%   s    
r*   c                   @   sj   e Zd ZdZdeeeef  edddZ	edddd	Z
edd
ddZddddZedddZdS )ClientIndexzmanages a set of distance sub-indexes. The sub_indexes search a
    subset of the inverted lists. Searches are merged afterwards
    F)machine_portsr&   c                 C   sV   g | _ |D ]\}}| j t||| q
t| j | _t| j| _|  | _	d| _
dS )z+ connect to a series of (host, port) pairs FN)sub_indexesappendr   ZClientlennir   poolr   r   verbose)r   r,   r&   machiner%   r   r   r   r   5   s    
zClientIndex.__init__Nr   c                    s   | j  fdd| j d S )Nc                    s
   |   S r
   )r   idxr   r   r   r(   D   r)   z(ClientIndex.set_nprobe.<locals>.<lambda>r1   mapr-   r   r   r6   r   r   B   s    
zClientIndex.set_nprobe)ntr   c                    s   | j  fdd| j d S )Nc                    s
   |   S r
   )set_omp_num_threadsr4   r9   r   r   r(   J   r)   z1ClientIndex.set_omp_num_threads.<locals>.<lambda>r7   )r   r9   r   r;   r   r:   H   s    
zClientIndex.set_omp_num_threadsr   c                 C   s   t | jdd | jS )Nc                 S   s   |   S r
   )r   r4   r   r   r   r(   P   r)   z(ClientIndex.get_ntotal.<locals>.<lambda>)sumr1   r8   r-   r   r   r   r   r   N   s    zClientIndex.get_ntotal)kc                    sV   t jd  }| j fdd| jD ]\}}||| q,|  |j|j	fS )Nr   c                    s   |   S r
   )searchr4   r=   xr   r   r(   X   r)   z$ClientIndex.search.<locals>.<lambda>)
r   Z
ResultHeapshaper1   imapr-   
add_resultfinalizeDI)r   r@   r=   ZrhZDiZIir   r?   r   r>   T   s
    "zClientIndex.search)F)r   r   r    r!   r   r   strr"   boolr   r   r:   r   r>   r   r   r   r   r+   0   s   r+   )F)Zmultiprocessing.poolr   r   typingr   r    r   r   r   r#   r"   rH   r*   r+   r   r   r   r   <module>   s   