o
    *n0jBB                     @  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   Z
DEFINITIONZDECLARATIONZREGISTRATIONZANONYMOUS_DEFINITIONZNAMESPACED_DEFINITIONZNAMESPACED_DECLARATION r   r   U/home/wildlama/miniconda3/envs/lam_a2e/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   )r,   r.   xrr   r   r   mapMaybeH   s   r4   Callable[[T], Sequence[S]]c                 c  s    |D ]	}| |E d H  qd S r1   r   )r,   r.   r2   r   r   r   	concatMapP   s   r6   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)r7   emsgr   r   r   contextX   s   rB   template_fnr   c                 C  s
   t | S r1   )r   	from_file)rC   r   r   r   _read_templatee   s   
rE   sintc                 C  s&   t j| ddd }tj|ddS )Nlatin1F)usedforsecuritylittle)	byteorder)hashlibsha1encodedigestrG   
from_bytes)rF   rM   r   r   r   string_stable_hashk   s   rQ   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 r1   )r   rS   rU   setfilesrV   )selfrS   rU   rV   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>)	frozensetrZ   r[   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)r[   rg   rh   rb   Zold_contentsr   r   r   _write_if_changed   s   zFileManager._write_if_changedrC   env_callable"Callable[[], str | dict[str, Any]]c           
   	   C  s  t | rt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: 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_absoluteAssertionErrorrU   
isinstancedictTORCHGEN_ROOTsysmodules__file__absoluteKeyErrorAttributeErrorrelative_to	REPO_ROOTr_   
ValueErrorr&   rE   
substituter    subVERBOSEr   r   )
r[   rC   rr   Ztemplate_pathenvZgenerator_default	generatorZgenerator_pathtemplatesubstitute_outr   r   r   substitute_with_template   sL   




z$FileManager.substitute_with_templatec                 C  sv   t |}| rtd| | j| }|| jv r td| | j| | js9| j||d}| j||d d S d S )Nfilename must be relative: zduplicate file write )rC   rr   )rg   rh   )	r   rw   rx   rS   rZ   addrV   r   rq   )r[   rg   rC   rr   rb   r   r   r   r   write_with_template   s   

zFileManager.write_with_templatec                 C  s   |  ||| d S r1   )r   )r[   rg   rr   r   r   r   write   s   zFileManager.writeN)base_envitemsr/   key_fnCallable[[T], str]#Callable[[T], dict[str, list[str]]]
num_shardsrG   r   dict[str, Any] | Nonesharded_keysset[str]c             
   C  s   | j ||||||||d d S )N)r   rr   r   r   r   )write_sharded_with_template)r[   rg   r   r   rr   r   r   r   r   r   r   write_sharded   s   
zFileManager.write_shardedc                  s\  t |}	|	 rtd| ddi}
dd t|D }|
g| }|d ur/|D ]  | q'D ]#}|D ] | v rOt | tsFt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_idZ
Everythingc                 S  s   g | ]	}d d| iqS )r   r'   r   )ra   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   rX   c                   s<   |  D ]\}}| vrtd| | |  |7  < qd S )Nzundeclared sharded key )r   rx   )r   r   kv)r   r   r   	merge_env  s
   z:FileManager.write_sharded_with_template.<locals>.merge_envr   c                     s    S r1   r   r   )shardr   r   <lambda>/  s    z9FileManager.write_sharded_with_template.<locals>.<lambda>)r   r   r   r   r   rX   )r   rw   rx   rangeupdatery   listcopyrV   rQ   r   	with_stemstemrZ   discardrS   )r[   rg   rC   r   r   rr   r   r   r   rb   Z
everythingZshardsZ
all_shardskeyr   itemZ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    ""Nr^   r`   r   r   r   	<genexpr><  s    z,FileManager.write_outputs.<locals>.<genexpr>)N)joinsortedrZ   rq   )r[   r   rg   contentr   r   r   write_outputs5  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relpathrU   dirnamer~   re   r   r   r   template_dir_for_commentsB  s   z%FileManager.template_dir_for_comments)rS   rT   rU   rT   rV   rW   r   rX   )r   r]   )rg   rT   rh   r   r   rX   )rC   rT   rr   rs   r   r   )rg   rT   rC   rT   rr   rs   r   rX   )rg   rT   rr   rs   r   rX   )rg   rT   r   r/   r   r   rr   r   r   rG   r   r   r   r   r   rX   )rg   rT   rC   rT   r   r/   r   r   rr   r   r   rG   r   r   r   r   r   rX   )r   r   rg   rT   r   rX   r   r   )r   r   r   r\   propertyrf   rq   r   r   r   r   r   r   r   r   r   r   r   rR   s   s    



5

?rR   optionsr   rS   str | Path | Nonec                 C  s.   t j| jd}|r|n| j}t||| jdS )NZ	templates)rS   rU   rV   )r   r   r   source_pathrS   rR   rV   )r   rS   rU   r   r   r   make_file_managerL  s   r   P   objr	   r>   widthc                 C  s   t | ||S r1   r   )r   r>   r   r   r   r   dataclass_reprZ  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   r>   r   r   Z	dict_reprr   r   Zk_reprZv_strr   r   r   _format_dictb  s   r   &list[Any] | set[Any] | tuple[Any, ...]c                   sJ    d 7   fdd| D }t | trdnd\}}t| ||S )Nr;   c                   s*   g | ]}t |rt| nt|qS r   )r   r   r   )ra   lr   r>   r   r   r   r   }  s    z _format_list.<locals>.<listcomp>)[])(r   )ry   r   r   )r   r>   r   r   Z	list_reprstartendr   r   r   _format_listv  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   r>   r   r   r   r   	delimiterZcurr_indent_strZ
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_levelrG   r   rX   c                 C  sr   | d}t||krt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   ra   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   rx   cpp_namespace_r   	prologue_reversed	epilogue_Znamespaces_entity_name_)r[   r   r   r   Zcpp_namespacesr   r   r   r\     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 r1   )r   re   r   r   r   prologue     zNamespaceHelper.prologuec                 C  r   r1   )r   re   r   r   r   epilogue  r   zNamespaceHelper.epiloguec                 C  r   r1   )r   re   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   )r[   r   r   r   r   get_cpp_namespace  s   z!NamespaceHelper.get_cpp_namespaceN)r   r   )r   r   r   r   r   rG   r   rX   )r   )r   r   r   rG   r   r   r   )r   )r   r   r   r   )r   r   r   __doc__r\   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   rX   c                 C  s"   |d u r	i | _ d S t|| _ d S r1   )r   rz   fromkeys)r[   r   r   r   r   r\     s   
zOrderedSet.__init__r   r*   rW   c                 C  s
   || j v S r1   r   r[   r   r   r   r   __contains__  s   
zOrderedSet.__contains__Iterator[T]c                 C  s   t | j S r1   )iterr   keysre   r   r   r   __iter__     zOrderedSet.__iter__r   OrderedSet[T]c                 C  s   | j |j  d S r1   )r   r   )r[   r   r   r   r   r     s   zOrderedSet.updatec                 C  s   d | j |< d S r1   r   r  r   r   r   r     r  zOrderedSet.addc                 C  s   t  }| j |_|S r1   )r   r   r   )r[   retr   r   r   r     s   zOrderedSet.copyr?   c                  G  s,   | d   }| dd  D ]}|| q|S )Nr   r;   )r   r   )r?   r	  rF   r   r   r   union  s   zOrderedSet.unionotherc                 C  s   t | |S r1   )r   r
  r[   r  r   r   r   __or__   s   zOrderedSet.__or__r   c                 C  s   |  | | S r1   )r   r  r   r   r   __ior__  s   
zOrderedSet.__ior__objectc                 C  s(   t |tr| j|jkS t| j |kS r1   )ry   r   r   rY   r  r  r   r   r   __eq__  s   
zOrderedSet.__eq__r1   )r   r   r   rX   )r   r*   r   rW   )r   r  )r   r  r   rX   )r   r*   r   rX   )r   r  )r?   r  r   r  )r  r  r   r  )r  r  r   r   )r  r  r   rW   )r   r   r   __annotations__r\   r  r  r   r   r   r   r
  r  r  r  r   r   r   r   r     s   
 






r   )r   r   r   r   )r,   r-   r.   r/   r   r0   )r,   r5   r.   r/   r   r0   )r7   r8   r   r9   )rC   r   r   r   )rF   r   r   rG   r1   )r   r   rS   r   r   rR   )r   r   )r   r	   r>   rG   r   rG   r   r   )
r   r   r>   rG   r   rG   r   rG   r   r   )
r   r   r>   rG   r   rG   r   rG   r   r   )r   r   r>   rG   r   rG   r   rG   r   r   r   r   r   r   )<
__future__r   
contextlib	functoolsrL   r   r    r|   r=   dataclassesr   enumr   r   pathlibr   pprintr   typingr	   r
   r   r   Ztyping_extensionsr   r   Ztorchgen.code_templater   argparser   collections.abcr   r   r   r   r~   r   rn   r{   r   r   ZIDENT_REGEXr)   r*   r+   r4   r6   contextmanagerrB   cacherE   rQ   rR   r   r   r   r   r   r   r   r   r   r   r   <module>   sX    



 \


G