o
    h>                     @   s  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mZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlm Z  G dd deZ!d	Z"d
e#dee#ee# f fddZ$edZ%edZ&dee%gee& f dee% dee& fddZ'dee%gee& f dee% dee& fddZ(e j)deg e#f ded fddZ*dedefddZ+ej,ddde#de fddZ-d e#de.fd!d"Z/G d#d$ d$Z0	dAd%ed&ee# de0fd'd(Z1	 	)dBd*ed+e.d,e.de#fd-d.Z2	 dCd*ed+e.d,e.d/e.de#f
d0d1Z3d2eeef d+e.d,e.d/e.de#f
d3d4Z4d2eee ee eed5f f d+e.d,e.d/e.de#f
d6d7Z5d8ee# d+e.d,e.d/e.d9e#d:e#de#fd;d<Z6G d=d> d>Z7G d?d@ d@ee% Z8dS )D    N)	Namespace)fieldsis_dataclass)autoEnum)AnyCallableDictGenericIterableIteratorListLiteralNoReturnOptionalSequenceSetTupleTypeVarUnion)CodeTemplatec                   @   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!   D/var/www/html/ai/venv/lib/python3.10/site-packages/torchgen/utils.pyr   (   s    
r   z(^|\W){}($|\W)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_params;   s
   r/   TSfuncxsc                 c   s&    |D ]}| |}|d ur|V  qd S Nr!   )r2   r3   xrr!   r!   r"   mapMaybeK   s   r7   c                 c   s    |D ]	}| |E d H  qd S r4   r!   )r2   r3   r5   r!   r!   r"   	concatMapS   s   r8   msg_fnc              
   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"   context[   s   rB   r5   c                 C   s   t dt| j )NzUnhandled type: )AssertionErrortyper   )r5   r!   r!   r"   assert_neverk   s   rE   )maxsizetemplate_fnc                 C   s
   t | S r4   )r   	from_file)rG   r!   r!   r"   _read_templateo   s   
rI   sc                 C   s"   t | d }tj|ddS )Nlatin1little)	byteorder)hashlibsha1encodedigestint
from_bytes)rJ   rO   r!   r!   r"   string_stable_hashu   s   rT   c                   @   s  e Zd ZU eed< eed< eed< ee ed< dedededdfddZd	ed
eddfddZdede	g e
eeeef f f defddZd	edede	g e
eeeef f f ddfddZd	ede	g e
ee
eeeef f f f ddfddZddd	edee de	egef de	egeeee f f dedeeeef  dee ddfddZded	eddfddZdefd d!ZdS )"FileManagerinstall_dirtemplate_dirdry_run	filenamesr$   Nc                 C   s   || _ || _t | _|| _d S r4   )rV   rW   setrY   rX   )selfrV   rW   rX   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)r[   r]   r^   fold_contentsr!   r!   r"   _write_if_changed   s   

"zFileManager._write_if_changedrG   env_callablec                 C   sv   t j| j|}| }t|tr.d|vr%d}|dt j| 7 }||d< t|}||S t|t	r5|S t
| d S )Ngenerated_commentz@generated by torchgen/gen.pyz from )rd   rf   joinrW   
isinstancedictbasenamerI   
substitutestrrE   )r[   rG   rl   template_pathenvcomment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})rG   rl   )r]   r^   )rV   rY   addrX   rx   rk   )r[   r]   rG   rl   substitute_outr!   r!   r"   write_with_template   s   zFileManager.write_with_templatec                 C   s   |  ||| d S r4   )r|   )r[   r]   rl   r!   r!   r"   rh      s   zFileManager.write)base_envitemskey_fn
num_shardsr}   sharded_keysc                   s  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tttt f dtttt f dd ffd	d
}| jrdd}|D ]}||}t	|| }||}||	| | ||| qf|
d}|dkrt|}|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.<locals>.<listcomp>z'sharded keys in base_env must be a list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.<locals>.merge_envr!   .c                      s    S r4   r!   r!   )shardr!   r"   <lambda>   s    z+FileManager.write_sharded.<locals>.<lambda>ry   )rangeupdatero   listcopyr	   rs   r   rX   rT   rfindlenr|   rY   discardrV   )r[   r]   r~   r   rl   r   r}   r   
everythingshards
all_shardskeyr   itemsidru   dot_posbase_filename	extensionr   r!   )r   r   r"   write_sharded   sR   

2	
zFileManager.write_sharded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)formatrn   sortedrY   rk   )r[   r   r]   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.
        )rd   rf   relpathrW   rg   __file__r[   r!   r!   r"   template_dir_for_comments
  s   z%FileManager.template_dir_for_comments)r   r   r   rs   __annotations__boolr   r\   rk   r   r   r	   r   rx   r|   rh   r   r0   r   rR   r   r   r   r   r!   r!   r!   r"   rU   }   sd   
 

"
	

A	rU   optionsrV   c                 C   s.   t j| jd}|r|n| j}t||| jdS )N	templates)rV   rW   rX   )rd   rf   rn   source_pathrV   rU   rX   )r   rV   rW   r!   r!   r"   make_file_manager  s
   r   P   objr>   widthc                 C   s0   t jdkrddlm} || ||S t| ||dS )N)   
   r   )pformat)r>   r   )sys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)r   ri   r   r!   r"   r   9  s   $ z_pformat.<locals>.<listcomp>= z,
())r   rD   	__class__r   r   r   r   ro   rp   _format_dictr   rZ   tuple_format_listr   appendrn   )r   r>   r   r   
class_namefields_list
fields_strr,   attr_curr_indentstr_repr
indent_strbodyr!   r   r"   r   -  s$   
r   r   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   	dict_reprr   r   k_reprv_strr!   r!   r"   r   P  s   r   .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   )r   lr   r>   r   r!   r"   r   k  s    z _format_list.<locals>.<listcomp>)[])r   r   )ro   r   r   )r   r>   r   r   	list_reprstartendr!   r   r"   r   d  s   r   r   r   r   c           
      C   sT   d\}}t t| |krd}d| }d| }d| | | }	| | |	 | S )N) r   r:   r   r%   )r   r   rn   )
r   r>   r   r   r   r   	delimitercurr_indent_strr   r   r!   r!   r"   r   s  s   r   c                   @   s   e Zd ZdZddededefddZe	dd	eded
d fddZe	d
efddZ
e	d
efddZe	d
efddZdded
ef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_strentity_name	max_levelc                 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_rn   	prologue_reversed	epilogue_namespaces_entity_name_)r[   r   r   r   cpp_namespacesr!   r!   r"   r\     s   

zNamespaceHelper.__init__namespaced_entityr$   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   r   N)r   r   r   )r*   rn   r   )r   r   namesr   r   r!   r!   r"   from_namespaced_entity  s   
z&NamespaceHelper.from_namespaced_entityc                 C      | j S r4   )r   r   r!   r!   r"   prologue     zNamespaceHelper.prologuec                 C   r   r4   )r   r   r!   r!   r"   epilogue  r   zNamespaceHelper.epiloguec                 C   r   r4   )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   )r[   r   r!   r!   r"   get_cpp_namespace  s   z!NamespaceHelper.get_cpp_namespaceN)r   r   )r   )r   )r   r   r   __doc__rs   rR   r\   staticmethodr   propertyr   r   r   r   r!   r!   r!   r"   r     s&    r   c                   @   s   e Zd ZU eeed f ed< ddeee  fddZ	dede
fdd	Zdee fd
dZdddZdeddfddZd ddZed!ddZd"ddZd"ddZdede
fddZdS )#
OrderedSetNstorageiterablec                 C   s&   |d u r	i | _ d S dd |D | _ d S )Nc                 S   s   i | ]}|d qS r4   r!   )r   r   r!   r!   r"   
<dictcomp>  s    z'OrderedSet.__init__.<locals>.<dictcomp>r   )r[   r   r!   r!   r"   r\     s   
zOrderedSet.__init__r   r$   c                 C   s
   || j v S r4   r  r[   r   r!   r!   r"   __contains__  s   
zOrderedSet.__contains__c                 C   s   t | j S r4   )iterr   keysr   r!   r!   r"   __iter__     zOrderedSet.__iter__r~   OrderedSet[T]c                 C   s   | j |j  d S r4   )r   r   )r[   r~   r!   r!   r"   r     s   zOrderedSet.updatec                 C   s   d | j |< d S r4   r  r  r!   r!   r"   rz     r  zOrderedSet.addc                 C   s   t  }| j |_|S r4   )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	  rJ   r!   r!   r"   union  s   zOrderedSet.unionotherc                 C   s   t | |S r4   )r   r
  r[   r  r!   r!   r"   __or__  s   zOrderedSet.__or__c                 C   s   |  | | S r4   )r   r  r!   r!   r"   __ior__  s   
zOrderedSet.__ior__c                 C   s(   t |tr| j|jkS t| j |kS r4   )ro   r   r   rZ   r  r  r!   r!   r"   __eq__  s   
zOrderedSet.__eq__r4   )r~   r  r$   N)r$   r  )r?   r  r$   r  )r  r  r$   r  )r   r   r   r	   r0   r   r   r   r   r\   r   r  r   r  r   rz   r   r   r
  r  r  objectr  r!   r!   r!   r"   r     s   
 



r   r4   )r   r   )r   )9
contextlib	functoolsrN   rd   r&   r   r=   argparser   dataclassesr   r   enumr   r   typingr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   torchgen.code_templater   r   IDENT_REGEXrs   r/   r0   r1   r7   r8   contextmanagerrB   rE   	lru_cacherI   rR   rT   rU   r   r   r   r   r   r   r   r   r!   r!   r!   r"   <module>   s    D,, 
 


#



?