o
    I5i@                     @  s  d dl m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 d dlmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ erdd d	l m!Z! ee"# j$j$Z%G d
d deZ&dZ'dTddZ(edZ)edZ*dUddZ+dVddZ,ej-dWd"d#Z.dXd&d'Z/ej0dd(dYd+d,Z1dZd/d0Z2G d1d2 d2Z3	d[d\d7d8Z4	 	9d]d^d>d?Z5	 d_d`dAdBZ6dadEdFZ7dbdHdIZ8dcdNdOZ9G dPdQ dQZ:G dRdS dSee) Z;dS )d    )annotationsN)fieldsis_dataclass)autoEnum)Path)
AnyCallableGenericIterableIteratorLiteralNoReturnSequenceTYPE_CHECKINGTypeVar)Self)CodeTemplate)	Namespacec                   @  s0   e Zd Ze Ze Ze Ze Ze Ze Z	dS )TargetN)
__name__
__module____qualname__r   
DEFINITIONDECLARATIONREGISTRATIONANONYMOUS_DEFINITIONNAMESPACED_DEFINITIONNAMESPACED_DECLARATION r   r   \/lsinfo/ai/hellotax_ai/llm_service/venv_embed/lib/python3.10/site-packages/torchgen/utils.pyr   -   s    
r   z(^|\W){}($|\W)schemastrreturntuple[str, list[str]]c                 C  s>   t d| }|d u rtd|  | \}}}||dfS )Nz(\w+)(\.\w+)?\((.*)\)zUnsupported function schema: , )rematchRuntimeErrorgroupssplit)r!   mname_paramsr   r   r    split_name_params@   s
   r/   TSfuncCallable[[T], S | None]xsIterable[T]Iterator[S]c                 c  s&    |D ]}| |}|d ur|V  qd S Nr   )r2   r4   xrr   r   r    mapMaybeP   s   r:   Callable[[T], Sequence[S]]c                 c  s    |D ]	}| |E d H  qd S r7   r   )r2   r4   r8   r   r   r    	concatMapX   s   r<   msg_fnCallable[[], str]Iterator[None]c              
   c  sp    zd V  W d S  t y7 } z$|  }t|d}|jr%|jd  d| n|}|f|jdd   |_ d }~ww )Nz  r   
   )	Exceptiontextwrapindentargs)r=   emsgr   r   r    context`   s   rH   r8   r   c                 C  s   t dt| j )NzUnhandled type: )AssertionErrortyper   )r8   r   r   r    assert_neverp   s   rK   )maxsizetemplate_fnr   c                 C  s
   t | S r7   )r   	from_file)rM   r   r   r    _read_templatet   s   
rO   sintc                 C  s"   t | d }tj|ddS )Nlatin1little)	byteorder)hashlibsha1encodedigestrQ   
from_bytes)rP   rV   r   r   r    string_stable_hashz   s   rZ   c                   @  s   e Zd ZU ded< ded< ded< ded< d,d
dZd-ddZd.ddZd/ddZd0ddZddd1d%d&Z	d2d(d)Z
d3d*d+ZdS )4FileManagerr"   install_dirtemplate_dirbooldry_runset[str]	filenamesr#   Nonec                 C  s   || _ || _t | _|| _d S r7   )r\   r]   setra   r_   )selfr\   r]   r_   r   r   r    __init__   s   
zFileManager.__init__filenamecontentsc                 C  s   zt |}| }W d    n1 sw   Y  W n ty%   d }Y nw ||krRtjtj|dd t |d}|| W d    d S 1 sKw   Y  d S d S )NT)exist_okw)openreadOSErrorosmakedirspathdirnamewrite)rd   rf   rg   fold_contentsr   r   r    _write_if_changed   s   

"zFileManager._write_if_changedrM   env_callable"Callable[[], str | dict[str, Any]]c           	   	   C  s   t j| j|}| }t|trgd|vr^td d }zttj	d j
p#| }W n ttfy7   | }Y nw z	|t }W n tyM   |j}Y nw i |ddd| d|  i}t|}||S t|trn|S t| d S )Ngenerated_commenttorchgenzgen.py__main__@zgenerated by z from )rm   ro   joinr]   
isinstancedict	REPO_ROOTr   sysmodules__file__absoluteKeyErrorAttributeErrorrelative_toas_posix
ValueErrorr,   rO   
substituter"   rK   )	rd   rM   ru   template_pathenvgenerator_default	generatorgenerator_pathtemplater   r   r    substitute_with_template   s<   



z$FileManager.substitute_with_templatec                 C  sX   | j  d| }|| jvsJ d| j| | js*| j||d}| j||d d S d S )N/zduplicate file write {filename})rM   ru   )rf   rg   )r\   ra   addr_   r   rt   )rd   rf   rM   ru   substitute_outr   r   r    write_with_template   s   zFileManager.write_with_templatec                 C  s   |  ||| d S r7   )r   )rd   rf   ru   r   r   r    rq      s   zFileManager.writeN)base_envitemsr5   key_fnCallable[[T], str]#Callable[[T], dict[str, list[str]]]
num_shardsrQ   r   dict[str, Any] | Nonesharded_keysc                  sj  ddi}dd t |D }	|g|	 }
|d ur |
D ]  | qD ]#}|
D ] | v r@t | ts7J d |   |< q&g  |< q&q"dfdd}| jrRd}|D ]}||}t|| }||}||	| | ||| qT|d}|dkr~t|}|d | }||d  }|
D ]  d }| 	| | | | fdd q| j
| j d| d|  d S )Nshard_id
Everythingc                 S  s   g | ]	}d d| iqS )r   r-   r   ).0ir   r   r    
<listcomp>   s    z-FileManager.write_sharded.<locals>.<listcomp>z'sharded keys in base_env must be a listintodict[str, list[str]]from_r#   rb   c                   s<   |  D ]\}}| v sJ d| | |  |7  < qd S )Nzundeclared sharded key )r   )r   r   kv)r   r   r    	merge_env   s   z,FileManager.write_sharded.<locals>.merge_envr   .c                     s    S r7   r   r   )shardr   r    <lambda>  s    z+FileManager.write_sharded.<locals>.<lambda>r   )r   r   r   r   r#   rb   )rangeupdater|   listcopyr_   rZ   rfindlenr   ra   discardr\   )rd   rf   r   r   ru   r   r   r   
everythingshards
all_shardskeyr   itemsidr   dot_posbase_filename	extensionr   r   )r   r   r    write_sharded   sR   

	
zFileManager.write_shardedvariable_namec                 C  s2   d |ddd t| jD }| || dS )z[Write a file containing the list of all outputs which are
        generated by this script.zset({}
    {})z
    c                 s  s    | ]	}d | d  V  qdS )"Nr   )r   r,   r   r   r    	<genexpr>  s    z,FileManager.write_outputs.<locals>.<genexpr>N)formatr{   sortedra   rt   )rd   r   rf   contentr   r   r    write_outputs  s
   zFileManager.write_outputsc                 C  s   t j| jt jtS )z
        This needs to be deterministic. The template dir is an absolute path
        that varies across builds. So, just use the path relative to this file,
        which will point to the codegen source but will be stable.
        )rm   ro   relpathr]   rp   r   rd   r   r   r    template_dir_for_comments  s   z%FileManager.template_dir_for_comments)r\   r"   r]   r"   r_   r^   r#   rb   )rf   r"   rg   r"   r#   rb   )rM   r"   ru   rv   r#   r"   )rf   r"   rM   r"   ru   rv   r#   rb   )rf   r"   ru   rv   r#   rb   )rf   r"   r   r5   r   r   ru   r   r   rQ   r   r   r   r`   r#   rb   )r   r"   rf   r"   r#   rb   r#   r"   )r   r   r   __annotations__re   rt   r   r   rq   r   r   r   r   r   r   r    r[      s   
 



!

A	r[   optionsr   r\   
str | Nonec                 C  s.   t j| jd}|r|n| j}t||| jdS )N	templates)r\   r]   r_   )rm   ro   r{   source_pathr\   r[   r_   )r   r\   r]   r   r   r    make_file_manager(  s
   r   P   objr   rD   widthc                 C  s0   t jdkrddlm} || ||S t| ||dS )N)   
   r   )pformat)rD   r   )r   version_infopprintr   _pformat)r   rD   r   r   r   r   r    dataclass_repr3  s   
r   curr_indentc                   s   t  sJ dt   jj}|t|d 7 } fddt D }g }|D ]C\}}|t| d }	t |r@t||||	}
n!t|trMt	||||	}
nt|t
ttfr]t||||	}
nt|}
|| d|
  q(|d }d| |}| d| d	S )
Nz%obj should be a dataclass, received: rA   c                   s$   g | ]}|j r|jt |jfqS r   )reprr,   getattr)r   rr   r   r   r    r   M  s   $ z_pformat.<locals>.<listcomp>= z,
())r   rJ   	__class__r   r   r   r   r|   r}   _format_dictr   rc   tuple_format_listr   appendr{   )r   rD   r   r   
class_namefields_list
fields_strr,   attr_curr_indentstr_repr
indent_strbodyr   r   r    r   A  s$   
r   r   dict[Any, Any]c           	      C  sv   ||d 7 }g }|   D ]%\}}t|}t|r#t||||t| nt|}|| d|  qt||||ddS )Nr   z: {})r   r   r   r   r   r   _format)	r   rD   r   r   	dict_reprr   r   k_reprv_strr   r   r    r   d  s   r   &list[Any] | set[Any] | tuple[Any, ...]c                   sJ    d 7   fdd| D }t | trdnd\}}t| ||S )NrA   c                   s*   g | ]}t |rt| nt|qS r   )r   r   r   )r   lr   rD   r   r   r    r     s    z _format_list.<locals>.<listcomp>)[])r   r   )r|   r   r   )r   rD   r   r   	list_reprstartendr   r   r    r   x  s   r   r   	list[str]r   r   c           
      C  sT   d\}}t t| |krd}d| }d| }d| | | }	| | |	 | S )N) r   r@   r   r%   )r   r   r{   )
r   rD   r   r   r   r   	delimitercurr_indent_strr   r   r   r   r    r     s   r   c                   @  sf   e Zd ZdZ	ddddZe	ddddZedddZedddZ	edddZ
dd ddZdS )!NamespaceHelpera  A helper for constructing the namespace open and close strings for a nested set of namespaces.

    e.g. for namespace_str torch::lazy,

    prologue:
    namespace torch {
    namespace lazy {

    epilogue:
    } // namespace lazy
    } // namespace torch
    r      namespace_strr"   entity_name	max_levelrQ   r#   rb   c                 C  sr   | d}t||ksJ d| d| d|| _ddd |D | _ddd t|D | _|| _|| _d S )	N::z"Codegen doesn't support more than z# level(s) of custom namespace. Got r   r@   c                 S  s   g | ]}d | dqS )z
namespace z {r   r   nr   r   r    r     s    z,NamespaceHelper.__init__.<locals>.<listcomp>c                 S  s   g | ]}d | qS )z} // namespace r   r  r   r   r    r     s    )	r*   r   cpp_namespace_r{   	prologue_reversed	epilogue_namespaces_entity_name_)rd   r  r  r  cpp_namespacesr   r   r    re     s   

zNamespaceHelper.__init__namespaced_entityc                 C  s2   |  d}|d }d|dd }t|||dS )zq
        Generate helper from nested namespaces as long as class/function name. E.g.: "torch::lazy::add"
        r  r   N)r  r  r  )r*   r{   r   )r  r  namesr  r  r   r   r    from_namespaced_entity  s   
z&NamespaceHelper.from_namespaced_entityc                 C     | j S r7   )r  r   r   r   r    prologue     zNamespaceHelper.prologuec                 C  r  r7   )r
  r   r   r   r    epilogue  r  zNamespaceHelper.epiloguec                 C  r  r7   )r  r   r   r   r    r    r  zNamespaceHelper.entity_namedefaultc                 C  s   | j r| j S |S )z
        Return the namespace string from joining all the namespaces by "::" (hence no leading "::").
        Return default if namespace string is empty.
        )r  )rd   r  r   r   r    get_cpp_namespace  s   z!NamespaceHelper.get_cpp_namespaceN)r   r   )r  r"   r  r"   r  rQ   r#   rb   )r   )r  r"   r  rQ   r#   r   r   )r   )r  r"   r#   r"   )r   r   r   __doc__re   staticmethodr  propertyr  r  r  r  r   r   r   r    r     s    r   c                   @  s   e Zd ZU ded< d&d'dd	Zd(ddZd)ddZd*ddZd+ddZd,ddZ	e
d-ddZd.ddZd/d!d"Zd0d$d%ZdS )1
OrderedSetzdict[T, Literal[None]]storageNiterableIterable[T] | Noner#   rb   c                 C  s"   |d u r	i | _ d S t|| _ d S r7   )r  r}   fromkeys)rd   r  r   r   r    re     s   
zOrderedSet.__init__r   r0   r^   c                 C  s
   || j v S r7   r  rd   r   r   r   r    __contains__  s   
zOrderedSet.__contains__Iterator[T]c                 C  s   t | j S r7   )iterr  keysr   r   r   r    __iter__     zOrderedSet.__iter__r   OrderedSet[T]c                 C  s   | j |j  d S r7   )r  r   )rd   r   r   r   r    r     s   zOrderedSet.updatec                 C  s   d | j |< d S r7   r  r   r   r   r    r     r&  zOrderedSet.addc                 C  s   t  }| j |_|S r7   )r  r  r   )rd   retr   r   r    r     s   zOrderedSet.copyrE   c                  G  s,   | d   }| dd  D ]}|| q|S )Nr   rA   )r   r   )rE   r(  rP   r   r   r    union  s   zOrderedSet.unionotherc                 C  s   t | |S r7   )r  r)  rd   r*  r   r   r    __or__  s   zOrderedSet.__or__r   c                 C  s   |  | | S r7   )r   r+  r   r   r    __ior__  s   
zOrderedSet.__ior__objectc                 C  s(   t |tr| j|jkS t| j |kS r7   )r|   r  r  rc   r$  r+  r   r   r    __eq__  s   
zOrderedSet.__eq__r7   )r  r  r#   rb   )r   r0   r#   r^   )r#   r"  )r   r'  r#   rb   )r   r0   r#   rb   )r#   r'  )rE   r'  r#   r'  )r*  r'  r#   r'  )r*  r'  r#   r   )r*  r.  r#   r^   )r   r   r   r   re   r!  r%  r   r   r   r  r)  r,  r-  r/  r   r   r   r    r    s   
 






r  )r!   r"   r#   r$   )r2   r3   r4   r5   r#   r6   )r2   r;   r4   r5   r#   r6   )r=   r>   r#   r?   )r8   r   r#   r   )rM   r"   r#   r   )rP   r"   r#   rQ   r7   )r   r   r\   r   r#   r[   )r   r   )r   r   rD   rQ   r   rQ   r#   r"   )r   )
r   r   rD   rQ   r   rQ   r   rQ   r#   r"   )
r   r   rD   rQ   r   rQ   r   rQ   r#   r"   )
r   r   rD   rQ   r   rQ   r   rQ   r#   r"   )r   r   rD   rQ   r   rQ   r   rQ   r   r"   r   r"   r#   r"   )<
__future__r   
contextlib	functoolsrU   rm   r&   r   rC   dataclassesr   r   enumr   r   pathlibr   typingr   r	   r
   r   r   r   r   r   r   r   typing_extensionsr   torchgen.code_templater   argparser   r   r   parentr~   r   IDENT_REGEXr/   r0   r1   r:   r<   contextmanagerrH   rK   	lru_cacherO   rZ   r[   r   r   r   r   r   r   r   r  r   r   r   r    <module>   sX    0





 (
#

A