Ë
    °Œjì
  ã                   ó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      új/var/www/html/Fitness-lenito-AI-main/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 performs 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__1   s9   € äœŸ	™	¤%§*¡*¨Q£-°!Ñ"3Ó4Ó5ˆ	Ü×Ñ˜1˜iÔ(Øˆ�r   c                  ó   — y )Nr   r   s     r
   r   zVectorQuantizer.train7   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)ziM: 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   € ð �1‰u˜Š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.trainH   sÙ   € Ø�—
‘
‰]ˆØ�V‰V�t—v‘vÑˆØ�h‰hˆØ—‘ˆÜŸ™ T§V¡V¨R°Ð$4¸SÈÔNˆŒÜ�t—v‘v–ˆAØ’Q˜˜DŸF™F™
 d§f¡fÑ,°°A±¸¿¹Ñ/?À4Ç6Á6Ñ/IÐIÐIÑJˆDÜ×+Ñ+¨D¯O©OÓ,=Ó>ˆDÜ)×0Ñ0°°D·J±J±ÀÓEˆD�M‰M˜!Òñ 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.encodeS   s´   € Ü—‘˜QŸW™W Q™Z¨¯©Ð8ÄÇÁÔLˆÜ�t—v‘v–ˆAØ’Q˜˜DŸF™F™
 d§f¡fÑ,°°A±¸¿¹Ñ/?À4Ç6Á6Ñ/IÐIÐIÑJˆDÜ—9‘9˜TŸ_™_Ó.°·±¸aÑ0@À!ÓD‰DˆAˆqØŸ'™'›)ˆ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.decode[   s©   € Ü,1°$·&±&¬MÓ:©M q�’a˜�d‘× Ñ Õ"¨MˆÐ:Ü9>¸t¿v¹v¼ÓG¹°A�4—=‘=  D¨¡GªQ Ó/¸ˆÐGÜŸ+™+ g°1Ô5ˆØ�m‰m×!Ñ! "Ñ%ˆØ×'Ñ'¨¨C°$·&±&©LÓ9ˆØˆùò ;ùÚGs   ˜C ÁCNr   r   r   r
   r(   r(   ;   s   „ ò
#ò	Fòór   r(   )	Ú__doc__r#   r@   r!   Úfaiss.contrib.torchr   r   r   r(   r   r   r
   Ú<module>rR      s:   ðñó Û Û Ý *÷
ñ ô:	�iô 	ô&�yõ &r   