a
    hH                     @  sZ  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rd 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+dddddZ,edZ-edZ.ddddddZ/ddddddZ0ej1ddd d!d"Z2erxed#d$d$d%d&d'Zej3dd(d)d*d+Z4dd,d-d.d/Z5G d0d1 d1Z6dNd2d3d1d4d5d6Z7dOd8d,d,dd9d:d;Z8dPd8d,d,d,dd<d=d>Z9d?d,d,d,dd@dAdBZ:dCd,d,d,dd@dDdEZ;dFd,d,d,ddddGdHdIZ<G dJdK dKZ=G dLdM dMee- Z>dS )Q    )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   Z
DEFINITIONZDECLARATIONZREGISTRATIONZANONYMOUS_DEFINITIONZNAMESPACED_DEFINITIONZNAMESPACED_DECLARATION r   r   </var/www/auris/lib/python3.9/site-packages/torchgen/utils.pyr   $   s   r   z(^|\W){}($|\W)strztuple[str, list[str]])schemareturnc                 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
    r*   TSzCallable[[T], S | None]Iterable[T]zIterator[S])funcxsr   c                 c  s$   |D ]}| |}|d ur|V  qd S Nr   )r.   r/   xrr   r   r   mapMaybeG   s    r3   zCallable[[T], Sequence[S]]c                 c  s   |D ]}| |E d H  qd S r0   r   )r.   r/   r1   r   r   r   	concatMapO   s    r4   zCallable[[], str]zIterator[None])msg_fnr   c              
   c  s|   z
d V  W nl t yv } zT|  }t|d}|jrF|jd  d| n|}|f|jdd   |_ W Y d }~n
d }~0 0 d S )Nz  r   
   )	Exceptiontextwrapindentargs)r5   emsgr   r   r   contextW   s    
r>   z*Use typing_extensions.assert_never insteadr   )r1   r   c                 C  s   t dt| j d S )NzUnhandled type: )AssertionErrortyper   )r1   r   r   r   r   h   s    r   r   )template_fnr   c                 C  s
   t | S r0   )r   	from_file)rA   r   r   r   _read_templatem   s    rC   int)sr   c                 C  s&   t j| ddd }tj|ddS )Nlatin1F)usedforsecuritylittle)	byteorder)hashlibsha1encodedigestrD   
from_bytes)rE   rK   r   r   r   string_stable_hashs   s    rO   c                   @  s   e Zd ZdddddddZeddd	d
ZddddddZddddddZdddddddZddddddZ	ddddddddd dd!d"d#Z
dddddddddd dd$	d%d&Zdddd'd(d)Zddd*d+ZdS ),FileManagerz
str | PathboolNone)install_dirtemplate_dirdry_runr   c                 C  s&   t || _t || _t | _|| _d S r0   )r   rS   rT   setfilesrU   )selfrS   rT   rU   r   r   r   __init__|   s    

zFileManager.__init__zfrozenset[str]r   c                 C  s   t dd | jD S )Nc                 S  s   h | ]}|  qS r   as_posix.0filer   r   r   	<setcomp>       z(FileManager.filenames.<locals>.<setcomp>)	frozensetrW   rX   r   r   r   	filenames   s    zFileManager.filenamesr   )filenamecontentsr   c                 C  sZ   t |}d }z|jdd}W n ty.   Y n0 ||krV|jjddd |j|dd d S )Nzutf-8)encodingT)parentsexist_ok)r   	read_textOSErrorparentmkdir
write_text)rX   re   rf   r_   Zold_contentsr   r   r   _write_if_changed   s    zFileManager._write_if_changedz"Callable[[], str | dict[str, Any]])rA   env_callabler   c           
   	   C  s  t | rJ d| | j| }| }t|trd|vrtd }zt tjd jpV|	 }W n t
tfy~   |	 }Y n0 z|t }W n ty   |j}Y n0 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: Z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_absoluterT   
isinstancedictTORCHGEN_ROOTsysmodules__file__absoluteKeyErrorAttributeErrorrelative_to	REPO_ROOTr\   
ValueErrorr'   rC   
substituter!   subVERBOSEr   r   )
rX   rA   rp   Ztemplate_pathenvZgenerator_default	generatorZgenerator_pathtemplatesubstitute_outr   r   r   substitute_with_template   sF    


z$FileManager.substitute_with_template)re   rA   rp   r   c                 C  sr   t |}| rJ d| | j| }|| jvs@J d| | j| | jsn| j||d}| j||d d S )Nfilename must be relative: zduplicate file write )rA   rp   )re   rf   )r   rt   rS   rW   addrU   r   ro   )rX   re   rA   rp   r_   r   r   r   r   write_with_template   s    
zFileManager.write_with_template)re   rp   r   c                 C  s   |  ||| d S r0   )r   )rX   re   rp   r   r   r   write   s    zFileManager.writeN)base_envr-   zCallable[[T], str]z#Callable[[T], dict[str, list[str]]]rD   zdict[str, Any] | Nonezset[str])re   itemskey_fnrp   
num_shardsr   sharded_keysr   c             
   C  s   | j ||||||||d d S )N)r   rp   r   r   r   )write_sharded_with_template)rX   re   r   r   rp   r   r   r   r   r   r   write_sharded   s    zFileManager.write_sharded)	re   rA   r   r   rp   r   r   r   r   c                  sf  t |}	|	 rJ d| ddi}
dd t|D }|
g| }|d ur^|D ]  | qND ]F}|D ]< | v rt | tsJ d |   |< qjg  |< qjqbdddd	fd
d}| jrd}|D ]8}||}t|| }||}||| | ||
| q|D ]4  d }| 	|	
|	j | | fdd q| j| j|	
|	j d  d S )Nr   shard_idZ
Everythingc                 S  s   g | ]}d d| iqS )r   r(   r   )r^   ir   r   r   
<listcomp>  s   z;FileManager.write_sharded_with_template.<locals>.<listcomp>z'sharded keys in base_env must be a listzdict[str, list[str]]rR   )intofrom_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 r0   r   r   )shardr   r   <lambda>5  ra   z9FileManager.write_sharded_with_template.<locals>.<lambda>)r   rt   rangeupdateru   listcopyrU   rO   r   	with_stemstemrW   discardrS   )rX   re   rA   r   r   rp   r   r   r   r_   Z
everythingZshardsZ
all_shardskeyr   itemZsidr   r   r   )r   r   r   r      sF    

z'FileManager.write_sharded_with_template)variable_namere   r   c                 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.r6   zset(c                 s  s   | ]}d |   dV  qdS )z    ""Nr[   r]   r   r   r   	<genexpr>B  ra   z,FileManager.write_outputs.<locals>.<genexpr>)N)joinsortedrW   ro   )rX   r   re   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relpathrT   dirnamerz   rc   r   r   r   template_dir_for_commentsH  s    z%FileManager.template_dir_for_comments)r   r   r   rY   propertyrd   ro   r   r   r   r   r   r   r   r   r   r   r   rP   {   s   6 ">rP   r   zstr | Path | None)optionsrS   r   c                 C  s.   t j| jd}|r|n| j}t||| jdS )NZ	templates)rS   rT   rU   )r   r   r   source_pathrS   rP   rU   )r   rS   rT   r   r   r   make_file_managerR  s    r   P   r   )objr:   widthr   c                 C  s0   t jdkr"ddlm} || ||S t| ||dS )N)   
   r   )pformat)r:   r   )rx   version_infopprintr   _pformat)r   r:   r   r   r   r   r   dataclass_repr`  s    
r   )r   r:   r   curr_indentr   c                   s   t  sJ dt   jj}|t|d 7 } fddt D }g }|D ]\}}|t| d }	t |rt||||	}
nBt|trt	||||	}
n(t|t
ttfrt||||	}
nt|}
|| d|
  qP|d }d| |}| d| d	S )
Nz%obj should be a dataclass, received: r7   c                   s$   g | ]}|j r|jt |jfqS r   )reprr'   getattr)r^   fr   r   r   r   z  ra   z_pformat.<locals>.<listcomp>= z,
(r   )r   r@   	__class__r   lenr   r   ru   rv   _format_dictr   rV   tuple_format_listr   appendr   )r   r:   r   r   
class_nameZfields_list
fields_strr'   attrZ_curr_indentZstr_repr
indent_strbodyr   r   r   r   n  s$    
r   zdict[Any, Any])r   r:   r   r   r   c           	      C  sv   ||d 7 }g }|   D ]J\}}t|}t|rFt||||t| nt|}|| d|  qt||||ddS )Nr   z: {})r   r   r   r   r   r   _format)	r   r:   r   r   Z	dict_reprr   r   Zk_reprZv_strr   r   r   r     s    r   z&list[Any] | set[Any] | tuple[Any, ...]c                   sJ    d 7   fdd| D }t | tr0dnd\}}t| ||S )Nr7   c                   s*   g | ]"}t |rt| nt|qS r   )r   r   r   )r^   lr   r:   r   r   r   r     s   z _format_list.<locals>.<listcomp>)[])r   r   )ru   r   r   )r   r:   r   r   Z	list_reprstartendr   r   r   r     s    r   z	list[str])r   r:   r   r   r   r   r   c           
      C  sT   d\}}t t| |kr$d}d| }d| }d| | | }	| | |	 | S )N) r   r6   r   r    )r   r   r   )
r   r:   r   r   r   r   	delimiterZcurr_indent_strr   r   r   r   r   r     s    r   c                   @  s   e Zd ZdZdddddddd	Zedddd d
ddZeddddZeddddZ	eddddZ
dd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      r   rD   rR   )namespace_strentity_name	max_levelr   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 .r6   c                 S  s   g | ]}d | dqS )z
namespace z {r   r^   nr   r   r   r     ra   z,NamespaceHelper.__init__.<locals>.<listcomp>c                 S  s   g | ]}d | qS )z} // namespace r   r   r   r   r   r     ra   )	r%   r   cpp_namespace_r   	prologue_reversed	epilogue_Znamespaces_entity_name_)rX   r   r   r   Zcpp_namespacesr   r   r   rY     s    
zNamespaceHelper.__init__)namespaced_entityr   r   c                 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_entityrZ   c                 C  s   | j S r0   )r   rc   r   r   r   prologue  s    zNamespaceHelper.prologuec                 C  s   | j S r0   )r   rc   r   r   r   epilogue  s    zNamespaceHelper.epiloguec                 C  s   | j S r0   )r   rc   r   r   r   r     s    zNamespaceHelper.entity_name)defaultr   c                 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   )rX   r   r   r   r   get_cpp_namespace  s    z!NamespaceHelper.get_cpp_namespaceN)r   r   )r   )r   )r   r   r   __doc__rY   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ddZd	d
dddZddddZdddddZd	ddddZddddZ	e
dddddZdddddZdd dd!d"Zd#d
dd$d%ZdS )'
OrderedSetzdict[T, Literal[None]]storageNzIterable[T] | NonerR   )iterabler   c                 C  s    |d u ri | _ nt|| _ d S r0   )r   rv   fromkeys)rX   r   r   r   r   rY     s    zOrderedSet.__init__r+   rQ   )r   r   c                 C  s
   || j v S r0   r   rX   r   r   r   r   __contains__  s    zOrderedSet.__contains__zIterator[T]rZ   c                 C  s   t | j S r0   )iterr   keysrc   r   r   r   __iter__  s    zOrderedSet.__iter__zOrderedSet[T])r   r   c                 C  s   | j |j  d S r0   )r   r   )rX   r   r   r   r   r     s    zOrderedSet.updatec                 C  s   d | j |< d S r0   r   r   r   r   r   r     s    zOrderedSet.addc                 C  s   t  }| j |_|S r0   )r   r   r   )rX   retr   r   r   r   !  s    zOrderedSet.copy)r;   r   c                  G  s,   | d   }| dd  D ]}|| q|S )Nr   r7   )r   r   )r;   r  rE   r   r   r   union&  s    zOrderedSet.union)otherr   c                 C  s   t | |S r0   )r   r  rX   r  r   r   r   __or__-  s    zOrderedSet.__or__r   c                 C  s   |  | | S r0   )r   r  r   r   r   __ior__0  s    
zOrderedSet.__ior__objectc                 C  s,   t |tr| j|jkS t| j |kS d S r0   )ru   r   r   rV   r   r  r   r   r   __eq__4  s    
zOrderedSet.__eq__)N)r   r   r   __annotations__rY   r   r  r   r   r   r   r  r  r  r	  r   r   r   r   r     s   
r   )N)r   r   )r   )?
__future__r   
contextlib	functoolsrJ   r   r!   rx   r9   Zdataclassesr   r   enumr   r   pathlibr   typingr   r	   r
   r   r   r   r   Ztyping_extensionsr   r   r   Ztorchgen.code_templater   argparser   collections.abcr   r   r   rz   r{   rl   rw   r   r   ZIDENT_REGEXr*   r+   r,   r3   r4   contextmanagerr>   cacherC   rO   rP   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s^   $ Z    #E