o
    h"C                     @  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 d dlmZ erhd d	lmZ d d
lm Z m!Z!m"Z" ee#$ j%j%Z&G dd deZ'dZ(dTddZ)edZ*edZ+dUddZ,dVddZ-ej.dWd#d$Z/dXd'd(Z0ej1dYd+d,Z2dZd/d0Z3G d1d2 d2Z4	d[d\d7d8Z5	 	9d]d^d>d?Z6	 d_d`dAdBZ7dadEdFZ8dbdHdIZ9dcdNdOZ:G dPdQ dQZ;G dRdS dSee* Z<dS )d    )annotationsN)fieldsis_dataclass)autoEnum)Path)AnyCallableGenericLiteralNoReturnTYPE_CHECKINGTypeVar)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   b/var/www/html/construction_image-detection-poc/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_params6   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    mapMaybeF   s   r:   Callable[[T], Sequence[S]]c                 c  s    |D ]	}| |E d H  qd S r7   r   )r2   r4   r8   r   r   r    	concatMapN   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    contextV   s   rH   r8   r   c                 C  s   t dt| j )NzUnhandled type: )AssertionErrortyper   )r8   r   r   r    assert_neverf   s   rK   template_fnr   c                 C  s
   t | S r7   )r   	from_file)rL   r   r   r    _read_templatej   s   
rN   sintc                 C  s&   t j| ddd }tj|ddS )Nlatin1F)usedforsecuritylittle)	byteorder)hashlibsha1encodedigestrP   
from_bytes)rO   rV   r   r   r    string_stable_hashp   s   rZ   c                   @  s   e Zd ZU ded< ded< ded< ded< d.d
dZd/ddZd0ddZd1ddZd2ddZddd3d%d&Z	ddd4d'd(Z
d5d*d+Zd6d,d-ZdS )7FileManagerr"   install_dirtemplate_dirbooldry_runset[str]	filenamesr#   Nonec                 C  s   || _ || _t | _|| _d S r7   )r\   r]   setra   r_   )selfr\   r]   r_   r   r   r    __init__~   s   
zFileManager.__init__filenamecontentsc                 C  s   zt |}| }W d    n1 sw   Y  W n ty%   d }Y nw ||krRtjtj|dd t |d}|| W d    d S 1 sKw   Y  d S d S )NT)exist_okw)openreadOSErrorosmakedirspathdirnamewrite)rd   rf   rg   fold_contentsr   r   r    _write_if_changed   s   

"zFileManager._write_if_changedrL   env_callable"Callable[[], str | dict[str, Any]]c           	   	   C  s   t j| j|}| }t|trgd|vr^td d }zttj	d j
p#| }W n ttfy7   | }Y nw z	|t }W n tyM   |j}Y nw i |ddd| d|  i}t|}||S t|trn|S t| d S )Ngenerated_commenttorchgenzgen.py__main__@zgenerated by z from )rm   ro   joinr]   
isinstancedict	REPO_ROOTr   sysmodules__file__absoluteKeyErrorAttributeErrorrelative_toas_posix
ValueErrorr,   rN   
substituter"   rK   )	rd   rL   ru   template_pathenvgenerator_default	generatorgenerator_pathtemplater   r   r    substitute_with_template   s<   



z$FileManager.substitute_with_templatec                 C  sX   | j  d| }|| jvsJ d| j| | js*| j||d}| j||d d S d S )N/zduplicate file write {filename})rL   ru   )rf   rg   )r\   ra   addr_   r   rt   )rd   rf   rL   ru   substitute_outr   r   r    write_with_template   s   zFileManager.write_with_templatec                 C  s   |  ||| d S r7   )r   )rd   rf   ru   r   r   r    rq      s   zFileManager.writeN)base_envitemsr5   key_fnCallable[[T], str]#Callable[[T], dict[str, list[str]]]
num_shardsrP   r   dict[str, Any] | Nonesharded_keysc             
   C  s   | j ||||||||d d S )N)r   ru   r   r   r   )write_sharded_with_template)rd   rf   r   r   ru   r   r   r   r   r   r    write_sharded   s   
zFileManager.write_shardedc                  sj  ddi}	dd t |D }
|	g|
 }|d ur |D ]  | qD ]#}|D ] | v r@t | ts7J d |   |< q&g  |< q&q"dfdd}| jrRd}|D ]}||}t|| }||}||
| | ||	| qT|d}|dkr~t|}|d | }||d  }|D ]  d }| 	| | | | fdd q| j
| j d| d|  d S )Nshard_id
Everythingc                 S  s   g | ]	}d d| iqS )r   r-   r   ).0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#   rb   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#   rb   )rangeupdater|   listcopyr_   rZ   rfindlenr   ra   discardr\   )rd   rf   rL   r   r   ru   r   r   r   
everythingshards
all_shardskeyr   itemsidr   dot_posbase_filename	extensionr   r   )r   r   r    r      sR   

	

z'FileManager.write_sharded_with_templatevariable_namec                 C  s2   d |ddd t| jD }| || dS )z[Write a file containing the list of all outputs which are
        generated by this script.zset({}
    {})z
    c                 s  s    | ]	}d | d  V  qdS )"Nr   )r   r,   r   r   r    	<genexpr>)  s    z,FileManager.write_outputs.<locals>.<genexpr>N)formatr{   sortedra   rt   )rd   r   rf   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.
        )rm   ro   relpathr]   rp   r   rd   r   r   r    template_dir_for_comments-  s   z%FileManager.template_dir_for_comments)r\   r"   r]   r"   r_   r^   r#   rb   )rf   r"   rg   r"   r#   rb   )rL   r"   ru   rv   r#   r"   )rf   r"   rL   r"   ru   rv   r#   rb   )rf   r"   ru   rv   r#   rb   )rf   r"   r   r5   r   r   ru   r   r   rP   r   r   r   r`   r#   rb   )rf   r"   rL   r"   r   r5   r   r   ru   r   r   rP   r   r   r   r`   r#   rb   )r   r"   rf   r"   r#   rb   r#   r"   )r   r   r   __annotations__re   rt   r   r   rq   r   r   r   r   r   r   r   r    r[   x   s    
 



!

D	r[   optionsr   r\   
str | Nonec                 C  s.   t j| jd}|r|n| j}t||| jdS )N	templates)r\   r]   r_   )rm   ro   r{   source_pathr\   r[   r_   )r   r\   r]   r   r   r    make_file_manager7  s
   r   P   objr   rD   widthc                 C  s0   t jdkrddlm} || ||S t| ||dS )N)   
   r   )pformat)rD   r   )r   version_infopprintr   _pformat)r   rD   r   r   r   r   r    dataclass_reprB  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: rA   c                   s$   g | ]}|j r|jt |jfqS r   )reprr,   getattr)r   rr   r   r   r    r   \  s   $ z_pformat.<locals>.<listcomp>= z,
())r   rJ   	__class__r   r   r   r   r|   r}   _format_dictr   rc   tuple_format_listr   appendr{   )r   rD   r   r   
class_namefields_list
fields_strr,   attr_curr_indentstr_repr
indent_strbodyr   r   r    r   P  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   rD   r   r   	dict_reprr   r   k_reprv_strr   r   r    r   s  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   )r   lr   rD   r   r   r    r     s    z _format_list.<locals>.<listcomp>)[])r   r   )r|   r   r   )r   rD   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   r@   r   r%   )r   r   r{   )
r   rD   r   r   r   r   	delimitercurr_indent_strr   r   r   r   r    r     s   r   c                   @  sf   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_levelrP   r#   rb   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   r@   c                 S  s   g | ]}d | dqS )z
namespace z {r   r   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_)rd   r  r  r  cpp_namespacesr   r   r    re     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  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	  r   r   r   r    prologue     zNamespaceHelper.prologuec                 C  r  r7   )r  r   r   r   r    epilogue  r  zNamespaceHelper.epiloguec                 C  r  r7   )r  r   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  )rd   r  r   r   r    get_cpp_namespace  s   z!NamespaceHelper.get_cpp_namespaceN)r   r  )r  r"   r  r"   r  rP   r#   rb   )r  )r  r"   r  rP   r#   r   r   )r   )r  r"   r#   r"   )r   r   r   __doc__re   staticmethodr  propertyr  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#   rb   c                 C  s"   |d u r	i | _ d S t|| _ d S r7   )r  r}   fromkeys)rd   r  r   r   r    re     s   
zOrderedSet.__init__r   r0   r^   c                 C  s
   || j v S r7   r  rd   r   r   r   r    __contains__  s   
zOrderedSet.__contains__Iterator[T]c                 C  s   t | j S r7   )iterr  keysr   r   r   r    __iter__     zOrderedSet.__iter__r   OrderedSet[T]c                 C  s   | j |j  d S r7   )r  r   )rd   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   )rd   retr   r   r    r     s   zOrderedSet.copyrE   c                  G  s,   | d   }| dd  D ]}|| q|S )Nr   rA   )r   r   )rE   r)  rO   r   r   r    union  s   zOrderedSet.unionotherc                 C  s   t | |S r7   )r  r*  rd   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  rc   r%  r,  r   r   r    __eq__  s   
zOrderedSet.__eq__r7   )r  r  r#   rb   )r   r0   r#   r^   )r#   r#  )r   r(  r#   rb   )r   r0   r#   rb   )r#   r(  )rE   r(  r#   r(  )r+  r(  r#   r(  )r+  r(  r#   r   )r+  r/  r#   r^   )r   r   r   r   re   r"  r&  r   r   r   r  r*  r-  r.  r0  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?   )r8   r   r#   r   )rL   r"   r#   r   )rO   r"   r#   rP   r7   )r   r   r\   r   r#   r[   )r   r   )r   r   rD   rP   r   rP   r#   r"   )r   )
r   r   rD   rP   r   rP   r   rP   r#   r"   )
r   r   rD   rP   r   rP   r   rP   r#   r"   )
r   r   rD   rP   r   rP   r   rP   r#   r"   )r   r   rD   rP   r   rP   r   rP   r   r"   r   r"   r#   r"   )=
__future__r   
contextlib	functoolsrU   rm   r&   r   rC   dataclassesr   r   enumr   r   pathlibr   typingr   r	   r
   r   r   r   r   typing_extensionsr   torchgen.code_templater   argparser   collections.abcr   r   r   r   r   parentr~   r   IDENT_REGEXr/   r0   r1   r:   r<   contextmanagerrH   rK   cacherN   rZ   r[   r   r   r   r   r   r   r   r  r   r   r   r    <module>   sZ    $




 A
#

A