o
    ,hH                     @  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 d dlmZmZmZ d dlmZ erld d	lm Z  d d
l!m"Z"m#Z#m$Z$ ee%& j'Z(e(j'Z)G dd deZ*dZ+dUddZ,edZ-edZ.dVddZ/dWddZ0ej1dXd#d$Z2ered%dYd(d)Zej3dZd,d-Z4d[d0d1Z5G d2d3 d3Z6	d\d]d8d9Z7	 	:d^d_d?d@Z8	 d`dadBdCZ9dbdFdGZ:dcdIdJZ;dddOdPZ<G dQdR dRZ=G dSdT dTee- Z>dS )e    )annotationsN)fieldsis_dataclass)autoEnum)Path)AnyCallableGenericLiteralNoReturnTYPE_CHECKINGTypeVar)assert_never
deprecatedSelf)CodeTemplate)	Namespace)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!   I/var/www/html/scripts/venv/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_params7   s
   r1   TSfuncCallable[[T], S | None]xsIterable[T]Iterator[S]c                 c  s&    |D ]}| |}|d ur|V  qd S Nr!   )r4   r6   xrr!   r!   r"   mapMaybeG   s   r<   Callable[[T], Sequence[S]]c                 c  s    |D ]	}| |E d H  qd S r9   r!   )r4   r6   r:   r!   r!   r"   	concatMapO   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"   contextW   s   rJ   z*Use typing_extensions.assert_never insteadr:   r   c                 C  s   t dt| j )NzUnhandled type: )AssertionErrortyper   )r:   r!   r!   r"   r   h      r   template_fnr   c                 C  s
   t | S r9   )r   	from_file)rN   r!   r!   r"   _read_templatem   s   
rP   sintc                 C  s&   t j| ddd }tj|ddS )Nlatin1F)usedforsecuritylittle)	byteorder)hashlibsha1encodedigestrR   
from_bytes)rQ   rX   r!   r!   r"   string_stable_hashs   s   r\   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 r9   )r   r^   r`   setfilesra   )selfr^   r`   ra   r!   r!   r"   __init__|   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>)	frozensetre   rf   r!   r!   r"   	filenames   rM   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)rf   rr   rs   rm   old_contentsr!   r!   r"   _write_if_changed   s   zFileManager._write_if_changedrN   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_ROOTrj   
ValueErrorr.   rP   
substituter(   subVERBOSEr$   r   )
rf   rN   r~   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 )rN   r~   )rr   rs   )r   r   r^   re   addra   r   r}   )rf   rr   rN   r~   rm   r   r!   r!   r"   write_with_template   s   
zFileManager.write_with_templatec                 C  s   |  ||| d S r9   )r   )rf   rr   r~   r!   r!   r"   write   s   zFileManager.writeN)base_envitemsr7   key_fnCallable[[T], str]#Callable[[T], dict[str, list[str]]]
num_shardsrR   r   dict[str, Any] | Nonesharded_keysset[str]c             
   C  s   | j ||||||||d d S )N)r   r~   r   r   r   )write_sharded_with_template)rf   rr   r   r   r~   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!   )rl   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%   rc   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 r9   r!   r!   )shardr!   r"   <lambda>5  s    z9FileManager.write_sharded_with_template.<locals>.<lambda>)r   r   r   r   r%   rc   )r   r   rangeupdater   listcopyra   r\   r   	with_stemstemre   discardr^   )rf   rr   rN   r   r   r~   r   r   r   rm   
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.rB   zset(c                 s  s     | ]}d |   dV  qdS )z    ""Nri   rk   r!   r!   r"   	<genexpr>B  s    z,FileManager.write_outputs.<locals>.<genexpr>)N)joinsortedre   r}   )rf   r   rr   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.
        )ospathrelpathr`   dirnamer   rp   r!   r!   r"   template_dir_for_commentsH  s   z%FileManager.template_dir_for_comments)r^   r_   r`   r_   ra   rb   r%   rc   )r%   rh   )rr   r_   rs   r$   r%   rc   )rN   r_   r~   r   r%   r$   )rr   r_   rN   r_   r~   r   r%   rc   )rr   r_   r~   r   r%   rc   )rr   r_   r   r7   r   r   r~   r   r   rR   r   r   r   r   r%   rc   )rr   r_   rN   r_   r   r7   r   r   r~   r   r   rR   r   r   r   r   r%   rc   )r   r$   rr   r_   r%   rc   r%   r$   )r   r   r   rg   propertyrq   r}   r   r   r   r   r   r   r   r!   r!   r!   r"   r]   {   s    



6

>r]   optionsr   r^   str | Path | Nonec                 C  s.   t j| jd}|r|n| j}t||| jdS )N	templates)r^   r`   ra   )r   r   r   source_pathr^   r]   ra   )r   r^   r`   r!   r!   r"   make_file_managerR  s   r   P   objr   rF   widthc                 C  s0   t jdkrddlm} || ||S t| ||dS )N)   
   r   )pformat)rF   r   )r   version_infopprintr   _pformat)r   rF   r   r   r!   r!   r"   dataclass_repr`  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: rC   c                   s$   g | ]}|j r|jt |jfqS r!   )reprr.   getattr)rl   fr   r!   r"   r   z  s   $ z_pformat.<locals>.<listcomp>= z,
(r   )r   rL   	__class__r   lenr   r   r   r   _format_dictr   rd   tuple_format_listr   appendr   )r   rF   r   r   
class_namefields_list
fields_strr.   attr_curr_indentstr_repr
indent_strbodyr!   r   r"   r   n  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   rF   r   r   	dict_reprr   r   k_reprv_strr!   r!   r"   r     s   r   &list[Any] | set[Any] | tuple[Any, ...]c                   sJ    d 7   fdd| D }t | trdnd\}}t| ||S )NrC   c                   s*   g | ]}t |rt| nt|qS r!   )r   r   r   )rl   lr   rF   r   r!   r"   r     s    z _format_list.<locals>.<listcomp>)[])r   r   )r   r   r   )r   rF   r   r   	list_reprstartendr!   r  r"   r     s   r   r   	list[str]r  r  c           
      C  sT   d\}}t t| |krd}d| }d| }d| | | }	| | |	 | S )N) r  rB   r   r'   )r   r   r   )
r   rF   r   r   r  r  	delimitercurr_indent_strr   r   r!   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_levelrR   r%   rc   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 .rB   c                 S  s   g | ]}d | dqS )z
namespace z {r!   rl   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_)rf   r  r  r  cpp_namespacesr!   r!   r"   rg     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 r9   )r  rp   r!   r!   r"   prologue     zNamespaceHelper.prologuec                 C  r  r9   )r  rp   r!   r!   r"   epilogue  r!  zNamespaceHelper.epiloguec                 C  r  r9   )r  rp   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  )rf   r#  r!   r!   r"   get_cpp_namespace  s   z!NamespaceHelper.get_cpp_namespaceN)r  r  )r  r$   r  r$   r  rR   r%   rc   )r  )r  r$   r  rR   r%   r  r   )r  )r#  r$   r%   r$   )r   r   r   __doc__rg   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, Literal[None]]storageNiterableIterable[T] | Noner%   rc   c                 C  s"   |d u r	i | _ d S t|| _ d S r9   )r(  r   fromkeys)rf   r)  r!   r!   r"   rg     s   
zOrderedSet.__init__r   r2   rb   c                 C  s
   || j v S r9   r(  rf   r   r!   r!   r"   __contains__  s   
zOrderedSet.__contains__Iterator[T]c                 C  s   t | j S r9   )iterr(  keysrp   r!   r!   r"   __iter__     zOrderedSet.__iter__r   OrderedSet[T]c                 C  s   | j |j  d S r9   )r(  r   )rf   r   r!   r!   r"   r     s   zOrderedSet.updatec                 C  s   d | j |< d S r9   r,  r-  r!   r!   r"   r     r3  zOrderedSet.addc                 C  s   t  }| j |_|S r9   )r'  r(  r   )rf   retr!   r!   r"   r   !  s   zOrderedSet.copyrG   c                  G  s,   | d   }| dd  D ]}|| q|S )Nr   rC   )r   r   )rG   r5  rQ   r!   r!   r"   union&  s   zOrderedSet.unionotherc                 C  s   t | |S r9   )r'  r6  rf   r7  r!   r!   r"   __or__-  s   zOrderedSet.__or__r   c                 C  s   |  | | S r9   )r   r8  r!   r!   r"   __ior__0  s   
zOrderedSet.__ior__objectc                 C  s(   t |tr| j|jkS t| j |kS r9   )r   r'  r(  rd   r1  r8  r!   r!   r"   __eq__4  s   
zOrderedSet.__eq__r9   )r)  r*  r%   rc   )r   r2   r%   rb   )r%   r/  )r   r4  r%   rc   )r   r2   r%   rc   )r%   r4  )rG   r4  r%   r4  )r7  r4  r%   r4  )r7  r4  r%   r   )r7  r;  r%   rb   )r   r   r   __annotations__rg   r.  r2  r   r   r   r&  r6  r9  r:  r<  r!   r!   r!   r"   r'    s   
 






r'  )r#   r$   r%   r&   )r4   r5   r6   r7   r%   r8   )r4   r=   r6   r7   r%   r8   )r?   r@   r%   rA   )r:   r   r%   r   )rN   r$   r%   r   )rQ   r$   r%   rR   r9   )r   r   r^   r   r%   r]   )r   r   )r   r   rF   rR   r   rR   r%   r$   )r   )
r   r   rF   rR   r   rR   r   rR   r%   r$   )
r   r   rF   rR   r   rR   r   rR   r%   r$   )
r   r   rF   rR   r   rR   r   rR   r%   r$   )r   r  rF   rR   r   rR   r   rR   r  r$   r  r$   r%   r$   )?
__future__r   
contextlib	functoolsrW   r   r(   r   rE   dataclassesr   r   enumr   r   pathlibr   typingr   r	   r
   r   r   r   r   typing_extensionsr   r   r   torchgen.code_templater   argparser   collections.abcr   r   r   r   r   ry   r   r   r   IDENT_REGEXr1   r2   r3   r<   r>   contextmanagerrJ   cacherP   r\   r]   r   r   r   r   r   r   r  r'  r!   r!   r!   r"   <module>   s`    $



 Z
#

E