o
    i3                     @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZ ddlmZmZmZmZmZ ddlmZ ddlmZmZmZmZmZ ddlZddlmZ ddlmZ dd	l mZ! dd
l m"Z" ddl#m$Z$m%Z% ddl&m'Z' e'e(Z)erddl*m+Z+ neZ+e,e+ Z-ede+dZ.e$e!fd	d?ddde,e. dB dedB dede,e. e	e,e. ge,e. f B fddZ/de-de0defddZ1de-de0de2fddZ3de.de.fddZ4			d@d e5d!ee0 d"edB d#e	g ef dB d$e2defd%d&Z6de,e de7e0e0f fd'd(Z8e%G d)d* d*eZ9G d+d, d,eZ:de.d-e7e0ef de.fd.d/Z;d0d1 Z<de.d2e=e0 de7e0e5f fd3d4Z>d5e7e0e5f de0fd6d7Z?eG d8d9 d9Z@de.d:e0d;e0eAe0 B d<e0ddf
d=d>ZBdS )Az.Utility functions for vLLM config dataclasses.    N)CallableMappingSequenceSet)MISSINGFieldfieldfieldsis_dataclass)pairwise)TYPE_CHECKINGAnyProtocolTypeVarcast)
ConfigDict	dataclass)r   )	FieldInfo)dataclass_transformruntime_checkable)init_logger)DataclassInstanceConfigT)bound)field_specifiers)configclsr   kwargsreturnc                   s>   t dd|dur|  fdd}| du r|S || S )a  Decorator to create a pydantic dataclass with default config. The default config
    for the dataclass forbids extra fields.

    All config classes in vLLM should use this decorator.

    Args:
        cls: The class to decorate
        config: The pydantic ConfigDict to use. If provided, it will be merged with
            the default config.
        **kwargs: Additional arguments to pass to pydantic.dataclass.forbid)extraNc                    s   t | fdi S )Nr   r   r   r   merged_config G/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/config/utils.py	decorator;   s   zconfig.<locals>.decorator)r   update)r   r   r   r'   r%   r#   r&   r   %   s   

namec              
      s   t | stdzt fddt| D }W n ty0 } ztd  d| j d|d}~ww |j}|j}|j	}t
|tr\|j	durG|j	}|jdurYttg tf |j}t}n|j}|tu rl|tu rltd| j  t|||d	S )
zrGet the default factory field of a dataclass by name. Used for getting
    default factory fields in `EngineArgs`.z#The given class is not a dataclass.c                 3   s    | ]
}|j  kr|V  qd S Nr)   .0fr+   r%   r&   	<genexpr>K   s    zget_field.<locals>.<genexpr>zField 'z' not found in .Nz(%s.%s has no default or default factory.)defaultdefault_factoryinit)r
   	TypeErrornextr	   StopIteration
ValueError__name__r1   r2   r3   
isinstancer   r   r   r   r   loggerwarning_oncer   )r   r)   named_fielder1   r2   r3   r%   r+   r&   	get_fieldE   s.   


r>   c                 C   s   t | |jS r*   )r>   r3   )r   r)   r%   r%   r&   is_init_fielde      r?   dataclass_instancec                   s<   t |  | j} fdd| D }||  di |S )zLike [`dataclasses.replace`](https://docs.python.org/3/library/dataclasses.html#dataclasses.replace),
    but compatible with Pydantic dataclasses which use `pydantic.fields.Field` instead
    of `dataclasses.field`c                    s    i | ]\}}t  |r||qS r%   )r?   r-   kvr"   r%   r&   
<dictcomp>o   s     zreplace.<locals>.<dictcomp>Nr%   )type__dict__itemsr(   )rA   r   dataclass_dictr%   r"   r&   replacei   s
   
rJ   Fobjectnamesr1   r2   warnc                 C   sb   t |D ]#\}}t| |r'|r |dkr tdt| j||d  t| |  S q|dur/| S |S )a  
    A helper function that retrieves an attribute from an object which may
    have multiple possible names. This is useful when fetching attributes from
    arbitrary `transformers.PretrainedConfig` instances.

    In the case where the first name in `names` is the preferred name, and
    any other names are deprecated aliases, setting `warn=True` will log a
    warning when a deprecated name is used.
    r   zc%s contains a deprecated attribute name '%s'. Please use the preferred attribute name '%s' instead.N)	enumeratehasattrr:   r;   rF   r8   getattr)rK   rL   r1   r2   rM   ir)   r%   r%   r&   getattr_itert   s   

rR   c                 C   s   t tt| jd }t|t jst	di }t
|jD ]G\}}t|t jt jfr@t|t jr@t|jt jr@t|jjtsAqt|jj}t|t jrQ|jn|jg}|D ]}t|t js`qW|||j< qWq|S )zw
    Get any docstrings placed after attribute assignments in a class body.

    https://davidism.com/mit-license/
    r   zGiven object was not a class.)astparsetextwrapdedentinspect	getsourcebodyr9   ClassDefr4   r   Assign	AnnAssignExprvalueConstantstrcleandoctargetstargetNameid)r   cls_nodeoutabdocrb   rc   r%   r%   r&   get_attr_docs   s,   
rk   c                   @   s   e Zd ZdefddZdS )SupportsHashr   c                 C      d S r*   r%   selfr%   r%   r&   compute_hash       zSupportsHash.compute_hashN)r8   
__module____qualname__r`   rp   r%   r%   r%   r&   rl      s    rl   c                   @   s"   e Zd Zdeeef fddZdS )SupportsMetricsInfor   c                 C   rm   r*   r%   rn   r%   r%   r&   metrics_info   rq   z SupportsMetricsInfo.metrics_infoN)r8   rr   rs   dictr`   ru   r%   r%   r%   r&   rt      s    rt   	overridesc                 C   s   i }|  D ]F\}}t| |sJ t|  d| dt| |}t|rHt|sHt|tsCJ dt|  d| dt| dt| t||}|||< qt| fi |S )Nz has no field ``zOverrides to r0   z must be a dict  or z
, but got )	rH   rO   rF   rP   r
   r9   rv   update_configrJ   )r   rw   processed_overrides
field_namer^   current_valuer%   r%   r&   ry      s(   

ry   c                    s    du st  ttttfr S t  tjr' jj d jj	 }|t
 jfS t  trLt dd}t dt dd}ddd ||fD pKt S t d	r]tt d	dr]  S t retd
t  tjrot S t  ttfrz  S t  tjrz	t   W S  ty   t  Y S w t r jj d jj	 }t fddt t! dd dD }||fS t  t"rtt dd  # D S t  t$rtt dd  D S t  t%rt  tttfstdd  D S t drt j&r & S tdt j' d)zReturn a stable, JSON-serializable canonical form for hashing.
    Order: primitives, special types (Enum, callable, torch.dtype, Path), then
    generic containers (Mapping/Set/Sequence) with recursion.
    Nr0   rr    rs   r8   c                 S   s   g | ]}|r|qS r%   r%   )r-   pr%   r%   r&   
<listcomp>   s    z#normalize_value.<locals>.<listcomp>uuidz:normalize_value: function or callable instance unsupportedc                 3   s&    | ]}|j tt |j fV  qd S r*   )r)   normalize_valuerP   r,   xr%   r&   r/     s
    
z"normalize_value.<locals>.<genexpr>c                 S   s   | j S r*   r+   )r.   r%   r%   r&   <lambda>  s    z!normalize_value.<locals>.<lambda>)keyc                 s   s$    | ]\}}t |t|fV  qd S r*   )r`   r   rB   r%   r%   r&   r/     s   " c                 s   s    | ]	}t t|V  qd S r*   )reprr   r-   rD   r%   r%   r&   r/     s    c                 s   s    | ]}t |V  qd S r*   )r   r   r%   r%   r&   r/     s    to_json_stringz#normalize_value: unsupported type 'zi'. Ensure config values use supported primitives/containers or add a stable representation for this type.)(r9   boolintfloatr`   enumEnum	__class__rr   rs   r   r^   rF   rP   joinr   rO   callabler   r4   torchdtypebytes	bytearrayhexpathlibPath
expanduserresolve	Exceptionr
   tuplesortedr	   r   rH   r   r   r   r8   )r   	enum_typemodulequaltype_fqnrH   r%   r   r&   r      sP   
	 

r   ignored_factorsc                 C   sx   i }t | D ]3}|j}||v rqt| |d}zt|||< W q ty9 } ztd| dt|j d|d}~ww |S )zGets the factors used for hashing a config class.
    - Includes all dataclass fields not in `ignored_factors`.
    - Errors on non-normalizable values.
    Nz,get_hash_factors: unsupported type for key 'z' ())r	   r)   rP   r   r4   rF   r8   )r   r   factorsdc_fieldfactorr^   r=   r%   r%   r&   get_hash_factors.  s&   r   rH   c                 C   s   t tj| dd  S )z=Return a SHA-256 hex digest of the canonical items structure.T)	sort_keys)hashlibsha256jsondumpsencode	hexdigest)rH   r%   r%   r&   hash_factorsC     r   c                   @   s~   e Zd ZU dZeed< eed< defddZdedefdd	Zd
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S )RangezG
    A range of numbers.
    Inclusive of start, inclusive of end.
    startendr   c                 C   s   | j | jkS r*   r   r   rn   r%   r%   r&   is_single_sizeR  r@   zRange.is_single_sizesizec                 C   s   | j |  ko| jkS   S r*   r   )ro   r   r%   r%   r&   __contains__U  r   zRange.__contains__otherc                 C   s&   t |tsdS | j|jko| j|jkS )NF)r9   r   r   r   )ro   r   r%   r%   r&   __eq__Y  s   
zRange.__eq__c                 C   s   t | j| jfS r*   )hashr   r   rn   r%   r%   r&   __hash__^  s   zRange.__hash__c                 C   s   d| j  d| j dS )N(, r   r   rn   r%   r%   r&   __str__a  s   zRange.__str__c                 C   s   |   S r*   )r   rn   r%   r%   r&   __repr__d  s   zRange.__repr__N)r8   rr   rs   __doc__r   __annotations__r   r   r   rK   r   r   r`   r   r   r%   r%   r%   r&   r   H  s   
 r   old_namenew_name_or_namesremoval_versionc                 C   sl   t | |}|d u rd S t|tr|g}n|}| d| dd| d}t| |D ]}t| || q+d S )Nz& is deprecated and will be removed in z. Use r   z	 instead.)rP   r9   r`   r   r:   warningsetattr)r   r   r   r   old_val	new_namesmsgnew_namer%   r%   r&   handle_deprecatedh  s   


r   r*   )NNF)Cr   rS   r   r   rW   r   r   rU   collections.abcr   r   r   r   dataclassesr   r   r   r	   r
   	itertoolsr   typingr   r   r   r   r   r   pydanticr   pydantic.dataclassesr   pydantic.fieldsPydanticFieldr   typing_extensionsr   r   vllm.loggerr   r8   r:   	_typeshedr   rF   
ConfigTyper   r   r`   r>   r   r?   rJ   rK   rR   rv   rk   rl   rt   ry   r   setr   r   r   listr   r%   r%   r%   r&   <module>   s   

 
)"V
