+
    "Ý³jDT ã                  ó   € ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHtHtHtHtHtHtHtHt ^ RIt ^ RIHt ^R	IH t  ^R
I!Ht" ^RI#H$t$ ^RI%H&t& ^RI'H(t( ^RI)H*t*H+t+ ](! 4       t,R R lt-]].]/]P`                  3,          t1]]P`                  R.R3,          t2 ! R R].]4      t3]! RR7       ! R R4      4       t4R R lt5R R lt6]Pn                  R R l4       t8R R lt9R R  lt: ! R! R"4      t; ! R# R$]Px                  4      t= ! R% R&]Px                  4      t> ! R' R(]Px                  4      t? ! R) R*4      t@ ! R+ R,4      tA ! R- R.4      tB ! R/ R04      tCR#   ] d    Rt EL.i ; i)1é    )ÚannotationsN)ÚFuture)Ú	dataclass)ÚdatetimeÚtimezone)ÚEnum)	ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚSetÚTupleÚUnion)ÚDevice)ÚDEBUG_ON)Útorch)Úctx)Úcapture_device_telemetry)Úsetup_logger)ÚHAS_NPUÚtorch_empty_cache_anyc               ó    € V ^8„  d   QhRRRR/# )é   ÚmessageÚstrÚreturnÚNone© )Úformats   "ÚX/home/luca/screen-checking/.venv/lib/python3.14/site-packages/gptqmodel/utils/threadx.pyÚ__annotate__r#   (   s   € ÷ ñ  sð ¨tñ ó    c                ó  € \         P                  ! \        4      ;_uu_ 4        \        P                  P                  V  R 24       \        P                  P                  4        RRR4       R#   + '       g   i     R# ; i)Ú
N)Ú
contextlibÚsuppressÚ	ExceptionÚsysÚstderrÚwriteÚflush)r   s   &r"   Ú_best_effort_stderr_writer.   (   sJ   € Ü	×	Ò	œY×	'Õ	'Ü�
‰
×Ñ˜G˜9 B˜Ô(Ü�
‰
×ÑÔ÷ 
(×	'×	'Ò	'ús   £AA.Á.A?	Ú	WarmUpCtxc                  ó.   € ] tR t^6tRtRtRtR R ltRtR# )r/   ÚthreadÚdeviceÚthread_and_devicec               ó   € V ^8„  d   QhRR/# )r   r   zTuple['WarmUpCtx', ...]r    )r!   s   "r"   r#   ÚWarmUpCtx.__annotate__;   s   € ÷ ñ Ð"9ñ r$   c                	óp   € V \         P                  J d!   \         P                  \         P                  3# V 3# ©N)r/   ÚTHREAD_AND_DEVICEÚDEVICEÚTHREAD©Úselfs   &r"   Úinvocation_orderÚWarmUpCtx.invocation_order;   s.   € Ø”9×.Ñ.Ó.Ü×$Ñ$¤i×&6Ñ&6Ð7Ð7Øˆwˆr$   r    N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r:   r9   r8   r=   Ú__static_attributes__r    r$   r"   r/   r/   6   s   † Ø€FØ€FØ+Ð÷ñ r$   T)Úfrozenc                  óD   € ] tR t^At$ R]R&   ]P                  tR]R&   RtR# )Ú
WarmupTaskÚWarmupFnÚfnr/   Úscoper    N)	r?   r@   rA   rB   Ú__annotations__r/   r9   rI   rC   r    r$   r"   rF   rF   A   s   ‡ àƒLØ ×'Ñ'€Eˆ9×'r$   rF   c               ó   € V ^8„  d   QhRR/# )r   r   Úboolr    )r!   s   "r"   r#   r#   K   s   € ÷ ñ ˜ñ r$   c                 óÆ   € \        \        R 4      ;'       dK    \        \        P                  R4      ;'       d)    \        P                  P                  P	                  4       # )ÚbackendsÚmps)Úhasattrr   rN   rO   Úis_availabler    r$   r"   Ú_mps_availablerR   K   sI   € ä”�zÓ"÷ 	.ð 	.Ü”E—N‘N EÓ*÷	.ð 	.ä�N‰N×Ñ×+Ñ+Ó-ðr$   c               ó    € V ^8„  d   QhRRRR/# )r   ÚdÚ
DeviceLiker   útorch.devicer    )r!   s   "r"   r#   r#   U   s   € ÷ ñ �jð  \ñ r$   c                ót  € \        V \        P                  4      '       d   V # \        V \        4      '       dì   \        P                  P                  4       '       d   \        P                  ! RV 4      # \        \        R4      '       d<   \        P                  P                  4       '       d   \        P                  ! RV 4      # \        '       d   \        P                  ! RV 4      # \        4       '       d   \        P                  ! R4      # \        P                  ! R4      # \        P                  ! V 4      # )zŒ
Convert a DeviceLike into a concrete torch.device. For integers, we
interpret as accelerator indices if present, otherwise map to CPU/MPS.
ÚcudaÚxpuÚnpurO   Úcpu)
Ú
isinstancer   r2   ÚintrX   rQ   rP   rY   r   rR   )rT   s   &r"   Ú_coerce_devicer^   U   sÆ   € ô
 �!”U—\‘\×"Ò"ØˆÜ�!”S×ÒÜ�:‰:×"Ñ"×$Ò$Ü—<’< ¨Ó*Ð*Ü”5˜%× Ò ¤U§Y¡Y×%;Ñ%;×%=Ò%=Ü—<’<  qÓ)Ð)ß‹7Ü—<’<  qÓ)Ð)Ü×ÒÜ—<’< Ó&Ð&Ü�|Š|˜EÓ"Ð"ä�<Š<˜‹?Ðr$   c               ó   € V ^8„  d   QhRR/# ©r   ÚdevrV   r    )r!   s   "r"   r#   r#   k   s   € ÷ ñ �\ñ r$   c              #  óè  "  € V P                   R8X  dI   V P                  e   T MRp\        P                  P	                  V4      ;_uu_ 4        Rx € RRR4       R# V P                   R8X  d_   \        \        R4      '       dI   V P                  e   T MRp\        P                  P	                  V4      ;_uu_ 4        Rx € RRR4       R# V P                   R8X  dU   \        '       dI   V P                  e   T MRp\        P                  P	                  V4      ;_uu_ 4        Rx € RRR4       R# Rx € R#   + '       g   i     R# ; i  + '       g   i     R# ; i  + '       g   i     R# ; i5i)u¿   
Set the caller threadâ€™s *current* device while running a task so handles/streams
line up correctly. For CUDA/XPU we set the per-thread current device; CPU/MPS
do not require pinning here.
rX   NrY   rZ   )	ÚtypeÚindexr   rX   r2   rP   rY   r   rZ   ©ra   Útargets   & r"   Ú_device_ctxrg   j   só   é € ð ‡x�x�6ÔØŸ	™	Ò-‘°6ˆÜ�Z‰Z×Ñ˜v×&Õ&Û÷ 'Ñ&à	�‰�UÔ	œw¤u¨e×4Ò4ØŸ	™	Ò-‘°5ˆÜ�Y‰Y×Ñ˜f×%Õ%Û÷ &Ñ%à	�‰�UÔ	Ÿw›wØŸ	™	Ò-‘°5ˆÜ�Y‰Y×Ñ˜f×%Õ%Û÷ &Ñ%õ 	÷ '×&Ð&ú÷ &×%Ð%ú÷ &×%Ð%üsU   ‚AE2ÁD6ÁA*E2Â<E
Ã&E2Ã(9E2Ä!EÄ&E2Ä6E	Å	E2Å
E	Å	E2ÅE/	Å)	E2c               ó   € V ^8„  d   QhRR/# r`   r    )r!   s   "r"   r#   r#   �   s   € ÷ %ñ % ñ %r$   c                óæ  € V P                   R8X  d4   V P                  e   T MRp\        P                  P	                  V4       R# V P                   R8X  dJ   \        \        R4      '       d4   V P                  e   T MRp\        P                  P	                  V4       R# V P                   R8X  dB   \        '       d4   V P                  e   T MRp\        P                  P	                  V4       R# R# R# )z’
Pin the worker thread to its device once, before entering its main loop.
CUDA/XPU require per-thread device activation for correct handle usage.
rX   NrY   rZ   )	rc   rd   r   rX   Ú
set_devicerP   rY   r   rZ   re   s   & r"   Ú_activate_thread_devicerk   �   s¦   € ð
 ‡x�x�6ÔØŸ	™	Ò-‘°6ˆÜ�
‰
×Ñ˜fÖ%Ø	�‰�UÔ	œw¤u¨e×4Ò4ØŸ	™	Ò-‘°5ˆÜ�	‰	×Ñ˜VÖ$Ø	�‰�UÔ	Ÿw›wØŸ	™	Ò-‘°5ˆÜ�	‰	×Ñ˜VÖ$ñ  'Ñ	r$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚkwargsúDict[str, Any]Úpublic_namer   Úprivate_namer    )r!   s   "r"   r#   r#   ’   s!   € ÷ ñ ˜nð ¸3ð Ècñ r$   c                ód   € W 9   d   \        R V RV R 24      hW9   d   V P                  V4      # R# )Ú'z' is no longer supported; use 'N)Ú	TypeErrorÚpop)rm   ro   rp   s   &&&r"   Ú_pop_public_kwargru   ’   s<   € ØÔÜ˜!˜L˜>Ð)HÈÈÐUVÐWÓXÐXØÔØ�z‰z˜+Ó&Ð&Ùr$   c                  ó€   € ] tR t^ŸtRtR tR tR t]P                  R 4       t
R tR t]P                  R 4       tR	tR
# )Ú_RWLockzé
Reader-writer lock with writer preference.

- Multiple readers may hold the lock simultaneously.
- A single writer holds exclusivity.
- When a writer is waiting, new readers will block.
- Writer is re-entrant for its owning thread.
c                	ór   € \         P                  ! 4       V n        ^ V n        RV n        ^ V n        ^ V n        R# ©r   N)Ú	threadingÚ	ConditionÚ_condÚ_readersÚ_writerÚ_writer_depthÚ_writers_waitingr;   s   &r"   Ú__init__Ú_RWLock.__init__¨   s0   € Ü×(Ò(Ó*ˆŒ
ØˆŒØ&*ˆŒØˆÔØ !ˆÖr$   c                	ó0  € \         P                  ! 4       pV P                  ;_uu_ 4        V P                  V8X  d%   V ;P                  ^,          un         RRR4       R# V ;P
                  ^,          un         V P                  f   V P                  ^ 8”  d   V P                  P                  4        K;  Wn        ^V n        V ;P
                  ^,          un         RRR4       R#   T ;P
                  ^,          un        i ; i  + '       g   i     R# ; i©é   N)rz   Ú	get_identr|   r~   r   r€   r}   Úwait©r<   Úmes   & r"   Úacquire_writeÚ_RWLock.acquire_write°   s¿   € Ü× Ò Ó"ˆØ�Z�Z‹ZØ�|‰|˜rÔ!Ø×"Ò" aÕ'Õ"Ø÷ ‰Zð ×!Ò! QÕ&Õ!ð+Ø—l‘lÒ.°$·-±-À!Ô2CØ—J‘J—O‘OÖ%Ø!”Ø%&�Ô"à×%Ò%¨Õ*Ö%÷ ‰Zøð ×%Ò%¨Õ*Ö%ú÷ �ZˆZús*   ª,DÁ DÁ:AC&ÃDÃ&DÄDÄD	c                	ó`  € \         P                  ! 4       pV P                  ;_uu_ 4        V P                  V8w  d   \	        R 4      hV ;P
                  ^,          un        V P
                  ^ 8X  d"   RV n        V P                  P                  4        RRR4       R#   + '       g   i     R# ; i)z!release_write called by non-ownerN)rz   r†   r|   r~   ÚRuntimeErrorr   Ú
notify_allrˆ   s   & r"   Úrelease_writeÚ_RWLock.release_write¿   ss   € Ü× Ò Ó"ˆØ�Z�Z‹ZØ�|‰|˜rÔ!Ü"Ð#FÓGÐGØ×Ò !Õ#ÕØ×!Ñ! QÔ&Ø#�”Ø—
‘
×%Ñ%Ô'÷ �Z�ZŠZús   ªA(BÂB-	c              #  	ó‚   "  € V P                  4         R x € V P                  4        R #   T P                  4        i ; i5ir7   )rŠ   r�   r;   s   &r"   ÚwriterÚ_RWLock.writerÉ   s1   é € à×ÑÔð	!Ûà×ÑÖ øˆD×ÑÕ üó   ‚?”* ˜?ª<¼?c                	ó¤  € \         P                  ! 4       pV P                  ;_uu_ 4        V P                  V8X  d%   V ;P                  ^,          un         RRR4       R# V P                  f   V P
                  ^ 8”  d   V P                  P                  4        K;  V ;P                  ^,          un        RRR4       R#   + '       g   i     R# ; ir„   )rz   r†   r|   r~   r}   r€   r‡   rˆ   s   & r"   Úacquire_readÚ_RWLock.acquire_readÒ   s€   € Ü× Ò Ó"ˆØ�Z�Z‹Zð �|‰|˜rÔ!Ø—’ Õ"•Ø÷ ‰Zð —,‘,Ò*¨d×.CÑ.CÀaÔ.GØ—
‘
—‘Ö!Ø�MŠM˜QÕ�M÷ �Z�ZŠZús   ª,B>Á AB>Â>C	c                	ó(  € V P                   ;_uu_ 4        V P                  ^ 8:  d   \        R4      hV ;P                  ^,          un        V P                  ^ 8X  d   V P                   P                  4        RRR4       R#   + '       g   i     R# ; i)r   z!release_read without acquire_readN)r|   r}   r�   rŽ   r;   s   &r"   Úrelease_readÚ_RWLock.release_readß   sY   € Ø�Z�Z‹ZØ�}‰} Ô!Ü"Ð#FÓGÐGØ�MŠM˜QÕ�MØ�}‰} Ô!Ø—
‘
×%Ñ%Ô'÷ �Z�ZŠZús   •A!B Â B	c              #  	ó‚   "  € V P                  4         R x € V P                  4        R #   T P                  4        i ; i5ir7   )r–   r™   r;   s   &r"   ÚreaderÚ_RWLock.readerç   s1   é € à×ÑÔð	 Ûà×ÑÖøˆD×ÑÕür”   )r|   r}   r~   r   r€   N)r?   r@   rA   rB   Ú__doc__r�   rŠ   r�   r'   Úcontextmanagerr’   r–   r™   rœ   rC   r    r$   r"   rw   rw   Ÿ   sT   † ñò"ò+ò(ð ×Ññ!ó ð!òò(ð ×Ññ ó ô r$   rw   c                  ó2   € ] tR t^ðtRtR R ltR tR tRtR# )Ú
_LockGroupz“
Acquire multiple device **write** locks in deterministic order to avoid deadlocks.
Helpful for GC passes or any multi-device exclusive operation.
c               ó   € V ^8„  d   QhRR/# ©r   Úordered_pairsúList[tuple[str, _RWLock]]r    )r!   s   "r"   r#   Ú_LockGroup.__annotate__õ   ó   € ÷ $ñ $Ð&?ñ $r$   c                	ó   € Wn         R # r7   ©Ú_pairs©r<   r¤   s   &&r"   r�   Ú_LockGroup.__init__õ   ó   € Ø#Žr$   c                	óä   € V P                    F_  w  r\        '       d   \        P                  R V 24       VP	                  4        \        '       g   KG  \        P                  RV 24       Ka  	  V # )z%_LockGroup: acquiring write lock for z$_LockGroup: acquired write lock for )rª   r   ÚlogÚdebugrŠ   ©r<   ÚnameÚlks   &  r"   Ú	__enter__Ú_LockGroup.__enter__ø   sU   € ØŸœ‰HˆDß‹xœŸ™Ð%JÈ4È&Ð#QÔRØ×ÑÔß�xœŸ™Ð%IÈ$ÈÐ#PÖQñ $ð ˆr$   c                	óª   € \        V P                  4       F9  w  rE\        '       d   \        P	                  R V 24       VP                  4        K;  	  R# )z%_LockGroup: releasing write lock for F)Úreversedrª   r   r¯   r°   r�   ©r<   Úexc_typeÚexcÚtbr²   r³   s   &&&&  r"   Ú__exit__Ú_LockGroup.__exit__ÿ   s@   € Ü  §¡Ö-‰HˆDß‹xœŸ™Ð%JÈ4È&Ð#QÔRØ×ÑÖñ .ñ r$   r©   N©	r?   r@   rA   rB   rž   r�   r´   r¼   rC   r    r$   r"   r¡   r¡   ð   ó   † ñõ$òör$   r¡   c                  ó2   € ] tR tRtRtR R ltR tR tRtR# )	Ú_ReadLockGroupi  z‚
Acquire multiple device **read** locks in deterministic order.
Useful for multi-device snapshots or read-only, consistent views.
c               ó   € V ^8„  d   QhRR/# r£   r    )r!   s   "r"   r#   Ú_ReadLockGroup.__annotate__  r§   r$   c                	ó   € Wn         R # r7   r©   r«   s   &&r"   r�   Ú_ReadLockGroup.__init__  r­   r$   c                	óä   € V P                    F_  w  r\        '       d   \        P                  R V 24       VP	                  4        \        '       g   KG  \        P                  RV 24       Ka  	  V # )z(_ReadLockGroup: acquiring read lock for z'_ReadLockGroup: acquired read lock for )rª   r   r¯   r°   r–   r±   s   &  r"   r´   Ú_ReadLockGroup.__enter__  sS   € ØŸœ‰HˆDß‹xœŸ™Ð%MÈdÈVÐ#TÔUØ�O‰OÔß�xœŸ™Ð%LÈTÈFÐ#SÖTñ $ð ˆr$   c                	óª   € \        V P                  4       F9  w  rE\        '       d   \        P	                  R V 24       VP                  4        K;  	  R# )z(_ReadLockGroup: releasing read lock for F)r·   rª   r   r¯   r°   r™   r¸   s   &&&&  r"   r¼   Ú_ReadLockGroup.__exit__  s>   € Ü  §¡Ö-‰HˆDß‹xœŸ™Ð%MÈdÈVÐ#TÔUØ�O‰OÖñ .ñ r$   r©   Nr¾   r    r$   r"   rÁ   rÁ     r¿   r$   rÁ   c                  ó2   € ] tR tRtRtR R ltR tR tRtR# )	Ú_WaitAndLocki  zÕ
Context manager returned by pool.wait(scope, lock=True).
On enter: acquires writer locks over the scope in canonical order,
which inherently waits for in-flight readers (tasks) to drain.
On exit: releases locks.
c               ó   € V ^8„  d   QhRR/# )r   Úpairsr¥   r    )r!   s   "r"   r#   Ú_WaitAndLock.__annotate__#  s   € ÷ (ñ (Ð7ñ (r$   c                	ó2   € Wn         \        V4      V n        R # r7   )rª   r¡   Ú_group)r<   rÍ   s   &&r"   r�   Ú_WaitAndLock.__init__#  s   € ØŒÜ  Ó'ˆŽr$   c                	ó6   € V P                   P                  4       # r7   )rÐ   r´   r;   s   &r"   r´   Ú_WaitAndLock.__enter__'  s   € Ø�{‰{×$Ñ$Ó&Ð&r$   c                	ó:   € V P                   P                  WV4      # r7   )rÐ   r¼   ©r<   r¹   rº   r»   s   &&&&r"   r¼   Ú_WaitAndLock.__exit__*  s   € Ø�{‰{×#Ñ# H°2Ó6Ð6r$   )rÐ   rª   Nr¾   r    r$   r"   rË   rË     s   † ñõ(ò'ö7r$   rË   c                  ó>   € ] tR tRtRtR R ltR R ltR R ltR	tR
# )Ú_WorkerWarmupStatei.  z¬
Coordinate a single warmup invocation.

Device-scoped states may be shared across workers for the same physical
device. Thread-scoped states are owned by a single worker.
c               ó    € V ^8„  d   QhRRRR/# )r   Úwarmup_taskrF   Ú
warmup_ctxr/   r    )r!   s   "r"   r#   Ú_WorkerWarmupState.__annotate__6  s   € ÷ 4ñ 4 Jð 4¸Iñ 4r$   c                	ó¢   € Wn         W n        \        P                  ! 4       V n        R V n        \        P                  ! 4       V n        RV n        R# )FN)	Ú_warmup_taskÚ_warmup_ctxrz   ÚLockÚ_claim_lockÚ_startedÚEventÚ_doneÚ_error)r<   rÚ   rÛ   s   &&&r"   r�   Ú_WorkerWarmupState.__init__6  s9   € Ø'ÔØ%ÔÜ$Ÿ>š>Ó+ˆÔØˆŒÜ—_’_Ó&ˆŒ
Ø/3ˆŽr$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r2   rV   Úrwlockrw   r   r   r    )r!   s   "r"   r#   rÜ   >  s!   € ÷  ñ  ˜\ð  °7ð  ¸tñ  r$   c               	óŒ  € V P                   P                  4       '       d   V P                  4        R # RpV P                  ;_uu_ 4        V P                   P                  4       '       d   MV P                  '       g
   RV n        RpR R R 4       V'       dv    \        VP                  4       \        V4      4      ;_uu_ 4        V P                  P                  WP                  4       R R R 4       T P                   P                  4        MV P                   P                  4        V P                  4        R #   + '       g   i     L¹; i  + '       g   i     Lj; i  \         d=   pT P                  ;_uu_ 4        Y@n        R R R 4       h   + '       g   i     h ; iR p?ii ; i  T P                   P                  4        i ; i)NFT)rä   Úis_setÚ_raise_if_failedrá   râ   r   rœ   rg   rÞ   rH   rß   ÚBaseExceptionrå   Úsetr‡   )r<   r2   rè   Ú
should_runrº   s   &$$  r"   ÚrunÚ_WorkerWarmupState.run>  s&  € Ø�:‰:×Ñ×ÒØ×!Ñ!Ô#Ùàˆ
Ø××ÓØ�z‰z× Ñ ×"Ò"ØØ—]—]�]Ø $�”Ø!�
÷ ÷ ð!Ü˜Ÿ™›¬+°fÓ*=×>Õ>Ø×%Ñ%×(Ñ(¨×1AÑ1AÔB÷ ?ð —
‘
—‘Õ à�J‰J�O‰OÔà×ÑÖ÷) ×ú÷ ?×>ûä ô Ø×%×%Ó%Ø"%”K÷ &à÷ &Ö%àþðûð
 —
‘
—‘Õ úsr   Á	3D7Á=	D7Â+E Ã&E
Ã(E Ä7E	Å
E	ÅE ÅF' ÅE ÅF$Å(FÅ<FÆ	FÆFÆFÆF$Æ$F' Æ'Gc               ó   € V ^8„  d   QhRR/# ©r   r   r   r    )r!   s   "r"   r#   rÜ   Z  s   € ÷ ñ  $ñ r$   c                	óŠ   € V P                   ;_uu_ 4        V P                  pR R R 4       Xe   VhR #   + '       g   i     L; ir7   )rá   rå   )r<   Úerrors   & r"   rë   Ú#_WorkerWarmupState._raise_if_failedZ  s5   € Ø××ÓØ—K‘KˆE÷ àÒØˆKñ ÷ ×ús	   •2²A	)rá   rä   rå   râ   rß   rÞ   N)	r?   r@   rA   rB   rž   r�   rï   rë   rC   r    r$   r"   rØ   rØ   .  s   † ñõ4õ ÷8ñ r$   rØ   c                  ót   € ] tR tRtRtRRR/R R llltR R ltR	 tR
 tR R lt	R R lt
R tR R ltRtR# )Ú_DeviceWorkerif  a  
Single worker thread bound to one device.

Queue entries: (is_task: bool, fn, args, kwargs, future)
- is_task=False is a sentinel to exit the thread loop.
- Tasks run within a device-scoped reader lock to prevent interleaving
  with GC passes (which need a write lock).
NÚkey_overridec               ó<   € V ^8„  d   QhRRRRRRRRR	R
RRRRRRRR
/	# )r   r2   rV   rè   rw   Úon_task_finishedúCallable[[str], None]Úon_worker_exitz&Callable[[str, '_DeviceWorker'], None]r²   úOptional[str]Úinference_moderL   Úcpu_coreúOptional[int]Úwarmup_planz(Optional[Tuple[_WorkerWarmupState, ...]]rø   r    )r!   s   "r"   r#   Ú_DeviceWorker.__annotate__o  so   € ÷  Oñ  Oàð Oð ð Oð 0ð	 Oð
 ?ð Oð ð Oð ð Oð  ð Oð >ð Oð $ñ Or$   c	               	ó¾  € Wn         W n        W0n        W@n        T;'       g    RV n        V	e   W�n        M:VP                  e   VP                   RVP                   2MVP                  V n        T;'       g    RV P
                   2V n        \        P                  ! 4       V n        \        P                  ! 4       V n        W`n        Wpn        RV n        \        P$                  ! V P&                  V P                  RR7      V n        V P(                  P+                  4        \,        '       d2   \.        P1                  RV P                   RV P
                   24       R # R # )	NÚ:ú	DPWorker-FT©rf   r²   ÚdaemonzSpawned worker 'z' for r    )r2   rè   Ú_on_task_finishedÚ_on_worker_exitÚ_pending_warmupsÚkeyrd   rc   r²   ÚqueueÚQueueÚ_qrz   rã   Ú_stopÚ_inference_modeÚ_target_cpu_coreÚ_affinity_appliedÚThreadÚ_runÚ_threadÚstartr   r¯   r°   )
r<   r2   rè   rú   rü   r²   rþ   rÿ   r  rø   s
   &&&&&&&&&$r"   r�   Ú_DeviceWorker.__init__o  s  € ð ŒØŒØ!1ÔØ-ÔØ +× 1Ð 1¨rˆÔàÒ#Ø#�Hà:@¿,¹,Ò:R˜&Ÿ+™+˜ a¨¯© ~Ñ6ÐX^×XcÑXcˆDŒHØ×2Ð2˜i¨¯© zÐ2ˆŒ	ÜW\×WbÒWbÓWdˆŒÜ—_’_Ó&ˆŒ
à-ÔØ (ÔØ!&ˆÔÜ ×'Ò'¨t¯y©y¸t¿y¹yÐQUÔVˆŒØ�‰×ÑÔß‹8”S—Y‘YÐ!1°$·)±)°¸FÀ4Ç8Á8À*ÐMÖN‰8r$   c               ó    € V ^8„  d   QhRRRR/# ©r   rH   úCallable[..., Any]r   r   r    )r!   s   "r"   r#   r  ‘  s   € ÷ ñ Ð+ð ÀFñ r$   c               óæ   € \        4       pV P                  P                  RWW434       \        '       d=   \        P                  V P                   RV P                  P                  4        24       V# )zQ
Enqueue a callable and return a Future that resolves with its result/exception.
Tz: task enqueued; qsize=)r   r  Úputr   r¯   r°   r²   Úqsize)r<   rH   Úargsrm   Úfuts   ""*, r"   ÚsubmitÚ_DeviceWorker.submit‘  sR   € ô ‹hˆØ�‰�‰�T˜2 VÐ1Ô2ß‹8”S—Y‘Y $§)¡) Ð,CÀDÇGÁGÇMÁMÃOÐCTÐUÔVØˆ
r$   c                óì   € V P                   P                  4        V P                  P                  RR R/ \	        4       34       \
        '       d%   \        P                  V P                   R24       R# R# )zb
Request thread exit by setting a sentinel work item. The run loop exits
ASAP after receiving it.
Fc                 ó   € R # r7   r    r    r$   r"   Ú<lambda>Ú$_DeviceWorker.stop.<locals>.<lambda>   s   € ¡Dr$   z!: stop requested; sentinel queuedNr    )	r  rí   r  r  r   r   r¯   r°   r²   r;   s   &r"   ÚstopÚ_DeviceWorker.stopš  sM   € ð
 	�
‰
�‰ÔØ�‰�‰�U™L¨"¨b´&³(Ð;Ô<ß‹8”S—Y‘Y $§)¡) Ð,MÐNÖO‰8r$   c                ó–   € \         '       d#   \        P                  V P                   R24       V P                  P                  4        R# )z;
Join the worker thread; for graceful shutdowns and tests.
z: joining threadN)r   r¯   r°   r²   r  Újoinr;   s   &r"   r)  Ú_DeviceWorker.join£  s0   € ÷ ‹8”S—Y‘Y $§)¡) Ð,<Ð=Ô>Ø�‰×ÑÖr$   c               ó   € V ^8„  d   QhRR/# rò   r    )r!   s   "r"   r#   r  ª  s   € ÷ *ñ * Tñ *r$   c                	ó°  € V P                   '       g   V P                  f   R # \        \        R4      '       g*   \        P                  RV P                  4       RV n         R #  \        P                  ! ^ \        V P                  4      04       RV n         \        P                  V P                   RV P                   24       R #   \         d?   p\        P                  RT P                  T P                  T4       RT n          R p?R # R p?i\         d?   p\        P                  RT P                  T P                  T4       RT n          R p?R # R p?ii ; i)NÚsched_setaffinityzGThread pinning unsupported on this platform; %s will use OS scheduling.Tz: pinned to CPU core zWThread pinning permission denied for %s on core %s (%s); falling back to OS scheduling.zLThread pinning failed for %s on core %s (%s); falling back to OS scheduling.)r  r  rP   Úosr¯   Úwarnr²   r-  r]   r°   ÚPermissionErrorÚOSError©r<   rº   s   & r"   Ú_apply_cpu_affinityÚ!_DeviceWorker._apply_cpu_affinityª  s  € Ø×!×!Ð! T×%:Ñ%:Ò%BÙÜ”rÐ.×/Ò/Ü�H‰HØYØ—	‘	ôð &*ˆDÔ"Ùð	*Ü× Ò  ¤S¨×)>Ñ)>Ó%?Ð$@ÔAØ%)ˆDÔ"ä�I‰I˜Ÿ™˜Ð#8¸×9NÑ9NÐ8OÐPÖQøÜô 	*Ü�H‰HØiØ—	‘	Ø×%Ñ%Øô	ð &*ˆD×"Ò"ûÜô 	*Ü�H‰HØ^Ø—	‘	Ø×%Ñ%Øô	ð &*ˆD×"Ò"ûð	*ús+   Á#A C ÃEÃ3D	Ä	EÄEÄ3EÅEc               ó   € V ^8„  d   QhRR/# rò   r    )r!   s   "r"   r#   r  Ê  s   € ÷ #ñ #˜Tñ #r$   c                	ó    € V P                   pV'       g   R # V F*  pVP                  V P                  V P                  R7       K,  	  RV n         R # )N)r2   rè   r    )r
  rï   r2   rè   )r<   Úpending_warmupsÚwarmup_states   &  r"   Ú_run_warmupÚ_DeviceWorker._run_warmupÊ  s@   € Ø×/Ñ/ˆßÙÛ+ˆLØ×Ñ D§K¡K¸¿¹ÐÖDñ ,à "ˆÖr$   c           	     ó�  € V P                  4        \        V P                  4       V P                  P	                  4       '       EgW   V P
                  P                  4       w  rr4p V'       gL   \        '       d#   \        P                  V P                   R24        V P
                  P                  4        EMä\        '       d=   \        P                  V P                   RV P
                  P                  4        24        V P                  4        TP!                  RR4      p\#        TRR4      pTf   T P$                  M
\'        T4      p	\)        T P*                  P-                  4       \/        T P                  4      4      ;_uu_ 4        T	'       d   \0        P2                  ! 4       M\4        P6                  ! 4       p
T
;_uu_ 4        Te,   T P                  P8                  R8X  d   TP;                  4        T! T/ TB pRRR4       RRR4       T P=                  T P>                  4       TPA                  4       '       g   TPC                  X4       \        '       d#   \        P                  T P                   R24       T P
                  P                  4        EKw   V PG                  V P>                  V 4       \        '       d%   \        P                  V P                   R
24       R# R#   \         d7   pT P                  T4        Rp?T P
                  P                  4        R# Rp?ii ; i  + '       g   i     EL9; i  + '       g   i     ELE; i  \         d�   pT P=                  T P>                  4       TPA                  4       '       g   TPE                  T4       \        '       d&   \        P                  T P                   R	T: 24       T P                  T4        Rp?ELmRp?ii ; i  T P
                  P                  4        i ; i  \        '       d$   \        P                  T P                   R
24       i i ; i)aA  
Main loop: pull tasks, set device context, execute, mark completion, and
fulfill or fail the future. Completion is accounted BEFORE resolving the
future to make stats() deterministic even under test interleavings.

Workers default to inference mode for throughput but individual tasks
may override via `inference_mode`.
z: received sentinel; exitingz: task begin; qsize=NÚ
cuda_eventrþ   Ú_threadx_inference_moderX   z: task donez: task exception: z: exited)$r3  rk   r2   r  rê   r  Úgetr   r¯   r°   r²   Ú	task_doner  r9  rì   Ú_abort_processrt   ru   r  rL   r   rè   rœ   rg   r   rþ   r'   Únullcontextrc   Úsynchronizer  r  Ú	cancelledÚ
set_resultÚset_exceptionr	  )r<   Úis_taskrH   r  rm   r  rº   ÚeventÚoverride_inferenceÚuse_inferenceÚinference_ctxÚresults   &           r"   r  Ú_DeviceWorker._runÒ  sþ  € ð 	× Ñ Ô"Ü §¡Ô,Ø—*‘*×#Ñ#×%Ó%Ø-1¯W©W¯[©[«]Ñ*ˆG˜ sð'$ßß“x¤§¡¨d¯i©i¨[Ð8TÐ+UÔ!VØðH —‘×!Ñ!Ö#÷G “8œSŸY™Y¨$¯)©)¨Ð4HÈÏÉÏÉËÐHYÐ'ZÔ[ðØ×$Ñ$Ô&ð
 Ÿ
™
 <°Ó6�Ü%6ØÐ,Ð.Gó&Ð"ð 9KÒ8R × 4Ò 4ÔX\Ð]oÓXp�ô ˜Ÿ™×+Ñ+Ó-¬{¸4¿;¹;Ó/G×HÕHß>K¤E×$8Ò$8Ô$:ÔQ[×QgÒQgÓQi�Mß&šØ Ò,°·±×1AÑ1AÀVÔ1KØ!×-Ñ-Ô/Ù!# TÐ!4¨VÑ!4˜÷ '÷ Ið ×&Ñ& t§x¡xÔ0Ø—}‘}—’Ø—N‘N 6Ô*ß“8œSŸY™Y¨$¯)©)¨°KÐ'@ÔAð —‘×!Ñ!×#ð	;Ø× Ñ  §¡¨4Ô0ç‹xœŸ™ d§i¡i [°Ð#9Ö:‰xøôG %ô Ø×'Ñ'¨Ô,Ûð: —‘×!Ñ!Ö#ûð?ú÷ 'Ÿ˜ú÷ I×HÐHûô !ô )à×&Ñ& t§x¡xÔ0Ø—}‘}—’Ø×%Ñ% cÔ*ß“8œSŸY™Y¨$¯)©)¨Ð4FÀsÁgÐ'NÔOØ×#Ñ# C×(Ò(ûð)ûð —‘×!Ñ!Õ#û÷ ‹xœŸ™ d§i¡i [°Ð#9Õ:ˆxús¶   Á&M Á:"M Â9M Ã<M ÄK, ÄA9M Æ=MÇ8L0	È MÈ8M ÉM É"M ÊP Ë,L-Ë7L(ÌM Ì(L-Ì-M Ì0MÌ;	MÍM	Í	M ÍO2Í#AO-Î16O-Ï'O5 Ï-O2Ï2O5 Ï5PÐ1Qc               ó    € V ^8„  d   QhRRRR/# )r   rº   rì   r   r   r    )r!   s   "r"   r#   r    s   € ÷ 2ñ 2 -ð 2°Dñ 2r$   c                óŒ  €  \         P                  ! \        V4      WP                  \        P
                  R7       \        P
                  P                  4         \        P                  ! ^4       R#   \         d     L&i ; i  \         d5    \        P                  ! R\        P                  ! 4       ,          4        R# i ; i)zCDump the stack trace and terminate the interpreter without cleanup.)Úfilez
kill -9 %dN)Ú	tracebackÚprint_exceptionrc   Ú__traceback__r*   r+   r-   r)   r.  Ú_exitÚsystemÚgetpidr2  s   &&r"   r@  Ú_DeviceWorker._abort_process  s‚   € ð	Ü×%Ò%¤d¨3£i°×6GÑ6GÌcÏjÉjÕYÜ�J‰J×ÑÔð	2Ü�HŠH�QŽKøô ô 	Ùð	ûô ô 	2ä�IŠI�l¤R§Y¢Y£[Õ0×1ð	2ús$   ‚AA3 ÁB Á3BÂ BÂ;CÃC)r  r  r  r	  r
  r  r  r  r  r2   r  r²   rè   )NFNN)r?   r@   rA   rB   rž   r�   r   r&  r)  r3  r9  r  r@  rC   r    r$   r"   r÷   r÷   f  sJ   † ññ Oð '+÷ Oð  OõDòPòõ*õ@#ò8;÷t2ñ 2r$   r÷   c                  óZ   € ] tR tRtRtRR/R R lltRR/R	 R
 lltR R ltR R ltRt	R# )Ú_SyncWorkeri  zJFallback worker that executes tasks synchronously when threads are unsafe.rþ   Fc               ó4   € V ^8„  d   QhRRRRRRRRR	R
RRRR/# )r   r  r   r2   rV   rè   rw   rú   rû   rü   z$Callable[[str, '_SyncWorker'], None]rþ   rL   r   r   r    )r!   s   "r"   r#   Ú_SyncWorker.__annotate__  sR   € ÷ +ñ +ð ð+ð ð	+ð
 ð+ð 0ð+ð =ð+ð ð+ð 
ñ+r$   c               	ód   € Wn         W n        W0n        W@n        WPn        W`n        R V R2V n        R# )r  z#syncN)r  r2   rè   r  r	  r  r²   )r<   r  r2   rè   rú   rü   rþ   s   &$$$$$$r"   r�   Ú_SyncWorker.__init__  s5   € ð ŒØŒØŒØ!1ÔØ-ÔØ-ÔØ ˜u EÐ*ˆŽ	r$   r<  Nc               ó    € V ^8„  d   QhRRRR/# r  r    )r!   s   "r"   r#   rZ  /  s   € ÷ ñ Ð+ð ÐU[ñ r$   c         	     	ó~  € \        4       p Tp\        VR R4      pVf   V P                  M
\        V4      p\	        V P
                  P                  4       \        V P                  4      4      ;_uu_ 4        V'       d   \        P                  ! 4       M\        P                  ! 4       p	T	;_uu_ 4        Ve,   V P                  P                  R8X  d   VP                  4        V! V/ VB p
RRR4       RRR4       V P                  V P                   4       VP#                  4       '       g   VP%                  X
4       V#   + '       g   i     L\; i  + '       g   i     Lg; i  \&         dN   pT P                  T P                   4       TP#                  4       '       g   TP)                  T4        Rp?T# Rp?ii ; i)rþ   r=  NrX   )r   ru   r  rL   r   rè   rœ   rg   r2   r   rþ   r'   rA  rc   rB  r  r  rC  rD  rì   rE  )r<   rH   r<  r  rm   r  rG  rH  rI  rJ  rK  rº   s   ""$*,       r"   r   Ú_SyncWorker.submit/  sI  € Ü‹hˆð	'ØˆEÜ!2ØÐ(Ð*Có"Ðð 5GÒ4N˜D×0Ò0ÔTXÐYkÓTlˆMÜ�T—[‘[×'Ñ'Ó)¬;°t·{±{Ó+C×DÕDç:G¤× 4Ò 4Ô 6ÌZ×McÒMcÓMe�ß"’]ØÒ(¨T¯[©[×-=Ñ-=ÀÔ-GØ×)Ñ)Ô+Ù Ð0¨Ñ0�F÷ #÷ Eð ×"Ñ" 4§8¡8Ô,Ø—=‘=—?’?Ø—‘˜vÔ&ð
 ˆ
÷ #—]ú÷ E×Dûô ô 	'Ø×"Ñ" 4§8¡8Ô,Ø—=‘=—?’?Ø×!Ñ! #Ô&ûØˆ
ûð		'úsO   ŒA)E$ Á5=EÂ28D>	Ã*EÃ28E$ Ä+E$ Ä>EÅ	EÅE!	ÅE$ Å$F<Å/AF7Æ7F<c               ó   € V ^8„  d   QhRR/# rò   r    )r!   s   "r"   r#   rZ  G  s   € ÷ -ñ -�dñ -r$   c                	ó>   € V P                  V P                  V 4       R # r7   )r	  r  r;   s   &r"   r&  Ú_SyncWorker.stopG  s   € Ø×Ñ˜TŸX™X tÖ,r$   c               ó   € V ^8„  d   QhRR/# rò   r    )r!   s   "r"   r#   rZ  J  s   € ÷ ñ �dñ r$   c                	ó   € R # r7   r    r;   s   &r"   r)  Ú_SyncWorker.joinJ  s   € Ùr$   )r  r  r	  r2   r  r²   rè   )
r?   r@   rA   rB   rž   r�   r   r&  r)  rC   r    r$   r"   rX  rX    s/   † ÙTð+ð  %÷+ð$À$÷ õ0-÷ñ r$   rX  c                  ó¾  € ] tR tRtRtRlRRRRRRRRR	RR
RRRR^2RRRRRRRRRR/R R lllt]R R l4       tR R ltR R lt	R R lt
]R R  l4       tR! R" ltRmR# R$ lltR% R& ltR'R/R( R) lltR'R/R* R+ lltR'R/R, R- lltRnR. R/ llt]P(                  R0 4       tR1 R2 ltR3 R4 ltRlR5 R6 lltRlR7R/R8 R9 llltR: R; ltR< R= ltR> R? ltR@ RA ltRB RC ltRD RE ltRF RG lt RH RI lt!RlRJ RK llt"RL RM lt#RN RO lt$]RP RQ l4       t%RR RS lt&RT RU lt'RV RW lt(RX RY lt)RZ R[ lt*R\ R] lt+R^ R_ lt,R` Ra lt-Rb Rc lt.Rd t/Re Rf lt0Rg Rh lt1Ri t2Rj t3Rkt4R# )oÚDeviceThreadPooliU  a~  
Multi-device thread pool with:
  - Eager discovery/creation of workers and locks for CUDA/XPU/MPS/CPU.
  - Configurable worker counts per device (default 1).
  - Correct per-thread device context.
  - submit()/do() for async/sync, with optional CUDA event synchronization.
  - Per-device RWLocks + global lock and family/all read-locks.
  - wait(scope, lock=False/True) to drain tasks (optionally with exclusive locks).
  - Per-device/global completed counters and in-flight counters.
  - Janitor: triggers empty-cache after N completions on accelerator devices (per-device lock).
  - GC diagnostics helpers (snapshots and ANSI tables).
NÚinclude_cudaTÚinclude_xpuÚinclude_npuÚinclude_mpsÚinclude_cpurþ   FÚwarmupsÚempty_cache_every_nÚworkersÚgc_debounce_secondsg{®Gáz”?Úgc_min_interval_secondsç        Úpin_cpu_workersÚpin_accelerator_workersc               óP   € V ^8„  d   QhRRRRRRRRRRRRR	RR
RRRRRRRRRRRRR/# )r   ÚdevicesúOptional[Iterable[DeviceLike]]rh  rL   ri  rj  rk  rl  rþ   rm  úOptional[Dict[str, WarmupTask]]rn  r]   ro  zOptional[Dict[str, int]]rp  Úfloatrq  rs  rt  r    )r!   s   "r"   r#   ÚDeviceThreadPool.__annotate__c  s¶   € ÷ sUñ sUà/ðsUð ð	sUð
 ðsUð ðsUð ðsUð ðsUð ðsUð 1ðsUð !ðsUð *ðsUð #ðsUð "'ðsUð ðsUð  "&ñ!sUr$   c               óF  a € VEfí   . pV'       dy   \         P                  P                  4       '       dU   \        \         P                  P	                  4       4       F)  pVP                  \         P                  ! RV4      4       K+  	  V'       d�   \        \         R4      '       dy   \         P                  P                  4       '       dU   \        \         P                  P	                  4       4       F)  pVP                  \         P                  ! RV4      4       K+  	  V'       da   \        '       dU   \        \         P                  P	                  4       4       F)  pVP                  \         P                  ! RV4      4       K+  	  V'       d6   \        4       '       d&   VP                  \         P                  ! R4      4       V'       d&   VP                  \         P                  ! R4      4       Tp/ S n        / S n        / S n        / S n        \         P"                  ! 4       S n        / S n        \         P"                  ! 4       S n        / S n        ^ S n        \/        V	4      S n        \         P2                  ! 4       S n        \         P2                  ! 4       S n        RS n        ^ S n        \         P<                  ! 4       S n        / S n         / S n!        \E        V4      S n#        \I        R\E        V4      4      S n%        / S n&        / S n'        / S n(        / S n)        / S n*        \         P"                  ! 4       S n+        / S n,        \[        4       S n.        \_        V4      S n0        S Pc                  V4      S n2        \         P"                  ! 4       S n3        / S n4        T
;'       g    / p/ p/ pVPk                  4        F¸  w  ppS Pm                  V4      p \/        V4      pTf   TTT&   K.  Tw  ppTPs                  R4      '       g   TPs                  R4      '       dQ   TPu                  R4      p\w        T4      ^8  g   T^,          Py                  4       '       g   \q        RT RT R24      hTT3TT&   Kº  	  VPk                  4        UUUu/ uF  w  pw  ppVVbK  	  upppS n=        S P}                  VVVVR7      pV EF±  p\        V4      p V P€                  R%9  d   K"  S Pƒ                  V 4      p!V!S P                  9   d   KF  V S P                  V!&   \…        4       S P                  V!&   ^ S P*                  V!&   ^ S P@                  V!&   \         P<                  ! 4       S PB                  V!&   ^ S PL                  V!&   V!0S PT                  V!&   V P€                  R&9   d   ^ S PN                  V!&   ^ S PP                  V!&   S P‡                  V V4      p". p#\        \/        \I        ^V"4      4      4       FB  p$VP‰                  V!V$34      p%S P‹                  V V!RV! RV$ 2V%R7      p&V#P                  V&4       KD  	  V#S P                  V!&   ^ S P                  V!&   V#'       g   EK›  V#^ ,          S P&                  V!&   EK´  	  VPk                  4        EFü  w  pw  pp'V'^8  d   \q        RV RV' R
24      hS P                  P‰                  V4      p(V(f   \q        RV RV R24      hV(P€                  R'9   d$   V(PŒ                  f   \q        RV RV RV R24      hS P                  P‰                  V. 4      p)\w        V)4      p*V'V*8”  d   \q        RV RV' RV RV* 24      hS P                  V,          S P                  V&   V(S P                  V&   ^ S P*                  V&   ^ S P@                  V&   \         P<                  ! 4       S PB                  V&   ^ S PL                  V&   S PT                  P�                  V\[        4       4      P‘                  V4       . p+\        V'4       F.  p$S P‹                  V(VRV RV$ 2R7      p&V+P                  V&4       K0  	  V+S P                  V&   ^ S P                  V&   V+'       g   EKæ  V+^ ,          S P&                  V&   EKÿ  	  \“        S P                  P•                  4       4      S nK        S P™                  4        ^ S nM        RS nN        ^ S nO        ^ S nP        S P0                  ^ 8”  dæ   \¢        ;QJ d)    V 3R lS P–                   4       F  '       g   K   RM	  RM! V 3R lS P–                   4       4      '       d’   \         P¤                  ! S P¦                  RRR7      S n        S P8                  P©                  4        \ª        '       dB   \¬        P¯                  R S PF                  R! R"S PJ                  R! R#S P0                   R
24       R# R# \ª        '       d   \¬        P¯                  R$4       R# R#   \n        \p        3 d   p\q        RT R	T: R
24      ThRp?ii ; iu upppi )(aj  
Args:
    devices: explicit list of devices. If None, auto-discover per include_* flags.
    workers: dict mapping worker-count policy:
        - 'cpu': N                -> N workers total for CPU
        - 'mps': N                -> N workers for MPS (single device)
        - 'cuda:per': N           -> N workers per CUDA index
        - 'xpu:per': N            -> N workers per XPU index
        - 'npu:per': N            -> N workers per NPU index
        - 'cuda:<i>': N           -> override for specific CUDA index
        - 'xpu:<i>': N            -> override for specific XPU index
        - 'npu:<i>': N            -> override for specific NPU index
        - '<alias>:<parent>': N   -> virtual pool sharing locks with parent device
          (CUDA/NPU parents must include an explicit index, e.g. 'alias:cuda:0')
      Unspecified devices default to 1 worker each.
    gc_debounce_seconds: short wait to coalesce multiple triggers.
    warmups: optional mapping from device family (e.g. 'cuda') to a
        `WarmupTask`. Each warmup callable receives `(device, ctx)`,
        where `ctx` is `WarmUpCtx.DEVICE` or `WarmUpCtx.THREAD`.
        A task scoped to `WarmUpCtx.THREAD_AND_DEVICE` runs once per
        physical device with `ctx=DEVICE`, then once per worker thread
        with `ctx=THREAD`. A special key 'default' applies when no
        family-specific warmup is found.
    gc_min_interval_seconds: minimum interval between GC passes. Values <= 0 disable throttling.
    pin_cpu_workers: bind CPU device workers to individual CPU cores when
        affinity APIs are available. Defaults to False so CPU tasks may
        float across cores unless explicitly opt-in.
    pin_accelerator_workers: bind CUDA/XPU/MPS workers to dedicated CPU
        cores when affinity APIs are available. Defaults to False so
        accelerator workers inherit the process CPU affinity mask.
NrX   rY   rZ   rO   r[   rr  zWorker count for 'z' must be an integer (got Ú)r  zVirtual pool 'zG' must target a concrete accelerator index (e.g. 'alias:cuda:0'); got 'rr   )rs  rt  r  Ú#)r²   rÿ   z$' requires at least one worker (got z' references unknown parent 'z7' requires an indexed accelerator parent device (e.g. 'z:cuda:0'); got 'z' requests z workers but parent 'z' only has ©r²   c              3  ód   <"  € T F%  pSP                   V,          P                  R9   x € K'  	  R# 5i)rX   N©rX   rY   rZ   rO   ©Ú_devices_by_keyrc   ©Ú.0Úkr<   s   & €r"   Ú	<genexpr>Ú,DeviceThreadPool.__init__.<locals>.<genexpr>H  s,   øé € ð 1
ÙSeÈaˆD× Ñ  Õ#×(Ñ(Ð,IÖIÓSeùó   ƒ-0TFz
DP-Janitorr  z$DP-Janitor thread started (debounce=ú.3fzs, min_interval=zs, threshold=z7DP-Janitor disabled (no accelerators or threshold <= 0)©rX   rY   rZ   rO   r[   r€  )rX   rZ   )Xr   rX   rQ   ÚrangeÚdevice_countÚappendr2   rP   rY   r   rZ   rR   Ú_locksr‚  Ú_worker_groupsÚ_dispatch_rrrz   rà   Ú_dispatch_lockÚ_serial_workersÚ_stats_lockÚ_per_device_doneÚ_total_doner]   Ú_empty_cache_every_nrã   Ú	_gc_eventÚ_stop_eventÚ_janitorÚ_auto_gc_disable_countr{   Ú_auto_gc_disable_cvÚ	_inflightÚ_inflight_cvry  Ú_gc_debounce_sÚmaxÚ_gc_min_interval_sÚ_last_gc_done_per_deviceÚ_gc_done_physicalÚ_last_gc_done_physicalÚ_gc_pending_physicalÚ_physical_childrenÚ_device_smi_lockÚ_device_smi_handlesrí   Ú_device_smi_failuresrL   r  Ú_normalize_worker_warmupsÚ_worker_warmupsÚ_device_warmup_lockÚ_device_warmup_statesÚitemsÚ_parse_virtual_worker_keyrs   Ú
ValueErrorÚ
startswithÚsplitÚlenÚisdigitÚ_virtual_to_parentÚ_plan_worker_affinityr^   rc   Ú_keyrw   Ú_resolve_workers_for_devicer>  Ú_spawn_workerrd   Ú
setdefaultÚaddÚsortedÚkeysÚ_ordered_keysÚ_rebuild_family_keysÚ
_gc_passesÚ_last_gc_tsÚ_gc_generationÚ_last_consumed_gc_generationÚanyr  Ú_janitor_loopr  r   r¯   r°   ),r<   rv  rh  ri  rj  rk  rl  rþ   rm  rn  ro  rp  rq  rs  rt  Ú
discoveredÚiÚworkers_cfgÚbase_workersÚvirtual_workersÚraw_keyÚ	raw_countÚ
alias_infoÚcountrº   Ú_Ú
parent_keyÚpartsÚv_keyÚparentÚaffinity_planrT   ra   r  Ú	n_workersÚgroupÚwidrÿ   ÚworkerÚlimitÚ
parent_devÚparent_groupÚparent_budgetÚalias_groups,   f&$$$$$$$$$$$$$                             r"   r�   ÚDeviceThreadPool.__init__c  s1	  ø€ ðb ‹?Ø-/ˆJß¤§
¡
× 7Ñ 7× 9Ò 9ÜœuŸz™z×6Ñ6Ó8Ö9�AØ×%Ñ%¤e§l¢l°6¸1Ó&=Ö>ñ :çœw¤u¨e×4Ò4¼¿¹×9OÑ9O×9QÒ9QÜœuŸy™y×5Ñ5Ó7Ö8�AØ×%Ñ%¤e§l¢l°5¸!Ó&<Ö=ñ 9çŸw›wÜœuŸy™y×5Ñ5Ó7Ö8�AØ×%Ñ%¤e§l¢l°5¸!Ó&<Ö=ñ 9çœ~×/Ò/Ø×!Ñ!¤%§,¢,¨uÓ"5Ô6ßØ×!Ñ!¤%§,¢,¨uÓ"5Ô6Ø ˆGð +-ˆŒØ8:ˆÔð ?AˆÔØ,.ˆÔÜ'ŸnšnÓ.ˆÔØ9;ˆÔô %Ÿ>š>Ó+ˆÔØ02ˆÔØ !ˆÔä$'Ð(;Ó$<ˆÔ!Ü"ŸšÓ*ˆŒÜ$Ÿ?š?Ó,ˆÔØ48ˆŒð '(ˆÔ#Ü#,×#6Ò#6Ó#8ˆÔ ð
 *,ˆŒØ<>ˆÔô $Ð$7Ó8ˆÔÜ"% c¬5Ð1HÓ+IÓ"JˆÔØ8:ˆÔ%à13ˆÔØ68ˆÔ#Ø46ˆÔ!Ø79ˆÔô !*§¢Ó 0ˆÔØ35ˆÔ Ü.1«eˆÔ!ä# NÓ3ˆÔØ#×=Ñ=¸gÓFˆÔÜ#,§>¢>Ó#3ˆÔ ØDFˆÔ"à—m�m ˆØ')ˆØ68ˆØ"-×"3Ñ"3Ö"5ÑˆG�YØ×7Ñ7¸Ó@ˆJðrÜ˜I›�ð Ò!Ø(-�˜WÓ%à *‘��:Ø×(Ñ(¨×0Ò0°J×4IÑ4IÈ%×4PÒ4PØ&×,Ñ,¨SÓ1�EÜ˜5“z A”~¨U°1­X×-=Ñ-=×-?Ò-?Ü(Ø,¨W¨IÐ5|ð  ~Hð  }Ið  IJð  Kóð ð -7¸Ð+>� Ó(ñ! #6ð& 5D×4IÑ4IÔ4Kõ3
Ù4KÑ0˜e¡[ f¨aˆE�6ŠMÑ4Kó3
ˆÔð ×2Ñ2ØØØ+Ø$;ð	 3ó 
ˆô ˆAÜ  Ó#ˆCØ�x‰xÐCÔCÙØ—)‘)˜C“.ˆCØ�d×*Ñ*Ô*Ùà(+ˆD× Ñ  Ñ%Ü&›yˆD�K‰K˜ÑØ)*ˆD×!Ñ! #Ñ&Ø"#ˆD�N‰N˜3ÑÜ%.×%8Ò%8Ó%:ˆD×Ñ˜cÑ"Ø12ˆD×)Ñ)¨#Ñ.Ø,/¨5ˆD×#Ñ# CÑ(Ø�x‰xÐ8Ô8Ø./�×&Ñ& sÑ+Ø34�×+Ñ+¨CÑ0à×8Ñ8¸¸lÓKˆIØ)+ˆEÜœS¤ Q¨	Ó!2Ó3Ö4�Ø(×,Ñ,¨c°3¨ZÓ8�Ø×+Ñ+¨C°¸YÀsÀeÈ1ÈSÈEÐ;RÐ]eÐ+Óf�Ø—‘˜VÖ$ñ 5ð (-ˆD×Ñ Ñ$Ø%&ˆD×Ñ˜cÑ"ßŠuØ,1°!­H�×$Ñ$ SÔ)ñ9 ð< +:×*?Ñ*?×*AÑ&ˆEÑ&�J Ø�qŒyÜ  >°%°Ð8\Ð]bÐ\cÐcdÐ!eÓfÐfØ×-Ñ-×1Ñ1°*Ó=ˆJØÒ!Ü  >°%°Ð8UÐV`ÐUaÐabÐ!cÓdÐdØ�‰ /Ô1°j×6FÑ6FÒ6NÜ Ø$ U GÐ+bÐchÐbiÐiyð  {Eð  zFð  FGð  Hóð ð  ×.Ñ.×2Ñ2°:¸rÓBˆLÜ Ó-ˆMØ�}Ô$Ü Ø$ U G¨;°u°gÐ=RÐS]ÐR^Ð^iÐjwÐixÐyóð ð "&§¡¨ZÕ!8ˆD�K‰K˜ÑØ*4ˆD× Ñ  Ñ'Ø+,ˆD×!Ñ! %Ñ(Ø$%ˆD�N‰N˜5Ñ!Ü'0×':Ò':Ó'<ˆD×Ñ˜eÑ$Ø34ˆD×)Ñ)¨%Ñ0Ø×#Ñ#×.Ñ.¨z¼3»5ÓA×EÑEÀeÔLà/1ˆKÜ˜U–|�Ø×+Ñ+¨J¸ÀiÐPUÈwÐVWÐX[ÐW\ÐD]Ð+Ó^�Ø×"Ñ" 6Ö*ñ $ð *5ˆD×Ñ Ñ&Ø'(ˆD×Ñ˜eÑ$ßŠ{Ø.9¸!­n�×$Ñ$ UÔ+ñA +BôF $ D§K¡K×$4Ñ$4Ó$6Ó7ˆÔØ×!Ñ!Ô#ð ˆŒØ,0ˆÔØ#$ˆÔØ12ˆÔ)ð ×$Ñ$ qÔ(¯S«Sô 1
ØSW×SeÒSeó1
¯S¯SªSô 1
ØSW×SeÒSeó1
÷ .
ò .
ô &×,Ò,Ø×)Ñ)°ÀTôˆDŒMð �M‰M×ÑÔ!ß‹xÜ—	‘	Ø:¸4×;NÑ;NÈsÐ:Sð T$Ø$(×$;Ñ$;¸CÐ#@ÀÈd×NgÑNgÐMhÐhiðköñ ÷ ‹xÜ—	‘	ÐSÖTñ øôk œzÐ*ô rÜ Ð#5°g°YÐ>XÐYbÑXeÐefÐ!gÓhÐnqÐqûðrüô3
s   Ïg/Òhç/hè hèhc               ó    € V ^8„  d   QhRRRR/# )r   r  r   r   zOptional[Tuple[str, str]]r    )r!   s   "r"   r#   rz  [  s   € ÷ ñ  sð Ð/Hñ r$   c                	ó”   € \        V \        4      '       d   R V 9  d   R# V P                  R ^4      w  rVR9   d   R# V'       g   R# W3# )r  N>   r[   rO   rZ   rY   rX   )r\   r   r±  )r  ÚheadÚtails   &  r"   r®  Ú*DeviceThreadPool._parse_virtual_worker_keyZ  sD   € ä˜#œs×#Ò# s°#¤~ÙØ—Y‘Y˜s AÓ&‰
ˆØÐ7Ô7ÙßÙØˆzÐr$   c               ó   € V ^8„  d   QhRR/# rò   r    )r!   s   "r"   r#   rz  e  s   € ÷ $ñ $ dñ $r$   c                	ó  € / p\        V P                  P                  4       4       F=  pVP                  R ^4      ^ ,          pVP	                  V. 4      P                  V4       K?  	  V P                  P                  4        FV  w  rEVP                  R ^4      ^ ,          pVP	                  V. 4       WAV,          9  g   K?  W,          P                  V4       KX  	  VP                  4        F  w  r7VP                  4        K  	  Wn	        R# )r  N)
r»  rŽ  r¼  r±  r¹  r�  r´  r­  ÚsortÚ_family_keys)r<   Úfam_mapr  ÚfamÚ	alias_keyrÏ  Ú
parent_famr¼  s   &       r"   r¾  Ú%DeviceThreadPool._rebuild_family_keyse  sÚ   € Ø(*ˆÜ˜$Ÿ+™+×*Ñ*Ó,Ö-ˆCØ—)‘)˜C Ó# AÕ&ˆCØ×Ñ˜s BÓ'×.Ñ.¨sÖ3ñ .ð &*×%<Ñ%<×%BÑ%BÖ%DÑ!ˆIØ#×)Ñ)¨#¨qÓ1°!Õ4ˆJØ×Ñ˜z¨2Ô.Ø¨
Õ 3Ö3ØÕ#×*Ñ*¨9Ö5ñ	 &Eð !Ÿ™ž‰IˆCØ�I‰IŽKñ )ð $Ör$   c               ó    € V ^8„  d   QhRRRR/# )r   r2   úDeviceLike | strr   r   r    )r!   s   "r"   r#   rz  v  s   € ÷ ñ Ð*:ð ¸sñ r$   c                	ó€  € \        V\        4      '       dn   VR 8X  d   \        R4      hWP                  9   d   V# V P                  P                  V4      pVe+   \        V4      ^8X  d
   V^ ,          # \        RV RV 24      h\        V4      pV P                  V4      pW@P                  9  d   \        RV 24      hV# )Úallz2'all' is not a valid concrete device specificationzDevice specification 'z' is ambiguous; choose one of úDevice not in pool: )	r\   r   r¯  rŽ  ræ  r>  r²  r^   r¶  )r<   r2   Úfam_keysra   r  s   &&   r"   Ú_resolve_device_keyÚ$DeviceThreadPool._resolve_device_keyv  s¾   € Ü�fœc×"Ò"Ø˜ŒÜ Ð!UÓVÐVØŸ™Ô$Ø�Ø×(Ñ(×,Ñ,¨VÓ4ˆHØÒ#Ü�x“= AÔ%Ø# A�;Ð&Ü Ø,¨V¨HÐ4RÐS[ÐR\Ð]óð ô ˜VÓ$ˆØ�i‰i˜‹nˆØ—k‘kÔ!ÜÐ3°F°8Ð<Ó=Ð=Øˆ
r$   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   rv  zIterable[torch.device]Úworker_tableúDict[str, int]rs  rL   rt  r   z$Dict[Tuple[str, int], Optional[int]]r    )r!   s   "r"   r#   rz  Š  sC   € ÷ Iñ Ià'ðIð %ðIð
 ðIð "&ðIð 
.ñIr$   c          
     ó  a€ \        \        R4      '       d   \        \        R4      '       g   / #  \        \        P                  ! ^ 4      4      pT'       g   / # . pT F»  p\        T4      p	T	P                  R9  d   K!  T	P                  R8X  d   T'       g   K<  T	P                  R9   d   T'       g   KW  T P                  T	4      p
\        \        ^T P                  Y’4      4      4      p\        T4       F   pTP                  T	P                  Y¬34       K"  	  K½  	  T'       g   / # R R loTP!                  T3R lR	7       \#        T4      p/ pR
pT F]  w  pr¬ \%        T4      pTfB   T'       g2   \        P                  R\)        T4      \)        T4      ,
          4       RpRYêT3&   KW  TYêT3&   K_  	  T#   \         d    / u # \
         d#   p\        P                  RT4       / u Rp?# Rp?ii ; i  \&         d    Rp Lži ; i)z:Return per-worker CPU core targets to minimise contention.Úsched_getaffinityr-  z?Thread pinning disabled: unable to read CPU affinity mask (%s).Nr[   c               ó    € V ^8„  d   QhRRRR/# )r   Údev_typer   r   r]   r    )r!   s   "r"   r#   Ú<DeviceThreadPool._plan_worker_affinity.<locals>.__annotate__µ  s   € ÷ 	ñ 	 ð 	¨ñ 	r$   c                ó*   € V R9   d   ^ # V R8X  d   ^# ^# )rX   rO   )rX   rY   rZ   r    )rú  s   &r"   Ú	_priorityÚ9DeviceThreadPool._plan_worker_affinity.<locals>._priorityµ  s   € ØÐ1Ô1ÙØ˜5Ô ÙÙr$   c                óD   <€ S! V ^ ,          4      V ^,          V ^,          3# )r   r    )Úspecrý  s   &€r"   r$  Ú8DeviceThreadPool._plan_worker_affinity.<locals>.<lambda>¼  s   ø€ ©I°d¸1µgÓ,>ÀÀQÅÈÈaÍÑ+Qr$   )r  Fz`Thread pinning: insufficient CPU cores for %d workers; remaining workers will use OS scheduling.TrŠ  r€  )rP   r.  r»  rø  ÚAttributeErrorr1  r¯   r/  r^   rc   r¶  r]   rŸ  r·  r‹  r�  rå  ÚiterÚnextÚStopIterationr²  )r<   rv  rõ  rs  rt  Úavailable_coresrº   Úworker_specsÚraw_devra   r  rÔ  rÖ  Ú	core_iterÚplanÚexhaustion_loggedrú  Úcorerý  s   &&&$$             @r"   rµ  Ú&DeviceThreadPool._plan_worker_affinityŠ  sÚ  ø€ ô ”rÐ.×/Ò/´w¼rÐCV×7WÒ7WØˆIð		Ü$¤R×%9Ò%9¸!Ó%<Ó=ˆO÷ ØˆIà35ˆÛˆGÜ  Ó)ˆCØ�x‰xÐCÔCÙØ�x‰x˜5Ô ¯ÙØ�x‰xÐ8Ô8×AXÙØ—)‘)˜C“.ˆCÜœC  4×#CÑ#CÀCÓ#VÓWÓXˆIÜ˜YÖ'�Ø×#Ñ# S§X¡X¨sÐ$8Ö9ó (ñ ÷ ØˆIõ	ð 	×ÑÔQÐÔRä˜Ó)ˆ	Ø57ˆØ!Ðã".ÑˆH�cðÜ˜I“�ð Š|ß(Ü—H‘HØzÜ˜LÓ)¬C°«IÕ5ôð )-Ð%Ø#'�˜3�ZÓ à#'�˜3�ZÓ ñ #/ð" ˆøôw ô 	ØŠIÜô 	Ü�H‰HØQØôð �Iûð	ûôV !ô Ø’ðús;   ±F7 ÅG5Æ7G2ÇG2ÇG2ÇG-Ç'G2Ç-G2Ç5HÈHc               ó    € V ^8„  d   QhRRRR/# )r   rm  rx  r   r    )r!   s   "r"   r#   rz  Ö  s   € ÷ ñ Ø0ðà	(ñr$   c                	óþ   € V '       g   R # / pV P                  4        F\  w  r#\        V\        4      '       g'   \        R\	        V4      P
                  : RV R24      hW1\        V4      P                  4       &   K^  	  V# )Nz2warmups entries must be WarmupTask instances; got z
 for key 'rr   )r­  r\   rF   rs   rc   r?   r   Úlower)rm  Ú
normalizedrÊ  Úraw_tasks   &   r"   r©  Ú*DeviceThreadPool._normalize_worker_warmupsÕ  s~   € ÷ Ùà,.ˆ
Ø!(§¡¦ÑˆGÜ˜h¬
×3Ò3ÜðÜ ›>×2Ñ2Ñ5°ZÀ¸yÈðKóð ð 08”s˜7“|×)Ñ)Ó+Ó,ñ "1ð Ðr$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   ra   rV   r  r   r   zTuple[_WorkerWarmupState, ...]r    )r!   s   "r"   r#   rz  æ  s(   € ÷ ñ àðð ðð 
(ñ	r$   c                	ó  € V P                   pV'       g   R# VP                  P                  4       pVP                  V4      pVP	                  R ^4      ^ ,          P                  4       pVf   Wc9   d	   W6,          pVf   VP                  R4      pVf   R# . pV P
                  P                  W"4      pVP                  P                  4        F™  p	V	\        P                  J d   VP                  \        WY4      4       K3  V P                  ;_uu_ 4        V P                  P                  V4      p
V
f   \        WY4      p
W P                  V&   RRR4       VP                  X
4       K›  	  \        V4      #   + '       g   i     L0; i)r  NÚdefaultr    )rª  rc   r  r>  r±  r´  rI   r=   r/   r:   r�  rØ   r«  r¬  Útuple)r<   ra   r  ÚmappingÚfamilyrÚ   Úprimary_keyÚstatesÚphysical_keyrÛ   Ústates   &&&        r"   Ú_resolve_worker_warmupÚ'DeviceThreadPool._resolve_worker_warmupæ  sC  € ð
 ×&Ñ&ˆßØˆIØ—‘—‘Ó!ˆØ—k‘k &Ó)ˆØ—i‘i  QÓ'¨Õ*×0Ñ0Ó2ˆØÒ ;Ô#9Ø!Õ.ˆKØÒØ!Ÿ+™+ iÓ0ˆKØÒØˆIà+-ˆØ×.Ñ.×2Ñ2°3Ó<ˆØ%×+Ñ+×<Ñ<Ö>ˆJØœY×-Ñ-Ó-Ø—‘Ô0°ÓIÔJÙà×)×)Ó)Ø×2Ñ2×6Ñ6°|ÓD�Ø’=Ü.¨{ÓG�EØ?D×.Ñ.¨|Ñ<÷	 *ð
 �M‰M˜%Ö ñ ?ô �V‹}Ð÷ *×)ús   Ä9E5Å5Fc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   ra   rV   r  r   r²   rý   rÿ   r   r   r÷   r    )r!   s   "r"   r#   rz    s<   € ÷ ñ àðð ðð ð	ð
  ðð 
ñr$   c                ó®   € V P                  W4      p\        VV P                  V,          V P                  V P                  VV P
                  VVVR7	      pV# )z9
Create and start a worker bound to the provided device.
)	r2   rè   rú   rü   r²   rþ   rÿ   r  rø   )r  r÷   rŽ  r  r	  r  )r<   ra   r  r²   rÿ   r  Úws   &&&&&  r"   r¸  ÚDeviceThreadPool._spawn_worker  s[   € ð ×1Ñ1°#Ó;ˆÜØØ—;‘;˜sÕ#Ø!×3Ñ3Ø×/Ñ/ØØ×/Ñ/ØØ#Øô

ˆð ˆr$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r  r   r×  r÷   r   r   r    )r!   s   "r"   r#   rz    s&   € ÷ Kñ K 3ð K°ð KÀ$ñ Kr$   c                óð  € V P                   ;_uu_ 4        V P                  P                  V. 4      pW#9   d`   VP                  V4       W0P                  V&   V'       d*   V P                  V;;,          \        V4      ,          uu&   M^ V P                  V&   V P                  V4       RRR4       \        '       d(   \        P                  RVP                   RV 24       R# R#   + '       g   i     LE; i)z3
Clean up worker bookkeeping after a thread exits.
NzWorker 'z' exited for )r‘  r�  r>  Úremover�  r²  Ú_refresh_serial_worker_lockedr   r¯   r°   r²   )r<   r  r×  rÕ  s   &&& r"   r	  Ú DeviceThreadPool._on_worker_exit  sµ   € ð × × Ó Ø×'Ñ'×+Ñ+¨C°Ó4ˆEØŒØ—‘˜VÔ$Ø+0×#Ñ# CÑ(ßØ×%Ñ% c×*¬c°%«jÕ8Ô*à-.�D×%Ñ% cÑ*Ø×.Ñ.¨sÔ3÷ !÷ ‹8”S—Y‘Y ¨&¯+©+¨°mÀCÀ5ÐIÖJ‰8÷ !× ús   •BC%Ã%C5	r<  c               ó(   € V ^8„  d   QhRRRRRRRR/# ©	r   r2   rU   rH   r  r<  úOptional[torch.cuda.Event]r   r   r    )r!   s   "r"   r#   rz  1  s2   € ÷ ñ àðð ðð /ðð 
ñr$   c              óÊ  € V P                  V4      pV P                  V,          pV P                  V4      pVe   VP                  R8w  d   \	        R4      h\
        '       d0   \        P                  RV R\        VR\        V4      4       24       V P                  V4        VP                  ! \        V4      .VO5RV/VB #   \         d    T P                  T4       h i ; i)z–
Asynchronously schedule work on the given device; returns a Future.
Optional (CUDA): pass `cuda_event=` to ensure work waits for the recorded event.
rX   ú)cuda_event is only valid for CUDA deviceszsubmit: device=ú fn=r?   r<  )rò  r‚  Ú_pick_workerrc   r¯  r   r¯   r°   ÚgetattrÚreprÚ_mark_scheduledr   r   rì   Ú_mark_finished)	r<   r2   rH   r<  r  rm   r  ra   r×  s	   """$*,   r"   r   ÚDeviceThreadPool.submit1  sØ   € ð ×&Ñ& vÓ.ˆØ×"Ñ" 3Õ'ˆØ×"Ñ" 3Ó'ˆØÒ! c§h¡h°&Ô&8ÜÐHÓIÐIç‹8”S—Y‘Y °°°T¼'À"ÀjÔRVÐWYÓRZÓ:[Ð9\Ð]Ô^à×Ñ˜SÔ!ð	Ø—=’=Ô!9¸"Ó!=ÐfÀÒfÐQ[ÐfÐ_eÑfÐføÜô 	à×Ñ Ô$Øð	ús   Â# C ÃC"c               ó(   € V ^8„  d   QhRRRRRRRR/# r*  r    )r!   s   "r"   r#   rz  N  s2   € ÷ )ñ )àð)ð ð)ð /ð)ð 
ñ)r$   c              ó   € V P                  V4      pV P                  V,          pVe   VP                  R8w  d   \        R4      hV P                  ;_uu_ 4        V P
                  P                  V4      pVf   . pW€P
                  V&   W`P                  9  d   ^ V P                  V&   V'       g8   V P                  WvRV R2R7      p	VP                  V	4       ^ V P                  V&   V P                  V4       V P                  P                  V4      p
RRR4       X
f   \        RV R24      h\        '       d0   \        P                  R	V R
\        VR\!        V4      4       24       V P#                  V4        V
P$                  ! \'        V4      .VO5RV/VB #   + '       g   i     L‘; i  \(         d    T P+                  T4       h i ; i)z‡
Schedule work that must execute sequentially on a device. Tasks are
enqueued onto a dedicated worker so they run in submission order.
NrX   r-  r  ú#0r~  z'No serial worker available for device 'rr   zsubmit_serial: device=r.  r?   r<  )rò  r‚  rc   r¯  r‘  r�  r>  r�  r¸  r�  r'  r’  r   r¯   r°   r0  r1  r2  r   r   rì   r3  )r<   r2   rH   r<  r  rm   r  ra   rÕ  Úfreshr×  s   """$*,     r"   Úsubmit_serialÚDeviceThreadPool.submit_serialN  s«  € ð ×&Ñ& vÓ.ˆØ×"Ñ" 3Õ'ˆØÒ! c§h¡h°&Ô&8ÜÐHÓIÐIà× × Ó Ø×'Ñ'×+Ñ+¨CÓ0ˆEØŠ}Ø�Ø+0×#Ñ# CÑ(Ø×+Ñ+Ô+Ø)*�×!Ñ! #Ñ&ßØ×*Ñ*¨3¸IÀcÀUÈ"Ð:MÐ*ÓN�Ø—‘˜UÔ#Ø)*�×!Ñ! #Ñ&Ø×.Ñ.¨sÔ3Ø×)Ñ)×-Ñ-¨cÓ2ˆF÷ !ð Š>ÜÐFÀsÀeÈ1ÐMÓNÐNç‹8”S—Y‘YÐ!7¸°u¸DÄÈÈZÔY]Ð^`ÓYaÓAbÐ@cÐdÔeØ×Ñ˜SÔ!ð	Ø—=’=Ô!9¸"Ó!=ÐfÀÒfÐQ[ÐfÐ_eÑfÐf÷) !× ûô* ô 	Ø×Ñ Ô$Øð	ús    ÁAFÂ0A#FÅ; F/ ÆF,	Æ/Gc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r2   rU   rH   r  r<  r+  r   r	   r    )r!   s   "r"   r#   rz  y  s2   € ÷ ñ àðð ðð /ðð 
ñr$   c              óR   € V P                   ! W.VO5RV/VB pVP                  4       # )z7
Synchronously schedule work and block for the result.
r<  )r   rK  )r<   r2   rH   r<  r  rm   r  s   """$*, r"   ÚdoÚDeviceThreadPool.doy  s-   € ð �kŠk˜&ÐM tÒM¸
ÐMÀfÑMˆØ�z‰z‹|Ðr$   c               ó   € V ^8„  d   QhRR/# )r   r‡   rL   r    )r!   s   "r"   r#   rz  ˆ  s   € ÷ )Eñ )E˜Tñ )Er$   c           
     ó–  € V P                   P                  4        V P                  P                  4        V P                  ;_uu_ 4        V P                  P                  4        UUu/ uF  w  r#V\        V4      bK  	  pppRRR4       V P                  eD   V'       d<   \        '       d   \        P                  R4       V P                  P                  4        XP                  4        F  w  r%V F  pVP                  4        K  	  K   	  V'       d3   VP                  4        F  w  r%V F  pVP                  4        K  	  K   	  V P                  ;_uu_ 4        \        V P                  P                  4       4       F  p VP!                  4        K  	  V P                  P%                  4        RRR4       \        '       d   \        P                  R4       R# R# u uppi   + '       g   i     ELk; i  \"         d4   p\        '       d   \        P                  RT4        Rp?K¬   Rp?K²  Rp?ii ; i  + '       g   i     L�; i)z²
Gracefully stop all workers and janitor.

IMPORTANT: We snapshot groups before stopping/joining to avoid mutating
the lists while iterating (workers remove themselves on exit).
Nu   Joining DP-Janitor threadâ€¦zNDeviceThreadPool: ignoring Device-SMI handle close failure during shutdown: %sz"DeviceThreadPool shutdown complete)r˜  rí   r—  r‘  r�  r­  Úlistr™  r   r¯   r°   r)  r&  r¦  r§  ÚvaluesÚcloser)   Úclear)	r<   r‡   r  rÕ  Úgroup_snapshotsÚsnapshotr"  Úhandlerº   s	   &&       r"   ÚshutdownÚDeviceThreadPool.shutdownˆ  sª  € ð 	×Ñ×ÑÔØ�‰×ÑÔð × × Ó à37×3FÑ3F×3LÑ3LÔ3Nô?Ù3N¡Z S�”T˜%“[Ò Ñ3Nð ñ ?÷ !ð �=‰=Ò$¯ß‹xœŸ™Ð#AÔBØ�M‰M×ÑÔ ð -×2Ñ2Ö4‰MˆCÛ�Ø—‘–ó ñ 5÷
 Ø!0×!6Ñ!6Ö!8‘�Û!�AØ—F‘F–Hó "ñ "9ð ×"×"Ó"Ü˜t×7Ñ7×>Ñ>Ó@ÖA�ðyØ—L‘L–Nñ Bð ×$Ñ$×*Ñ*Ô,÷ #÷ ‹8”S—Y‘YÐCÖD‰8ùó;?÷ !× Ð ûô2 !ô yß“xÜŸ	™	Ð"rÐtw×xÒxõ  ûðyú÷	 #×"úsT   Á	G#Á'G
Á>G#Å'H8ÆG7ÆH8ÇG#Ç#G4	Ç7H5	È"H0	È$H8È0H5	È5H8È8I	c           	   #  óh  "  € V P                   ;_uu_ 4        V ;P                  ^,          un        RRR4        Rx € RpV P                   ;_uu_ 4        V P                  ^ 8”  d   V ;P                  ^,          un        V P                  ^ 8X  d   RpV P                   P                  4        RRR4       V'       d   V P                  P	                  4        R# R#   + '       g   i     L±; i  + '       g   i     LI; i  RpT P                   ;_uu_ 4        T P                  ^ 8”  d   T ;P                  ^,          un        T P                  ^ 8X  d   RpT P                   P                  4        RRR4       M  + '       g   i     M; iT'       d   T P                  P	                  4        i i ; i5i)z 
Temporarily disable automatic empty-cache passes. Useful for latency-sensitive
critical sections (e.g., forwarding) where janitor interference is undesirable.
NFT)r›  rš  rŽ   r—  rí   )r<   Úshould_signals   & r"   Ú
no_auto_gcÚDeviceThreadPool.no_auto_gc³  s7  é € ð ×%×%Ó%Ø×'Ò'¨1Õ,Õ'÷ &ð	%Ûà!ˆMØ×)×)Ó)Ø×.Ñ.°Ô2Ø×/Ò/°1Õ4Õ/Ø×.Ñ.°!Ô3Ø$(�MØ×,Ñ,×7Ñ7Ô9÷ *÷ à—‘×"Ñ"Ö$ñ ÷ &×%ú÷ *×)ûð "ˆMØ×)×)Ó)Ø×.Ñ.°Ô2Ø×/Ò/°1Õ4Õ/Ø×.Ñ.°!Ô3Ø$(�MØ×,Ñ,×7Ñ7Ô9÷ *×)×)Ð)ú÷ à—‘×"Ñ"Õ$ð üso   ‚F2—C±F2ºD  ¾F2ÁAC-Â,F2Â<F2ÃC*	Ã%F2Ã-C=	Ã8F2Ä F/ÄAE8	Å/	F/Å8FÆF/ÆF/Æ/F2c               ó   € V ^8„  d   QhRR/# )r   r2   rU   r    )r!   s   "r"   r#   rz  Ë  s   € ÷ ñ  *ñ r$   c                óž   € V P                  V4      pV P                  P                  V4      pVf   \        RV 24      hVP	                  4       # )zH
Obtain an exclusive lock for a single device (blocks all its workers).
úUnknown device for pool: )rò  rŽ  r>  r¯  r’   )r<   r2   r  r³   s   &&  r"   Údevice_lockÚDeviceThreadPool.device_lockË  sJ   € ð ×&Ñ& vÓ.ˆØ�[‰[�_‰_˜SÓ!ˆØŠ:ÜÐ8¸¸ÐAÓBÐBØ�y‰y‹{Ðr$   c               ó   € V ^8„  d   QhRR/# )r   r2   rí  r    )r!   s   "r"   r#   rz  Õ  s   € ÷ %ñ %Ð 0ñ %r$   c                ó„  € \        V\        4      '       dÌ   VR8X  d9   V P                   Uu. uF  q"V P                  V,          3NK  	  pp\	        V4      # V P
                  P                  V4      pVe/   V Uu. uF  q"V P                  V,          3NK  	  pp\	        V4      # WP                  9   d"   V P                  V,          P                  4       # \        RV 24      h\        V4      pV P                  V4      pVP                  fk   V P
                  P                  V4      pV'       g   \        RVP                   R24      hV Uu. uF  q"V P                  V,          3NK  	  pp\	        V4      # V P                  P                  V4      pVf   \        RV 24      hVP                  4       # u upi u upi u upi )zÍ
Obtain a read/shared lock. Accepts:
  - Concrete device: torch.device('cuda:0'), 'cuda:1'
  - Family device:  'cuda', 'xpu', 'mps', 'cpu'
  - 'all' for every device in the pool
Returns a context manager.
rï  rP  úNo devices of type 'ú	' in pool)r\   r   r½  rŽ  rÁ   ræ  r>  rœ   r¯  r^   r¶  rd   rc   )r<   r2   r…  rÍ   rñ  ra   r  r³   s   &&      r"   Ú	read_lockÚDeviceThreadPool.read_lockÕ  s�  € ô �fœc×"Ò"Ø˜ŒØ6:×6HÒ6HÓIÑ6H°˜TŸ[™[¨�^Ó,Ñ6H�ÐIÜ% eÓ,Ð,Ø×(Ñ(×,Ñ,¨VÓ4ˆHØÒ#Ù6>Ó?±h°˜TŸ[™[¨�^Ó,±h�Ð?Ü% eÓ,Ð,ØŸ™Ô$Ø—{‘{ 6Õ*×1Ñ1Ó3Ð3ÜÐ8¸¸ÐAÓBÐBô ˜VÓ$ˆØ�i‰i˜‹nˆð �9‰9ÒØ×(Ñ(×,Ñ,¨SÓ1ˆHßÜ Ð#7¸¿¹°zÀÐ!KÓLÐLÙ2:Ó;±(¨Q˜Ÿ™ Q�Ó(±(ˆEÐ;Ü! %Ó(Ð(ð �[‰[�_‰_˜SÓ!ˆØŠ:ÜÐ8¸¸Ð>Ó?Ð?Ø�y‰y‹{Ðùò5 Jùò @ùò <s   ¬F3Á9F8ÅF=c               ó   € V ^8„  d   QhRR/# )r   rv  rw  r    )r!   s   "r"   r#   rz  ü  s   € ÷ 
!ñ 
!Ð:ñ 
!r$   c                ó
  € Vf/   V P                    Uu. uF  q"V P                  V,          3NK  	  ppM=\        V P                  V4      4      pV Uu. uF  q"V P                  V,          3NK  	  pp\	        V4      # u upi u upi )zŽ
Exclusive lock across multiple devices (default: all pool devices).
Acquires each device's write lock in canonical order to avoid deadlocks.
)r½  rŽ  r»  Ú_normalize_scope_to_keysr¡   )r<   rv  r…  rÍ   r¼  s   &&   r"   ÚlockÚDeviceThreadPool.lockü  s|   € ð
 Š?Ø26×2DÒ2DÓEÑ2D¨Q˜Ÿ™ Q�Ó(Ñ2DˆEÐEˆEä˜$×7Ñ7¸Ó@ÓAˆDÙ26Ó7±$¨Q˜Ÿ™ Q�Ó(±$ˆEÐ7Ü˜%Ó Ð ùò	 Fùò 8s   “A;ÁB r\  c               ó$   € V ^8„  d   QhRRRRRR/# )r   rI   ú6Optional[Union[str, DeviceLike, Iterable[DeviceLike]]]r\  rL   r   zNone | _WaitAndLockr    )r!   s   "r"   r#   rz    s(   € ÷ =ñ =àEð=ð ð	=ð
 
ñ=r$   c          
     óº  € V P                  V4      pV'       dO   \        V4       Uu. uF  qDV P                  V,          3NK  	  pp ! R R\        P                  4      pV! WV4      # \
        '       d   \        P                  RV 24       V FŒ  pV P                  V,          pT;_uu_ 4        V P                  V,          ^ 8”  dK   \
        '       d-   \        P                  RV RV P                  V,           24       VP                  4        Kb   RRR4       KŽ  	  \
        '       d   \        P                  RV 24       R# u upi   + '       g   i     KÌ  ; i)ai  
Wait until in-flight tasks for `scope` drain to zero.

scope:
  - None or 'all' -> all devices
  - 'cuda' | 'xpu' | 'mps' | 'cpu' -> all devices of that type
  - 'cuda:0' | 'xpu:1' -> specific device key
  - torch.device or iterable of the above

lock:
  - False: block until drained.
  - True: return a context manager that drains then acquires writer locks.
c                  ó2   € ] tR tRtRtR R ltR tR tRtR# )	Ú,DeviceThreadPool.wait.<locals>._WaitThenLocki%  zc
Drain inflight for the given keys, then acquire writer locks
in canonical order; release on exit.
c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úouterrg  Úpairs_localr¥   Ú
keys_localú	List[str]r    )r!   s   "r"   r#   Ú9DeviceThreadPool.wait.<locals>._WaitThenLock.__annotate__*  s$   € ÷ :ñ :Ð*:ð :ÐIbð :Ðpyñ :r$   c                	óJ   € Wn         W n        W0n        \        V4      V n        R # r7   )Ú_outerrª   Ú_keysr¡   rÐ   )r<   rd  re  rf  s   &&&&r"   r�   Ú5DeviceThreadPool.wait.<locals>._WaitThenLock.__init__*  s   € Ø"'”KØ"-”KØ!+”JÜ",¨[Ó"9�D–Kr$   c           
     	óŒ  € \         '       d#   \        P                  R V P                   24       V P                   Fª  pV P                  P
                  V,          pT;_uu_ 4        V P                  P                  V,          ^ 8”  dU   \         '       d7   \        P                  RV RV P                  P                  V,           24       VP                  4        Kv   RRR4       K¬  	  \         '       d#   \        P                  RV P                   24       V P                  P                  4       #   + '       g   i     EK  ; i)z"wait(lock=True) drain start: keys=z%wait(lock=True) blocking on inflight[ú]=Nz+wait(lock=True) acquire writer locks: keys=)
r   r¯   r°   rk  rj  r�  rœ  r‡   rÐ   r´   )r<   ÚkkÚcvs   &  r"   r´   Ú6DeviceThreadPool.wait.<locals>._WaitThenLock.__enter__0  sï   € ß“x¤§¡Ð-OÐPT×PZÑPZÈ|Ð+\Ô!]Ø"Ÿjœj˜Ø!Ÿ[™[×5Ñ5°bÕ9˜ßšRØ"&§+¡+×"7Ñ"7¸Õ";¸aÔ"?ß#+£8¬S¯Y©YÐ9^Ð_aÐ^bÐbdÐei×epÑep×ezÑezÐ{}Õe~Ðdð  8Aô  .BØ "§¡¦	ð #@÷  ™Rñ )÷  “x¤§¡Ð-XÐY]×YcÑYcÐXdÐ+eÔ!fØŸ;™;×0Ñ0Ó2Ð2÷  ŸR™Rús   Á%.D1ÂAD1Ä1Ec                	ó–   € \         '       d#   \        P                  R V P                   24       V P                  P                  WV4      # )z-wait(lock=True) releasing writer locks: keys=)r   r¯   r°   rk  rÐ   r¼   rÕ   s   &&&&r"   r¼   Ú5DeviceThreadPool.wait.<locals>._WaitThenLock.__exit__;  s9   € ß“x¤§¡Ð-ZÐ[_×[eÑ[eÐZfÐ+gÔ!hØŸ;™;×/Ñ/°¸rÓBÐBr$   )rÐ   rk  rj  rª   Nr¾   r    r$   r"   Ú_WaitThenLockrb  %  s   † ñõ:ò	3öCr$   rt  z#wait(lock=False) drain start: keys=z&wait(lock=False) blocking on inflight[rn  Nz"wait(lock=False) drain done: keys=)Ú_resolve_scope_to_keysr»  rŽ  r'   ÚAbstractContextManagerr   r¯   r°   r�  rœ  r‡   )r<   rI   r\  r¼  r…  rÍ   rt  rp  s   &&$     r"   r‡   ÚDeviceThreadPool.wait  s  € ð& ×*Ñ*¨5Ó1ˆçÜ28¸´,Ó?±,¨Q˜Ÿ™ Q�Ó(±,ˆEÐ?ôC¤
× AÑ Aô Cñ4 ! ¨dÓ3Ð3÷ ‹8”S—Y‘YÐ!DÀTÀFÐKÔLÛˆAØ×"Ñ" 1Õ%ˆBß’Ø—n‘n QÕ'¨!Ô+ß“x¤§¡Ð-SÐTUÐSVÐVXÐY]×YgÑYgÐhiÕYjÐXkÐ+lÔ!mØ—G‘G–Ið ,÷ ‘ñ ÷ ‹8”S—Y‘YÐ!CÀDÀ6ÐJÔKÙùòO @÷D —�ús   §EÂ.$E	Ã>E	Å	Ec               ó   € V ^8„  d   QhRR/# ©r   r   rn   r    )r!   s   "r"   r#   rz  N  s   € ÷ 	ñ 	�~ñ 	r$   c           
     óê   € V P                   ;_uu_ 4        R\        V P                  4      R\        V P                  4      R\        V P
                  4      /uuRRR4       #   + '       g   i     R# ; i)zG
Return a snapshot of counters. Use under tests or ad-hoc diagnostics.
Ú
per_deviceÚtotalÚ	thresholdN)r“  Údictr”  r]   r•  r–  r;   s   &r"   ÚstatsÚDeviceThreadPool.statsN  sT   € ð ××Óàœd 4×#8Ñ#8Ó9Øœ˜T×-Ñ-Ó.ØœS ×!:Ñ!:Ó;ð÷ ××Óús   •AA!Á!A2	c               ó    € V ^8„  d   QhRRRR/# )r   r2   rU   r   r]   r    )r!   s   "r"   r#   rz  Y  s   € ÷ :ñ : zð :°cñ :r$   c                óÔ   € V P                  V4      pV P                  ;_uu_ 4        \        V P                  P	                  V^ 4      4      uuRRR4       #   + '       g   i     R# ; i)zH
Convenience accessor for per-device completed count (atomic snapshot).
N)rò  r“  r]   r”  r>  )r<   r2   r  s   && r"   Údevice_completedÚ!DeviceThreadPool.device_completedY  sJ   € ð ×&Ñ& vÓ.ˆØ××ÓÜ�t×,Ñ,×0Ñ0°°aÓ8Ó9÷ ××Óús   ¦%AÁA'	c               ó   € V ^8„  d   QhRR/# )r   r   r]   r    )r!   s   "r"   r#   rz  a  s   € ÷ )ñ ) ñ )r$   c                ó’   € V P                   ;_uu_ 4        \        V P                  4      uuRRR4       #   + '       g   i     R# ; i)zD
Convenience accessor for global completed count (atomic snapshot).
N)r“  r]   r•  r;   s   &r"   Útotal_completedÚ DeviceThreadPool.total_completeda  s-   € ð ××ÓÜ�t×'Ñ'Ó(÷ ××Óús	   •5µA	c               ó    € V ^8„  d   QhRRRR/# )r   ra   rV   r   r   r    )r!   s   "r"   r#   rz  j  s   € ÷ "ñ "˜ð "¨ñ "r$   c                	ó`   € VP                   f   RMRVP                    2pVP                   V 2# )NÚ r  )rd   rc   )r<   ra   Úidxs   && r"   r¶  ÚDeviceThreadPool._keyj  s/   € Ø—I‘IÒ%‰b¨Q¨s¯y©y¨k¨?ˆØ—(‘(�˜C˜5Ð!Ð!r$   c               ó    € V ^8„  d   QhRRRR/# )r   r  r   r   r÷   r    )r!   s   "r"   r#   rz  n  s   € ÷ ñ  ð ¨ñ r$   c           	     ó6  € V P                   ;_uu_ 4        V P                  P                  V4      pV'       gh   V P                  V,          pV P	                  W1RV R2R7      pV.pW P                  V&   ^ V P
                  V&   V P                  V4       VuuRRR4       # \        V4      pV P
                  V,          V,          pW&,          pV^,           V,          V P
                  V&   V P                  V4       VuuRRR4       #   + '       g   i     R# ; i)z¡
Round-robin selection across available workers for a device key.
If no workers exist (should not happen under normal init), we
spawn one lazily for robustness.
r  r7  r~  N)r‘  r�  r>  r‚  r¸  r�  r'  r²  )r<   r  rÕ  ra   r"  ÚnrŒ  s   &&     r"   r/  ÚDeviceThreadPool._pick_workern  sô   € ð × × Ó Ø×'Ñ'×+Ñ+¨CÓ0ˆEßØ×*Ñ*¨3Õ/�Ø×&Ñ& s¸	À#ÀÀbÐ6IÐ&ÓJ�Ø˜�Ø+0×#Ñ# CÑ(Ø)*�×!Ñ! #Ñ&Ø×2Ñ2°3Ô7Ø÷ !Ò ô �E“
ˆAØ×#Ñ# CÕ(¨1Õ,ˆCØ•
ˆAØ&)¨A¥g°¥]ˆD×Ñ˜cÑ"Ø×.Ñ.¨sÔ3Ø÷! !× × Ó ús   •B DÂ ADÄD	c               ó    € V ^8„  d   QhRRRR/# ©r   r  r   r   r   r    )r!   s   "r"   r#   rz  †  s   € ÷ -ñ -°ð -¸ñ -r$   c                óü   € V P                   P                  V. 4      pV'       g   V P                  P                  VR4       R# V P                  P                  V4      pW29   d   R# V^ ,          V P                  V&   R# )zb
Ensure the serial worker mapping references a live worker.
Caller must hold self._dispatch_lock.
N)r�  r>  r’  rt   )r<   r  rÕ  Úcurrents   &&  r"   r'  Ú.DeviceThreadPool._refresh_serial_worker_locked†  sk   € ð
 ×#Ñ#×'Ñ'¨¨RÓ0ˆßØ× Ñ ×$Ñ$ S¨$Ô/Ùà×&Ñ&×*Ñ*¨3Ó/ˆØÔÙà$)¨!¥Hˆ×Ñ˜SÓ!r$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   ra   rV   Útablerö  r   r]   r    )r!   s   "r"   r#   rz  –  s"   € ÷ ñ ¨|ð ÀNð ÐWZñ r$   c                ó  € V P                  V4      pW29   d   \        W#,          4      # VP                   R2pWB9   d   \        W$,          4      # VP                  R9   d-   VP                  V9   d   \        W!P                  ,          4      # ^# )zÊ
Resolve worker count from policy table:
  - exact key (e.g. 'cuda:0') overrides
  - family-per (e.g. 'cuda:per') applies to all indices
  - family singletons ('cpu', 'mps') apply to that single device
z:per)r[   rO   )r¶  r]   rc   )r<   ra   r˜  r  Úfam_keys   &&&  r"   r·  Ú,DeviceThreadPool._resolve_workers_for_device–  sp   € ð �i‰i˜‹nˆØŒ<Ü�u•z“?Ð"Ø—X‘X�J˜dÐ#ˆØÔÜ�u•~Ó&Ð&Ø�8‰8�~Ô%¨#¯(©(°eÔ*;Ü�uŸX™X•Ó'Ð'Ùr$   c               ó    € V ^8„  d   QhRRRR/# )r   rI   zIterable[DeviceLike]r   rg  r    )r!   s   "r"   r#   rz  §  s   € ÷ /ñ /Ð.Bð /Àyñ /r$   c                óò  € . p\        4       pV EFã  p\        V\        4      '       då   VR8X  d@   V P                   F-  pWS9  g   K  VP	                  V4       VP                  V4       K/  	  K`  V P                  P                  V4      pVe6   V F-  pWS9  g   K  VP	                  V4       VP                  V4       K/  	  K´  W@P                  9  d   \        RV 24      hWC9  d%   VP	                  V4       VP                  V4       Kü  Kþ  \        V4      pV P                  V4      pVP                  fs   V P                  P                  V4      pV'       g   \        RVP                   R24      hV F-  pWS9  g   K  VP	                  V4       VP                  V4       K/  	  EKš  W€P                  9  d   \        RV 24      hWƒ9  g   EKÁ  VP	                  V4       VP                  V4       EKæ  	  V# )z 
Normalize a scope specification into a sorted list of device keys.
Accepts strings ('cuda', 'cuda:0', 'all'), ints (device indices),
and torch.device objects.
rï  zUnknown device key in scope: rU  rV  rð  )rí   r\   r   r½  r�  rº  ræ  r>  rŽ  r¯  r^   r¶  rd   rc   )	r<   rI   r¼  ÚseenÚsr  rñ  ra   r…  s	   &&       r"   r[  Ú)DeviceThreadPool._normalize_scope_to_keys§  s¡  € ð ˆÜ›ˆÜˆAÜ˜!œS×!Ò!Ø˜”:Ø#×1Ô1˜Øž?Ø ŸK™K¨Ô,Ø ŸH™H SžMñ  2ñ à×,Ñ,×0Ñ0°Ó3�ØÒ'Û'˜Øž?Ø ŸK™K¨Ô,Ø ŸH™H SžMñ  (ñ àŸK™KÔ'Ü$Ð'DÀQÀCÐ%HÓIÐIØ”=Ø—K‘K ”NØ—H‘H˜Q–Kñ !ô % QÓ'�Ø—I‘I˜c“N�Ø—9‘9Ò$Ø#×0Ñ0×4Ñ4°QÓ7�Hß#Ü(Ð+?ÀÇÁ¸zÈÐ)SÓTÐTÛ'˜Øž?Ø ŸK™K¨Ô,Ø ŸH™H SžMô  (ð
 §¡Ô+Ü(Ð+?À¸uÐ)EÓFÐFØ—}ØŸ™ AœØŸ™ ŸñM ðN ˆr$   c               ó    € V ^8„  d   QhRRRR/# )r   rI   r_  r   rg  r    )r!   s   "r"   r#   rz  Ø  s   € ÷ 4ñ 4Ð,bð 4Ðnwñ 4r$   c                ó
  € Ve   \        V\        4      '       d   VR8X  d   \        V P                  4      # \        V\        \        P
                  \        34      '       d   V P                  V.4      # V P                  V4      # )zE
Helper for wait()/lock(): expand a scope into concrete device keys.
rï  )r\   r   rA  r½  r   r2   r]   r[  )r<   rI   s   &&r"   ru  Ú'DeviceThreadPool._resolve_scope_to_keysØ  sh   € ð Š=œZ¨¬s×3Ò3¸À¼Ü˜×*Ñ*Ó+Ð+Ü�eœc¤5§<¡<´Ð5×6Ò6Ø×0Ñ0°%°Ó9Ð9Ø×,Ñ,¨UÓ3Ð3r$   c               ó    € V ^8„  d   QhRRRR/# )r   r  r   r   r    )r!   s   "r"   r#   rz  â  s   € ÷ Eñ E ð E¨ñ Er$   c                ó:   € \        V R/ 4      P                  W4      # )zA
Map a logical worker/alias key back to its physical device key.
r´  )r0  r>  )r<   r  s   &&r"   Ú_physical_keyÚDeviceThreadPool._physical_keyâ  s   € ô �tÐ1°2Ó6×:Ñ:¸3ÓDÐDr$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r  r   ra   rV   r   úOptional[float]r    )r!   s   "r"   r#   rz  è  s!   € ÷ #ñ #¨sð #¸ð #È/ñ #r$   c                ó   € \         P                   ! 4       p \        P                  P                  4        \	        VRR7      pT'       g0   \        '       d$   \        P                  RTP                  T4       R# \         P                   ! 4       T,
          #   \
         d.   p\        '       d   \        P                  RY4        Rp?R# Rp?ii ; i)zV
Execute an empty_cache call for the given device. Returns execution time in seconds.
F)r2   Úgcz*DP-Janitor: empty_cache failed for %s (%s)Nz3DP-Janitor: unsupported device type '%s' for key %s)
ÚtimeÚtorch_utilsÚresolve_empty_cache_callableÚcache_clearr   r)   r   r¯   r°   rc   )r<   r  ra   r  Úsuccessrº   s   &&&   r"   Ú_run_empty_cache_for_deviceÚ,DeviceThreadPool._run_empty_cache_for_deviceè  sŽ   € ô —	’	“ˆð	ä×4Ñ4×@Ñ@ÔBÜ+°3¸5ÔAˆG÷
 Ÿ8›8Ü�I‰IÐKÈSÏXÉXÐWZÔ[ÙÜ�yŠy‹{˜UÕ"Ð"øô ô 	ß‹xÜ—	‘	ÐFÈÔQÝûð	ús   —+B ÂCÂ "CÃCc               ó    € V ^8„  d   QhRRRR/# )r   Úvaluery  r   r   r    )r!   s   "r"   r#   rz  û  s   € ÷ ñ  ð ¨3ñ r$   c                	óL   € V R  pVP                  R4      '       d   VRR pV R2# )ú.1fz.0NÚGéþÿÿÿ)Úendswith)r´  Útexts   & r"   Ú_format_gib_valueÚ"DeviceThreadPool._format_gib_valueú  s1   € à˜�ˆØ�=‰=˜×ÒØ˜˜�9ˆDØ��qˆzÐr$   c               ó    € V ^8„  d   QhRRRR/# )r   ra   rV   r   rý   r    )r!   s   "r"   r#   rz    s   € ÷ ñ ¨,ð ¸=ñ r$   c                	óX  € \         f   R # VP                  R8X  d?   VP                  pVf   R # \        \        P
                  RR 4      '       d   RMRpV RV 2# VP                  R8X  d   VP                  pVf   R # RV 2# VP                  R8X  d   VP                  pVf   R # RV 2# R # )	NrX   ÚhipÚrocmr  rY   zxpu:rZ   znpu:)r   rc   rd   r0  r   Úversion)r<   ra   rŒ  Úprefixs   &&  r"   Ú_device_smi_identifierÚ'DeviceThreadPool._device_smi_identifier  s¦   € ÜŠ>ÙØ�8‰8�vÔØ—)‘)ˆCØŠ{ÙÜ&¤u§}¡}°e¸T×BÒB‘VÈˆFØ�X˜Q˜s˜eÐ$Ð$Ø�8‰8�uÔØ—)‘)ˆCØŠ{ÙØ˜#˜�<ÐØ�8‰8�uÔØ—)‘)ˆCØŠ{ÙØ˜#˜�<ÐÙr$   c               ó    € V ^8„  d   QhRRRR/# )r   r  r   r   r©  r    )r!   s   "r"   r#   rz    s   € ÷ &0ñ &0¨#ð &0°/ñ &0r$   c                	óª  € \         f   R # V P                  P                  V4      pVf   R # V P                  V4      pVf   R # V P                  ;_uu_ 4        W0P
                  9   d    R R R 4       R # V P                  P                  V4      pVf    \        V4      pY@P                  T&   R R R 4        XP                  RR7      p\        TRR 4      pTf   R # \        T4      R,          #   \         d(    T P
                  P                  T4        R R R 4       R # i ; i  + '       g   i     L}; i  \         d”    T P                  ;_uu_ 4        T P
                  P                  T4       T P                  P                  TR 4      pTe$    TP                  4        M  \         d     Mi ; iR R R 4       M  + '       g   i     M; i R # i ; i)NT)ÚfastÚmemory_usedi   @)r   r‚  r>  rÃ  r¦  r¨  r§  r)   rº  Úmetricsrt   rC  r0  ry  )r<   r  ra   Ú
identifierrG  rÉ  ÚstoredrÈ  s   &&      r"   Ú_query_device_vram_gibÚ'DeviceThreadPool._query_device_vram_gib  sž  € ÜŠ>ÙØ×"Ñ"×&Ñ& sÓ+ˆØŠ;ÙØ×0Ñ0°Ó5ˆ
ØÒÙà×"×"Ó"Ø×6Ñ6Ô6Ø÷ #Ñ"ð ×-Ñ-×1Ñ1°*Ó=ˆFØŠ~ð Ü# JÓ/�Fð 8>×(Ñ(¨Ñ4÷ #ð	Ø—n‘n¨$�nÓ/ˆGô ˜g }°dÓ;ˆØÒÙÜ�[Ó! YÕ/Ð/øô+ !ô  Ø×-Ñ-×1Ñ1°*Ô=Ø÷ #Ñ"ð ú÷ #×"ûô ô 		Ø×&×&Ó&Ø×)Ñ)×-Ñ-¨jÔ9Ø×1Ñ1×5Ñ5°jÀ$ÓG�ØÒ%ðØŸ™�øÜ$ô Ùðú÷ '×&×&Ð&úò ð		ús„   ÁD!Á3D!ÂC,ÂD!Â5D4 Ã,&DÄD!ÄDÄD!Ä!D1	Ä4GÅ<F;ÆF!Æ F;Æ!F/	Æ,F;Æ.F/	Æ/F;Æ2	GÆ;GÇGÇGc               ó    € V ^8„  d   QhRRRR/# )r   Úphysical_keyszIterable[str]r   r   r    )r!   s   "r"   r#   rz  >  s   € ÷ :ñ :°-ð :ÀCñ :r$   c                	óÆ   € . pV F?  pV P                  V4      pVf   K  VP                  V RV P                  V4       24       KA  	  V'       d   RP                  V4      # R# )NÚ=ú, zn/a)rÌ  r�  r»  r)  )r<   rÏ  Úreadingsr  r´  s   &&   r"   Ú_format_vram_summaryÚ%DeviceThreadPool._format_vram_summary>  sd   € Ø ˆÛ ˆCØ×/Ñ/°Ó4ˆEØŠ}ÙØ�O‰O˜s˜e 1 T×%;Ñ%;¸EÓ%BÐ$CÐDÖEñ	 !÷
 '/ˆt�y‰y˜Ó"Ð9°EÐ9r$   c               ó    € V ^8„  d   QhRRRR/# r“  r    )r!   s   "r"   r#   rz  I  s   € ÷ Sñ S 3ð S¨4ñ Sr$   c           	     óJ  € V P                   V,          pT;_uu_ 4        V P                  P                  V^ 4      ^,           V P                  V&   \        '       d-   \        P                  RV RV P                  V,           24       RRR4       R#   + '       g   i     R# ; i)zM
Increment inflight for a device key and emit a debug breadcrumb if enabled.
ú	inflight[z] ++ -> N)r�  rœ  r>  r   r¯   r°   )r<   r  rp  s   && r"   r2  Ú DeviceThreadPool._mark_scheduledI  sp   € ð ×Ñ˜sÕ#ˆßŠRØ"&§.¡.×"4Ñ"4°S¸!Ó"<¸qÕ"@ˆD�N‰N˜3Ñß‹xœŸ™ Y¨s¨e°8¸D¿N¹NÈ3Õ<OÐ;PÐ#QÔR÷ �R�RŠRús   žA)BÂB"	c               ó    € V ^8„  d   QhRRRR/# r“  r    )r!   s   "r"   r#   rz  R  s   € ÷  ñ   #ð  ¨$ñ  r$   c           	     óþ  € V P                   V,          pT;_uu_ 4        V P                  P                  V^ 4      ^,
          pV^ 8  d+   \        '       d   \        P                  RV RV R24       ^ pW0P                  V&   \        '       d-   \        P                  RV RV P                  V,           24       V P                  V,          ^ 8X  d   VP                  4        RRR4       R#   + '       g   i     R# ; i)zm
Decrement inflight for a device key, clamp at zero on underflow, and
notify waiters when the device drains.
zWARNING: inflight[z] underflow (z); clamping to 0rØ  z] -- -> N)r�  rœ  r>  r   r¯   r°   rŽ   )r<   r  rp  Únew_vals   &&  r"   r3  ÚDeviceThreadPool._mark_finishedR  sº   € ð
 ×Ñ˜sÕ#ˆßŠRØ—n‘n×(Ñ(¨¨aÓ0°1Õ4ˆGØ˜Œ{ß“8œSŸY™YÐ);¸C¸5ÀÈgÈYÐVfÐ'gÔhØ�Ø")�N‰N˜3Ñß‹xœŸ™ Y¨s¨e°8¸D¿N¹NÈ3Õ<OÐ;PÐ#QÔRØ�~‰~˜cÕ" aÔ'Ø—‘”÷ �R�RŠRús   ž6C+ÁBC+Ã+C<	c               ó    € V ^8„  d   QhRRRR/# r“  r    )r!   s   "r"   r#   rz  b  s   € ÷ 3!ñ 3! Sð 3!¨Tñ 3!r$   c                óš  € \        V R4      '       g   / V n        \        V R4      '       g	   / V n        ME\        V P                  \        4      '       g&   \        P                  V P                  ^4      V n        \        V R4      '       g   / V n        \        V R4      '       g   / V n        V P                  V4       RpV P                  ;_uu_ 4        V P                  P                  V^ 4      ^,           V P                  V&   V ;P                  ^,          un        V P                  P                  V4      pVEeQ   V P                  ^ 8”  Ed?   VP                  R
9   Ed-   V P!                  V4      pV P                  P                  V^ 4      ^,           pWPP                  V&   V P                  P                  V^ 4      p\#        ^ WV,
          V P                  ,          4      pV P                  pVP                  V^ 4      p	Wy,
          p
V
^ 8”  d   Wš,           W„&   V ;P$                  V
,          un        Rp\&        '       dN   \(        P+                  RVVVV P                  V P                  \-        R	 VP/                  4        4       4      4       RRR4       V'       d   V P0                  P3                  4        R# R#   + '       g   i     L6; i)zˆ
Called at the end of every task (success or failure). Updates counters
and signals the janitor if the per-device threshold is reached.
r¢  r¤  r£  r¥  FNTz^GC trigger set by %s (physical=%s): per_physical_done=%d threshold=%d total_done=%d pending=%sc              3  ó<   "  € T F  w  rV^ 8”  g   K  Vx € K  	  R# 5iry   r    ©r„  r…  rÍ  s   &  r"   r†  Ú5DeviceThreadPool._on_task_finished.<locals>.<genexpr>’  s   é € Ð"VÑ5H©¨ÈEÐTUÉI§1¢1Ó5Hùó   ‚’
r€  )rP   r¢  r¤  r\   r~  Úfromkeysr£  r¥  r3  r“  r”  r>  r•  r‚  r–  rc   r¦  rŸ  rÁ  r   r¯   r°   r»  r­  r—  rí   )r<   r  Ú
trigger_gcra   r  r•  Ú	last_doneÚcompleted_chunksÚpending_mapÚalready_pendingÚnew_triggerss   &&         r"   r  Ú"DeviceThreadPool._on_task_finishedb  s?  € ô
 �tÐ0×1Ò1Ø%'ˆDÔ"Ü�tÐ3×4Ò4Ø(*ˆDÕ%Ü˜D×5Ñ5´t×<Ò<Ü(,¯©°d×6OÑ6OÐQRÓ(SˆDÔ%Ü�tÐ5×6Ò6Ø*,ˆDÔ'Ü�tÐ1×2Ò2Ø&(ˆDÔ#à×Ñ˜CÔ àˆ
Ø××ÓØ)-×)>Ñ)>×)BÑ)BÀ3ÈÓ)JÈQÕ)NˆD×!Ñ! #Ñ&Ø×Ò Õ!ÕØ×&Ñ&×*Ñ*¨3Ó/ˆCà“Ø×-Ñ-°Õ1Ø—H‘HÐ =Õ=à#×1Ñ1°#Ó6�Ø×0Ñ0×4Ñ4°\À1ÓEÈÕI�Ø7>×&Ñ& |Ñ4Ø ×7Ñ7×;Ñ;¸LÈ!ÓL�	Ü#& q¨7Õ+>À4×C\ÑC\Õ*\Ó#]Ð Ø"×7Ñ7�Ø"-§/¡/°,ÀÓ"B�Ø/ÕA�Ø !Ô#Ø0?Õ0N�KÑ-Ø×'Ò'¨<Õ7Õ'Ø!%�Jß“xÜŸ	™	Ø|ØØ(Ø#Ø ×5Ñ5Ø ×,Ñ,Ü"Ñ"V°[×5FÑ5FÔ5HÓ"VÓVô÷- ÷> Ø�N‰N×ÑÖ ñ ÷? ×ús   ÃF:J:Ê:K
	c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úheadersrg  ÚrowszList[List[str]]r   r   r    )r!   s   "r"   r#   rz  ™  s!   € ÷ # ñ #  9ð # °Oð # Èñ # r$   c                óð  a€ V Uu. uF  p\        V4      NK  	  upoV F6  p\        V4       F$  w  rV\        SV,          \        V4      4      SV&   K&  	  K8  	  R	V3R llpR V3R llpRp	Rp
V! 4       pV! RR7      pV! 4       pY¸! V Uu. uF  q9V,           V
,           NK  	  up4      V.pV F  pVP                  V! V4      4       K  	  VP                  V4       RP	                  V4      # u upi u upi )
zv
Render a simple ANSI/ASCII table with bold headers. Used only for
human-readable diagnostics; not used in hot paths.
c                óä   <€ V .p\        S4       FM  w  rVVP                  W6^,           ,          4       TP                  V\        S4      ^,
          8  d   TMT4       KO  	  RP                  V4      # )r   r‹  )Ú	enumerater�  r²  r)  )Úsep_leftÚsep_midÚ	sep_rightÚhrÐ  rÆ  r"  Úwidthss   &&&&   €r"   ÚhruleÚ+DeviceThreadPool._ansi_table.<locals>.hrule£  sZ   ø€ Ø�JˆEÜ! &Ö)‘�Ø—‘˜Q a¥%�[Ô)Ø—‘¨¬C°«K¸!­OÔ(;™WÀÖKñ *ð —7‘7˜5“>Ð!r$   c               ó   € V ^8„  d   QhRR/# )r   Úcolsrg  r    )r!   s   "r"   r#   Ú2DeviceThreadPool._ansi_table.<locals>.__annotate__ª  s   € ÷ 	 ñ 	 ˜Yñ 	 r$   c                óà   <€ R .p\        V 4       FK  w  r#VP                  RVP                  SV,          4      ,           R,           4       VP                  R 4       KM  	  RP                  V4      # )Ú|Ú r‹  )rñ  r�  Úljustr)  )rú  ÚoutrÆ  Úcellrö  s   &   €r"   Ú
format_rowÚ0DeviceThreadPool._ansi_table.<locals>.format_rowª  sX   ø€ Ø�%ˆCÜ$ Tž?‘�Ø—
‘
˜3 §¡¨F°1­IÓ!6Õ6¸Õ<Ô=Ø—
‘
˜3–ñ +ð —7‘7˜3“<Ðr$   z[1mz[0mrÑ  )rõ  r&   )Ú+r  r  Ú-)r²  rñ  rŸ  r�  r)  )r<   rí  rî  rõ  ÚrrÆ  r  r÷  r  ÚBOLDÚRESETÚtopÚmidÚbotÚlinesrö  s   &&&            @r"   Ú_ansi_tableÚDeviceThreadPool._ansi_table™  së   ø€ ñ
 #*Ó*¡'˜Q”#�a–&¡'Ñ*ˆÛˆAÜ$ Qž<‘�Ü  q¥	¬3¨t«9Ó5��q“	ó (ñ ÷	"÷	 ð 	 ð ˆØˆá‹gˆÙ�cŒlˆÙ‹gˆà�j¹GÓ!D¹G°q¨¥(¨U×"2Ð"2¹GÑ!DÓEÀsÐKˆÛˆAØ�L‰L™ A›Ö'ñ à�‰�SÔØ�y‰y˜ÓÐùò= +ùò4 "Es   †C.ÂC3
c               ó   € V ^8„  d   QhRR/# ry  r    )r!   s   "r"   r#   rz  ¾  s   € ÷ 2ñ 2¨ñ 2r$   c           
     óâ  a€ V P                   ;_uu_ 4        \        V P                  4      o\        V P                  4      p\        V P
                  4      pRRR4       / pV P                  P                  4        F6  w  rEV;_uu_ 4        \        V P                  V,          4      W4&   RRR4       K8  	  V P                  P                  4        Uu/ uF(  qD\        V P                  P                  V. 4      4      bK*  	  pp/ pV P                  P                  4        F<  w  rHVP                  f   RM\        VP                  4      p	RVP                   RV	/Wt&   K>  	  \#        V R/ 4      p
/ pV
P                  4        F  w  rÍ\%        V3R lV 4       4      W¼&   K  	  \#        V R/ 4      p\'        V\        4      '       d"   \)        R VP                  4        4       4      pM\)        V4      p/ R	\)        V P                  P                  4       4      bR
SbRVbRXbRXbRVbRVbRVbR\%        VP+                  4       4      bR\%        VP+                  4       4      bR\        V P,                  4      bR\        V P.                  4      bR\        V P0                  4      bRV P2                  bR\4        P4                  ! 4       bRVbpV#   + '       g   i     ELv; i  + '       g   i     EKo  ; iu upi )zK
Safely collect a snapshot of pool state for diagnostics and GC decisions.
Nr‹  rc   rd   r¥  c              3  óH   <"  € T F  pSP                  V^ 4      x € K  	  R# 5iry   )r>  )r„  ÚmemberÚper_dones   & €r"   r†  Ú;DeviceThreadPool._collect_state_snapshot.<locals>.<genexpr>Ö  s!   øé € Ð-\ÑT[È&¨h¯l©l¸6À1×.EÐ.EÓT[ùs   ƒ"r¤  c              3  ó<   "  € T F  w  rV^ 8”  g   K  Vx € K  	  R# 5iry   r    rá  s   &  r"   r†  r  Ú  s   é € ÐSÑ2E¡h aÈÐQRÉ§¢Ó2Eùrã  rv  r  Úper_done_physicalÚ
total_doner}  Úinflightro  ÚmetaÚtotal_inflightÚtotal_workersÚ	gc_passesÚgc_generationÚgc_generation_consumedÚ
last_gc_tsÚnowÚ
pending_gc)r“  r~  r”  r]   r•  r–  r�  r­  rœ  r‚  r¼  r²  r�  r>  rd   r   rc   r0  Úsumr\   r»  rB  r¿  rÁ  rÂ  rÀ  r¬  )r<   r  r}  r  r…  rp  ro  r  ra   rŒ  Úphysical_childrenr  Úphys_keyÚmembersÚraw_pendingr!  Úsnapr  s   &                @r"   Ú_collect_state_snapshotÚ(DeviceThreadPool._collect_state_snapshot¾  sÛ  ø€ ð ××ÓÜ˜D×1Ñ1Ó2ˆHÜ˜T×-Ñ-Ó.ˆJÜ˜D×5Ñ5Ó6ˆI÷ ð
 $&ˆØ×&Ñ&×,Ñ,Ö.‰EˆAß’Ü! $§.¡.°Õ"3Ó4�‘÷ ‘ñ /ð DH×CWÑCW×C\ÑC\ÔC^Ó_ÑC^¸a”c˜$×-Ñ-×1Ñ1°!°RÓ8Ó9Ò9ÑC^ˆÐ_à*,ˆØ×*Ñ*×0Ñ0Ö2‰FˆAØŸ	™	Ò)‘"¬s°3·9±9«~ˆCØ˜sŸx™x¨°#Ð6ˆD‹Gñ 3ô $ DÐ*>ÀÓCÐØ,.ÐØ!2×!8Ñ!8Ö!:ÑˆHÜ*-Ô-\ÑT[Ó-\Ó*\ÐÓ'ñ ";ô ˜dÐ$:¸BÓ?ˆÜ�k¤4×(Ò(ÜÑS°+×2CÑ2CÔ2EÓSÓS‰Jä Ó,ˆJð 
Ø”v˜d×2Ñ2×7Ñ7Ó9Ó:ð 
à˜ð 
ð  Ð!2ð 
ð ˜*ð	 
ð
 ˜ð 
ð ˜ð 
ð �wð 
ð �Dð 
ð œc (§/¡/Ó"3Ó4ð 
ð œS §¡Ó!1Ó2ð 
ð œ˜TŸ_™_Ó-ð 
ð œS ×!4Ñ!4Ó5ð 
ð %¤c¨$×*KÑ*KÓ&Lð 
ð ˜$×*Ñ*ð 
ð ”4—9’9“;ð 
ð  ˜*ð! 
ˆð$ ˆ÷] ×Ðú÷ —‘üò `s   –A KÂ	KÃ.K,ËK	ËK)c               ó    € V ^8„  d   QhRRRR/# )r   r'  rn   r   r   r    )r!   s   "r"   r#   rz  ò  s   € ÷ $0ñ $0 ^ð $0¸ñ $0r$   c                ó  € . ROp. pVR,          pVR,           EF  pVR,          V,          R,          pVR,          V,          R,          pVR,          P                  V^ 4      pVR,          P                  V^ 4      p	VR,          P                  V^ 4      p
VR9   d   R	MR
pV^ 8”  dB   VR9   d;   W¤,          ^ 8w  d   WJV,          ,
          M^ pV^ 8X  d
   V
^ 8”  d   RM
\        V4      pMRpTP                  YVT\        V4      \        V	4      \        V
4      V^ 8”  d   \        V4      MRWÛ.	4       EK  	  V P                  W#4      p. ROpV P                  f   RM'\
        P
                  ! 4       V P                  ,
          R p\        \        R V P                  P                  4        4       4      4      \        VR,          4      \        VR,          4      \        VR,          4      V..pV P                  VV4      pVR,           V,           # )zH
Pretty-print a GC state table; used only when someone wants to log it.
r}  rv  r  rc   rd   ro  r  r  ÚYÚNr   r  r‰  c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir7   ©r²  ©r„  Úvs   & r"   r†  Ú4DeviceThreadPool._render_gc_table.<locals>.<genexpr>  s   é € ÐAÑ$@˜q”C˜—F�FÓ$@ùó   ‚r  r  r  r&   )	r   ÚTypeÚIndexÚWorkersÚInflightÚDoneÚ	ThresholdÚNextGCÚAccelr€  )zTotal WorkerszTotal Inflightz
Total Donez	GC PasseszSince Last GC (s))	r>  r   r�  r  rÀ  r¬  r"  r�  rB  )r<   r'  rí  rî  Úthrr…  ÚtrŒ  r"  ÚinflÚdoneÚaccelÚremÚnextgcÚ
table_mainÚtotals_headersÚsinceÚtotals_rowsÚtable_totalss   &&                 r"   Ú_render_gc_tableÚ!DeviceThreadPool._render_gc_tableò  sÖ  € ò
ˆð !#ˆØ�;ÕˆØ�i—‘ˆAØ�V•˜Q• Õ'ˆAØ�v•,˜q•/ 'Õ*ˆCØ�Y•×#Ñ# A qÓ)ˆAØ˜
Õ#×'Ñ'¨¨1Ó-ˆDØ˜
Õ#×'Ñ'¨¨1Ó-ˆDØÐ =Ô=‘CÀ3ˆEØ�QŒw˜1Ð =Ô=Ø-1­Z¸AÔ,=�c C�ZÖ(À1�Ø"%¨¤(¨t°a¬x™¼SÀ»X‘à�Ø�K‰K˜˜s¤C¨£F¬C°«I´s¸4³yÈcÐTUÌgÄ#ÀcÄ(Ð[^Ð`fÐn×oñ !ð ×%Ñ% gÓ4ˆ
âlˆØ×'Ñ'Ò/‘¼¿	º	»Àd×FVÑFVÕ8VÐWZÐ7[ˆä”ÑA D×$7Ñ$7×$>Ñ$>Ô$@ÓAÓAÓBÜ�Ð%Õ&Ó'Ü��\Õ"Ó#Ü��[Õ!Ó"Øð
ð ˆð ×'Ñ'¨¸ÓDˆØ˜DÕ  <Õ/Ð/r$   c                óÜ  a € S P                    F�  pS P                  V,          pVP                  R8w  d   K)  \        P                  P                  VP                  4      ;_uu_ 4        \        P                  P                  4        RRR4       Kƒ  	  S P                    F»  pS P                  V,          pVP                  R8w  d   K)  \        \        R4      '       g   KA  \        \        P                  R4      '       g   Kc  \        P                  P                  VP                  4      ;_uu_ 4        \        P                  P                  4        RRR4       K½  	  S P                    F�  pS P                  V,          pVP                  R8w  d   K)  \        '       g   K7  \        P                  P                  VP                  4      ;_uu_ 4        \        P                  P                  4        RRR4       K‘  	  \        ;QJ d)    V 3R lS P                    4       F  '       g   K   RM	  RM! V 3R lS P                    4       4      pV'       d[   \        \        R	4      '       dC   \        \        P                  R4      '       d!   \        P                  P                  4        R# R# R# R#   + '       g   i     EK³  ; i  + '       g   i     EK7  ; i  + '       g   i     EK�  ; i)
z”
Optionally ensure devices are idle before empty_cache() to avoid races with
outstanding kernels. Keeping this disabled by default for performance.
rX   NrY   rB  rZ   c              3  ód   <"  € T F%  pSP                   V,          P                  R 8H  x € K'  	  R# 5i)rO   Nr�  rƒ  s   & €r"   r†  Ú4DeviceThreadPool._synchronize_all.<locals>.<genexpr>;  s)   øé € Ð_ÑL^Àq˜T×1Ñ1°!Õ4×9Ñ9¸UÖBÓL^ùrˆ  TFrO   )r½  r‚  rc   r   rX   r2   rd   rB  rP   rY   r   rZ   rÃ  rO   )r<   r  ra   Úhas_mps_devices   f   r"   Ú_synchronize_allÚ!DeviceThreadPool._synchronize_all  s×  ø€ ð ×%Ô%ˆCØ×&Ñ& sÕ+ˆCØ�x‰x˜6Ô!ÙÜ—‘×"Ñ" 3§9¡9×-Õ-Ü—
‘
×&Ñ&Ô(÷ .Ñ-ñ	 &ð ×%Ô%ˆCØ×&Ñ& sÕ+ˆCØ�x‰x˜5Ô ÙÜ”u˜e×$Ô$¬´·±¸M×)JÔ)JÜ—Y‘Y×%Ñ% c§i¡i×0Õ0Ü—I‘I×)Ñ)Ô+÷ 1Ñ0ñ &ð ×%Ô%ˆCØ×&Ñ& sÕ+ˆCØ�x‰x˜5Ô Ùß�wÜ—Y‘Y×%Ñ% c§i¡i×0Õ0Ü—I‘I×)Ñ)Ô+÷ 1Ñ0ñ &÷ ›Ô_ÈD×L^ÒL^Ó_ŸŸšÔ_ÈD×L^ÒL^Ó_Ó_ˆßœg¤e¨U×3Ò3¼ÄÇ	Á	È=×8YÒ8YÜ�I‰I×!Ñ!Ö#ñ 9ZÑ3‰>÷) .×-Ñ-ú÷ 1×0Ñ0ú÷ 1×0Ñ0ús$   Á(J/Ä3KÇKÊ/KËKËK+c               ó    € V ^8„  d   QhRRRR/# )r   r'  rn   r   rL   r    )r!   s   "r"   r#   rz  ?  s   € ÷ ñ °ð ÀDñ r$   c                ó:  € VR,          pV^ 8:  d   R# VP                  R4      ;'       g    . pV'       d   R# VP                  R4      ;'       g    / p\        V R/ 4      pVP                  4        F'  w  rgVP                  V^ 4      pWx,
          V8¼  g   K&   R# 	  R# )z–
Decide whether to run GC by comparing per-device progress since last GC.
This deduplicates bursty triggers that occurred before the previous GC ran.
r}  Fr!  Tr  r£  )r>  r0  r­  )	r<   r'  r<  Úpendingr  Úlast_done_physicalr$  Údone_nowÚ	done_prevs	   &&       r"   Ú_should_run_gc_from_snapshotÚ-DeviceThreadPool._should_run_gc_from_snapshot?  s—   € ð
 �;ÕˆØ�!Œ8ÙØ—(‘(˜<Ó(×.Ð.¨BˆßÙØ ŸH™HÐ%8Ó9×?Ð?¸RÐÜ$ TÐ+CÀRÓHÐØ"3×"9Ñ"9Ö";ÑˆHØ*×.Ñ.¨x¸Ó;ˆIØÕ# sÖ*Úñ #<ñ r$   c               ó    € V ^8„  d   QhRRRR/# )r   Ú
snap_afterrn   r   r   r    )r!   s   "r"   r#   rz  R  s   € ÷ Dñ D°ð DÀ4ñ Dr$   c                ó  € \        V P                  4       VP                  R4      ;'       g    / pVP                  R4      ;'       g    / pVP                  R4      ;'       g    /  VP                  R4      pVf   VP                  4       pMTpV Fr  pVP                  V4      pVf   K  WpP                  V&   V P
                  P                  Wf04      pV F(  p	VP                  V	4      p
V
f   K  W P                  V	&   K*  	  Kt  	  R# )zg
Record 'done' counters as of a GC pass to require fresh progress
before a subsequent pass is allowed.
r  r  r  Ú_gc_processed_devicesN)r]   r–  r>  r¼  r£  r¥  r¡  )r<   rY  r  r  Ú	processedÚprocessed_iterr$  Ú	done_physr%  r  Údone_members   &&         r"   Ú_update_gc_watermarksÚ&DeviceThreadPool._update_gc_watermarksR  sõ   € ô
 	ˆD×%Ñ%Ô&Ø&ŸN™NÐ+>Ó?×EÐEÀ2ÐØ—>‘> *Ó-×3Ð3°ˆØ�‰�vÓ×$Ð$ "øØ—N‘NÐ#:Ó;ˆ	ØÒØ.×3Ñ3Ó5‰Nà&ˆNã&ˆHØ)×-Ñ-¨hÓ7ˆIØÒ ÙØ4=×'Ñ'¨Ñ1à×-Ñ-×1Ñ1°(¸JÓGˆGÛ!�Ø&Ÿl™l¨6Ó2�ØÒ&ÙØ8C×-Ñ-¨fÓ5ó	 "ó 'r$   c                ó   €  \         '       d   \        P                  R4       V P                  P	                  4        V P                  P                  4        V P                  P                  4       '       d$   \         '       d   \        P                  R4       R# V P                  ^ 8”  Ed1   \        P                  ! 4       V P                  ,           p\         '       d%   \        P                  RV P                  R R24       \        P                  ! 4       V8  d    V P                  P                  4       '       d$   \         '       d   \        P                  R4       R# V P                  P	                  \        R	V\        P                  ! 4       ,
          4      R
7       V P                  P                  4        K¹  \         '       d   \        P                  R4       V P                  ;_uu_ 4        V P                  ^ 8”  d^   V P                  P                  4       '       g>   \         '       d   \        P                  R4       V P                  P	                  4        Kn  V P                  P                  4       '       d-   \         '       d   \        P                  R4        RRR4       R#  RRR4       V P                  ;_uu_ 4        V P                  pV P                  pV P                   pRRR4       XX8X  d%   \         '       d   \        P                  R4       EK  V P"                  pVR	8”  EdP   XEeK   \        P                  ! 4       V,
          pWe8  Ed(   WV,
          p\         '       d-   \        P                  RVR,          R RVR,          R R24       V P                  P	                  VR
7      '       d$   \         '       d   \        P                  R4       R# V P                  P                  4       '       d$   \         '       d   \        P                  R4       R# V P                  ;_uu_ 4        V P                  pV P                  pRRR4       W#8X  d%   \         '       d   \        P                  R4       EK‚   V P%                  4       p\         '       dI   \        P                  RVR,           RVR,           RVR,           24       \        P                  R4       T PI                  T4      '       gH   \         '       d   \        P                  R*4       T P                  ;_uu_ 4        Y n        RRR4       EKE  \        P                  ! 4       p T P%                  4       p\         '       dS   \        P                  R+TR,          TR,          TR,          TP3                  R,4      4       \        P                  R4       TP3                  R,. 4       U
u. uF  qªT PJ                  9   g   K  T
NK  	  pp
T'       g^   \         '       d   \        P                  R/T4       T P                  ;_uu_ 4        \        T P                  T4      T n        RRR4       EKa  . p\U        4       pT PV                   F„  pT PY                  T4      pTT9   d   K  T P,                  P3                  T4      pTe   TP6                  RH9  d   KO  TT PJ                  9  d   Kb  TP[                  T4       TP]                  T4       K†  	  T'       g   Tp. p. p/ pT EF
  pT P,                  P3                  T4      pTe   TP6                  RH9  d   TP]                  T4       KG  T PJ                  P3                  T4      pTf   TP]                  T4       Ky  \         '       d   \        P                  R0T4       TP_                  4       ;_uu_ 4        \         '       d   \        P                  R1T4       T Pa                  TT4      pTe   TTT&   RRR4       TP]                  T4       EK  	  T'       g#   \         '       d   \        P                  R2T4       \        P                  ! 4       pT P                   pT'       d!   T ;PD                  ^,          un"        TT n        \b        Pd                  ! T\f        Ph                  R37      Pk                  4       pTf   R4pMTT,
          pR5TR R6TR,          R R72pRpT'       d(    T P%                  4       pTTR8&   T Pm                  T4       T P                  ;_uu_ 4        T Pp                  p \O        T \8        4      '       g   \8        P;                  T ^4      p T T n8        T F  pT Ps                  TR4       K  	  T F  pT Ps                  TR4       K  	  \        T P                  T4      T n        \t        ;QJ d*    R; T PC                  4        4       F  '       g   K   RM	  R<M! R; T PC                  4        4       4      '       d   T P                  PU                  4        RRR4       T'       g   E
KD  T Pw                  T4      p! R=Py                  T4      p"\        P{                  R>TT,
          R R?T PD                   R@T RAT" RBT! RCT RD24       \         '       d:   \        P                  RETR,          TR ,          TP3                  RF4      T4       E
Kæ  E
Ké    + '       g   i     ELG; i  + '       g   i     EL; i  + '       g   i     ELÊ; i  \&         Edæ   p	 \        P)                  RT	: 24       M  \&         d     Mi ; iR\+        T P,                  P/                  4       4      R T P,                  P/                  4        U
u/ uF  qªT P0                  P3                  T
^ 4      bK!  	  Mu up
i up
RT P4                  R!T P,                  P/                  4        U
u/ uF"  qªR"T P,                  T
,          P6                  /bK$  	  Mu up
i up
R\8        P;                  T P,                  P/                  4       ^ 4      R#T P,                  P/                  4        U
u/ uF(  qª\=        T P>                  P3                  T
. 4      4      bK*  	  Mu up
i up
R$^ R%\A        R& T P>                  PC                  4        4       4      R'T PD                  R(T P                   R)\        P                  ! 4       RT PF                  /p Rp	?	EL*Rp	?	ii ; i  + '       g   i     ELè; iu up
i   \&         dŒ   p	 \        P)                  RT	: 24       M  \&         d     Mi ; i\M        T R-/ 4      p\O        T\8        4      '       d'   \Q        R. TPS                  4        4       4      p Rp	?	EL¶\Q        T4      p Rp	?	ELÇRp	?	ii ; i  + '       g   i     EL~; i  + '       g   i     ELä; i  \&         dV   p	 \        P)                  R9T	: 24        Rp	?	EL  \&         d#   p\o        R9T	: R:T: 24        Rp? Rp	?	EL*Rp?ii ; iRp	?	ii ; i  + '       g   i     EL.; i  \&         dX   p	 \        P)                  RGT	: 24        Rp	?	EK–    \&         d$   p\o        RGT	: R:T: 24        Rp? Rp	?	EK¿  Rp?ii ; iRp	?	ii ; i)Iau  
Main janitor loop:
  - Waits on a trigger (with short timeout to honor shutdowns promptly).
  - Debounces additional triggers for a brief window.
  - Takes a snapshot and decides whether to run.
  - For each accelerator device, acquires its writer lock and calls
    empty_cache() using the LIVE attribute if callable, otherwise the
    HARD COPY captured at import time.
Tu"   DP-Janitor: waiting for triggerâ€¦z#DP-Janitor: stop event set; exitingz#DP-Janitor: debounce window start (r‰  zs)z)DP-Janitor: stop during debounce; exitingNrr  )ÚtimeoutzDP-Janitor: debounce window endu(   DP-Janitor: auto-GC disabled; waitingâ€¦z7DP-Janitor: stop event set during auto-GC wait; exitingz9DP-Janitor: trigger generation already consumed; skippingzDP-Janitor: last pass iè  r¶  zms ago; waiting zms to honor min intervalz<DP-Janitor: stop event set during min-interval wait; exitingz@DP-Janitor: stop event observed after min-interval wait; exitingzFDP-Janitor: no pending GC generation after min-interval wait; skippingz+DP-Janitor: pre-snapshot taken: total_done=r  z, threshold=r}  z, inflight=r  u1   GC trigger received; evaluating whether to runâ€¦z"Failed to render GC pre-snapshot: rv  r  r  rc   ro  r  r  c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir7   r/  r0  s   & r"   r†  Ú1DeviceThreadPool._janitor_loop.<locals>.<genexpr>Ð  s   é € Ð(VÑ9U°A¬¨Q¯¨Ó9Uùr3  r  r  r   zGDP-Janitor: skip GC (no device progressed by threshold since last pass)zQDP-Janitor: pre-snapshot taken: total_done=%s threshold=%s inflight=%s pending=%sr!  r¤  c              3  ó<   "  € T F  w  rV^ 8”  g   K  Vx € K  	  R# 5iry   r    rá  s   &  r"   r†  re  ò  s   é € Ð,`Ñ?R±8°1ÐV[Ð^_ÑV_¯QªQÓ?Rùrã  zMDP-Janitor: no pending devices after snapshot; marking generation %d consumedz)DP-Janitor: attempting writer lock for %sz'DP-Janitor: acquired writer lock for %sz?DP-Janitor: no eligible accelerator devices found in pending=%s)Útzzsince last GC: n/azsince last GC: zs (zms)r[  z Failed to update GC watermarks: z; secondary logging failed: c              3  ó*   "  € T F	  q^ 8„  x € K  	  R# 5iry   r    )r„  rÍ  s   & r"   r†  re  N  s   é € ÐCÑ.B U˜q–yÓ.Bùs   ‚FrÒ  zGC completed in z	s (pass #z) at z
; devices=z; VRAM z; Ú.zSDP-Janitor: post-snapshot inflight=%s per_done=%s per_done_physical=%s durations=%sr  z#Failed to render GC post-snapshot: r€  )>r   r¯   r°   r—  r‡   rD  r˜  rê   rž  r¬  rŸ  r›  rš  r“  rÁ  rÂ  rÀ  r   r(  r)   r/  rA  r‚  r¼  r”  r>  r–  rc   r~  rä  r²  r�  r"  rB  r¿  r•  rV  rŽ  r0  r\   r»  r­  rí   r½  r¦  rº  r�  r’   r±  r   Úfromtimestampr   ÚutcÚ	isoformatr`  r.   r¤  rt   rÃ  rÔ  r)  Úinfo)#r<   Út_endÚcurrent_generationÚlast_generationr  Úmin_intervalÚelapsedÚwait_forÚpreÚer…  Út0Úpending_targetsr&  Úsweep_targetsÚseen_targetsÚ	candidateÚphysicalra   Úprocessed_devicesÚskipped_devicesÚper_device_durationsr  r³   ÚdurationÚt1Ú
prev_gc_tsÚgc_timestampÚsince_last_gcÚdelta_sÚpostÚlog_excrè  Úvram_summaryÚdevices_clauses#   &                                  r"   rÄ  ÚDeviceThreadPool._janitor_loopn  s¿  € ð ß‹xÜ—	‘	Ð>Ô?à�N‰N×ÑÔ!Ø�N‰N× Ñ Ô"à×Ñ×&Ñ&×(Ò(ß“8Ü—I‘IÐCÔDÙð ×"Ñ" QÕ&ÜŸ	š	› d×&9Ñ&9Õ9�ß“8œSŸY™YÐ)LÈT×M`ÑM`ÐadÐLeÐegÐ'hÔiÜ—i’i“k EÔ)Ø×'Ñ'×.Ñ.×0Ò0ß#›8¤S§Y¡YÐ/ZÔ%[ÙØ—N‘N×'Ñ'´°C¸ÄÇÂÃÕ9LÓ0MÐ'ÔNØ—N‘N×(Ñ(Ö*ß“8œSŸY™YÐ'HÔIà×)×)Ó)Ø×1Ñ1°AÔ5¸d×>NÑ>N×>UÑ>U×>WÒ>Wß“xÜŸ	™	Ð"LÔMØ×,Ñ,×1Ñ1Ö3Ø×#Ñ#×*Ñ*×,Ò,ß“x¤§¡Ð+dÔ!eØ÷ *Ñ)ð
 -÷ *ð ×!×!Ó!Ø%)×%8Ñ%8Ð"Ø"&×"CÑ"C�Ø!×-Ñ-�
÷ "ð
 " _Ô4ß“8Ü—I‘IÐYÔZÚà×2Ñ2ˆLØ˜cÕ! jÓ&<ÜŸ)š)›+¨
Õ2�ØÕ)Ø+Õ5�Hß“xÜŸ	™	Ø4°W¸tµ^ÀCÐ4HÐHXÐYaÐdhÕYhÐilÐXmð  nFð  Gôð ×'Ñ'×,Ñ,°XÐ,×>Ò>ß#›8ÜŸI™IÐ&dÔeÙØ×'Ñ'×.Ñ.×0Ò0ß#›8ÜŸI™IÐ&hÔiÙØ×)×)Ó)Ø-1×-@Ñ-@Ð*Ø*.×*KÑ*K˜÷ *ð *Ô<ß#›8ÜŸI™IÐ&nÔoÚ ðØ×2Ñ2Ó4�ß“8Ü—I‘IÐ KÈCÐP\ÕL]ÐK^Ð^jÐknÐozÕk{Ðj|ð  }Hð  ILð  MWõ  IXð  HYð  Zô  [Ü—I‘IÐQÔRð, ×4Ñ4°S×9Ò9ß“8œSŸY™YÐ'pÔqØ×%×%Ó%Ø8JÔ5÷ &âä—’“ˆBð:Ø×2Ñ2Ó4�ß“8Ü—I‘IØkØ˜LÕ)Ø˜KÕ(Ø˜J�ØŸ™ Ó-ôô —I‘IÐQÔRØ.1¯g©g°lÀBÔ.GÓ"\Ñ.G¨ÐPT×P[ÑP[ÑK[§1 1Ñ.G�Ð"\÷ #ß“8Ü—I‘IÐmð  pBô  CØ×%×%Ó%Ü8;¸D×<]Ñ<]Ð_qÓ8r�DÔ5÷ &âð (*ˆMÜ%(£UˆLØ!×/Ô/�	Ø×-Ñ-¨iÓ8�Ø˜|Ô+ÙØ×*Ñ*×.Ñ.¨xÓ8�Ø’; #§(¡(Ð2OÔ"OÙØ 4§;¡;Ô.ÙØ× Ñ  Ô*Ø×$Ñ$ XÖ.ñ 0÷ !Ø /�à+-ÐØ)+ˆOØ57Ð ä$�Ø×*Ñ*×.Ñ.¨sÓ3�Ø’; #§(¡(Ð2OÔ"OØ#×*Ñ*¨3Ô/ÙØ—[‘[—_‘_ SÓ)�Ø’:Ø#×*Ñ*¨3Ô/Ùß“8Ü—I‘IÐIÈ3ÔOØ—Y‘Y—[•[ß“xÜŸ	™	Ð"KÈSÔQØ#×?Ñ?ÀÀSÓI�HØÒ+Ø4<Ð,¨SÑ1÷ !ð "×(Ñ(¨×-ñ# %÷& %¯«Ü—	‘	Ð[Ð]lÔmä—’“ˆBØ×)Ñ)ˆJß Ø—’ 1Õ$•Ø#%�Ô Ü#×1Ò1°"¼¿¹ÔF×PÑPÓRˆLØÒ!Ø 4‘à˜z�/�Ø"1°'¸#°¸cÀ'ÈDÅ.ÐQTÐAUÐUXÐ Y�àˆDß ð
Ø×7Ñ7Ó9�DØ4E�DÐ0Ñ1Ø×.Ñ.¨tÔ4ð ×!×!Ó!Ø"×7Ñ7�Ü! +¬t×4Ò4Ü"&§-¡-°¸QÓ"?�KØ0;�DÔ-Û,�CØ—O‘O C¨Ö.ñ -ã*�CØ—O‘O C¨Ö.ñ +ä47¸×8YÑ8YÐ[mÓ4n�Ô1ß“3ÑC¨k×.@Ñ.@Ô.BÓC—3—3’3ÑC¨k×.@Ñ.@Ô.BÓC×CÒCØ—N‘N×&Ñ&Ô(÷ "÷ !Ò Ø#×8Ñ8Ð9JÓK�ðØ%)§Y¡YÐ/@Ó%A�NÜ—H‘HØ*¨2°­7°3¨-°yÀÇÁÐ@QÐQVÐWcÐVdÐdnÐo}Ðn~ð  Fð  GSð  FTð  TVð  Wdð  Veð  efð  gô÷  “xÜŸ	™	ØqØ  Õ,Ø  Õ,Ø ŸH™HÐ%8Ó9Ø0÷ò  ÷Q *×)Ð)ú÷ "×!Ð!ú÷6 *×)Ð)ûô õ ðÜ—H‘HÐAÀ!ÁÐGÕHøÜ ô Ùðúð œt D×$8Ñ$8×$=Ñ$=Ó$?Ó@ØÈT×MaÑMa×MfÑMfÔMhÓ iÑMhÈ D×$9Ñ$9×$=Ñ$=¸aÀÓ$CÒ!CÒMhùÔ iØ ×!:Ñ!:ØÐPT×PdÑPd×PiÑPiÔPkÓlÑPkÈ1 ¨×)=Ñ)=¸aÕ)@×)EÑ)EÐ FÒFÒPkùÔlØ¤§¡¨d×.BÑ.B×.GÑ.GÓ.IÈ1Ó MØÐPT×PdÑPd×PiÑPiÔPkÓlÑPkÈ1¤3 t×':Ñ':×'>Ñ'>¸qÀ"Ó'EÓ#FÒ FÒPkùÔlØ$ aØ#¤SÑ(V¸×9LÑ9L×9SÑ9SÔ9UÓ(VÓ%VØ §¡Ø  $×"2Ñ"2Øœ4Ÿ9š9›;Ø  $×"2Ñ"2ð–ûðú÷. &×%Ð%üò" #]øÜô 	:ðÜ—H‘HÐAÀ!ÁÐGÕHøÜ ô Ùðúä% dÐ,BÀBÓG�Ü˜k¬4×0Ò0Ü&,Ñ,`¸{×?PÑ?PÔ?RÓ,`Ó&`–Oä&,¨[Ó&9–Oûð	:ú÷ &×%Ð%ú÷L !—[�[ûô: !ô ðÜŸ™Ð#CÀAÁ5Ð!I×JÒJøÜ$ô Ü1Ø>¸q¹eÐC_Ð`gÑ_jÐk÷ö ûðþðú÷ "×!Ð!ûô8 !ô ðÜŸ™Ð#FÀqÁeÐ!L×MÓMøÜ$ô Ü1ØAÀ!ÁÐFbÐcjÑbmÐn÷÷ ûðþðús­  Ç01k*È"k*È.Ak*É?k*Êk*Ë%k>Ð8lÒl& Ò Al& Ô4tÕt3 Õ8A&t3 ×t.×5t.×;t3 Ø;wß>w ã7&w4 ä1B;yç/(yèyéAy+ ê.6y+ ë*k;	ë>l	ìl#	ì&tì3mítímítímíAtî%oï1tï4(pðAtñ/.ròA/tôtôt+	ô.t3 ô3w	ô?uõwõu'õ$wõ&u'õ'Awö3w÷w	÷w	÷ w1÷4yø xøyø*yø=yùyùyùyùy(	ù+{ù7zú{ú"{ ú5{û {û{û{c                	ó   € \        R R7       R# )F)r«  N)r   r;   s   &r"   Ú_empty_all_cachesÚ"DeviceThreadPool._empty_all_cachesh  s
   € Ü ×'r$   )&rš  r›  r¨  r§  r¦  r«  r¬  r‚  r‘  r�  r–  ræ  rž  r¢  r—  rÁ  r   r¿  r¤  r  rœ  r�  r™  rÂ  r¡  r£  rÀ  rŽ  r½  r”  r¥  r’  r“  r˜  r•  r´  r�  rª  r7   )NN)T)5r?   r@   rA   rB   rž   r�   Ústaticmethodr®  r¾  rò  rµ  r©  r  r¸  r	  r   r9  r=  rH  r'   rŸ   rL  rQ  rW  r\  r‡   r  rƒ  r‡  r¶  r/  r'  r·  r[  ru  r¦  r±  r»  rÃ  rÌ  rÔ  r2  r3  r  r  r(  rH  rN  rV  r`  rÄ  r‹  rC   r    r$   r"   rg  rg  U  s  † ññsUð "ð	sUð
 !ðsUð !ðsUð !ðsUð !ðsUð  %ðsUð 48ðsUð $&ðsUð -1ðsUð &*ðsUð *-ðsUð !&ðsUð  ).÷!sUð sUðn ôó ðõ$õ"õ(IðV ôó ðõ ÷Bõ0Kð$ð 26÷ð:)ð 26÷)ðVð 26÷÷)EðV ×Ññ%ó ð%õ.õ%÷N
!ñ"=ð ÷	=ð =õB	õ:õ)õ"õõ0-õ õ"/÷b4õEõ#ð$ ôó ðõõ*&0õP:õSõ õ 3!õn# õJ2õh$0òX$õBõ&Dò8xöt(r$   rg  )DÚ
__future__r   r'   r.  r  r*   rz   r¬  rP  Úconcurrent.futuresr   Údataclassesr   r   r   Úenumr   Útypingr	   r
   r   r   r   r   r   r   r   r   Ú
device_smir   r)   r‹  r   Úutilsr­  Ú	utils.ctxr   Úutils.device_telemetryr   Úutils.loggerr   Úutils.torchr   r   r¯   r.   r   r]   r2   rU   rG   r/   rF   rR   r^   rŸ   rg   rk   ru   rw   rv  r¡   rÁ   rË   rØ   r÷   rX  rg  r    r$   r"   Ú<module>r™     ss  ðõ #ã Û 	Û Û 
Û Û Û Ý %Ý !ß 'Ý ß S× SÕ Sã ðÝ!õ Ý (Ý Ý =Ý 'ß 8ñ ƒn€õð �3˜˜UŸ\™\Ð)Õ*€
Ø�U—\‘\ ;Ð/°Ð5Õ6€ô��Tô ñ �$Ô÷(ð (ó ð(õõð* ×Ñôó ðõ,%õ"÷N ñ N ôb�×2Ñ2ô ô,�Z×6Ñ6ô ô,7�:×4Ñ4ô 7÷$0ñ 0÷pq2ñ q2÷h1ñ 1÷vT(ó T(øðw ô ØƒFðús   ÁF  Æ 	FÆF