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   Z
DEFINITIONZDECLARATIONZREGISTRATIONZANONYMOUS_DEFINITIONZNAMESPACED_DEFINITIONZNAMESPACED_DECLARATION r   r   T/home/www/facesmatcher.com/frenv_anti/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
   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.   r0   xrr   r   r   mapMaybeG   s   r6   Callable[[T], Sequence[S]]c                 c  s    |D ]	}| |E d H  qd S r3   r   )r.   r0   r4   r   r   r   	concatMapO   s   r8   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)r9   emsgr   r   r   contextW   s   rD   z*Use typing_extensions.assert_never insteadr4   r   c                 C  s   t dt| j )NzUnhandled type: )AssertionErrortyper   )r4   r   r   r   r   h      r   template_fnr   c                 C  s
   t | S r3   )r   	from_file)rH   r   r   r   _read_templatem   s   
rJ   sintc                 C  s&   t j| ddd }tj|ddS )Nlatin1F)usedforsecuritylittle)	byteorder)hashlibsha1encodedigestrL   
from_bytes)rK   rR   r   r   r   string_stable_hashs   s   rV   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 r3   )r   rX   rZ   setfilesr[   )selfrX   rZ   r[   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>)	frozensetr_   r`   r   r   r   	filenames   rG   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`   rl   rm   rg   Zold_contentsr   r   r   _write_if_changed   s   zFileManager._write_if_changedrH   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: 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_absoluterZ   
isinstancedictTORCHGEN_ROOTsysmodules__file__absoluteKeyErrorAttributeErrorrelative_to	REPO_ROOTrd   
ValueErrorr(   rJ   
substituter"   subVERBOSEr   r   )
r`   rH   rw   Ztemplate_pathenvZgenerator_default	generatorZ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 )rH   rw   )rl   rm   )r   r|   rX   r_   addr[   r   rv   )r`   rl   rH   rw   rg   r   r   r   r   write_with_template   s   
zFileManager.write_with_templatec                 C  s   |  ||| d S r3   )r   )r`   rl   rw   r   r   r   write   s   zFileManager.writeN)base_envitemsr1   key_fnCallable[[T], str]#Callable[[T], dict[str, list[str]]]
num_shardsrL   r   dict[str, Any] | Nonesharded_keysset[str]c             
   C  s   | j ||||||||d d S )N)r   rw   r   r   r   )write_sharded_with_template)r`   rl   r   r   rw   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_idZ
Everythingc                 S  s   g | ]	}d d| iqS )r   r)   r   )rf   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 r3   r   r   )shardr   r   <lambda>5  s    z9FileManager.write_sharded_with_template.<locals>.<lambda>)r   r   r   r   r   r]   )r   r|   rangeupdater}   listcopyr[   rV   r   	with_stemstemr_   discardrX   )r`   rl   rH   r   r   rw   r   r   r   rg   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    ""Nrc   re   r   r   r   	<genexpr>B  s    z,FileManager.write_outputs.<locals>.<genexpr>)N)joinsortedr_   rv   )r`   r   rl   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relpathrZ   dirnamer   rj   r   r   r   template_dir_for_commentsH  s   z%FileManager.template_dir_for_comments)rX   rY   rZ   rY   r[   r\   r   r]   )r   rb   )rl   rY   rm   r   r   r]   )rH   rY   rw   rx   r   r   )rl   rY   rH   rY   rw   rx   r   r]   )rl   rY   rw   rx   r   r]   )rl   rY   r   r1   r   r   rw   r   r   rL   r   r   r   r   r   r]   )rl   rY   rH   rY   r   r1   r   r   rw   r   r   rL   r   r   r   r   r   r]   )r   r   rl   rY   r   r]   r   r   )r   r   r   ra   propertyrk   rv   r   r   r   r   r   r   r   r   r   r   r   rW   {   s    



6

>rW   optionsr   rX   str | Path | Nonec                 C  s.   t j| jd}|r|n| j}t||| jdS )NZ	templates)rX   rZ   r[   )r   r   r   source_pathrX   rW   r[   )r   rX   rZ   r   r   r   make_file_managerR  s   r   P   objr   r@   widthc                 C  s0   t jdkrddlm} || ||S t| ||dS )N)   
   r   )pformat)r@   r   )r   version_infopprintr   _pformat)r   r@   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: r=   c                   s$   g | ]}|j r|jt |jfqS r   )reprr(   getattr)rf   fr   r   r   r   z  s   $ z_pformat.<locals>.<listcomp>= z,
(r   )r   rF   	__class__r   lenr   r   r}   r~   _format_dictr   r^   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   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   r@   r   r   Z	dict_reprr   r   Zk_reprZ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 )Nr=   c                   s*   g | ]}t |rt| nt|qS r   )r   r   r   )rf   lr   r@   r   r   r   r     s    z _format_list.<locals>.<listcomp>)[])r   r   )r}   r   r   )r   r@   r   r   Z	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   r<   r   r!   )r   r   r   )
r   r@   r   r   r   r   	delimiterZ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_levelrL   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   rf   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_Znamespaces_entity_name_)r`   r   r   r   Zcpp_namespacesr   r   r   ra     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 r3   )r   rj   r   r   r   prologue     zNamespaceHelper.prologuec                 C  r  r3   )r   rj   r   r   r   epilogue  r  zNamespaceHelper.epiloguec                 C  r  r3   )r   rj   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   rL   r   r]   )r   )r   r   r   rL   r   r   r   )r   )r  r   r   r   )r   r   r   __doc__ra   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   r]   c                 C  s"   |d u r	i | _ d S t|| _ d S r3   )r  r~   fromkeys)r`   r  r   r   r   ra     s   
zOrderedSet.__init__r   r,   r\   c                 C  s
   || j v S r3   r  r`   r   r   r   r   __contains__  s   
zOrderedSet.__contains__Iterator[T]c                 C  s   t | j S r3   )iterr  keysrj   r   r   r   __iter__     zOrderedSet.__iter__r   OrderedSet[T]c                 C  s   | j |j  d S r3   )r  r   )r`   r   r   r   r   r     s   zOrderedSet.updatec                 C  s   d | j |< d S r3   r  r  r   r   r   r     r  zOrderedSet.addc                 C  s   t  }| j |_|S r3   )r  r  r   )r`   retr   r   r   r   !  s   zOrderedSet.copyrA   c                  G  s,   | d   }| dd  D ]}|| q|S )Nr   r=   )r   r   )rA   r  rK   r   r   r   union&  s   zOrderedSet.unionotherc                 C  s   t | |S r3   )r  r  r`   r  r   r   r   __or__-  s   zOrderedSet.__or__r   c                 C  s   |  | | S r3   )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 r3   )r}   r  r  r^   r  r  r   r   r   __eq__4  s   
zOrderedSet.__eq__r3   )r  r  r   r]   )r   r,   r   r\   )r   r  )r   r  r   r]   )r   r,   r   r]   )r   r  )rA   r  r   r  )r  r  r   r  )r  r  r   r   )r  r   r   r\   )r   r   r   __annotations__ra   r  r  r   r   r   r  r  r  r  r!  r   r   r   r   r    s   
 






r  )r   r   r   r    )r.   r/   r0   r1   r   r2   )r.   r7   r0   r1   r   r2   )r9   r:   r   r;   )r4   r   r   r   )rH   r   r   r   )rK   r   r   rL   r3   )r   r   rX   r   r   rW   )r   r   )r   r   r@   rL   r   rL   r   r   )r   )
r   r   r@   rL   r   rL   r   rL   r   r   )
r   r   r@   rL   r   rL   r   rL   r   r   )
r   r   r@   rL   r   rL   r   rL   r   r   )r   r   r@   rL   r   rL   r   rL   r   r   r   r   r   r   )?
__future__r   
contextlib	functoolsrQ   r   r"   r   r?   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   r   r   rs   r   r   r   ZIDENT_REGEXr+   r,   r-   r6   r8   contextmanagerrD   cacherJ   rV   rW   r   r   r   r   r   r   r   r  r   r   r   r   <module>   s`    $



 Z
#

E