o
    piM                     @   sh   d Z ddlZddlZddlZddlZdi fdejeje  de	fddZ
G dd dZG d	d
 d
ZdS )z*
Non signal processing related utilities.
    Nattrs	overridesc           	      C   s   t | jj}g }|du rt| }|D ]=}d}||v r"|| }nt| |r-t| |}nq||v rD|| }|jt j	u sA||jkrCd}nd}|rR|
| d|  q| jj dd| dS )z
    Return a simple representation string for `obj`.
    If `attrs` is not None, it should be a list of attributes to include.
    NFT=(,))inspect	signature	__class__
parameterslistkeyshasattrgetattrdefault_emptyappend__name__join)	objr   r   params
attrs_reprattrdisplayvalueparam r   @/home/ubuntu/.local/lib/python3.10/site-packages/julius/utils.pysimple_repr   s*   

r   c                   @   s6   e Zd ZdZejfddZdd Zdd Zdd	 Z	d
S )MarkdownTablea9  
    Simple MarkdownTable generator. The column titles should be large enough
    for the lines content. This will right align everything.

    >>> import io  # we use io purely for test purposes, default is sys.stdout.
    >>> file = io.StringIO()
    >>> table = MarkdownTable(["Item Name", "Price"], file=file)
    >>> table.header(); table.line(["Honey", "5"]); table.line(["Car", "5,000"])
    >>> print(file.getvalue().strip())  # Strip for test purposes
    | Item Name | Price |
    |-----------|-------|
    |     Honey |     5 |
    |       Car | 5,000 |
    c                 C   s   || _ || _d S N)columnsfile)selfr!   r"   r   r   r   __init__:   s   
zMarkdownTable.__init__c                 C   s   | j dd| d  d S )N|z|
)r"   writer   )r#   liner   r   r   _writeln>   s   zMarkdownTable._writelnc                 C   s0   |  dd | jD  |  dd | jD  d S )Nc                 s   s    | ]	}d | d V  qdS ) Nr   .0colr   r   r   	<genexpr>B   s    z'MarkdownTable.header.<locals>.<genexpr>c                 s   s     | ]}d t |d  V  qdS )-   N)lenr*   r   r   r   r-   C   s    )r(   r!   r#   r   r   r   headerA   s   zMarkdownTable.headerc                 C   sP   g }t || jD ]\}}t|dtt| }|d| d  q| | d S )N>r)   )zipr!   formatstrr0   r   r(   )r#   r'   outvalr,   r   r   r   r'   E   s
   zMarkdownTable.lineN)
r   
__module____qualname____doc__sysstdoutr$   r(   r2   r'   r   r   r   r   r   +   s    r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Chronoa  
    Measures ellapsed time, calling `torch.cuda.synchronize` if necessary.
    `Chrono` instances can be used as context managers (e.g. with `with`).
    Upon exit of the block, you can access the duration of the block in seconds
    with the `duration` attribute.

    >>> with Chrono() as chrono:
    ...     _ = sum(range(10_000))
    ...
    >>> print(chrono.duration < 10)  # Should be true unless on a really slow computer.
    True
    c                 C   s
   d | _ d S r    )durationr1   r   r   r   r$   Z   s   
zChrono.__init__c                 C   s   t   | _| S r    )time_beginr1   r   r   r   	__enter__]   s   
zChrono.__enter__c                 C   s0   dd l }|j r|j  t | j | _d S )Nr   )torchcudais_availablesynchronizer@   rA   r?   )r#   exc_type	exc_valueexc_tracebckrC   r   r   r   __exit__a   s   

zChrono.__exit__N)r   r9   r:   r;   r$   rB   rJ   r   r   r   r   r>   M   s
    r>   )r;   r   typingtpr<   r@   OptionalSequencer6   dictr   r   r>   r   r   r   r   <module>   s   
"