o
    iA                     @  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
 d dlmZmZ d dlmZ d dlmZ d dlmZmZmZmZ d dlmZmZ d d	lmZ erjd d
lmZ d dlmZm Z m!Z!m"Z" ee#$ j%Z&e&j%Z'G dd deZ(dZ)dOddZ*edZ+edZ,dPddZ-dQdd Z.ej/dRd$d%Z0ej1dSd(d)Z2dTd,d-Z3G d.d/ d/Z4	dUdVd4d5Z5	 	6dWdXd;d<Z6dYd@dAZ7dZdCdDZ8d[dIdJZ9G dKdL dLZ:G dMdN dNee+ Z;dS )\    )annotationsN)is_dataclass)autoEnum)Pathpformat)AnyGenericTYPE_CHECKINGTypeVar)assert_neverSelf)CodeTemplate)	Namespace)CallableIterableIteratorSequencec                   @  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   P/sda-disk/www/egybert/egybert_env/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_params8   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    mapMaybeH   s   r:   Callable[[T], Sequence[S]]c                 c  s    |D ]	}| |E d H  qd S r7   r   )r2   r4   r8   r   r   r    	concatMapP   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    contextX   s   rH   template_fnr   c                 C  s
   t | S r7   )r   	from_file)rI   r   r   r    _read_templatee   s   
rK   sintc                 C  s&   t j| ddd }tj|ddS )Nlatin1F)usedforsecuritylittle)	byteorder)hashlibsha1encodedigestrM   
from_bytes)rL   rS   r   r   r    string_stable_hashk   s   rW   c                   @  s   e Zd Zd1dd	Zed2ddZd3ddZd4ddZd5ddZd6ddZ	ddd7d(d)Z
ddd8d*d+Zd9d-d.Zd:d/d0ZdS );FileManagerinstall_dir
str | Pathtemplate_dirdry_runboolr#   Nonec                 C  s&   t || _t || _t | _|| _d S r7   )r   rY   r[   setfilesr\   )selfrY   r[   r\   r   r   r    __init__t   s   


zFileManager.__init__frozenset[str]c                 C  s   t dd | jD S )Nc                 S  s   h | ]}|  qS r   as_posix.0filer   r   r    	<setcomp>   s    z(FileManager.filenames.<locals>.<setcomp>)	frozensetr`   ra   r   r   r    	filenames   s   zFileManager.filenamesfilenamecontentsr"   c                 C  s^   t |}d }z|jdd}W n	 ty   Y nw ||kr-|jjddd |j|dd d S d S )Nzutf-8)encodingT)parentsexist_ok)r   	read_textOSErrorparentmkdir
write_text)ra   rm   rn   rh   old_contentsr   r   r    _write_if_changed   s   zFileManager._write_if_changedrI   env_callable"Callable[[], str | dict[str, Any]]c           
   	   C  s  t | rJ d| | j| }| }t|tryd|vrftd }zt tjd jp+|	 }W n t
tfy?   |	 }Y nw z	|t }W n tyU   |j}Y nw i |ddd| d|  i}t|}||}	tjdd	|	tjd
S t|tr|S t| d S )Nztemplate_fn must be relative: generated_commentzgen.py__main__@zgenerated by z from z
                (""")\n+             # match triple quotes
                (
                    (\s*@.+\n)*     # match decorators if any
                    \s*(class|def)  # match class/function definition
                )
                z\g<1>\n\n\g<2>)flags)r   is_absoluter[   
isinstancedictTORCHGEN_ROOTsysmodules__file__absoluteKeyErrorAttributeErrorrelative_to	REPO_ROOTre   
ValueErrorr,   rK   
substituter&   subVERBOSEr"   r   )
ra   rI   ry   template_pathenvgenerator_default	generatorgenerator_pathtemplatesubstitute_outr   r   r    substitute_with_template   sN   




z$FileManager.substitute_with_templatec                 C  sv   t |}| rJ d| | j| }|| jvs J d| | j| | js9| j||d}| j||d d S d S )Nfilename must be relative: zduplicate file write )rI   ry   )rm   rn   )r   r   rY   r`   addr\   r   rx   )ra   rm   rI   ry   rh   r   r   r   r    write_with_template   s   
zFileManager.write_with_templatec                 C  s   |  ||| d S r7   )r   )ra   rm   ry   r   r   r    write   s   zFileManager.writeN)base_envitemsr5   key_fnCallable[[T], str]#Callable[[T], dict[str, list[str]]]
num_shardsrM   r   dict[str, Any] | Nonesharded_keysset[str]c             
   C  s   | j ||||||||d d S )N)r   ry   r   r   r   )write_sharded_with_template)ra   rm   r   r   ry   r   r   r   r   r   r    write_sharded   s   
zFileManager.write_shardedc                  s\  t |}	|	 rJ d| ddi}
dd t|D }|
g| }|d ur/|D ]  | q'D ]#}|D ] | v rOt | tsFJ d |   |< q5g  |< q5q1dfdd}| jrad}|D ]}||}t|| }||}||| | ||
| qc|D ]  d }| 	|	
|	j | | fdd q| j| j|	
|	j d  d S )Nr   shard_id
Everythingc                 S  s   g | ]	}d d| iqS )r   r-   r   )rg   ir   r   r    
<listcomp>  s    z;FileManager.write_sharded_with_template.<locals>.<listcomp>z'sharded keys in base_env must be a listintodict[str, list[str]]from_r#   r^   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_with_template.<locals>.merge_envr   c                     s    S r7   r   r   )shardr   r    <lambda>-  s    z9FileManager.write_sharded_with_template.<locals>.<lambda>)r   r   r   r   r#   r^   )r   r   rangeupdater   listcopyr\   rW   r   	with_stemstemr`   discardrY   )ra   rm   rI   r   r   ry   r   r   r   rh   
everythingshards
all_shardskeyr   itemsidr   r   r   )r   r   r    r      sH   

	
$z'FileManager.write_sharded_with_templatevariable_namec                 C  s8   d d|gdd t| jD dR }| || dS )zSWrite a file containing the list of all outputs which are generated by this script.r@   zset(c                 s  s     | ]}d |   dV  qdS )z    ""Nrd   rf   r   r   r    	<genexpr>:  s    z,FileManager.write_outputs.<locals>.<genexpr>)N)joinsortedr`   rx   )ra   r   rm   contentr   r   r    write_outputs3  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.
        )ospathrelpathr[   dirnamer   rk   r   r   r    template_dir_for_comments@  s   z%FileManager.template_dir_for_comments)rY   rZ   r[   rZ   r\   r]   r#   r^   )r#   rc   )rm   rZ   rn   r"   r#   r^   )rI   rZ   ry   rz   r#   r"   )rm   rZ   rI   rZ   ry   rz   r#   r^   )rm   rZ   ry   rz   r#   r^   )rm   rZ   r   r5   r   r   ry   r   r   rM   r   r   r   r   r#   r^   )rm   rZ   rI   rZ   r   r5   r   r   ry   r   r   rM   r   r   r   r   r#   r^   )r   r"   rm   rZ   r#   r^   r#   r"   )r   r   r   rb   propertyrl   rx   r   r   r   r   r   r   r   r   r   r   r    rX   s   s    



6

>rX   optionsr   rY   str | Path | Nonec                 C  s.   t j| jd}|r|n| j}t||| jdS )N	templates)rY   r[   r\   )r   r   r   source_pathrY   rX   r\   )r   rY   r[   r   r   r    make_file_managerJ  s   r   P   objr	   rD   widthc                 C  s   t | ||S r7   r   )r   rD   r   r   r   r    dataclass_reprX  s   r   attrdict[Any, Any]curr_indentc           	      C  sv   ||d 7 }g }|   D ]%\}}t|}t|r#t||||t| nt|}|| d|  qt||||ddS )N   z: {})r   reprr   r   lenappend_format)	r   rD   r   r   	dict_reprr   r   k_reprv_strr   r   r    _format_dict`  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   )rg   lr   rD   r   r   r    r   {  s    z _format_list.<locals>.<listcomp>)[])(r   )r   r   r   )r   rD   r   r   	list_reprstartendr   r   r    _format_listt  s   r   
fields_str	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   rD   r   r   r   r   	delimitercurr_indent_str
indent_strbodyr   r   r    r     s   r   c                   @  sh   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_levelrM   r#   r^   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@   c                 S  s   g | ]}d | dqS )z
namespace z {r   rg   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_)ra   r   r   r   cpp_namespacesr   r   r    rb     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   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  rk   r   r   r    prologue     zNamespaceHelper.prologuec                 C  r  r7   )r  rk   r   r   r    epilogue  r  zNamespaceHelper.epiloguec                 C  r  r7   )r  rk   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   )ra   r  r   r   r    get_cpp_namespace  s   z!NamespaceHelper.get_cpp_namespaceN)r   r   )r   r"   r   r"   r   rM   r#   r^   )r   )r  r"   r   rM   r#   r   r   )r   )r  r"   r#   r"   )r   r   r   __doc__rb   staticmethodr
  r   r  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, None]storageNiterableIterable[T] | Noner#   r^   c                 C  s"   |d u r	i | _ d S t|| _ d S r7   )r  r   fromkeys)ra   r  r   r   r    rb     s   
zOrderedSet.__init__r   r0   r]   c                 C  s
   || j v S r7   r  ra   r   r   r   r    __contains__  s   
zOrderedSet.__contains__Iterator[T]c                 C  s   t | j S r7   )iterr  keysrk   r   r   r    __iter__     zOrderedSet.__iter__r   OrderedSet[T]c                 C  s   | j |j  d S r7   )r  r   )ra   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   )ra   retr   r   r    r     s   zOrderedSet.copyrE   c                  G  s,   | d   }| dd  D ]}|| q|S )Nr   rA   )r   r   )rE   r!  rL   r   r   r    union  s   zOrderedSet.unionotherc                 C  s   t | |S r7   )r  r"  ra   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  r_   r  r$  r   r   r    __eq__  s   
zOrderedSet.__eq__r7   )r  r  r#   r^   )r   r0   r#   r]   )r#   r  )r   r   r#   r^   )r   r0   r#   r^   )r#   r   )rE   r   r#   r   )r#  r   r#   r   )r#  r   r#   r   )r#  r'  r#   r]   )r   r   r   __annotations__rb   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?   )rI   r"   r#   r   )rL   r"   r#   rM   r7   )r   r   rY   r   r#   rX   )r   r   )r   r	   rD   rM   r   rM   r#   r"   )
r   r   rD   rM   r   rM   r   rM   r#   r"   )
r   r   rD   rM   r   rM   r   rM   r#   r"   )r   r   rD   rM   r   rM   r   rM   r   r"   r   r"   r#   r"   )<
__future__r   
contextlib	functoolsrR   r   r&   r   rC   dataclassesr   enumr   r   pathlibr   pprintr   typingr	   r
   r   r   typing_extensionsr   r   torchgen.code_templater   argparser   collections.abcr   r   r   r   r   r   rt   r   r   r   IDENT_REGEXr/   r0   r1   r:   r<   contextmanagerrH   cacherK   rW   rX   r   r   r   r   r   r   r  r   r   r   r    <module>   sX    



 Z


E