o
    ۷i                     @   s*  d dl mZ d dlmZ d dlmZ d dlmZ 	ddede	e
 dee
ee
ef f dB d	eee
eegef f  fd
dZdedeee
ef  d	ee
ef fddZdeee
ef  d	ee
 fddZ		dde
dee
ef eee
ef  B dee
 de
dB de
d	e
fddZdee d	efddZdS )    )Callable)fields)Any)PrettyTableNclsexclude
transformsreturnc                 C   sx   |pi }g }t | D ]/}|j|v rq
|j|v r,||j \}}||||jfddf q
||j|jfddf q
|S )a  Auto-generate field definitions from a dataclass.

    Args:
        cls: The dataclass type to extract fields from.
        exclude: Set of field names to exclude from output.
        transforms: Optional mapping of field transformations.
            Format: {original_name: (display_name, transform_fn)}

    Returns:
        List of (display_name, getter_fn) tuples for table generation.
    c                 S   s   |t | |S Ngetattr)efnn r   M/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm_omni/metrics/utils.py<lambda>    s    z#_build_field_defs.<locals>.<lambda>c                 S   s
   t | |S r
   r   )r   r   r   r   r   r   "   s   
 )r   nameappend)r   r   r   resultfdisplay_nametransform_fnr   r   r   _build_field_defs   s   

r   evt
field_defsc                    s    fdd|D S )zBuild a row dict from an event object using field definitions.

    Args:
        evt:  The event object (dataclass instance).
        field_defs: List of (field_name, getter_fn) tuples.

    Returns:
        Dict mapping field names to their values.
    c                    s   i | ]	\}}|| qS r   r   ).0r   getterr   r   r   
<dictcomp>0   s    z_build_row.<locals>.<dictcomp>r   )r   r   r   r   r   
_build_row&   s   
r    c                 C   s   dd | D S )zExtract field names from field definitions.

    Args:
        field_defs: List of (field_name, getter_fn) tuples.

    Returns:
        List of field names.
    c                 S   s   g | ]\}}|qS r   r   )r   r   _r   r   r   
<listcomp><   s    z$_get_field_names.<locals>.<listcomp>r   )r   r   r   r   _get_field_names3   s   	r#    titledatavalue_fields
column_keycolumn_prefixc                    sJ  |sd|  dS dt dtfdd t }t|trZddg|_d	|jd< d
|jd< |D ].|v rXt| trM|  D ]\}}||  |g q=q*| | g q*n>du rbt	dfdd|D }dg| |_d	|jd< |D ]}	d
|j|	< qy|D ] fdd|D }
|g|
  qd
d|  d| gS )aq  Format a table for display.

    Supports two modes:
    1. Single-column mode:  data is a dict, displays as Field | Value
    2. Multi-column mode: data is a list of dicts, displays as Field | col1 | col2 | ...

    Args:
        title:  Table title.
        data: Either a single dict (single-column) or list of dicts (multi-column).
        value_fields: List of field names to display as rows.
        column_key: Key in each dict used as column header (required for multi-column mode).
        column_prefix: Optional prefix for column headers (multi-column mode only).

    Returns:
        Formatted table string.
    [z	] <empty>valuer	   c                 S   s\   t | tr	t| S t | tr| dS t | tr| dS t | tr*ddd | D S t| S )N,,.3fz, c                 s   s    | ]	}t |d V  qdS )r-   N)str)r   vr   r   r   	<genexpr>a   s    z7_format_table.<locals>._format_value.<locals>.<genexpr>)
isinstanceboolr.   intfloatlistjoin)r+   r   r   r   _format_valueY   s   



z$_format_table.<locals>._format_valueFieldValuelrNz,column_key is required for multi-column modec                    s    g | ]} |  d  qS )?get)r   row)r(   r)   r   r   r"   w   s     z!_format_table.<locals>.<listcomp>c                    s   g | ]
} | d qS )r$   r=   )r   r;   )r7   fieldr   r   r"   }   s    
])r   r.   r   r1   dictfield_namesalignitemsadd_row
ValueErrorr6   
get_string)r%   r&   r'   r(   r)   tablesub_key	sub_valuecol_headerscol
row_valuesr   )r7   r(   r)   r@   r   _format_table?   s8   





rP   engine_outputsc              	   C   sh   d}| D ]-}z"t |dd }|r't|dkr't |d dd }|d ur'|t|7 }W q ty1   Y qw |S )Nr   outputs	token_ids)r   len	Exception)rQ   total_rooutstokensr   r   r   count_tokens_from_outputs   s   rZ   r
   )Nr$   )collections.abcr   dataclassesr   typingr   prettytabler   typesetr.   rC   tupler5   r   r    r#   rP   r3   rZ   r   r   r   r   <module>   s@    
*"
D