o
    i                     @   sL   d dl Z d dlZd dlmZ G dd ded ZG dd deeef Z	dS )    N)Anyc                   @   s`   e Zd ZedejfddZedeeeee	f f fddZ
edeeee	f  fdd	Zd
S )ParameterSweepfilepathc                 C   sR   t |d}t|}W d    n1 sw   Y  t|tr$| |S | |S )Nrb)openjsonload
isinstancedictread_from_dictfrom_records)clsr   fdata r   W/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/benchmarks/sweep/param_sweep.py	read_json	   s   


zParameterSweep.read_jsonr   c                 C   s   dd |  D }| |S )a  
        Read parameter sweep from a dict format where keys are names.

        Example:
            {
                "experiment1": {"max_tokens": 100, "temperature": 0.7},
                "experiment2": {"max_tokens": 200, "temperature": 0.9}
            }
        c                 S   s   g | ]
\}}d |i|qS _benchmark_namer   ).0nameparamsr   r   r   
<listcomp>       z1ParameterSweep.read_from_dict.<locals>.<listcomp>)itemsr   )r   r   recordsr   r   r   r      s   
zParameterSweep.read_from_dictr   c                    sz   t |tstdt| dd |D   r4t tt kr4 fdd D }tdt| d| dd |D S )	NzFThe parameter sweep should be a list of dictionaries, but found type: c                 S   s   g | ]
}d |v r|d  qS r   r   )r   rr   r   r   r   +   r   z/ParameterSweep.from_records.<locals>.<listcomp>c                    s   g | ]}  |d kr|qS )   )count)r   r   namesr   r   r   -   s    z(Duplicate _benchmark_name values found: z,. All _benchmark_name values must be unique.c                 s   s    | ]}t |V  qd S N)ParameterSweepItemfrom_record)r   recordr   r   r   	<genexpr>3   s    z.ParameterSweep.from_records.<locals>.<genexpr>)r	   list	TypeErrortypelenset
ValueError)r   r   
duplicatesr   r   r   r   "   s   
zParameterSweep.from_recordsN)__name__
__module____qualname__classmethodosPathLiker   r
   strobjectr   r&   r   r   r   r   r   r      s    
  r   r"   c                       s   e Zd Zedeeef fddZdeeef f fddZ	e
defdd	Zd
efddZd
efddZd
efddZd
edefddZdededee fddZdee dee fddZddedefddZ  ZS )r"   r$   c                 C   s$   t |tstdt| | |S )NzIEach item in the parameter sweep should be a dictionary, but found type: )r	   r
   r'   r(   )r   r$   r   r   r   r#   7   s   
zParameterSweepItem.from_recordotherc                    s   t | t |S r!   )r(   super__or__)selfr5   	__class__r   r   r7   A   s   zParameterSweepItem.__or__returnc                 C   s    d| v r
t | d S | jddS )z
        Get the name for this parameter sweep item.

        Returns the '_benchmark_name' field if present, otherwise returns a text
        representation of all parameters.
        r   -)sep)r3   as_textr8   r   r   r   r   D   s   zParameterSweepItem.name	param_keyc                 c   sb    d|v r| dd\}}| |D ]	}|d | V  qd S |V  |ddV  |ddV  d S )N.r   r<   _)split_iter_param_key_candidatesreplace)r8   r@   prefixrestprefix_candidater   r   r   rD   R   s   z-ParameterSweepItem._iter_param_key_candidatesc                 c   s(    t t| |D ]}d| V  q
d S )Nz--)reversedtuplerD   )r8   r@   kr   r   r   _iter_cmd_key_candidates`   s   z+ParameterSweepItem._iter_cmd_key_candidatesc                 C   s   t | |S r!   )nextrL   r8   r@   r   r   r   _normalize_cmd_keyd   s   z%ParameterSweepItem._normalize_cmd_keyc                    s   t  fdd |D S )Nc                 3   s    | ]}| v V  qd S r!   r   )r   rK   r?   r   r   r%   h   s    z/ParameterSweepItem.has_param.<locals>.<genexpr>)anyrD   rN   r   r?   r   	has_paramg   s   zParameterSweepItem.has_paramrK   vc                 C   sd   t |tr)d|v r| | d|rd gS d gS | |r#|gS d| gS | |t|gS )a  
        Normalize a key-value pair into command-line arguments.

        Returns a list containing either:
        - A single element for boolean flags (e.g., ['--flag'] or ['--flag=true'])
        - Two elements for key-value pairs (e.g., ['--key', 'value'])
        rA   =truefalsezno-)r	   boolrO   r3   )r8   rK   rR   r   r   r   _normalize_cmd_kv_pairj   s
   
$z)ParameterSweepItem._normalize_cmd_kv_paircmdc              
   C   s   t |}|  D ]V\}}|dkrqt|trt|}| |D ]4}z)||}| ||}t	|dkr;|d ||< n|d ||< |d ||d < W  n t
yT   Y q w || || q|S )Nr   r   r   )r&   r   r	   r
   r   dumpsrL   indexrW   r)   r+   extend)r8   rX   rK   rR   k_candidatek_idx
normalizedr   r   r   apply_to_cmd{   s*   


zParameterSweepItem.apply_to_cmd, r=   c                 C   s   | dd |  D S )Nc                 s   s*    | ]\}}|d kr| d| V  qdS )r   rS   Nr   )r   rK   rR   r   r   r   r%      s   ( z-ParameterSweepItem.as_text.<locals>.<genexpr>)joinr   )r8   r=   r   r   r   r>      s   zParameterSweepItem.as_text)r`   )r-   r.   r/   r0   r
   r3   r4   r#   r   r7   propertyr   rD   rL   rO   rV   rQ   r&   rW   r_   r>   __classcell__r   r   r9   r   r"   6   s    	#)
r   r1   typingr   r&   r   r
   r3   r4   r"   r   r   r   r   <module>   s
   .