a
    ^g
                     @   sZ   d Z ddlZddlZddlZddlmZ G dd dZG dd deZG dd	 d	eZdS )
z=
This contrib module contains Pytorch code for quantization.
    N)
clusteringc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	Quantizerc                 C   s   || _ || _dS )za
        d: dimension of vectors
        code_size: nb of bytes of the code (per vector)
        N)d	code_size)selfr   r    r   n/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/faiss/contrib/torch/quantization.py__init__   s    zQuantizer.__init__c                 C   s   dS )z;
        takes a n-by-d array and peforms training
        Nr   r   xr   r   r   train   s    zQuantizer.trainc                 C   s   dS )zV
        takes a n-by-d float array, encodes to an n-by-code_size uint8 array
        Nr   r
   r   r   r   encode!   s    zQuantizer.encodec                 C   s   dS )zL
        takes a n-by-code_size uint8 array, returns a n-by-d array
        Nr   )r   codesr   r   r   decode'   s    zQuantizer.decodeN__name__
__module____qualname__r	   r   r   r   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd Zdd ZdS )VectorQuantizerc                 C   s.   t tt|d }t|| || _d S )N   )intmathceiltorchlog2r   r	   k)r   r   r   r   r   r   r   r	   0   s    zVectorQuantizer.__init__c                 C   s   d S Nr   r
   r   r   r   r   6   s    zVectorQuantizer.trainN)r   r   r   r	   r   r   r   r   r   r   .   s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ProductQuantizerc                 C   sV   || dksJ |dksJ t t|| d }t| || || _|| _|| _dS )zj M: number of subvectors, d%M == 0
        nbits: number of bits that each vector is encoded into
        r   r   N)r   r   r   r   r	   Mnbitsr   )r   r   r   r   r   r   r   r   r	   ;   s    zProductQuantizer.__init__c           	      C   s   d| j  }| j| j }|j}|j}tj| j||f||d| _t| jD ]Z}|d d || j | j |d | j | j f }t	
| }t	d| j  || j|< qFd S )N   )devicedtype   )r   r   r   r!   r"   r   zeroscodebookranger   ZDatasetAssign
contiguousZkmeans)	r   r   ncsddevr"   mxsubdatar   r   r   r   G   s    
0zProductQuantizer.trainc                 C   s   t j|jd | jft jd}t| jD ]d}|d d || j | j |d | j | j f }t	|
 | j| d\}}| |d d |f< q&|S )Nr   )r"   r#   )r   r$   shaper   Zuint8r&   r   r   faissZknnr'   r%   Zravel)r   r   r   r+   r,   _Ir   r   r   r   R   s    0zProductQuantizer.encodec                    sb    fddt jD fddt jD }tj|dd}jjd }|d|j }|S )Nc                    s    g | ]} d d |f   qS r   )long.0r+   )r   r   r   
<listcomp>[       z+ProductQuantizer.decode.<locals>.<listcomp>c                    s$   g | ]}j | | d d f qS r   )r%   r3   )idxsr   r   r   r5   \   r6   r#   )dim)r&   r   r   stackr%   r.   Zreshape)r   r   ZvectorsZstacked_vectorsZcbdZx_recr   )r   r7   r   r   r   Z   s    zProductQuantizer.decodeNr   r   r   r   r   r   :   s   r   )	__doc__r   r/   r   Zfaiss.contrib.torchr   r   r   r   r   r   r   r   <module>   s   