U
    •Ê¹j>  ã                   @   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   úM/var/www/html/bwave/python/venv/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r€tˆ | tƒsntdƒ‚ˆ |  ¡ ˆ |< qLg ˆ |< qLqDtttt f tttt f d dœ‡fdd„}| j	rÄd	}|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 |ƒr€t||||	ƒ}
nBt|t	ƒršt
||||	ƒ}
n(t|tttfƒrºt||||	ƒ}
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((
  ÿ þ  ýü üû$
ûûù?