§
    ÐÁ³gì
  ã                   ó€   — 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dS )
z=
This contrib module contains Pytorch code for quantization.
é    N)Ú
clusteringc                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )Ú	Quantizerc                 ó"   — || _         || _        dS )za
        d: dimension of vectors
        code_size: nb of bytes of the code (per vector)
        N)ÚdÚ	code_size)Úselfr   r   s      ú^/var/www/html/mpstechhub/venv/lib/python3.11/site-packages/faiss/contrib/torch/quantization.pyÚ__init__zQuantizer.__init__   s   € ð
 ˆŒØ"ˆŒˆˆó    c                 ó   — dS )z;
        takes a n-by-d array and peforms training
        N© ©r	   Úxs     r
   ÚtrainzQuantizer.train   ó	   € ð 	ˆr   c                 ó   — dS )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                 ó   — dS )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      sP   € € € € € ð#ð #ð #ðð ð ðð ð ðð ð ð ð r   r   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚVectorQuantizerc                 ó¶   — t          t          j        t          j        |¦  «        dz  ¦  «        ¦  «        }t
                               ||¦  «         || _        d S )Né   )ÚintÚmathÚceilÚtorchÚlog2r   r   Úk)r	   r   r%   r   s       r
   r   zVectorQuantizer.__init__0   sG   € å�œ	¥%¤*¨Q¡-¤-°!Ñ"3Ñ4Ô4Ñ5Ô5ˆ	Ý×Ò˜1˜iÑ(Ô(Ð(ØˆŒˆˆr   c                 ó   — d S ©Nr   r   s     r
   r   zVectorQuantizer.train6   s   € Øˆr   N)r   r   r   r   r   r   r   r
   r   r   .   s2   € € € € € ðð ð ðð ð ð ð r   r   c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚProductQuantizerc                 óÜ   — ||z  dk    sJ ‚|dk    sJ ‚t          t          j        ||z  dz  ¦  «        ¦  «        }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   s        r
   r   zProductQuantizer.__init__;   sr   € ð �1‰u˜ŠzˆzˆzˆzØ˜ŠzˆzˆzˆzÝ�œ	 ! e¡)¨a¡-Ñ0Ô0Ñ1Ô1ˆ	Ý×Ò˜4  IÑ.Ô.Ð.ØˆŒØˆŒ
Ø"ˆŒˆˆr   c                 óÂ  — 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
        |                     ¦   «         ¦  «        }t          j        d| j         z  |¦  «        | j        |<   Œd S )Né   )ÚdeviceÚdtypeé   )r,   r   r+   r/   r0   r#   ÚzerosÚcodebookÚranger   ÚDatasetAssignÚ
contiguousÚkmeans)	r	   r   ÚncÚsdÚdevr0   ÚmÚxsubÚdatas	            r
   r   zProductQuantizer.trainG   sâ   € Ø�$”*‰_ˆØŒV�t”vÑˆØŒhˆØ”ˆÝœ T¤V¨R°Ð$4¸SÈÐNÑNÔNˆŒÝ�t”v‘”ð 	Hð 	HˆAØ�Q�Q�Q˜˜DœF™
 d¤fÑ,¨q°1©u¸¼Ñ.>À$Ä&Ñ.HÐHÐHÔIˆDÝÔ+¨D¯OªOÑ,=Ô,=Ñ>Ô>ˆDÝ)Ô0°°d´j±À$ÑGÔGˆDŒM˜!ÑÐð	Hð 	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        |         d¦  «        \  }}|                     ¦   «         |d d …|f<   Œ…|S )Nr   )r0   r1   )r#   r2   Úshaper   Úuint8r4   r+   r   ÚfaissÚknnr6   r3   Úravel)r	   r   r   r;   r<   Ú_ÚIs          r
   r   zProductQuantizer.encodeR   s»   € Ý”˜QœW QœZ¨¬Ð8ÅÄÐLÑLÔLˆÝ�t”v‘”ð 	$ð 	$ˆAØ�Q�Q�Q˜˜DœF™
 d¤fÑ,¨a°!©e°t´vÑ-=ÀÄÑ-GÐGÐGÔHˆDÝ”9˜TŸ_š_Ñ.Ô.°´¸aÔ0@À!ÑDÔD‰DˆAˆqØŸ'š'™)œ)ˆE�!�!�!�Q�$‰KˆKØˆr   c                 ó  ‡ ‡‡— ˆfd„t          ‰ j        ¦  «        D ¦   «         Šˆˆ fd„t          ‰ j        ¦  «        D ¦   «         }t          j        |d¬¦  «        }‰ j        j        d         }|                     d|‰ j        z  ¦  «        }|S )Nc                 óL   •— g | ] }‰d d …|f                               ¦   «         ‘Œ!S r'   )Úlong)Ú.0r;   r   s     €r
   ú
<listcomp>z+ProductQuantizer.decode.<locals>.<listcomp>[   s1   ø€ Ð:Ð:Ð: q��a�a�a˜�d”× Ò Ñ"Ô"Ð:Ð:Ð:r   c                 ó@   •— g | ]}‰j         |‰|         d d …f         ‘ŒS r'   )r3   )rI   r;   Úidxsr	   s     €€r
   rJ   z+ProductQuantizer.decode.<locals>.<listcomp>\   s.   ø€ ÐGÐGÐG°A�4”=  D¨¤G¨Q¨Q¨Q Ô/ÐGÐGÐGr   r1   )Údiméÿÿÿÿ)r4   r+   r#   Ústackr3   r?   Úreshape)r	   r   ÚvectorsÚstacked_vectorsÚcbdÚx_recrL   s   ``    @r
   r   zProductQuantizer.decodeZ   s�   øøø€ Ø:Ð:Ð:Ð:­E°$´&©M¬MÐ:Ñ:Ô:ˆØGÐGÐGÐGÐG½¸t¼v¹¼ÐGÑGÔGˆÝœ+ g°1Ð5Ñ5Ô5ˆØŒmÔ! "Ô%ˆØ×'Ò'¨¨C°$´&©LÑ9Ô9ˆØˆr   Nr   r   r   r
   r)   r)   :   sS   € € € € € ð
#ð 
#ð 
#ð	Hð 	Hð 	Hðð ð ðð ð ð ð r   r)   )	Ú__doc__r#   rA   r!   Úfaiss.contrib.torchr   r   r   r)   r   r   r
   ú<module>rW      sÄ   ððð ð €€€Ø €€€Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ñ ô ð ð:	ð 	ð 	ð 	ð 	�iñ 	ô 	ð 	ð&ð &ð &ð &ð &�yñ &ô &ð &ð &ð &r   