a
    dB                     @   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 d dlmZ d dl m!Z! zd dl"m#Z$ W n e%y   d d	l"m&Z$ Y n0 zd d
l"m'Z( W n  e%y   d dl"m)Z( Y n0 e(Z*G dd de$Z+G dd deZ,dZ-e.ee.ee. f dddZ/edZ0edZ1ee0gee1 f ee0 ee1 dddZ2ee0gee1 f ee0 ee1 dddZ3e j4eg e.f ed dddZ5eeddd Z6ej7dd!e.e!d"d#d$Z8e.e9d%d&d'Z:G d(d) d)Z;dAeee. e;d*d+d,Z<dBee9e9e.d.d/d0Z=dCee9e9e9e.d1d2d3Z>eeef e9e9e9e.d4d5d6Z?eee ee eed7f f e9e9e9e.d4d8d9Z@ee. e9e9e9e.e.e.d:d;d<ZAG d=d> d>ZBG d?d@ d@ee0 ZCdS )D    N)	Namespace)fieldsis_dataclass)autoEnum)AnyCallableDictGenericIterableIteratorListNoReturnOptionalSequenceSetTupleTypeVarUnion)Literal)CodeTemplate)CSafeLoader)
SafeLoader)CSafeDumper)
SafeDumperc                       s   e Zd Zd fdd	Z  ZS )
YamlLoaderFc                    s`   g }|j D ]@\}}| j||d}||vs@J d| d|jj || q
t j||d}|S )N)deepz'Found a duplicate key in the yaml. key=z, line=)valueZconstruct_objectZ
start_marklineappendsuperconstruct_mapping)selfnoder   mappingZkey_nodeZ
value_nodekey	__class__ W/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torchgen/utils.pyr!   /   s    zYamlLoader.construct_mapping)F)__name__
__module____qualname__r!   __classcell__r(   r(   r&   r)   r   .   s   r   c                   @   s0   e Zd Ze Ze Ze Ze Ze Ze Z	dS )TargetN)
r*   r+   r,   r   Z
DEFINITIONZDECLARATIONZREGISTRATIONZANONYMOUS_DEFINITIONZNAMESPACED_DEFINITIONZNAMESPACED_DECLARATIONr(   r(   r(   r)   r.   C   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_paramsU   s
    r;   TS)funcxsr0   c                 c   s$   |D ]}| |}|d ur|V  qd S Nr(   r>   r?   xrr(   r(   r)   mapMaybed   s    rD   c                 c   s"   |D ]}| |D ]
}|V  qqd S r@   r(   rA   r(   r(   r)   	concatMapl   s    rE   )msg_fnr0   c              
   c   s|   z
d V  W nl t yv } zT|  }t|d}|jrF|jd  d| n|}|f|jdd   |_ W Y d }~n
d }~0 0 d S )Nz  r   
   )	Exceptiontextwrapindentargs)rF   emsgr(   r(   r)   contextu   s    
rO   )rB   r0   c                 C   s   t dt| jd S )NzUnhandled type: {})AssertionErrorformattyper*   )rB   r(   r(   r)   assert_never   s    rS   )maxsize)template_fnr0   c                 C   s
   t | S r@   )r   	from_file)rU   r(   r(   r)   _read_template   s    rW   )sr0   c                 C   s"   t | d }tj|ddS )Nlatin1little)	byteorder)hashlibsha1encodedigestint
from_bytes)rX   r]   r(   r(   r)   string_stable_hash   s    rb   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)rd   re   rf   r0   c                 C   s   || _ || _t | _|| _d S r@   )rd   re   setrg   rf   )r"   rd   re   rf   r(   r(   r)   __init__   s    zFileManager.__init__)filenamecontentsr0   c                 C   s   z6t |d}| }W d    n1 s*0    Y  W n tyL   d }Y n0 ||krtjtj|dd t |d}|| W d    n1 s0    Y  d S )NrC   T)exist_okw)openreadIOErrorosmakedirspathdirnamewrite)r"   rj   rk   fZold_contentsr(   r(   r)   _write_if_changed   s    *
zFileManager._write_if_changed)rU   env_callabler0   c                 C   sv   t j| j|}| }t|tr\d|vrJd}|dt j|7 }||d< t|}|	|S t|t
rj|S t| d S )NZgenerated_commentz@generated by torchgen/gen.pyz from {})rq   rs   joinre   
isinstancedictrQ   basenamerW   
substitutestrrS   )r"   rU   rx   Ztemplate_pathenvcommenttemplater(   r(   r)   substitute_with_template   s    


z$FileManager.substitute_with_template)rj   rU   rx   r0   c                 C   sR   d | j|}|| jvs J d| j| | jsN| j||d}| j||d d S )Nz{}/{}zduplicate file write {filename})rU   rx   )rj   rk   )rQ   rd   rg   addrf   r   rw   )r"   rj   rU   rx   Zsubstitute_outr(   r(   r)   write_with_template   s    zFileManager.write_with_template)rj   rx   r0   c                 C   s   |  ||| d S r@   )r   )r"   rj   rx   r(   r(   r)   ru      s    zFileManager.write)base_env)rj   itemskey_fnrx   
num_shardsr   sharded_keysr0   c                   s  ddi}dd t |D }	|g|	 }
|d ur@|
D ]  | q0D ]F}|
D ]< | v rt | tsnJ 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 )r   r9   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_r0   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 r@   r(   r(   )shardr(   r)   <lambda>      z+FileManager.write_sharded.<locals>.<lambda>/)rangeupdaterz   listcopyr	   r~   r   rf   rb   rfindlenr   rg   discardrd   )r"   rj   r   r   rx   r   r   r   Z
everythingZshardsZ
all_shardsr%   r   itemZsidr   Zdot_posbase_filename	extensionr   r(   )r   r   r)   write_sharded   sP    
.

zFileManager.write_sharded)variable_namerj   r0   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(   )r   r8   r(   r(   r)   	<genexpr>!  r   z,FileManager.write_outputs.<locals>.<genexpr>N)rQ   ry   sortedrg   rw   )r"   r   rj   contentr(   r(   r)   write_outputs  s
    zFileManager.write_outputsr0   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.
        )rq   rs   relpathre   rt   __file__r"   r(   r(   r)   template_dir_for_comments%  s    z%FileManager.template_dir_for_comments)r*   r+   r,   r~   __annotations__boolr   ri   rw   r   r   r	   r   r   r   ru   r   r<   r   r`   r   r   r   r   r(   r(   r(   r)   rc      s>   
"B	rc   )optionsrd   r0   c                 C   s.   t j| jd}|r|n| j}t||| jdS )NZ	templates)rd   re   rf   )rq   rs   ry   source_pathrd   rc   rf   )r   rd   re   r(   r(   r)   make_file_manager/  s
    r   P   )objrK   widthr0   c                 C   s0   t jdkr"ddlm} || ||S t| ||dS )N)   
   r   )pformat)rK   r   )sysversion_infopprintr   _pformat)r   rK   r   r   r(   r(   r)   dataclass_repr:  s    
r   )r   rK   r   curr_indentr0   c                    s   t  sJ 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: rH   c                    s$   g | ]}|j r|jt |jfqS r(   )reprr8   getattr)r   rv   r   r(   r)   r   T  r   z_pformat.<locals>.<listcomp>= z,
())r   rR   r'   r*   r   r   r   rz   r{   _format_dictr   rh   tuple_format_listr   r   ry   )r   rK   r   r   
class_nameZfields_list
fields_strr8   attrZ_curr_indentZstr_repr
indent_strbodyr(   r   r)   r   H  s$    
r   )r   rK   r   r   r0   c           	      C   sv   ||d 7 }g }|   D ]J\}}t|}t|rFt||||t| nt|}|| d|  qt||||ddS )Nr   z: {})r   r   r   r   r   r   _format)	r   rK   r   r   Z	dict_reprr   r   Zk_reprZv_strr(   r(   r)   r   k  s    r   .c                    sJ    d 7   fdd| D }t | tr0dnd\}}t| ||S )NrH   c                    s*   g | ]"}t |rt| nt|qS r(   )r   r   r   )r   lr   rK   r   r(   r)   r     s   z _format_list.<locals>.<listcomp>)[])r   r   )rz   r   r   )r   rK   r   r   Z	list_reprstartendr(   r   r)   r     s    r   )r   rK   r   r   r   r   r0   c           
      C   sT   d\}}t t| |kr$d}d| }d| }d| | | }	| | |	 | S )N) r   rG   r   r1   )r   r   ry   )
r   rK   r   r   r   r   	delimiterZcurr_indent_strr   r   r(   r(   r)   r     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,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   rG   c                 S   s   g | ]}d | dqS )z
namespace z {r(   r   nr(   r(   r)   r     r   z,NamespaceHelper.__init__.<locals>.<listcomp>c                 S   s   g | ]}d | qS )z} // namespace r(   r   r(   r(   r)   r     r   )	r6   r   cpp_namespace_ry   	prologue_reversed	epilogue_Znamespaces_entity_name_)r"   r   r   r   Zcpp_namespacesr(   r(   r)   ri     s    

zNamespaceHelper.__init__)namespaced_entityr   r0   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   )r6   ry   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)defaultr0   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   )r"   r   r(   r(   r)   get_cpp_namespace  s    z!NamespaceHelper.get_cpp_namespaceN)r   r   )r   )r   )r*   r+   r,   __doc__r~   r`   ri   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 u ri | _ ndd |D | _ d S )Nc                 S   s   i | ]
}|d qS r@   r(   )r   r   r(   r(   r)   
<dictcomp>  r   z'OrderedSet.__init__.<locals>.<dictcomp>r   )r"   r   r(   r(   r)   ri     s    zOrderedSet.__init__)r   r0   c                 C   s
   || j v S r@   r   r"   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])r   r0   c                 C   s   | j |j  d S r@   )r   r   )r"   r   r(   r(   r)   r     s    zOrderedSet.updatec                 C   s   d | j |< d S r@   r   r   r(   r(   r)   r     s    zOrderedSet.addc                 C   s   t  }| j |_|S r@   )r   r   r   )r"   retr(   r(   r)   r     s    zOrderedSet.copy)rL   r0   c                  G   s,   | d   }| dd  D ]}|| q|S )Nr   rH   )r   r   )rL   r   rX   r(   r(   r)   union  s    zOrderedSet.union)otherr0   c                 C   s   t | |S r@   )r   r   r"   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@   )rz   r   r   rh   r   r   r(   r(   r)   __eq__  s    
zOrderedSet.__eq__)N)r*   r+   r,   r	   r<   r   r   r   r   ri   r   r   r   r   r   r   r   r   r   r   r  objectr  r(   r(   r(   r)   r     s   
r   )N)r   r   )r   )D
contextlib	functoolsr\   rq   r2   r   rJ   argparser   Zdataclassesr   r   enumr   r   typingr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Ztyping_extensionsr   Ztorchgen.code_templater   Zyamlr   LoaderImportErrorr   r   ZDumperr   Z
YamlDumperr   r.   ZIDENT_REGEXr~   r;   r<   r=   rD   rE   contextmanagerrO   rS   	lru_cacherW   r`   rb   rc   r   r   r   r   r   r   r   r   r(   r(   r(   r)   <module>   s   @((	
     $
?