U
    5-e>                     @   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"e#ee#ee# f d
ddZ$edZ%edZ&ee%gee& f ee% ee& dddZ'ee%gee& f ee% ee& dddZ(e j)eg e#f ed dddZ*eedddZ+ej,dde#e dddZ-e#e.ddd Z/G d!d" d"Z0d:eee# e0d#d$d%Z1d;ee.e.e#d'd(d)Z2d<ee.e.e.e#d*d+d,Z3eeef e.e.e.e#d-d.d/Z4eee ee eed0f f e.e.e.e#d-d1d2Z5ee# e.e.e.e#e#e#d3d4d5Z6G d6d7 d7Z7G d8d9 d9ee% Z8dS )=    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   Z
DEFINITIONZDECLARATIONZREGISTRATIONZANONYMOUS_DEFINITIONZNAMESPACED_DEFINITIONZNAMESPACED_DECLARATION r   r   O/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/torchgen/utils.pyr   (   s   r   z(^|\W){}($|\W))schemareturnc                 C   s>   t d| }|d k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xsr   c                 c   s$   |D ]}| |}|d k	r|V  qd S Nr   )r,   r-   xrr   r   r   mapMaybeK   s    r1   c                 c   s   |D ]}| |E d H  qd S r.   r   )r,   r-   r/   r   r   r   	concatMapS   s    r2   )msg_fnr   c              
   c   sz   z
d V  W nj t k
rt } zL|  }t|d}|jrH|jd  d| n|}|f|jdd   |_ W 5 d }~X Y nX d S )Nz  r   
   )	Exceptiontextwrapindentargs)r3   emsgr   r   r   context[   s    
r<   )r/   r   c                 C   s   t dt| j d S )NzUnhandled type: )AssertionErrortyper   )r/   r   r   r   assert_neverk   s    r?   )maxsize)template_fnr   c                 C   s
   t | S r.   )r   	from_file)rA   r   r   r   _read_templateo   s    rC   )sr   c                 C   s"   t | d }tj|ddS )Nlatin1little)	byteorder)hashlibsha1encodedigestint
from_bytes)rD   rI   r   r   r   string_stable_hashu   s    rN   c                
   @   sV  e Zd ZU eed< eed< eed< ee ed< eeeddddZeedd	d
dZee	g e
eeeef f f edddZeee	g e
eeeef f f ddddZee	g e
ee
eeeef f f f ddddZddeee e	egef e	egeeee f f eeeeef  ee ddddZeeddddZedddZdS )FileManagerinstall_dirtemplate_dirdry_run	filenamesN)rP   rQ   rR   r   c                 C   s   || _ || _t | _|| _d S r.   )rP   rQ   setrS   rR   )selfrP   rQ   rR   r   r   r   __init__   s    zFileManager.__init__)filenamecontentsr   c              	   C   s|   z t |}| }W 5 Q R X W n tk
r8   d }Y nX ||krxtjtj|dd t |d}|| W 5 Q R X d S )NT)exist_okw)openreadOSErrorosmakedirspathdirnamewrite)rU   rW   rX   fZold_contentsr   r   r   _write_if_changed   s    

zFileManager._write_if_changed)rA   env_callabler   c                 C   sv   t j| j|}| }t|tr\d|krJd}|dt j| 7 }||d< t|}||S t|t	rj|S t
| d S )NZgenerated_commentz@generated by torchgen/gen.pyz from )r^   r`   joinrQ   
isinstancedictbasenamerC   
substitutestrr?   )rU   rA   re   Ztemplate_pathenvcommenttemplater   r   r   substitute_with_template   s    


z$FileManager.substitute_with_template)rW   rA   re   r   c                 C   sT   | j  d| }|| jks"td| j| | jsP| j||d}| j||d d S )N/zduplicate file write {filename})rA   re   )rW   rX   )rP   rS   r=   addrR   ro   rd   )rU   rW   rA   re   Zsubstitute_outr   r   r   write_with_template   s    zFileManager.write_with_template)rW   re   r   c                 C   s   |  ||| d S r.   )rr   )rU   rW   re   r   r   r   rb      s    zFileManager.write)base_env)rW   itemskey_fnre   
num_shardsrs   sharded_keysr   c                   s  ddi}dd t |D }	|g|	 }
|d k	r@|
D ]  | q0D ]F}|
D ]< | krt | tsntd |   |< qLg  |< qLqDtttt f tttt f d dfdd}| j	rd	}|D ]8}||}t
|| }||}||	| | ||| q|d
}|dkrt|}|d | }||d  }|
D ]0  d }| | | | | fdd q:| j| j d| d|  d S )Nshard_idZ
Everythingc                 S   s   g | ]}d d| iqS )rx   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 ].\}}| ks&td| | |  |7  < qd S )Nzundeclared sharded key )rt   r=   )r|   r}   kv)rw   r   r   	merge_env   s    z,FileManager.write_sharded.<locals>.merge_envr   .c                      s    S r.   r   r   )shardr   r   <lambda>       z+FileManager.write_sharded.<locals>.<lambda>rp   )rangeupdaterg   listr=   copyr	   rk   r   rR   rN   rfindlenrr   rS   discardrP   )rU   rW   rt   ru   re   rv   rs   rw   Z
everythingZshardsZ
all_shardskeyr   itemZsidrl   Zdot_posbase_filename	extensionrx   r   )r   rw   r   write_sharded   sV    
 .

  
zFileManager.write_sharded)variable_namerW   r   c                 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   )ry   r&   r   r   r   	<genexpr>  s     z,FileManager.write_outputs.<locals>.<genexpr>N)formatrf   sortedrS   rd   )rU   r   rW   contentr   r   r   write_outputs  s
    zFileManager.write_outputsr   c                 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.
        )r^   r`   relpathrQ   ra   __file__rU   r   r   r   template_dir_for_comments
  s    z%FileManager.template_dir_for_comments)r   r   r   rk   __annotations__boolr   rV   rd   r   r   r	   r   ro   rr   rb   r   r*   r   rL   r   r   r   r   r   r   r   r   rO   }   s@   
 "A	rO   )optionsrP   r   c                 C   s.   t j| jd}|r|n| j}t||| jdS )NZ	templates)rP   rQ   rR   )r^   r`   rf   source_pathrP   rO   rR   )r   rP   rQ   r   r   r   make_file_manager  s      r   P   )objr8   widthr   c                 C   s0   t jdkr"ddlm} || ||S t| ||dS )N)   
   r   )pformat)r8   r   )sysversion_infopprintr   _pformat)r   r8   r   r   r   r   r   dataclass_repr  s    
r   )r   r8   r   curr_indentr   c                    s   t  st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: r5   c                    s$   g | ]}|j r|jt |jfqS r   )reprr&   getattr)ry   rc   r   r   r   r{   9  s      z_pformat.<locals>.<listcomp>= z,
())r   r=   r>   	__class__r   r   r   r   rg   rh   _format_dictr   rT   tuple_format_listr   appendrf   )r   r8   r   r   
class_nameZfields_list
fields_strr&   attrZ_curr_indentZstr_repr
indent_strbodyr   r   r   r   -  s$    
r   )r   r8   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: {})rt   r   r   r   r   r   _format)	r   r8   r   r   Z	dict_reprr~   r   Zk_reprZv_strr   r   r   r   P  s    r   .c                    sJ    d 7   fdd| D }t | tr0dnd\}}t| ||S )Nr5   c                    s*   g | ]"}t |rt| nt|qS r   )r   r   r   )ry   lr   r8   r   r   r   r{   k  s   z _format_list.<locals>.<listcomp>)[])r   r   )rg   r   r   )r   r8   r   r   Z	list_reprstartendr   r   r   r   d  s    r   )r   r8   r   r   r   r   r   c           
      C   sT   d\}}t t| |kr$d}d| }d| }d| | | }	| | |	 | S )N) r   r4   r   r   )r   r   rf   )
r   r8   r   r   r   r   	delimiterZcurr_indent_strr   r   r   r   r   r   s  s    r   c                   @   s   e Zd ZdZdeeedddZedeed ddd	Ze	ed
ddZ
e	ed
ddZe	ed
ddZdee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_strentity_name	max_levelc                 C   sr   | d}t||ks,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   r4   c                 S   s   g | ]}d | dqS )z
namespace z {r   ry   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   r=   cpp_namespace_rf   	prologue_reversed	epilogue_Znamespaces_entity_name_)rU   r   r   r   Zcpp_namespacesr   r   r   rV     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   r   Nr   )r$   rf   r   )r   r   namesr   r   r   r   r   from_namespaced_entity  s    
  z&NamespaceHelper.from_namespaced_entityr   c                 C   s   | j S r.   )r   r   r   r   r   prologue  s    zNamespaceHelper.prologuec                 C   s   | j S r.   )r   r   r   r   r   epilogue  s    zNamespaceHelper.epiloguec                 C   s   | j S r.   )r   r   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   )rU   r   r   r   r   get_cpp_namespace  s    z!NamespaceHelper.get_cpp_namespaceN)r   r   )r   )r   )r   r   r   __doc__rk   rL   rV   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eee  dddZ	ee
dddZee d	d
dZdddddZe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ee
dddZdS )
OrderedSetNstorage)iterablec                 C   s$   |d kri | _ ndd |D | _ d S )Nc                 S   s   i | ]
}|d qS r.   r   )ry   r~   r   r   r   
<dictcomp>  s      z'OrderedSet.__init__.<locals>.<dictcomp>r   )rU   r   r   r   r   rV     s    zOrderedSet.__init__)r   r   c                 C   s
   || j kS r.   r   rU   r   r   r   r   __contains__  s    zOrderedSet.__contains__r   c                 C   s   t | j S r.   )iterr   keysr   r   r   r   __iter__  s    zOrderedSet.__iter__zOrderedSet[T])rt   r   c                 C   s   | j |j  d S r.   )r   r   )rU   rt   r   r   r   r     s    zOrderedSet.updatec                 C   s   d | j |< d S r.   r   r   r   r   r   rq     s    zOrderedSet.addc                 C   s   t  }| j |_|S r.   )r   r   r   )rU   retr   r   r   r     s    zOrderedSet.copy)r9   r   c                  G   s,   | d   }| dd  D ]}|| q|S )Nr   r5   )r   r   )r9   r   rD   r   r   r   union  s    zOrderedSet.union)otherr   c                 C   s   t | |S r.   )r   r   rU   r   r   r   r   __or__  s    zOrderedSet.__or__c                 C   s   |  | | S r.   )r   r   r   r   r   __ior__  s    
zOrderedSet.__ior__c                 C   s,   t |tr| j|jkS t| j |kS d S r.   )rg   r   r   rT   r   r   r   r   r   __eq__  s    
zOrderedSet.__eq__)N)r   r   r   r	   r*   r   r   r   r   rV   r   r   r   r   r   rq   r   r   r   r   r   objectr   r   r   r   r   r     s   
r   )N)r   r   )r   )9
contextlib	functoolsrH   r^   r    r   r7   argparser   dataclassesr   r   enumr   r   typingr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Ztorchgen.code_templater   r   ZIDENT_REGEXrk   r)   r*   r+   r1   r2   contextmanagerr<   r?   	lru_cacherC   rL   rN   rO   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   D((
      $
?