§
    f>Ëj×  ã                  óè   — d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	Z
 ej        e¦  «        Z e
j        d„  ed¦  «        D ¦   «         e
j        ¬¦  «        Zdd„Zdd„Zdd„Z G d„ d¦  «        ZdS )u  
High-Scale Vector Quantization & Hamming Indexing Engine.
Triá»ƒn khai Product Quantization (PQ64) vÃ  128-bit Hamming Bit-Vector trá»±c tiáº¿p tá»« Ä‘áº§u,
cho phÃ©p há»‡ thá»‘ng xá»­ lÃ½ mÆ°á»£t mÃ  kho dá»¯ liá»‡u 10.000 - 50.000+ giá»� video trÃªn 16GB VRAM.
é    )ÚannotationsN)ÚPath)ÚOptionalÚTuplec                óR   — g | ]$}t          |¦  «                             d ¦  «        ‘Œ%S )Ú1)ÚbinÚcount)Ú.0Úis     ú4C:\Projects\VideoDetection\src\indexing\quantizer.pyú
<listcomp>r      s*   € Ð@Ð@Ð@°�#˜a™&œ&Ÿ,š, sÑ+Ô+Ð@Ð@Ð@ó    é   ©ÚdtypeÚfloat_fpú
np.ndarrayÚreturnc                ó  — | j         dk    rc| dd…         | dd…         z
  }t          j        |dd¬¦  «        }|dk                         t          j        ¦  «        }t          j        |¦  «        S | j         dk    rm| dd…dd…f         | dd…dd…f         z
  }t          j        |d	d¬¦  «        }|dk                         t          j        ¦  «        }t          j        |d¬
¦  «        S t          j        dt          j        ¬¦  «        S )u�  
    Chuyá»ƒn Ä‘á»•i vector Ã¢m thanh 128 chiá»�u float32 thÃ nh vector nhá»‹ phÃ¢n 128-bit (16 bytes uint8).
    Sá»­ dá»¥ng Ä‘á»™ dá»‘c vi phÃ¢n phá»• táº§n sá»‘ (Differential Spectral Energy - chuáº©n Philips/Shazam),
    giÃºp vector nhá»‹ phÃ¢n cá»±c ká»³ phÃ¢n biá»‡t vÃ  báº¥t biáº¿n vá»›i chuáº©n hÃ³a Ã¢m lÆ°á»£ng.
    NÃ©n dung lÆ°á»£ng tá»« 512 bytes xuá»‘ng 16 bytes (NÃ©n 32 láº§n).
    é   Néÿÿÿÿ©r   r   Úconstant)Úmoder   é   ))r   r   r   ©Úaxis)r   é   r   )ÚndimÚnpÚpadÚastypeÚuint8ÚpackbitsÚempty)r   Údiffr"   Úbitss       r   Úbinarize_audio_fingerprintr)      sþ   € ð „}˜ÒÐØ˜˜˜Œ|˜h s¨ sœmÑ+ˆÝŒf�T˜6¨
Ð3Ñ3Ô3ˆØ�a’×Ò¥¤Ñ)Ô)ˆÝŒ{˜4Ñ Ô Ð Ø	Œ˜!Ò	Ð	Ø˜˜˜˜1˜2˜2˜Œ ¨!¨!¨!¨S¨b¨S¨&Ô!1Ñ1ˆÝŒf�TÐ+°*Ð=Ñ=Ô=ˆØ�a’×Ò¥¤Ñ)Ô)ˆÝŒ{˜4 bÐ)Ñ)Ô)Ð)ÝŒ8�G¥2¤8Ð,Ñ,Ô,Ð,r   Ú
query_bitsÚref_bitsc                ó¤  — t          | ¦  «        dk    st          |¦  «        dk    r<t          j        t          | ¦  «        t          |¦  «        ft          j        ¬¦  «        S t          j        | dd…ddd…f         |ddd…dd…f         ¦  «        }t
          |         }t          j        |d¬¦  «                             t          j        ¦  «        S )u"  
    TÃ­nh khoáº£ng cÃ¡ch Hamming giá»¯a Query bits [T, 16] vÃ  Reference bits [R, 16].
    Sá»­ dá»¥ng báº£ng tra cá»©u POPCOUNT siÃªu tá»‘c, xá»­ lÃ½ hÃ ng triá»‡u fingerprint trong vÃ i mili-giÃ¢y.
    Tráº£ vá»� ma tráº­n khoáº£ng cÃ¡ch [T, R] uint8 (giÃ¡ trá»‹ tá»« 0 Ä‘áº¿n 128).
    r   r   Nr   r   )Úlenr!   r&   r$   Úbitwise_xorÚPOPCOUNT_8BITÚsumr#   )r*   r+   Úxor_resÚ
bit_countss       r   Úcompute_hamming_distance_matrixr3   (   sµ   € õ ˆ:�„˜!ÒÐ�s 8™}œ}°Ò1Ð1ÝŒx�˜Z™œ­#¨h©-¬-Ð8ÅÄÐIÑIÔIÐIõ Œn˜Z¨¨¨¨4°°°¨
Ô3°X¸dÀAÀAÀAÀqÀqÀq¸jÔ5IÑJÔJ€Gå˜wÔ'€JåŒ6�* 2Ð&Ñ&Ô&×-Ò-­b¬hÑ7Ô7Ð7r   c                ól   — t          | |¦  «        }d|                     t          j        ¦  «        dz  z
  S )u€   
    Quy Ä‘á»•i khoáº£ng cÃ¡ch Hamming sang Ä‘iá»ƒm tÆ°Æ¡ng Ä‘á»“ng (0.0 - 1.0).
    Ä�iá»ƒm = 1.0 - (Hamming_dist / 128.0)
    g      ð?g      `@)r3   r#   r!   Úfloat32)r*   r+   Úh_dists      r   Úcompute_hamming_similarityr7   9   s1   € õ
 -¨Z¸ÑBÔB€FØ�&—-’-¥¤
Ñ+Ô+¨eÑ3Ñ4Ð4r   c                  ó4   — e Zd ZdZddd„Zdd„Zdd„Zdd„ZdS )ÚProductQuantizer64u^  
    Bá»™ mÃ£ hÃ³a Product Quantization PQ64 cho vector thá»‹ giÃ¡c V-JEPA 2 (1024-d).
    Chia 1024 chiá»�u thÃ nh 64 sub-vectors (má»—i sub-vector dÃ i 16 chiá»�u).
    Má»—i sub-vector Ä‘Æ°á»£c lÆ°á»£ng tá»­ hÃ³a thÃ nh 1 byte (256 centroids).
    NÃ©n dung lÆ°á»£ng má»—i visual clip tá»« 4.096 bytes xuá»‘ng Ä‘Ãºng 64 bytes (NÃ©n 64 láº§n).
    é   é@   é   ÚdÚintÚmÚnbitsr   ÚNonec                óœ   — || _         || _        || _        ||z  | _        d|z  | _        d | _        d | _        |                      ¦   «          d S )Nr   )r=   r?   r@   Úd_subÚk_subÚcodebookÚfaiss_indexÚ_init_codebook)Úselfr=   r?   r@   s       r   Ú__init__zProductQuantizer64.__init__J   sT   € ØˆŒØˆŒØˆŒ
Ø˜!‘VˆŒ
Ø˜%‘ZˆŒ
Ø.2ˆŒØˆÔà×ÒÑÔÐÐÐr   c                ó¸  — t           j                             d¦  «        }|                     | j        | j        | j        ¦  «                             t           j        ¦  «        }t           j	         
                    |dd¬¦  «        dz   }||z  | _        	 ddl}|                     | j        | j        | j        ¦  «        | _        dS # t"          $ r d| _        Y dS w xY w)uÞ   
        Khá»Ÿi táº¡o codebook chuáº©n hÃ³a trá»±c giao (Unit Orthogonal Subspace Codebook).
        Ä�áº£m báº£o cÃ³ thá»ƒ mÃ£ hÃ³a vÃ  giáº£i mÃ£ tá»©c thÃ¬ mÃ  khÃ´ng phá»¥ thuá»™c quÃ¡ trÃ¬nh train ban Ä‘áº§u.
        é*   r   T)r   ÚkeepdimsgH¯¼šò×z>r   N)r!   ÚrandomÚRandomStateÚrandnr?   rD   rC   r#   r5   ÚlinalgÚnormrE   ÚfaissÚIndexPQr=   r@   rF   ÚImportError)rH   ÚrngÚcbÚnormsrR   s        r   rG   z!ProductQuantizer64._init_codebookU   sË   € õ
 Œi×#Ò# BÑ'Ô'ˆà�YŠY�t”v˜tœz¨4¬:Ñ6Ô6×=Ò=½b¼jÑIÔIˆå”	—’˜r¨°T�Ñ:Ô:¸TÑAˆØ˜U™
ˆŒð	$ØˆLˆLˆLØ$Ÿ}š}¨T¬V°T´V¸T¼ZÑHÔHˆDÔÐÐøåð 	$ð 	$ð 	$Ø#ˆDÔÐÐÐð	$øøøs   Â/C ÃCÃCÚvectorsr   c                óŒ  — t          |¦  «        dk    r't          j        d| j        ft          j        ¬¦  «        S |                     t          j        ¦  «        }|j        d         }|                     || j        | j	        ¦  «        }t          j
        |d¦  «        }t          j        || j        ft          j        ¬¦  «        }t          | j        ¦  «        D ]k}||         }| j        |         }t          j        ||j        ¦  «        }	t          j        |	d¬¦  «                             t          j        ¦  «        |dd…|f<   Œl|S )uo   
        MÃ£ hÃ³a ma tráº­n vector [N, 1024] float32 thÃ nh ma tráº­n mÃ£ lÆ°á»£ng tá»­ [N, 64] uint8.
        r   r   )r   r   r   r   r   N)r-   r!   r&   r?   r$   r#   r5   ÚshapeÚreshaperC   Ú	transposeÚrangerE   ÚdotÚTÚargmax)
rH   rX   ÚnÚsub_vecsÚsub_tÚcodesÚm_idxÚsub_mÚcb_mÚsimss
             r   ÚencodezProductQuantizer64.encodei   s  € õ ˆw‰<Œ<˜1ÒÐÝ”8˜Q ¤˜K­r¬xÐ8Ñ8Ô8Ð8à—.’.¥¤Ñ,Ô,ˆØŒM˜!Ôˆð —?’? 1 d¤f¨d¬jÑ9Ô9ˆõ
 ”˜X yÑ1Ô1ˆå”˜!˜TœV˜­B¬HÐ5Ñ5Ô5ˆå˜4œ6‘]”]ð 	Gð 	GˆEà˜%”LˆEØ”= Ô'ˆDõ ”6˜% ¤Ñ(Ô(ˆDÝ œi¨°1Ð5Ñ5Ô5×<Ò<½R¼XÑFÔFˆE�!�!�!�U�(‰OˆOàˆr   Úquery_vectorsÚ	ref_codesc                ó¸  — t          |¦  «        }t          |¦  «        }|dk    s|dk    r"t          j        ||ft          j        ¬¦  «        S |                     || j        | j        ¦  «        }t          j        || j        | j        ft          j        ¬¦  «        }t          | j        ¦  «        D ]>}t          j	        |dd…|dd…f         | j
        |         j        ¦  «        |dd…|dd…f<   Œ?t          j        ||ft          j        ¬¦  «        }t          | j        ¦  «        D ]}|dd…|f         }	||dd…||	f         z  }Œ|t          | j        ¦  «        z  }|S )um  
        TÃ­nh khoáº£ng cÃ¡ch báº¥t Ä‘á»‘i xá»©ng (Asymmetric Distance Computation - ADC):
        Query giá»¯ nguyÃªn dáº¡ng float32 [Q, 1024], Reference dÃ¹ng mÃ£ nÃ©n 64-byte [R, 64] uint8.
        KhÃ´ng cáº§n giáº£i nÃ©n reference vectors, tá»‘c Ä‘á»™ cá»±c nhanh!
        Tráº£ vá»� ma tráº­n Ä‘á»™ tÆ°Æ¡ng Ä‘á»“ng Cosine Æ°á»›c tÃ­nh [Q, R] float32.
        r   r   N)r-   r!   r&   r5   r[   r?   rC   rD   r]   r^   rE   r_   ÚzerosÚfloat)
rH   rj   rk   Úq_countÚr_countÚq_subsÚdist_tablesre   Ú
sim_matrixÚ	sub_codess
             r   Úcompute_asymmetric_distancesz/ProductQuantizer64.compute_asymmetric_distancesˆ   sa  € õ �mÑ$Ô$ˆÝ�i‘.”.ˆà�aŠ<ˆ<˜7 aš<˜<Ý”8˜W gÐ.µb´jÐAÑAÔAÐAð ×&Ò& w°´¸¼
ÑCÔCˆÝ”h ¨¬°´Ð<ÅBÄJÐOÑOÔOˆå˜4œ6‘]”]ð 	[ð 	[ˆEå')¤v¨f°Q°Q°Q¸¸q¸q¸q°[Ô.AÀ4Ä=ÐQVÔCWÔCYÑ'ZÔ'ZˆK˜˜˜˜5 ! ! !˜Ñ$Ð$õ ”X˜w¨Ð0½¼
ÐCÑCÔCˆ
å˜4œ6‘]”]ð 	;ð 	;ˆEà! ! ! ! U (Ô+ˆIà˜+ a a a¨°	Ð&9Ô:Ñ:ˆJˆJð 	•e˜DœF‘m”mÑ#ˆ
ØÐr   N)r:   r;   r<   )r=   r>   r?   r>   r@   r>   r   rA   )r   rA   )rX   r   r   r   )rj   r   rk   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rI   rG   ri   ru   © r   r   r9   r9   B   ss   € € € € € ðð ð	ð 	ð 	ð 	ð 	ð$ð $ð $ð $ð(ð ð ð ð>&ð &ð &ð &ð &ð &r   r9   )r   r   r   r   )r*   r   r+   r   r   r   )ry   Ú
__future__r   ÚloggingÚpathlibr   Útypingr   r   Únumpyr!   Ú	getLoggerrv   ÚloggerÚarrayr]   r$   r/   r)   r3   r7   r9   rz   r   r   ú<module>rƒ      s  ððð ð
 #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ð �”Ð@Ð@°U°U¸3±Z´ZÐ@Ñ@Ô@ÈÌÐQÑQÔQ€ð-ð -ð -ð -ð(8ð 8ð 8ð 8ð"5ð 5ð 5ð 5ðlð lð lð lð lñ lô lð lð lð lr   