ó
    Ð]jÆ)  ã                   óº   • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKr\R                  r	 " S S\
5      r " S S\
5      r " S S\	5      r " S	 S
\5      rSS jrg)zb
Fast cryptographic hash of Python objects, with a special case for fast
hashing of numpy arrays.
é    Nc                   ó   • \ rS rSrSrS rSrg)Ú_ConsistentSeté   zTClass used to ensure the hash of Sets is preserved
whatever the order of its items.
c                 ó”   •  [        U5      U l        g ! [        [        R                  4 a    [        S U 5       5      U l         g f = f)Nc              3   ó8   #   • U  H  n[        U5      v •  M     g 7f©N©Úhash)Ú.0Úes     ÚK/home/mande/repo/quber/.venv/lib/python3.13/site-packages/joblib/hashing.pyÚ	<genexpr>Ú*_ConsistentSet.__init__.<locals>.<genexpr>%   s   é € Ð$C²l°¤T¨!§W W²lùs   ‚)ÚsortedÚ	_sequenceÚ	TypeErrorÚdecimalÚInvalidOperation)ÚselfÚset_sequences     r   Ú__init__Ú_ConsistentSet.__init__   sF   € ð		Eô
 $ LÓ1ˆD�NøÜœ7×3Ñ3Ð4ó 	Eô $Ñ$C±lÓ$CÓDˆDŽNð	Eús   ‚ “1AÁA)r   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__© ó    r   r   r      s   † ñõEr!   r   c                   ó   • \ rS rSrSrS rSrg)Ú_MyHashé(   z5Class used to hash objects that won't normally picklec                 ó   • Xl         g r   ©Úargs)r   r'   s     r   r   Ú_MyHash.__init__+   s   € Ø�	r!   r&   Nr   r    r!   r   r#   r#   (   s
   † Ù?õr!   r#   c                   ó&  • \ rS rSrSrSS jrSS jrS rS rS\	R                  4S jr\R                  R                  5       r\\\" \5      '   \\\" \5      '   \\\" \5      '   \\\" \R&                  5      '   S	 rS
 r\\\" \" 5       5      '   Srg)ÚHasheré/   z½A subclass of pickler, to do cryptographic hashing, rather than
pickling. This is used to produce a unique hash of the given
Python object that is not necessarily cryptographically secure.
c                 ó¬   • [         R                  " 5       U l        Sn[        R	                  X R                  US9  [
        R                  " USS9U l        g )Né   )ÚprotocolF)Úusedforsecurity)ÚioÚBytesIOÚstreamÚPicklerr   ÚhashlibÚnewÚ_hash)r   Ú	hash_namer.   s      r   r   ÚHasher.__init__5   s?   € Ü—j’j“lˆŒð ˆÜ×Ñ˜Ÿ{™{°XÐÑ>ä—[’[ ¸EÑBˆ�
r!   c                 óJ  •  U R                  U5        U R                  R                  5       nU R                  R                  U5        U(       a  U R                  R                  5       $ g ! [        R                   a$  nU=R                  SU< SU< 34-  sl        e S nAff = f)NzPicklingError while hashing z: )	ÚdumpÚpickleÚPicklingErrorr'   r2   Úgetvaluer6   ÚupdateÚ	hexdigest)r   ÚobjÚreturn_digestr   Údumpss        r   r
   ÚHasher.hash>   s„   € ð	Ø�I‰I�cŒNð —‘×$Ñ$Ó&ˆØ�
‰
×Ñ˜%Ô ÞØ—:‘:×'Ñ'Ó)Ð)ð øô ×#Ñ#ó 	Ø�F‹F»sÂAÐFÐHÑH�FØûð	ús   ‚A* Á*B"Á>BÂB"c                 óÚ  • [        U[        R                  [        0 R                  5      45      (       a¢  [        US5      (       a  UR                  R                  nOUR                  nUR                  n[        U5      [        [        5      L a  [        X#R                  5      nO1Uc  [        X#5      nO"UR                  R                  n[        X#U5      n[        R                  X5        g )NÚ__func__)Ú
isinstanceÚtypesÚ
MethodTypeÚtypeÚpopÚhasattrrE   r   Ú__self__r;   r#   Ú	__class__r3   Úsave)r   r@   Ú	func_nameÚinstÚclss        r   rN   ÚHasher.saveI   s¦   € Ü�cœE×,Ñ,¬d°2·6±6«lÐ;×<Ñ<ô �s˜J×'Ñ'ØŸL™L×1Ñ1‘	àŸL™L�	Ø—<‘<ˆDÜ�D‹zœT¤&›\Ò)Ü˜i¯©Ó7‘Ø‘ä˜iÓ.‘à—l‘l×,Ñ,�Ü˜i¨sÓ3�Ü�‰�TÕr!   c                 óf   • [        U[        [        45      (       a  g [        R	                  X5        g r   )rF   ÚbytesÚstrr3   Úmemoize)r   r@   s     r   rV   ÚHasher.memoize\   s$   € ô
 �cœE¤3˜<×(Ñ(ØÜ�‰˜Õ"r!   Nc                 ó\  • [        X#S9nUS	  [        R                  " X40 UD6  g ! [        R                   aq    [        R                  " X40 UD6  [        USS 5      nUS:X  aD  UnUc  UR                  n[        R                  U   n[        Xv5      (       d  [        XvU5         g  g  g f = f)N)ÚnameÚpackrZ   r   Ú__main__)Údictr3   Úsave_globalr;   r<   Úgetattrr   ÚsysÚmodulesrK   Úsetattr)r   r@   rY   rZ   ÚkwargsÚmoduleÚmy_nameÚmods           r   r]   ÚHasher.save_globalg   s­   € ô ˜4Ñ+ˆØ�6ˆNð	/Ü×Ò Ñ4¨VÓ4øÜ×#Ñ#ó 	/Ü×Ò Ñ4¨VÒ4Ü˜S ,°Ó5ˆFØ˜Ó#Ø�Ø‘?Ø!Ÿl™l�GÜ—k‘k &Ñ)�Ü˜s×,Ñ,ô ˜C¨#Ö.ñ -ñ $ð	/ús   Ž& ¦A>B+Â*B+c           
      óÜ   •  [         R                  " U [        [        U5      5      /UQ76   g ! [         a4    [         R                  " U [        [        S U 5       5      5      /UQ76    g f = f)Nc              3   ó@   #   • U  H  u  p[        U5      U4v •  M     g 7fr   r	   )r   ÚkÚvs      r   r   Ú)Hasher._batch_setitems.<locals>.<genexpr>”   s   é € Ð!Aº5±4°1¤4¨£7¨A¥,º5ùs   ‚)r3   Ú_batch_setitemsÚiterr   r   )r   Úitemsr'   s      r   rl   ÚHasher._batch_setitemsˆ   sc   € ð	ô
 ×#Ò# D¬$¬v°e«}Ó*=ÐEÀÔEøÜó 	ô ×#Ò#Ø”dœ6Ñ!A¹5Ó!AÓAÓBðØEIõð	ús   ‚*- ­;A+Á*A+c                 óB   • [         R                  U [        U5      5        g r   )r3   rN   r   )r   Ú	set_itemss     r   Úsave_setÚHasher.save_set—   s   € ä�‰�Tœ>¨)Ó4Õ5r!   )r6   r2   )Úmd5)T)r   r   r   r   r   r   r
   rN   rV   ÚstructrZ   r]   r3   ÚdispatchÚcopyrI   ÚlenÚobjectr;   r:   rl   rr   Úsetr   r    r!   r   r*   r*   /   s›   † ñô
Cô	*ò ò&#ð %)¨v¯{©{ô /ð* ×Ñ×$Ñ$Ó&€Hà%€H‰T�#‹YÑà(€H‰T�&‹\Ñà)€H‰T�'‹]Ñà"-€H‰T�&—+‘+ÓÑòò6ð %€H‰T‘#“%‹[Ôr!   r*   c                   ó(   • \ rS rSrSrSS jrS rSrg)ÚNumpyHasheréž   z1Special case the hasher for when numpy is loaded.c                 ó¦   • X l         [        R                  XS9  SSKnX0l        [        US5      (       a  UR                  U l        g[        U l        g)z¥
Parameters
----------
hash_name: string
    The hash algorithm to be used
coerce_mmap: boolean
    Make no difference between np.memmap and np.ndarray
    objects.
©r7   r   NÚ	getbuffer)	Úcoerce_mmapr*   r   ÚnumpyÚnprK   r€   Ú
_getbufferÚ
memoryview)r   r7   r�   rƒ   s       r   r   ÚNumpyHasher.__init__¡   s?   € ð 'ÔÜ�‰˜ˆÑ2ãàŒÜ�2�{×#Ñ#Ø Ÿl™lˆD�Oä(ˆD�Or!   c                 ó2  • [        XR                  R                  5      (       Ga_  UR                  R                  (       GdC  UR
                  S:X  a  UR                  5       nOVUR                  R                  (       a  UnO8UR                  R                  (       a  UR                  nOUR                  5       nU R                  R                  U R                  UR                  U R                  R                  5      5      5        U R                   (       a;  [        XR                  R"                  5      (       a  U R                  R                  nOUR$                  nUSUR                  UR
                  UR&                  44nO~[        XR                  R                  5      (       aZ  U R                  R                  SR)                  S5      5        U R                  R                  [*        R,                  " U5      5        g[.        R1                  X5        g)z‡Subclass the save method, to hash ndarray subclass, rather
than pickling them. Off course, this is a total abuse of
the Pickler class.
r    ÚHASHEDÚ_HASHED_DTYPEzutf-8N)rF   rƒ   ÚndarrayÚdtypeÚ	hasobjectÚshapeÚflattenÚflagsÚc_contiguousÚf_contiguousÚTr6   r>   r„   ÚviewÚuint8r�   ÚmemmaprM   ÚstridesÚencoder;   rB   r*   rN   )r   r@   Úobj_c_contiguousÚklasss       r   rN   ÚNumpyHasher.save¶   s\  € ô
 �cŸ7™7Ÿ?™?×+Ò+°C·I±I×4G×4GÐ4Gð �y‰y˜B‹ð $'§;¡;£=Ñ Ø—‘×'×'Ø#&Ñ Ø—‘×'×'Ø#&§5¡5Ñ ð
 $'§;¡;£=Ð ð �J‰J×Ñ˜dŸo™oÐ.>×.CÑ.CÀDÇGÁGÇMÁMÓ.RÓSÔTð
 ××¤J¨s·G±G·N±N×$CÑ$Cð Ÿ™Ÿ™‘àŸ™�ð
 ˜8 S§Y¡Y°·	±	¸3¿;¹;ÐGÐH‰CÜ˜ŸW™WŸ]™]×+Ñ+ð  �J‰J×Ñ˜o×4Ñ4°WÓ=Ô>Ø�J‰J×ÑœfŸlšl¨3Ó/Ô0ØÜ�‰�DÕr!   )r„   r�   rƒ   N©rt   F)r   r   r   r   r   r   rN   r   r    r!   r   r|   r|   ž   s   † Ù;ô)õ*>r!   r|   c                 ó´   • SnX;  a  [        SR                  X15      5      eS[        R                  ;   a
  [	        XS9nO	[        US9nUR                  U 5      $ )a%  Quick calculation of a hash to identify uniquely Python objects
containing numpy arrays.

Parameters
----------
hash_name: 'md5' or 'sha1'
    Hashing algorithm used. sha1 is supposedly safer, but md5 is
    faster.
coerce_mmap: boolean
    Make no difference between np.memmap and np.ndarray
)rt   Úsha1zAValid options for 'hash_name' are {}. Got hash_name={!r} instead.r‚   )r7   r�   r   )Ú
ValueErrorÚformatr_   r`   r|   r*   r
   )r@   r7   r�   Úvalid_hash_namesÚhashers        r   r
   r
   ÷   s_   € ð 'ÐØÓ(ÜØO×VÑVØ óó
ð 	
ð
 ”#—+‘+ÓÜ yÑJ‰ä )Ñ,ˆØ�;‰;�sÓÐr!   r›   )r   r   r4   r0   r;   ru   r_   rG   Ú_Picklerr3   ry   r   r#   r*   r|   r
   r    r!   r   Ú<module>r£      sg   ðñó Û Û 	Û Û Û 
Û à
�/‰/€ôE�Vô Eô&ˆfô ôl%ˆWô l%ô^V�&ô Võrr!   