
    h	?                       S SK Jr  S SKrS SKrS SKrS SKJr  S SKJrJ	r	  \" SS9S5S j5       r
 " S S	5      r\S
:X  Ga  S SKr\" S5        \" \" S5      SS9 H  r\R                   " S5        M     \" S5        \" SSSS9r\" S5       HK  r\R                   " S5        \R%                  S5        \S-  S:X  d  M1  \R'                  S\S-  S-    35        MM     \R)                  5         \" S5        \" SSS9r\" S5       HD  r\R                   " S5        \R%                  S5        \S-  S :X  d  M1  \R+                  \S-   S!S"9  MF     \R)                  5         \" S#5        \" S$S%S&S'S(9 r\" S)5       H)  r\R                   " S*5        \R%                  S+\-  5        M+     SSS5        \" S,5        S- r\" \" 5       S.S/S9 H  r\R                   " S*5        M     \" S05        S1 r\" S2SS9r\" 5       r\" \5       H=  u  rr\R                   " S35        \R%                  S5        \R'                  S4\ 35        M?     \R)                  5         gg! , (       d  f       N= f)6    )annotationsN)	lru_cache)IOAny   )maxsizec                 \    S[         R                  ;   =(       d    S[         R                  ;   $ )z5Check for known non-interactive console environments.GITHUB_ACTIONSRUNPOD_POD_ID)osenviron     P/home/james-whalen/.local/lib/python3.13/site-packages/ultralytics/utils/tqdm.pyis_noninteractive_consoler      s!     rzz)J_

-JJr   c                  D   \ rS rSrSrSrSrSrSr            S                         SS jjr	SS	 jr
SS
 jrSS jrS S!S jjrS"S jrS#S$S jjrS%S&S jjrS'S jrS(S jrS)S jrS*S jrS+S jrS,S jrS)S jrS)S jrS)S jr\S-S.S jj5       rSrg)/TQDM   a2  
Lightweight zero-dependency progress bar for Ultralytics.

Provides clean, rich-style progress bars suitable for various environments including Weights & Biases,
console outputs, and other logging systems. Features zero external dependencies, clean single-line output,
rich-style progress bars with Unicode block characters, context manager support, iterator protocol support,
and dynamic description updates.

Attributes:
    iterable (object): Iterable to wrap with progress bar.
    desc (str): Prefix description for the progress bar.
    total (int): Expected number of iterations.
    disable (bool): Whether to disable the progress bar.
    unit (str): String for units of iteration.
    unit_scale (bool): Auto-scale units flag.
    unit_divisor (int): Divisor for unit scaling.
    leave (bool): Whether to leave the progress bar after completion.
    mininterval (float): Minimum time interval between updates.
    initial (int): Initial counter value.
    n (int): Current iteration count.
    closed (bool): Whether the progress bar is closed.
    bar_format (str): Custom bar format string.
    file (object): Output file stream.

Methods:
    update: Update progress by n steps.
    set_description: Set or update the description.
    set_postfix: Set postfix for the progress bar.
    close: Close the progress bar and clean up.
    refresh: Refresh the progress bar display.
    clear: Clear the progress bar from display.
    write: Write a message without breaking the progress bar.

Examples:
    Basic usage with iterator:
    >>> for i in TQDM(range(100)):
    ...     time.sleep(0.01)

    With custom description:
    >>> pbar = TQDM(range(100), desc="Processing")
    >>> for i in pbar:
    ...     pbar.set_description(f"Processing item {i}")

    Context manager usage:
    >>> with TQDM(total=100, unit="B", unit_scale=True) as pbar:
    ...     for i in range(100):
    ...         pbar.update(1)

    Manual updates:
    >>> pbar = TQDM(total=100, desc="Training")
    >>> for epoch in range(100):
    ...     # Do work
    ...     pbar.update(1)
    >>> pbar.close()
g{Gz?g333333?i@B g      N@Nc                :   Uc*   SSK JnJn  U(       + =(       d    UR                  5       S:  nXl        U=(       d    SU l        U=(       d'    [        US5      (       a  [        U5      OS=(       d    SU l	        Xpl
        Xl        Xl        Xl        X@l        [        5       U l        U R                   (       a  [#        X`R$                  5      OUU l        Xl        Xl        U=(       d    [,        R.                  U l        U R(                  U l        U R(                  U l        [6        R6                  " 5       U l        [6        R6                  " 5       U l        SU l        SU l        U	=(       a    US	;   U l         U R@                  (       a  / S
QO4SSU R                   S34SSU R                   S34SSU R                   S34/U l!        U R                  (       d5  U R                  (       a#  U R                   (       d  U RE                  5         gggg! [         a    Sn GNf = f)a  
Initialize the TQDM progress bar with specified configuration options.

Args:
    iterable (object, optional): Iterable to wrap with progress bar.
    desc (str, optional): Prefix description for the progress bar.
    total (int, optional): Expected number of iterations.
    leave (bool, optional): Whether to leave the progress bar after completion.
    file (object, optional): Output file stream for progress display.
    mininterval (float, optional): Minimum time interval between updates (default 0.1s, 60s in GitHub Actions).
    disable (bool, optional): Whether to disable the progress bar. Auto-detected if None.
    unit (str, optional): String for units of iteration (default "it" for items).
    unit_scale (bool, optional): Auto-scale units for bytes/data units.
    unit_divisor (int, optional): Divisor for unit scaling (default 1000).
    bar_format (str, optional): Custom bar format string.
    initial (int, optional): Initial counter value.
    **kwargs (Any): Additional keyword arguments for compatibility (ignored).

Examples:
    >>> pbar = TQDM(range(100), desc="Processing")
    >>> with TQDM(total=1000, unit="B", unit_scale=True) as pbar:
    ...     pbar.update(1024)  # Updates by 1KB
Nr   )LOGGERVERBOSE   F __len__        )Bbytes))i   @zGB/s)   zMB/s)   zKB/sg    eAG/sg    .AMg     @@K)#ultralytics.utilsr   r   getEffectiveLevelImportErroriterabledeschasattrlentotaldisableunit
unit_scaleunit_divisorleaver   noninteractivemaxNONINTERACTIVE_MIN_INTERVALminintervalinitial
bar_formatsysstdoutfilenlast_print_ntimelast_print_tstart_t	last_rateclosedis_bytesscales_display)selfr'   r(   r+   r0   r9   r4   r,   r-   r.   r/   r6   r5   kwargsr   r   s                   r   __init__TQDM.__init__Q   s   P ? =%+H)A)A)Cb)H !JB	_)0L0Ls8}RV_[_
	$(
79QUQdQd3{,L,LMju %&CJJ	  LL IIKyy{"=t~'= }} F!DII;b)*SAdii[2C,DsaPTPYPY{Z\L]F^_ 	 ||

43F3FMMO 4G
|E    s   )H
 
HHc                   ^ TS::  a  gU R                   (       a  TS S3OTS U R                   S3n[        U4S jU R                   5       U5      $ )zFormat rate with units.r   r   .1fzB/sr!   c              3  L   >#    U  H  u  pTU:  d  M  TU-  S  U 3v   M     g7f)rI   Nr   ).0turates      r   	<genexpr>$TQDM._format_rate.<locals>.<genexpr>   s+     OkdaTQY)q~aS)ks   $$)rA   r-   nextrB   )rD   rN   fallbacks    ` r   _format_rateTQDM._format_rate   sM    19'+}}d3Zs#T#JtyykQS:TOdkkOQYZZr   c                    U R                   (       a  U R                  (       d  [        U5      $ S HC  n[        U5      U R                  :  a  U(       a
  US U S3s  $ US S3s  $ XR                  -  nME     US S3$ )z)Format number with optional unit scaling.)r   r#   r"   r    Tz3.1fr   .0frI   PB)r.   rA   strabsr/   )rD   numr-   s      r   _format_numTQDM._format_num   st    dmms8O,D3x$+++/3#dD6+FC9AF$$$C - c"~r   c                    US:  a  US S3$ US:  a  [        US-  5       SUS-  S 3$ [        US-  5      [        US-  S-  5      p2U SUS SUS-  S 3$ )zFormat time duration.<   rI   si  :z02.0f02d)int)rD   secondshms       r   _format_timeTQDM._format_time   s    R<c]!$$t^'R-()7R<*>??w$'gn-C)DqS!C'B,u!566r   c                   U R                   c  U R                  (       a  SU-  $ SU-  $ [        SU R                  U R                   -  5      n[	        X!-  5      nSU-  SX-
  -  -   nX1:  a  X!-  U-
  S:  a  USU  SXCS-   S  3nU$ )zGenerate progress bar.Nu   ━u   ─g      ?g      ?u   ╸r   )r+   r@   minr:   rc   )rD   widthfracfilledbars        r   _generate_barTQDM._generate_bar   s    ::$(KK55=BUU]B3+,T\"fnu77>dlV3c9&\N#c1*,&7%89C
r   c                    U R                   (       a  gU R                  SL=(       a    U R                  U R                  :  =(       d    XR                  :  $ )zCheck if display should update.FN)r1   r+   r:   r4   )rD   dtdns      r   _should_updateTQDM._should_update   s=    

$&?466TZZ+?\RK[K[E[\r   c                   U R                   (       d  U R                  (       a  U(       d  g[        R                  " 5       nX R                  -
  nU R                  U R
                  -
  nU(       d  U R                  X45      (       d  gX0R                  :  aZ  U(       a  XC-  OSnXPR                  :  a=  U R                  U-  SU R                  -
  U R                  -  -   U l
        U R                  nOU R                  nU R                  (       a=  U R                  U R                  :  a#  X R                  -
  nUS:  a  U R                  U-  nU R                  U l        X l        X R                  -
  nSnU R                  (       ap  SU R                  s=:  a  U R                  :  aO  O  OLUS:  aF  U=(       d    U R                  U-  n	SU R                  U R                  U R                  -
  U	-  5       3nU R                  (       a  U R                  U R                  -  S-  n
U R                  U R                  5      nU R                  U R                  5      nU R                  (       a  US   US   :X  a  UR!                  S	5      nOSn
U R                  U R                  5      S
pU R                  U5      nU R#                  U5      =(       d&    US:  a  U R#                  U R                  U-  5      OSnU R%                  5       nU R                  (       an  U R                  (       a9  U R                  U R                  :  a  U R&                   SU
S SU SU SU SU 3nO>U R&                   SU
S SU SU SU SU SU U 3nOU R&                   SU SU SU SU 3	n U R(                  (       a  U R*                  R-                  U5        OU R*                  R-                  SU 35        U R*                  R/                  5         g! [0         a     gf = f)zDisplay progress bar.Nr   r   r   r   <d   KMGTPB?z: rW   z%  /[K)r,   r@   r<   r=   r:   r;   rt   MIN_RATE_CALC_INTERVALMAX_SMOOTHED_RATERATE_SMOOTHING_FACTORr?   r+   r>   rg   r\   rA   rstriprS   ro   r(   r1   r9   writeflush	Exception)rD   finalcurrent_timerr   rs   rN   overall_elapsedelapsedremaining_strest_ratepercentn_strt_strelapsed_strrate_strrn   progress_strs                    r   rC   TQDM._display   si   <<DKKyy{---VVd'''T0088 +++ 27cD,,,!%!;!;d!Ba$JdJdFdhlhvhvEv!v~~>>D ::$&&DJJ.*\\9O"vv/ !FF(- ::!dff1tzz1gk1 0H 1 14::3F(2R STUM ::vv

*c1G$$TVV,E$$TZZ0E}}9b	)!LL2EG++DFF3S5''0$$T*jV]`aVat/@/@'AQ/Rgi  " ::}}4::!5"&))Bwsm2cU!E7!H:UVWbVcd yykGC=3%qqq
RST_S`an`op  #ii[3%qq
!K=QL		""		- 		(<. 9:IIOO 		s   A%O? ?
PPc                    U R                   (       d8  U R                  (       d&  U =R                  U-  sl        U R                  5         ggg)zUpdate progress by n steps.N)r,   r@   r:   rC   )rD   r:   s     r   updateTQDM.update"  s,    ||DKKFFaKFMMO %0|r   c                h    U=(       d    SU l         U R                  (       d  U R                  5         gg)zSet description.r   N)r(   r,   rC   )rD   r(   s     r   set_descriptionTQDM.set_description(  s"    JB	||MMO r   c                    U(       aw  SR                  S UR                  5        5       5      nSU R                  ;   a  U R                  R                  S5      S   OU R                  nU R	                  U SU 35        gg)z%Set postfix (appends to description).z, c              3  4   #    U  H  u  pU S U 3v   M     g7f)=Nr   )rK   kvs      r   rO   #TQDM.set_postfix.<locals>.<genexpr>1  s     F~tq1#Qqc
~s   z | r   N)joinitemsr(   splitr   )rD   rE   postfix	base_descs       r   set_postfixTQDM.set_postfix.  se    iiFv||~FFG5:dii5G		.q1TYYI  I;c'!;< r   c                   U R                   (       a  gSU l         U R                  (       d  U R                  (       a+  U R                  U R                  :  a  U R                  U l        U R	                  SS9  U R
                  (       a  U R                  R                  S5        OU R                  R                  S5         U R                  R                  5         gg! [         a     gf = f)zClose progress bar.NT)r   
r~   )
r@   r,   r+   r:   rC   r0   r9   r   r   r   rD   s    r   close
TQDM.close5  s    ;;||zzdff

2MMM% zz		%		
+		!   s   ?C 
C('C(c                    U $ )zEnter context manager.r   r   s    r   	__enter__TQDM.__enter__M  s    r   c                $    U R                  5         g)z,Exit context manager and close progress bar.N)r   )rD   argss     r   __exit__TQDM.__exit__Q  s    

r   c              #     #    U R                   c  [        S5      e U R                    H  nUv   U R                  S5        M     U R                  5         g! U R                  5         f = f7f)z8Iterate over the wrapped iterable with progress updates.Nz!'NoneType' object is not iterabler   )r'   	TypeErrorr   r   )rD   items     r   __iter__TQDM.__iter__U  sR     == ?@@	
A & JJLDJJLs   A*(A A*A''A*c                F     U R                  5         g! [         a     gf = f)zDestructor to ensure cleanup.N)r   r   r   s    r   __del__TQDM.__del__a  s"    	JJL 		s    
  c                H    U R                   (       d  U R                  5         gg)zRefresh display.N)r,   rC   r   s    r   refreshTQDM.refreshh  s    ||MMO r   c                    U R                   (       d7   U R                  R                  S5        U R                  R                  5         gg! [         a     gf = f)zClear progress bar.r~   N)r,   r9   r   r   r   r   s    r   clear
TQDM.clearm  sE    ||		
+		!   s   5A
 

AAc                    U=(       d    [         R                  n UR                  X-   5        UR                  5         g! [         a     gf = f)z5Static method to write without breaking progress bar.N)r7   r8   r   r   r   )r`   r9   ends      r   r   
TQDM.writev  s@     !szz	JJqwJJL 		s   #? 
AA)r6   r@   r(   r,   r9   r5   rA   r'   r;   r=   r?   r0   r4   r:   r1   rB   r>   r+   r-   r/   r.   )NNNTN皙?NitTi  Nr   )r'   r   r(   
str | Noner+   z
int | Noner0   boolr9   IO[str] | Noner4   floatr,   zbool | Noner-   rY   r.   r   r/   rc   r6   r   r5   rc   returnNone)rN   r   r   rY   )r[   zint | floatr   rY   )rd   r   r   rY   )   )rk   rc   r   rY   )rr   r   rs   rc   r   r   )F)r   r   r   r   )r   )r:   rc   r   r   )r(   r   r   r   )rE   r   r   r   )r   r   )r   r   )r   r   r   r   )r   r   )Nr   )r`   rY   r9   r   r   rY   r   r   )__name__
__module____qualname____firstlineno____doc__r   r   r   r3   rF   rS   r\   rg   ro   rt   rC   r   r   r   r   r   r   r   r   r   r   staticmethodr   __static_attributes__r   r   r   r   r      sD   6r ""&  # # !%PP P 	P
 P P P P P P P P P 
Pd[	7
]Ob=0

  r   r   __main__z'1. Basic progress bar with known total:   zKnown total)r(   g?z$
2. Manual updates with known total:i,  zManual updatesfiles)r+   r(   r-   gQ?
   	   zProcessing batch z$
3. Progress bar with unknown total:zUnknown totalr   )r(   r-      g{Gz?      OK)	processedstatusz'
4. Context manager with unknown total:zProcessing streamr   Tr   )r(   r-   r.   r/      r   r   z!
5. Iterator with unknown length:c               #  f   #    SSK n [        U R                  SS5      5       H
  nSU 3v   M     g7f)z)Simulate a data stream of unknown length.r   Nr   r   data_chunk_)randomrangerandint)r   is     r   data_streamr     s/     v~~b"-.As## /s   /1zStream processingchunksz.
6. File processing simulation (unknown size):c                 L    [        S5       V s/ s H	  n SU  S3PM     sn $ s  sn f )z+Simulate processing files of unknown count.r   file_z.txt)r   )r   s    r   process_filesr     s&    ).r3A%s$333s   !zScanning filesgQ?zProcessing )r   r   )
__future__r   r   r7   r<   	functoolsr   typingr   r   r   r   r   printr   r   sleeppbarr   r   r   r   r   chunkr   r   	enumeratefilenamer   r   r   <module>r      sQ   # 	 
    1K K
l l^ z	
34%(/

4 0 

12c 0w?D3Z

4Ar6Q;  #4Q"Wq[M!BC	 
 	JJL	
12_73D2Y

4Aq5A:q1uT:	 
 	JJL	
45	&STPT	UY]rAJJsOKKa(  
V
 

./$ km*=HM

3 N 

;<4 %G4DOE '8

4A{8*56 ( 	JJLo 4 
V	Us   )6I
I