
    .h	?                       d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	  ed      d5d       Z
 G d d	      Zed
k(  rd dlZ ed        e ed      d      D ]  Z ej                   d         ed        eddd      Z ed      D ]H  Z ej                   d       ej%                  d       edz  dk(  s/ej'                  dedz  dz           J ej)                           ed        edd      Z ed      D ]D  Z ej                   d       ej%                  d       edz  d k(  s/ej+                  edz   d!"       F ej)                           ed#        ed$d%d&d'(      5 Z ed)      D ](  Z ej                   d*       ej%                  d+ez         * 	 ddd        ed,       d- Z e e       d.d/      D ]  Z ej                   d*         ed0       d1 Z ed2d      Z e       Z ee      D ]<  \  ZZ ej                   d3       ej%                  d       ej'                  d4e        > ej)                          yy# 1 sw Y   xY w)6    )annotationsN)	lru_cache)IOAny   )maxsizec                 N    dt         j                  v xs dt         j                  v S )z5Check for known non-interactive console environments.GITHUB_ACTIONSRUNPOD_POD_ID)osenviron     T/var/www/html/ai-service/venv/lib/python3.12/site-packages/ultralytics/utils/tqdm.pyis_noninteractive_consoler      s!     rzz)J_

-JJr   c                     e Zd ZdZdZdZdZdZ	 	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZ	dd	Z
dd
ZdddZd dZd!d"dZd#d$dZd%dZd&dZd'dZd(dZd)dZd*dZd'dZd'dZd'dZed+d,d       Zy)-TQDMa  
    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                   |!	 ddl m}m} | xs |j                         dkD  }|| _        |xs d| _        |xs t        |d      rt        |      ndxs d| _	        || _
        || _        |	| _        |
| _        || _        t               | _        | j                   rt#        || j$                        n|| _        || _        || _        |xs t,        j.                  | _        | j(                  | _        | j(                  | _        t7        j6                         | _        t7        j6                         | _        d| _        d| _        |	xr |d	v | _         | j@                  rg d
n4dd| j                   dfdd| j                   dfdd| j                   dfg| _!        | j                  s+| j                  r| j                   s| jE                          yyyy# t        $ r d}Y w xY w)ab  
        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*   r/   r8   r3   r+   r,   r-   r.   r5   r4   kwargsr   r   s                   r   __init__zTQDM.__init__Q   s   P ? =%+H)A)A)Cb)H !JB	_)0Ls8}RV_[_
	$(
79QUQdQd3{D,L,LMju %&CJJ	  LL IIKyy{"=t~'= }} F!DII;b)*SAdii[2C,DsaPTPYPY{Z\L]F^_ 	 ||

43F3FMMO 4G
|E    s    G GGc                    dk  ry| j                   rddnd| j                   d}t        fd| j                  D        |      S )zFormat rate with units.r   r   .1fzB/sr    c              3  D   K   | ]  \  }}|k\  s|z  d |   yw)rG   Nr   ).0turates      r   	<genexpr>z$TQDM._format_rate.<locals>.<genexpr>   s*     OdaTQYq~aS)Os     )r@   r,   nextrA   )rC   rL   fallbacks    ` r   _format_ratezTQDM._format_rate   sM    19'+}}d3Zs#T#JtyykQS:TOdkkOQYZZr   c                    | j                   r| j                  st        |      S dD ]=  }t        |      | j                  k  r|r
|d| dc S |ddc S || j                  z  }? |ddS )z)Format number with optional unit scaling.)r   r"   r!   r   Tz3.1fr   .0frG   PB)r-   r@   strabsr.   )rC   numr,   s      r   _format_numzTQDM._format_num   s{    dmms8O, 	%D3x$+++/3#dD6+FC9AF4$$$C	% c"~r   c                    |dk  r|ddS |dk  rt        |dz         d|dz  dS t        |dz        t        |dz  dz        }}| d|dd|dz  dS )zFormat time duration.<   rG   si  :z02.0f02d)int)rC   secondshms       r   _format_timezTQDM._format_time   s    R<c]!$$t^'R-()7R<*>??w$'gn-C)DqAS!C'B,u!566r   c                   | j                   | j                  rd|z  S d|z  S t        d| j                  | j                   z        }t	        ||z        }d|z  d||z
  z  z   }||k  r||z  |z
  dkD  r|d|  d||dz   d  }|S )zGenerate progress bar.Nu   ━u   ─g      ?g      ?u   ╸r   )r*   r?   minr9   r^   )rC   widthfracfilledbars        r   _generate_barzTQDM._generate_bar   s    ::$(KK55=BUU]B3+,TE\"fnu77E>dUlV3c9&\N#c&1*,&7%89C
r   c                    | j                   ry| j                  duxr | j                  | j                  k\  xs || j                  k\  S )zCheck if display should update.FN)r0   r*   r9   r3   )rC   dtdns      r   _should_updatezTQDM._should_update   s?    

$&?466TZZ+?\R4K[K[E[\r   c                   | j                   s| j                  r|syt        j                         }|| j                  z
  }| j                  | j
                  z
  }|s| j                  ||      sy|| j                  kD  rV|r||z  nd}|| j                  k  rJ| j                  |z  d| j                  z
  | j                  z  z   | _
        | j                  }n| j                  }| j                  r<| j                  | j                  k\  r#|| j                  z
  }|dkD  r| j                  |z  }| j                  | _        || _        || j                  z
  }d}| j                  rhd| j                  cxk  r| j                  k  rIn nF|dkD  rA|xs | j                  |z  }	d| j                  | j                  | j                  z
  |	z         }| j                  r{| j                  | j                  z  dz  }
| j                  | j                        }| j                  | j                        }| j                  r<|d   |d   k(  r1|j!                  d	      }nd}
| j                  | j                        d
}}| j                  |      }| j#                  |      xs% |dkD  r| j#                  | j                  |z        nd}| j%                         }| j                  rh| j                  r8| j                  | j                  k\  r| j&                   d|
dd| d| d| d| }n>| j&                   d|
dd| d| d| d| d| | }n| j&                   d| d| d| d| 	}	 | j(                  r| j*                  j-                  |       n| j*                  j-                  d|        | j*                  j/                          y# t0        $ r Y yw xY w)zDisplay progress bar.Nr   r   r   r   <d   KMGTPB?z: rS   z%  /[K)r+   r?   r;   r<   r9   r:   rm   MIN_RATE_CALC_INTERVALMAX_SMOOTHED_RATERATE_SMOOTHING_FACTORr>   r*   r=   rb   rX   r@   rstriprP   ri   r'   r0   r8   writeflush	Exception)rC   finalcurrent_timerk   rl   rL   overall_elapsedelapsedremaining_strest_ratepercentn_strt_strelapsed_strrate_strrh   progress_strs                    r   rB   zTQDM._display   sv   <<DKKyy{D---VVd'''T00R8 +++ 27cDd,,,!%!;!;d!Ba$JdJdFdhlhvhvEv!v~~>>D ::$&&DJJ.*T\\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3S5E''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 N2 2	N>=N>c                    | j                   s3| j                  s&| xj                  |z  c_        | j                          yyy)zUpdate progress by n steps.N)r+   r?   r9   rB   )rC   r9   s     r   updatezTQDM.update"  s,    ||DKKFFaKFMMO %0|r   c                T    |xs d| _         | j                  s| j                          yy)zSet description.r   N)r'   r+   rB   )rC   r'   s     r   set_descriptionzTQDM.set_description(  s"    JB	||MMO r   c                    |rudj                  d |j                         D              }d| j                  v r| j                  j                  d      d   n| j                  }| j	                  | d|        yy)z%Set postfix (appends to description).z, c              3  0   K   | ]  \  }}| d |   yw)=Nr   )rI   kvs      r   rM   z#TQDM.set_postfix.<locals>.<genexpr>1  s     Ftq!1#Qqc
Fs   z | r   N)joinitemsr'   splitr   )rC   rD   postfix	base_descs       r   set_postfixzTQDM.set_postfix.  se    iiFv||~FFG5:dii5G		.q1TYYI  I;c'!;< r   c                   | j                   ryd| _         | j                  s| j                  r*| j                  | j                  k\  r| j                  | _        | j	                  d       | j
                  r| j                  j                  d       n| j                  j                  d       	 | j                  j                          yy# t        $ r Y yw xY w)zClose progress bar.NT)r~   
rv   )
r?   r+   r*   r9   rB   r/   r8   r{   r|   r}   rC   s    r   closez
TQDM.close5  s    ;;||zzdff

2MMM% zz		%		
+		!   s   -C	 		CCc                    | S )zEnter context manager.r   r   s    r   	__enter__zTQDM.__enter__M  s    r   c                $    | j                          y)z,Exit context manager and close progress bar.N)r   )rC   argss     r   __exit__zTQDM.__exit__Q  s    

r   c              #     K   | j                   t        d      	 | j                   D ]  }| | j                  d        	 | j                          y# | j                          w xY ww)z8Iterate over the wrapped iterable with progress updates.Nz!'NoneType' object is not iterabler   )r&   	TypeErrorr   r   )rC   items     r   __iter__zTQDM.__iter__U  sX     == ?@@	 
A JJLDJJLs   A(&A A(A%%A(c                D    	 | j                          y# t        $ r Y yw xY w)zDestructor to ensure cleanup.N)r   r}   r   s    r   __del__zTQDM.__del__a  s"    	JJL 		s    	c                >    | j                   s| j                          yy)zRefresh display.N)r+   rB   r   s    r   refreshzTQDM.refreshh  s    ||MMO r   c                    | j                   s7	 | j                  j                  d       | j                  j                          yy# t        $ r Y yw xY w)zClear progress bar.rv   N)r+   r8   r{   r|   r}   r   s    r   clearz
TQDM.clearm  sE    ||		
+		!   s   5A 	AAc                    |xs t         j                  }	 |j                  | |z          |j                          y# t        $ r Y yw xY w)z5Static method to write without breaking progress bar.N)r6   r7   r{   r|   r}   )r[   r8   ends      r   r{   z
TQDM.writev  sB     !szz	JJq3wJJL 		s   $; 	AA)NNNTN皙?NitTi  Nr   )r&   r   r'   
str | Noner*   z
int | Noner/   boolr8   IO[str] | Noner3   floatr+   zbool | Noner,   rU   r-   r   r.   r^   r5   r   r4   r^   returnNone)rL   r   r   rU   )rW   zint | floatr   rU   )r_   r   r   rU   )   )re   r^   r   rU   )rk   r   rl   r^   r   r   )F)r~   r   r   r   )r   )r9   r^   r   r   )r'   r   r   r   )rD   r   r   r   )r   r   )r   r   )r   r   r   r   )r   r   )Nr   )r[   rU   r8   r   r   rU   r   r   )__name__
__module____qualname____doc__rw   ry   rx   r2   rE   rP   rX   rb   ri   rm   rB   r   r   r   r   r   r   r   r   r   r   staticmethodr{   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               #  b   K   ddl } t        | j                  dd            D ]	  }d|   yw)z)Simulate a data stream of unknown length.r   Nr   r   data_chunk_)randomrangerandint)r   is     r   data_streamr     s5     v~~b"-. 	$As##	$s   -/zStream processingchunksz.
6. File processing simulation (unknown size):c                 F    t        d      D  cg c]  } d|  d
 c} S c c} w )z+Simulate processing files of unknown count.   file_z.txt)r   )r   s    r   process_filesr     s"    ).r3A%s$333s   zScanning filesgQ?zProcessing )r   r   )
__future__r   r   r6   r;   	functoolsr   typingr   r   r   r   r   printr   r   sleeppbarr   r   r   r   r   chunkr   r   	enumeratefilenamer   r   r   <module>r      s   # 	 
    1K K
l l^ z	
34%(/ 

4 

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

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

4Aq5A:q1uT:	;
 	JJL	
45	&STPT	U )Y]r 	)ADJJsOKKa(	))
 

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

3 

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

4A{8*567 	JJLo 4) )s   /4II