o
    -ik1                     @   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mZ ddlmZmZ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 ddlZddlZddl m!Z! ddl"m#Z# dd	l$m%Z% e%e&Z'erwdd
l(m)Z) neZ)e*e) Z+ede+dZ,de,de,fddZ-de+de.defddZ/			d;de0de
e. dedB de	g ef dB de1defddZ2de.de1fddZ3de.de1fdd Z4de*e de5e.e.f fd!d"Z6de+de.de1fd#d$Z7e#G d%d& d&eZ8G d'd( d(eZ9de,d)e5e.ef de,fd*d+Z:d,d- Z;de,d.e<e. de5e.e0f fd/d0Z=d1e5e.e0f de.fd2d3Z>de,d4e.d5e.e?e. B d6e.ddf
d7d8Z@eG d9d: d:ZAdS )<z.Utility functions for vLLM config dataclasses.    N)CallableIterableMappingSequenceSet)MISSINGField	dataclassfieldfieldsis_dataclassreplace)pairwise)TYPE_CHECKINGAnyProtocolTypeVar)	FieldInfo)runtime_checkable)init_logger)DataclassInstanceConfigT)boundclsreturnc                 C   s   | S )a	  
    A decorator that ensures all fields in a dataclass have default values
    and that each field has a docstring.

    If a `ConfigT` is used as a CLI argument itself, the `type` keyword argument
    provided by `get_kwargs` will be
    `pydantic.TypeAdapter(ConfigT).validate_json(cli_arg)` which treats the
    `cli_arg` as a JSON string which gets validated by `pydantic`.

    Config validation is performed by the tools/pre_commit/validate_config.py
    script, which is invoked during the pre-commit checks.
     )r   r   r   N/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/vllm/config/utils.pyconfig#   s   r   namec                 C   s   t | stddd t| D }||vr!td| d| j d|| }|j }tur1t|dS |j }turPt	|t
rK|jdurHt|jdS |j}t|d	S t| j d| d
)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                 S   s   i | ]}|j |qS r   r   .0fr   r   r   
<dictcomp>8       zget_field.<locals>.<dictcomp>zField 'z' not found in .)default_factoryN)defaultz. must have a default value or default factory.)r   	TypeErrorr   
ValueError__name__r&   r   r
   r'   
isinstancer   )r   r   
cls_fieldsnamed_fieldr&   r'   r   r   r   	get_field3   s"   



r.   Fobjectnamesr'   r&   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hasattrloggerwarning_oncetyper*   getattr)r/   r0   r'   r&   r1   ir   r   r   r   getattr_iterL   s   

r9   textc                 C   s   d}t || }|duS )ak  
    Check if the text looks like a printed Python object, e.g.
    contains any substring matching the pattern: "at 0xFFFFFFF>"
    We match against 0x followed by 2-16 hex chars (there's
    a max of 16 on a 64-bit system).

    Args:
        text (str): The text to check

    Returns:
        result (bool): `True` if a match is found, `False` otherwise.
    zat 0x[a-fA-F0-9]{2,16}>N)research)r:   patternmatchr   r   r   contains_object_printj   s   r?   c                 C   s   t | sdS td|  )NTzvLLM tried to hash some configs that may have Python objects ids in them. This is a bug, please file an issue. Text being hashed: )r?   AssertionError)r:   r   r   r   assert_hashable|   s   rA   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bodyr+   ClassDefr(   r   Assign	AnnAssignExprvalueConstantstrcleandoctargetstargetNameid)r   cls_nodeoutabdocrQ   rR   r   r   r   get_attr_docs   s,   
rZ   c                    s   t  fddt| D jS )Nc                 3   s    | ]
}|j  kr|V  qd S Nr   r    r   r   r   	<genexpr>   s    z is_init_field.<locals>.<genexpr>)nextr   init)r   r   r   r   r   is_init_field   s   r_   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)r*   
__module____qualname__rO   rd   r   r   r   r   r`      s    r`   c                   @   s"   e Zd Zdeeef fddZdS )SupportsMetricsInfor   c                 C   ra   r[   r   rb   r   r   r   metrics_info   re   z SupportsMetricsInfo.metrics_infoN)r*   rf   rg   dictrO   ri   r   r   r   r   rh      s    rh   	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 r%   z must be a dict  or z
, but got )	itemsr3   r6   r7   r   r+   rj   update_configr   )r   rk   processed_overrides
field_namerM   current_valuer   r   r   rn      s(   

rn   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.
    Nr%   rf    rg   r*   c                 S   s   g | ]}|r|qS r   r   )r!   pr   r   r   
<listcomp>   r$   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_valuer7   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[   )rO   rv   )r!   kvr   r   r   r\     s   " c                 s   s    | ]	}t t|V  qd S r[   )reprrv   r!   r|   r   r   r   r\     s    c                 s   s    | ]}t |V  qd S r[   )rv   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.)(r+   boolintfloatrO   enumEnum	__class__rf   rg   rv   rM   r6   r7   joinr}   r3   callableru   r(   torchdtypebytes	bytearrayhexpathlibPath
expanduserresolve	Exceptionr   tuplesortedr   r   rm   r   r   r   r*   )rx   	enum_typemodulequaltype_fqnrm   r   rw   r   rv      sP   
	 

rv   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   r7   rv   r(   r6   r*   )r   r   factorsdc_fieldfactorrM   er   r   r   get_hash_factors&  s&   r   rm   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)rm   r   r   r   hash_factors;     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 , z	 instead.)r7   r+   rO   r   r4   warningsetattr)r   r   r   r   old_val	new_namesmsgnew_namer   r   r   handle_deprecated@  s   


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   rb   r   r   r   is_single_sizec  s   zRange.is_single_sizesizec                 C   s   | j |  ko| jkS   S r[   r   )rc   r   r   r   r   __contains__f  r   zRange.__contains__otherc                 C   s&   t |tsdS | j|jko| j|jkS )NF)r+   r   r   r   )rc   r   r   r   r   __eq__j  s   
zRange.__eq__c                 C   s   t | j| jfS r[   )hashr   r   rb   r   r   r   __hash__o  s   zRange.__hash__c                 C   s   d| j  d| j dS )N(r   r   r   rb   r   r   r   __str__r  s   zRange.__str__c                 C   s   |   S r[   )r   rb   r   r   r   __repr__u  s   zRange.__repr__N)r*   rf   rg   __doc__r   __annotations__r   r   r   r/   r   r   rO   r   r   r   r   r   r   r   Y  s   
 r   )NNF)Br   rB   r   r   rF   r   r   rD   collections.abcr   r   r   r   r   dataclassesr   r   r	   r
   r   r   r   	itertoolsr   typingr   r   r   r   regexr;   r   pydantic.fieldsr   typing_extensionsr   vllm.loggerr   r*   r4   	_typeshedr   r6   
ConfigTyper   r   rO   r.   r/   r   r9   r?   rA   rj   rZ   r_   r`   rh   rn   rv   setr   r   listr   r   r   r   r   r   <module>   s   $

)"V

