
    rh
                     l    d Z ddlZddlZddlZddlmZ  G d d      Z G d de      Z G d d	e      Zy)
z=
This contrib module contains Pytorch code for quantization.
    N)
clusteringc                   $    e Zd Zd Zd Zd Zd Zy)	Quantizerc                      || _         || _        y)za
        d: dimension of vectors
        code_size: nb of bytes of the code (per vector)
        N)d	code_size)selfr   r   s      s/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/faiss/contrib/torch/quantization.py__init__zQuantizer.__init__   s    
 "    c                      y)z;
        takes a n-by-d array and peforms training
        N r	   xs     r
   trainzQuantizer.train        	r   c                      y)zV
        takes a n-by-d float array, encodes to an n-by-code_size uint8 array
        Nr   r   s     r
   encodezQuantizer.encode!   r   r   c                      y)zL
        takes a n-by-code_size uint8 array, returns a n-by-d array
        Nr   )r	   codess     r
   decodezQuantizer.decode'   r   r   N__name__
__module____qualname__r   r   r   r   r   r   r
   r   r      s    #r   r   c                       e Zd Zd Zd Zy)VectorQuantizerc                     t        t        j                  t        j                  |      dz              }t
        j                  ||       || _        y )N   )intmathceiltorchlog2r   r   k)r	   r   r%   r   s       r
   r   zVectorQuantizer.__init__0   s9    		%**Q-!"345	1i(r   c                      y )Nr   r   s     r
   r   zVectorQuantizer.train6   s    r   N)r   r   r   r   r   r   r   r
   r   r   .   s    r   r   c                   $    e Zd Zd Zd Zd Zd Zy)ProductQuantizerc                     ||z  dk(  sJ |dk(  sJ t        t        j                  ||z  dz              }t        j	                  | ||       || _        || _        || _        y)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   s        r
   r   zProductQuantizer.__init__;   sb     1uzzzz		!e)a-01	4I.
"r   c                 6   d| j                   z  }| j                  | j                  z  }|j                  }|j                  }t        j                  | j                  ||f||      | _        t        | j                        D ]  }|d d || j                  z  | j                  z  |dz   | j                  z  | j                  z  f   }t        j                  |j                               }t        j                  d| j                   z  |      | j                  |<    y )N   )devicedtype   )r+   r   r*   r.   r/   r#   zeroscodebookranger   DatasetAssign
contiguouskmeans)	r	   r   ncsddevr/   mxsubdatas	            r
   r   zProductQuantizer.trainG   s    $**_VVtvvhhTVVR$4SNtvv 	HAQDFF
dff,q1u.>$&&.HHHID++DOO,=>D)00djj$GDMM!	Hr   c                    t        j                  |j                  d   | j                  ft         j                        }t        | j                        D ]  }|d d || j                  z  | j                  z  |dz   | j                  z  | j                  z  f   }t        j                  |j                         | j                  |   d      \  }}|j                         |d d |f<    |S )Nr   )r/   r0   )r#   r1   shaper   uint8r3   r*   r   faissknnr5   r2   ravel)r	   r   r   r:   r;   _Is          r
   r   zProductQuantizer.encodeR   s    QWWQZ8Ltvv 	$AQDFF
dff,a!etvv-=-GGGHD99T__.a0@!DDAq'')E!Q$K	$ r   c                    t        | j                        D cg c]  }|d d |f   j                          }}t        | j                        D cg c]  }| j                  |||   d d f    }}t	        j
                  |d      }| j                  j                  d   }|j                  d|| j                  z        }|S c c}w c c}w )Nr0   )dim)r3   r*   longr2   r#   stackr>   reshape)r	   r   r:   idxsvectorsstacked_vectorscbdx_recs           r
   r   zProductQuantizer.decodeZ   s    ,1$&&M:qad  "::9>tvvGA4==DGQ/GG++g15mm!!"%''C$&&L9 ;Gs   C CNr   r   r   r
   r(   r(   :   s    
#	Hr   r(   )	__doc__r#   r@   r!   faiss.contrib.torchr   r   r   r(   r   r   r
   <module>rR      s:       * :	i 	&y &r   