
    Oh
                     l    S r SSKrSSKrSSKrSSKJr   " S S5      r " S S\5      r " S S	\5      rg)
z=
This contrib module contains Pytorch code for quantization.
    N)
clusteringc                   ,    \ rS rSrS rS rS rS rSrg)	Quantizer   c                     Xl         X l        g)zI
d: dimension of vectors
code_size: nb of bytes of the code (per vector)
N)d	code_size)selfr   r	   s      X/var/www/html/shao/venv/lib/python3.13/site-packages/faiss/contrib/torch/quantization.py__init__Quantizer.__init__   s    
 "    c                     g)z+
takes a n-by-d array and peforms training
N r
   xs     r   trainQuantizer.train        	r   c                     g)zF
takes a n-by-d float array, encodes to an n-by-code_size uint8 array
Nr   r   s     r   encodeQuantizer.encode!   r   r   c                     g)z<
takes a n-by-code_size uint8 array, returns a n-by-d array
Nr   )r
   codess     r   decodeQuantizer.decode'   r   r   )r	   r   N	__name__
__module____qualname____firstlineno__r   r   r   r   __static_attributes__r   r   r   r   r      s    #r   r   c                        \ rS rSrS rS rSrg)VectorQuantizer.   c                     [        [        R                  " [        R                  " U5      S-  5      5      n[
        R                  X5        X l        g )N   )intmathceiltorchlog2r   r   k)r
   r   r-   r	   s       r   r   VectorQuantizer.__init__0   s5    		%**Q-!"345	1(r   c                     g )Nr   r   s     r   r   VectorQuantizer.train6   s    r   )r-   N)r   r   r    r!   r   r   r"   r   r   r   r$   r$   .   s    r   r$   c                   ,    \ rS rSrS rS rS rS rSrg)ProductQuantizer:   c                     X-  S:X  d   eUS:X  d   e[        [        R                  " X#-  S-  5      5      n[        R	                  XU5        X l        X0l        X@l        g)zYM: 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   r5   r6   r	   s        r   r   ProductQuantizer.__init__;   sV     uzzzz		!)a-01	4I.
"r   c                 4   SU R                   -  nU R                  U R                  -  nUR                  nUR                  n[
        R                  " U R                  X#4XES9U l        [        U R                  5       H  nUS S 2X`R                  -  U R                  -  US-   U R                  -  U R                  -  24   n[        R                  " UR                  5       5      n[        R                  " SU R                   -  U5      U R                  U'   M     g )N   )devicedtype   )r6   r   r5   r:   r;   r+   zeroscodebookranger   DatasetAssign
contiguouskmeans)	r
   r   ncsddevr;   mxsubdatas	            r   r   ProductQuantizer.trainG   s    $**_VVtvvhhTVVR$4SNtvvAQFF
dff,q1u.>$&&.HHHID++DOO,=>D)00djj$GDMM! r   c                    [         R                  " UR                  S   U R                  4[         R                  S9n[        U R                  5       H  nUS S 2X0R                  -  U R                  -  US-   U R                  -  U R                  -  24   n[        R                  " UR                  5       U R                  U   S5      u  pVUR                  5       US S 2U4'   M     U$ )Nr   )r;   r<   )r+   r=   shaper	   uint8r?   r5   r   faissknnrA   r>   ravel)r
   r   r   rF   rG   _Is          r   r   ProductQuantizer.encodeR   s    QWWQZ8LtvvAQFF
dff,a!etvv-=-GGGHD99T__.a0@!DDA'')E!Q$K  r   c                    [        U R                  5       Vs/ sH  o!S S 2U4   R                  5       PM     nn[        U R                  5       Vs/ sH  o R                  X#U   S S 24   PM     nn[        R
                  " USS9nU R                  R                  S   nUR                  SX`R                  -  5      nU$ s  snf s  snf )Nr<   )dim)r?   r5   longr>   r+   stackrK   reshape)r
   r   rF   idxsvectorsstacked_vectorscbdx_recs           r   r   ProductQuantizer.decodeZ   s    ,1$&&M:Mqad  "M:9>tvvGA==GQ/G++g15mm!!"%''C&&L9 ;Gs   B>C)r5   r	   r>   r6   Nr   r   r   r   r2   r2   :   s    
#	Hr   r2   )	__doc__r+   rM   r)   faiss.contrib.torchr   r   r$   r2   r   r   r   <module>ra      s:       * :	i 	&y &r   