Ë
    lQêj^!  ã            
       ó2  — d dl Z d dlmZmZmZ d dlZd dlZd dlmZm	Z	m
Z
mZmZmZmZ d dlZd dlmZ d dlmc mc mZ d dlmZ d dlmZ d dlmZ d dlmZ d	eeef   fd
„Zdeded	efd„Z dedededed	df
d„Z!dedededed	df
d„Z"ded	dfd„Z#ded	dfd„Z$y)é    N)ÚFutureÚThreadPoolExecutorÚwait)ÚAnyÚDictÚListÚOptionalÚSetÚTupleÚcast)Ú	ClientAPI)Ú
SegmentAPI)Ú	RecordSet)Útest_hnsw_config)ÚMetadataÚreturnc                  ób   — t        j                  dd«      } t        j                  dd«      }| |fS )Né
   i'  é   )ÚrandomÚrandint)ÚNÚDs     úe/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/chromadb/test/test_multithreaded.pyÚgenerate_data_shaper      s+   € Ü�‰�r˜5Ó!€AÜ�‰�r˜3Ó€AØˆqˆ6€Mó    r   r   c                 óL  — t        | «      D �cg c]  }t        |«      ‘Œ }}t        | «      D �cg c]  }|› |i‘Œ	 }}t        | «      D �cg c]  }d|› �‘Œ	 }}t        j                  j	                  | |«      j                  «       }t        ||||¬«      }|S c c}w c c}w c c}w )Nzdoc ©ÚidsÚ
embeddingsÚ	metadatasÚ	documents)ÚrangeÚstrÚnpr   ÚrandÚtolistr   )r   r   Úir   r!   r"   r    Únormalized_record_sets           r   Úgenerate_record_setr*      s    € Ü  ›8Ö
$�aŒ3ˆq�6Ð
$€CÐ
$Ü<AÀ!»HÖ&E°q¨1¨#°¢{Ð&E€IÐ&EÜ%*¨1£XÖ. �4˜�s’Ð.€IÐ.Ü—‘—‘  1Ó%×,Ñ,Ó.€Jô (1ØØØØô	(Ðð !Ð ùò %ùÚ&EùÚ.s   ŽB¯BÁ
B!ÚclientÚnum_workersc           
      ó  — t        ||«      }|d   }|d   }|d   }|d   }t        d|› d|› d|› d�«       | j                  «        | j                  d	t        ¬
«      }	t        |¬«      5 }
g }d}|t        |«      k  r¯t        j                  d|dz  «      }t        |t        |«      |z
  «      }|dz   }||z   dz   }|�t        ||| «      dk(  rn]|
j                  |	j                  ||| |�||| nd |�||| nd |�||| nd ¬«      }|j                  |«       ||z  }|t        |«      k  rŒ¯d d d «       t        «       |D ]  }|j                  «       }|€Œ|‚ t        j                   |	|«       t        j"                  |	|«       t        j$                  |	|«       t        j&                  |	«       t        j(                  t+        |«      D �cg c]  }|‘Œ c}d«      }d}t        j,                  |	|||¬«       y # 1 sw Y   ŒÏxY wc c}w )Nr   r    r!   r"   úAdding ú records with ú dimensions on ú workersÚtest©ÚnameÚmetadata©Úmax_workerséÿÿÿÿé   r   r   r   é   ©Ú	n_resultsÚquery_indices)r*   ÚprintÚresetÚcreate_collectionr   r   Úlenr   r   ÚminÚsubmitÚaddÚappendr   Ú	exceptionÚ
invariantsÚcountÚ	ids_matchÚmetadatas_matchÚno_duplicatesÚsampler#   Úann_accuracy)r+   r   r   r,   Úrecords_setr   r    r!   r"   ÚcollÚexecutorÚfuturesÚ
total_sentÚ
batch_sizeÚto_sendÚstartÚendÚfuturerF   r(   r=   r<   s                         r   Ú_test_multithreaded_addrX   )   s<  € ô & a¨Ó+€KØ
�eÑ
€CØ˜\Ñ*€JØ˜KÑ(€IØ˜KÑ(€Iä	ˆG�A�3�n Q C °{°mÀ8Ð
LÔMð ‡L�L„NØ×#Ñ#¨Ô:JÐ#ÓK€DÜ	¨Ô	4ð "¸Ø%'ˆØˆ
Øœ3˜s›8Ò#äŸ™¨¨1°©7Ó3ˆJÜ˜*¤c¨#£h°Ñ&;Ó<ˆGØ ‘NˆEØ˜wÑ&¨Ñ*ˆCØÐ%¬#¨j¸¸sÐ.CÓ*DÈÒ*IØØ—_‘_Ø—‘Ø˜˜c�NØ4>Ð4J˜: e¨CÑ0ÐPTØ2;Ð2G˜) E¨#Ñ.ÈTØ2;Ð2G˜) E¨#Ñ.ÈTð %ó ˆFð �N‰N˜6Ô"Ø˜'Ñ!ˆJð! œ3˜s›8Ó#÷"ô* 	ˆ„Màò ˆØ×$Ñ$Ó&ˆ	ØÑ ØˆOðô ×Ñ�T˜;Ô'Ü×Ñ˜˜{Ô+Ü×Ñ˜t [Ô1Ü×Ñ˜TÔ"ô —M‘M¬e°A«hÖ"7¨¢1Ò"7¸Ó<€MØ€IÜ×ÑØØØØ#ö	÷M"ð "üòH #8s   Á)CG9Ç	HÇ9Hc           	      óÜ  ‡‡‡‡‡‡‡— | j                  «        | j                  dt        ¬«      Št        ||«      }t	        t
        t           |d   «      Št	        t
        t           |d   «      Št	        t
        t           |d   «      Š|d   Št        «       Št        j                  «       Št        d|› d|› d	|› d
�«       	 ddt        dt        t
        t              ddfˆˆˆˆˆˆˆfd„}t        |¬«      5 }g }d}|t!        ‰«      dz
  k  rÀt#        j$                  dd«      }	|	dk(  rkt#        j$                  d|dz  «      }
t'        |
t!        ‰«      |z
  «      }|dz   }||z   dz   }|j)                  ||	‰|| «      }|j+                  |«       ||z  }n(|	dk(  r#|j)                  ||	«      }|j+                  |«       |t!        ‰«      dz
  k  rŒÀddd«       t-        «       |D ]  }|j/                  «       }|€Œ|‚ t1        | t2        «      r1| j5                  «       j6                  du rt9        j:                  |«       t9        j<                  ‰|«       t9        j>                  ‰|«       t9        j@                  ‰|«       t9        jB                  ‰«       t#        jD                  tG        |«      D �cg c]  }|‘Œ c}d«      }d}t9        jH                  ‰|||¬«       y# 1 sw Y   �ŒxY wc c}w )zeTest that will use multiple threads to interleave operations on the db and verify they work correctlyr2   r3   r   r    r!   r"   r.   r/   r0   r1   NÚ	operationÚids_to_modifyr   c           
      ó.  •— | dk(  r¢|€J ‚|D �cg c]  }‰j                  |«      ‘Œ }}t        |«      dk(  ry‰j                  |‰�|D �cg c]  }‰|   ‘Œ	 c}nd‰�|D �cg c]  }‰|   ‘Œ	 c}nd‰�|D �cg c]  }‰|   ‘Œ	 c}nd¬«       ‰5  ‰
j                  |«       ddd«       y| dk(  r²g }d}‰5  t	        ‰
j                  «       «      }ddd«       |D �cg c]  }‰j                  |«      ‘Œ }}t        |«      dk(  st        |«      |k  ryt        j                  |t        dt        |«      «      «      }|D �cg c]  }‰|   ‘Œ	 }	}‰j                  |	|¬«       yyc c}w c c}w c c}w c c}w # 1 sw Y   yxY w# 1 sw Y   Œ´xY wc c}w c c}w )z,Perform a random operation on the collectionr   Nr   r9   r:   r   )r<   )
ÚindexrA   rD   ÚupdateÚlistÚcopyr   rL   rB   Úquery)rZ   r[   ÚidÚindices_to_modifyr(   Úcurrently_added_idsr<   Úcurrently_added_indicesr=   Úquery_vectorsÚ	added_idsrO   r"   r    r   Úlockr!   s             €€€€€€€r   Úperform_operationz6_test_interleaved_add_query.<locals>.perform_operationx   sÐ  ø€ ð ˜Š>Ø Ð,Ð,Ð,Ø9FÖ G°2 §¡¨2¥Ð GÐÐ GäÐ$Ó%¨Ò*ØØ�H‰HØ!àÐ)ð 4EÖE¨a˜J q›MÓEààÐ(ð 2CÖC¨A˜9 Q›<ÓCààÐ(ð 2CÖC¨A˜9 Q›<ÓCàð ô ð ñ 0Ø× Ñ  Ô/÷0ð 0à˜!Š^Ø"$ÐØˆIØñ =Ü&*¨9¯>©>Ó+;Ó&<Ð#÷=à?RÖ&S¸ s§y¡y°¥}Ð&SÐ#Ð&SäÐ'Ó(¨AÒ-ÜÐ.Ó/°)Ò;àô
 #ŸM™MØ'Ü�BœÐ3Ó4Ó5óˆMð 5BÖB¨q˜Z¨›]ÐBˆMÐBà�J‰JØØ#ð õ ð+ ùò% !Hùò Fùò Dùò D÷0ð 0ú÷
=ð =üâ&Sùò Cs;   �E!Á
E&
Á E+Á6E0ÂE5Â4FÃFÄ>FÅ5E>ÆF
r6   r8   r9   r   é   r   Tr:   r;   )N)%r?   r@   r   r*   r   r   r$   Úfloatr   ÚsetÚ	threadingÚLockr>   Úintr	   r   rA   r   r   rB   rC   rE   r   rF   Ú
isinstancer   Úget_settingsÚis_persistentrG   Ú fd_not_exceeding_threadpool_sizerH   rI   rJ   rK   rL   r#   rM   )r+   r   r   r,   rN   ri   rP   rQ   rR   rZ   rS   rT   rU   rV   rW   rF   r(   r=   r<   rg   rO   r"   r    r   rh   r!   s                      @@@@@@@r   Ú_test_interleaved_add_queryrt   e   s¿  þ€ ð
 ‡L�L„NØ×#Ñ#¨Ô:JÐ#ÓK€Dä% a¨Ó+€KÜ
Œt”C‰y˜+ eÑ,Ó
-€CÜ”dœ5‘k ;¨|Ñ#<Ó=€JÜ”Tœ(‘^ [°Ñ%=Ó>€IØ˜KÑ(€Iä›%€IÜ�>‰>Ó€Dä	ˆG�A�3�n Q C °{°mÀ8Ð
LÔMð >Bñ0Üð0Ü'/´´S±	Ñ':ð0à	÷0ó 0ôd 
¨Ô	4ð '¸Ø%'ˆØˆ
Øœ3˜s›8 a™<Ò'ÜŸ™ q¨!Ó,ˆIØ˜AŠ~ä#Ÿ^™^¨A¨q°B©wÓ7�
Ü˜j¬#¨c«(°ZÑ*?Ó@�Ø" Q™�Ø  7Ñ*¨QÑ.�Ø!Ÿ™Ð):¸IÀsÈ5ÐQTÀ~ÓV�Ø—‘˜vÔ&Ø˜gÑ%‘
Ø˜a’Ø!Ÿ™Ø%Øó�ð —‘˜vÔ&ð! œ3˜s›8 a™<Ó'÷'ô* 	ˆ„Màò ˆØ×$Ñ$Ó&ˆ	ØÑ ØˆOðô
 	�6œ:Ô&¨6×+>Ñ+>Ó+@×+NÑ+NÐRVÑ+Vä×3Ñ3°KÔ@ä×Ñ�T˜;Ô'Ü×Ñ˜˜{Ô+Ü×Ñ˜t [Ô1Ü×Ñ˜TÔ"ô —M‘M¬e°A«hÖ"7¨¢1Ò"7¸Ó<€MØ€IÜ×ÑØØØØ#ö	÷Q'ñ 'üòL #8s   Ã7CKÊ/	K)ËK&c                 ó°   — t        d«      D ]H  }t        j                  dt        j                  «       dz  «      }t        «       \  }}t        | |||«       ŒJ y ©Né   rj   )r#   r   r   ÚmultiprocessingÚ	cpu_countr   rX   ©r+   r(   r,   r   r   s        r   Útest_multithreaded_addr{   Ú   sM   € Ü�1‹Xò ;ˆÜ—n‘n Q¬×(AÑ(AÓ(CÀaÑ(GÓHˆÜ"Ó$‰ˆˆ1Ü ¨¨1¨kÕ:ñ;r   c                 ó°   — t        d«      D ]H  }t        j                  dt        j                  «       dz  «      }t        «       \  }}t        | |||«       ŒJ y rv   )r#   r   r   rx   ry   r   rt   rz   s        r   Útest_interleaved_add_queryr}   á   sM   € Ü�1‹Xò ?ˆÜ—n‘n Q¬×(AÑ(AÓ(CÀaÑ(GÓHˆÜ"Ó$‰ˆˆ1Ü# F¨A¨q°+Õ>ñ?r   )%rx   Úconcurrent.futuresr   r   r   r   rm   Útypingr   r   r   r	   r
   r   r   Únumpyr%   Úchromadb.apir   Ú!chromadb.test.property.invariantsr2   ÚpropertyrG   Úchromadb.api.segmentr   Ú!chromadb.test.property.strategiesr   r   Úchromadb.typesr   ro   r   r*   rX   rt   r{   r}   © r   r   ú<module>rˆ      së   ðÛ ß ?Ñ ?Û Û ß >× >Ñ >Û å "ß 6Ó 6Ý +Ý 7Ý >Ý #ð˜U 3¨ 8™_ó ð!˜3ð ! 3ð !¨9ó !ð&9Øð9Øð9Ø"%ð9Ø47ð9à	ó9ðxrØðrØðrØ"%ðrØ47ðrà	órðj; 9ð ;°ó ;ð? yð ?°Tô ?r   