a
    dh                     @   s4  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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 d dlmZ d dlZd dlmZmZmZmZmZmZ d dlmZ ddl m!Z!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+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 e8e9Z:ej;j<j=j>Z>ej;j<j=j?Z?ej;j<j=j@Z@eAde@fde?fdejBfdejAjCfde/fde-fde7fde6fdejDfdeEdfg
ZFdd ZGdd ZHG dd deZIG dd dZJe+ejKeeLeMf eNddd d!ZOe+ejKeeLeMf eNd"d#d$ZPe%eP d%d& ZQdS )'    N)currentframegetframeinfo)	AnyCallableDictListOptionalSetTupleTypeUnion)ReferenceType)DuplicateInputsGuardGuardBuilderBaseGuardEnvExprGuardSourceSource)SYMPY_INTERP   )configconvert_framemutation_guard)set_guard_error_hookset_guard_fail_hook)unimplemented)GuardedCode	GuardFailGuardFn)dict_const_keysdict_const_keys_reprdict_param_key_idsguard_failures	HAS_NUMPYistypenporig_code_maprename_implicittuple_iterator_getitemtuple_iterator_lenZ___check_type_idZ___check_obj_idZ___is_grad_enabledZ___odict_getitemZ___dict_param_key_idsZ___dict_const_keysZ___tuple_iterator_lenZ___tuple_iterator_getitemZ__math_isnaninfc                 C   s4   t d| }|r,|ddkr,t|dS t| S )z)
    "___odict_getitem(a, 1)" => "a"
    z([a-z0-9_]+)\(([^(),]+)[^()]*\)r   slice   )researchgroupstrip_function_callstrip_getattr_getitem)namem r4   ]/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/_dynamo/guards.pyr0   A   s    r0   c                 C   s   t d| d S )z*
    "a[1]" => "a"
    "a.foo" => "a"
    z[.\[]r   )r-   split)r2   r4   r4   r5   r1   K   s    r1   c                   @   sl  e Zd Zd9eee gef eegef ee	eef  ddddZ
eedddZeeef ed	d
dZedddZedddZedddZedddZedddZedddZedddZedddZedddZeddd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zedd-d.Z edd/d0Z!edd1d2Z"edd3d4Z#d:d7d8Z$d5S );GuardBuilderTCheckFunctionManager)id_ref
source_refscopecheck_fn_managerc                 C   s   || _ || _|r(|r.dd | D }nt }|| _tj | jd< tj	j
j D ]<\}}|dddddd}|| jd |< || j|< qRg | _g | _g | _g | _g | _i | _|| _d S )	Nc                 S   s   i | ]\}}t ||qS r4   r'   .0kvr4   r4   r5   
<dictcomp>`       z)GuardBuilder.__init__.<locals>.<dictcomp>__builtins__>_<.Z_dot_)r9   r:   itemsdictr;   builtins__dict__copytorchpackageZpackage_importerZ_package_imported_modulesreplaceargnamescodeshape_env_codetensor_check_namestensor_check_examplestensor_check_idsr<   )selfr9   r:   r;   r<   renamesr2   Zpackage_moduler4   r4   r5   __init__T   s,    zGuardBuilder.__init__)r2   returnc                 C   s   t || jtS N)evalr;   CLOSURE_VARS)rW   r2   r4   r4   r5   get   s    zGuardBuilder.get)guardrZ   c                 C   sX   t |tr|}n|j}tt|}|| jvrTtd|rHt	d|  | j
| |S )Nz^\d+$zinvalid var name: )
isinstancestrr2   r1   r0   rQ   r-   matchlogwarningappend)rW   r_   r2   baser4   r4   r5   arg_ref   s    

zGuardBuilder.arg_ref)r_   c                 C   sD   t | |j}| |}d| | d| d}| ||g d S )N___check_type_id(, ))typer^   r2   r9   rg   _produce_guard_code)rW   r_   tZobj_idrR   r4   r4   r5   
TYPE_MATCH   s    
zGuardBuilder.TYPE_MATCHc                 C   sf   t d|j}|r.| t|d|jtjS d| | d| 	| 
|j d}| ||g d S )Nz^type\((.+)\)$r   z___check_obj_id(ri   rj   )r-   rb   r2   rn   r   r/   sourcer7   rg   r9   r^   rl   )rW   r_   r3   rR   r4   r4   r5   ID_MATCH   s    &zGuardBuilder.ID_MATCHc                 C   s4   |  |j}| | d|j }| ||g d S )Nz.__name__ == )r^   r2   rg   __name__rl   )rW   r_   objrR   r4   r4   r5   
NAME_MATCH   s    zGuardBuilder.NAME_MATCHc                 C   s   t d|j}|s"J d|j |dd\}}| |}t| ||}d }|rhd| d|d}nd| d|d}| j||g| |d	 d S )
Nz^(.*)[.]([a-zA-Z0-9_]+)$zinvalid hasattr check r   r,   zhasattr(ri   rj   znot hasattr()provided_guarded_object)r-   rb   r2   r/   rg   hasattrr^   rl   )rW   r_   r3   rf   attrrefvalrR   r4   r4   r5   HASATTR   s    
zGuardBuilder.HASATTRc           	      C   s  |  |}| |j}t|}trRtjtjtjtj	tj
tjtjtjtjtjtjfnd}t|ttttd tttttttttjtjtjf| sJ |j t|tjtjfrd| dt|g}| !|| d S t|tr,t"#|r,t }|$d| d| %| d |$d| d | !|| d S t }t|ttfr| &| t'|D ]2\}}|$d| d| d	| %t| d qTn,t|tjs|$d| d| %| d t|tjrt|}|$| d
| | !|| d S )Nr4   str() == rh   ri   rj   z__math_isnan([z], z == )(rg   r^   r2   rk   r#   r%   Zint8int16int32int64Zuint8Zuint16Zuint32Zuint64float16float32float64r$   intfloatboolra   listtuplesetr+   	frozensetrangerN   SizeZdeviceZdtyperq   rl   mathisnanre   r9   LIST_LENGTH	enumerate)	rW   r_   rw   rx   rm   Znp_typesrR   idxelemr4   r4   r5   EQUALS_MATCH   s    

 
zGuardBuilder.EQUALS_MATCHc                 C   s8   |  |j}t|ttd fr*| | n
| | d S r[   )r^   r2   r$   r   rk   rp   r   )rW   r_   rx   r4   r4   r5   CONSTANT_MATCH  s    zGuardBuilder.CONSTANT_MATCHc                    sX    | | |j fdd}tdrB|  ntdt  d S )Nc                      s,   t jtsJ j  dj  d S )Nz.training == )r$   trainingr   rR   re   r4   rw   rW   rx   r4   r5   setup_guard#  s    z+GuardBuilder.NN_MODULE.<locals>.setup_guardr   z$Guard setup for uninitialized class )rp   rg   r^   r2   ru   r   rk   )rW   r_   r   r4   r   r5   	NN_MODULE  s    


zGuardBuilder.NN_MODULEc                 C   s   |  r| |S dS )z0things like torch.add and user defined functionsN)is_localrp   rW   r_   r4   r4   r5   FUNCTION_MATCH-  s    zGuardBuilder.FUNCTION_MATCHc                 C   s
   |  |S r[   r   r   r4   r4   r5   BUILTIN_MATCH2  s    zGuardBuilder.BUILTIN_MATCHc                 C   s
   |  |S r[   r   r   r4   r4   r5   PYMODULE_MATCH5  s    zGuardBuilder.PYMODULE_MATCHc                 C   sl   |  |}| |j}t|}t }|d| d| | d |d| dt|  | || d S )Nrh   ri   rj   zlen(r{   )	rg   r^   r2   rk   r   re   r9   lenrl   rW   r_   rw   valuerm   rR   r4   r4   r5   r   8  s    
zGuardBuilder.LIST_LENGTHc                 C   sl   |  |}| |j}t|}t }|d| d| | d |d| dt|  | || d S )Nrh   ri   rj   z___tuple_iterator_len(r{   )	rg   r^   r2   rk   r   re   r9   r)   rl   r   r4   r4   r5   TUPLE_ITERATOR_LENC  s    
zGuardBuilder.TUPLE_ITERATOR_LENc           	      C   s   |  |}| |j}t|}t }|d| d| | d tt|}tt	|}t
|}|r|d| d| |d| d|  n|d| d|  | || d S )	Nrh   ri   rj   z___dict_param_key_ids(r{   z___dict_const_keys(zset(.keys()) == )rg   r^   r2   rk   r   re   r9   r   r!   r   r    rl   )	rW   r_   rw   r   rm   rR   Zparam_key_idsZ
const_keysZconst_keys_reprr4   r4   r5   	DICT_KEYSN  s    
zGuardBuilder.DICT_KEYSc                 C   s   |  || | dg d S )Nz is not None)rl   rg   r   r4   r4   r5   WEAKREF_ALIVE`  s    zGuardBuilder.WEAKREF_ALIVEc                 C   sz   |  |}| |j}t|}dd | D }t }|d| d| | d |d| d| | || d S )Nc                 S   s   h | ]\}}|qS r4   r4   r>   r4   r4   r5   	<setcomp>g  rC   z5GuardBuilder.NN_MODULE_PARAM_NAMES.<locals>.<setcomp>rh   ri   rj   z{k for k, v in z.named_parameters()} == )	rg   r^   r2   rk   Znamed_parametersr   re   r9   rl   )rW   r_   rw   r   rm   keysrR   r4   r4   r5   NN_MODULE_PARAM_NAMESc  s    
z"GuardBuilder.NN_MODULE_PARAM_NAMESc                 C   sp   |  |}| |j}t|}t }|d| d| | d |d| dt|  | 	|| dS )zOrderedDict keys matchrh   ri   rj   rz   r   N)
rg   r^   r2   rk   r   re   r9   ra   r   rl   r   r4   r4   r5   
ODICT_KEYSo  s    
zGuardBuilder.ODICT_KEYSc                 C   s   t | |j| j d S r[   )r   Zwatchr^   r2   r<   r   r4   r4   r5   OBJECT_MUTATION{  s    zGuardBuilder.OBJECT_MUTATIONc                 C   sD   |j dksJ |jtju sJ d}tjr.d}nd}| ||g dS )zGuard on the initial grad state Nz___is_grad_enabled()znot ___is_grad_enabled())r2   ro   r   GLOBALr   Zinitial_grad_staterl   )rW   r_   rR   r4   r4   r5   	GRAD_MODE~  s    zGuardBuilder.GRAD_MODEc                 C   sd   |j dksJ | jj}|j}|jjdd |D dd |D | jd}|D ]}| j||gdd qHd S )Nr   c                 S   s   g | ]
}|j qS r4   )Zfaker?   ar4   r4   r5   
<listcomp>  rC   z*GuardBuilder.SHAPE_ENV.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r4   )ro   r   r4   r4   r5   r     rC   )r:   T)	shape_env)r2   r<   output_graphZtracked_fakesr   Zproduce_guardsr:   rl   )rW   r_   r   fsguardsZshape_guardr4   r4   r5   	SHAPE_ENV  s    zGuardBuilder.SHAPE_ENVc                 C   s   |  r| | nl| |j}t|tjs0J | |}| j	| | j
	| t|| j|< |dtt|d t| d S )NTENSOR_MATCH)is_nn_modulerp   r^   r2   r`   rN   ZTensorrg   rT   re   rU   idrV   set_export_infoweakrefrw   rk   )rW   r_   r   Ztensor_namer4   r4   r5   r     s    
zGuardBuilder.TENSOR_MATCHNFc                 C   s   t  }|d usJ |j}~|d us&J t|d }~|t| jv sPJ d| |rb| j| n| j| |d u r|jd uo|jdk}|r| 	|jnd }	n|}	|	d urt
t|	nd }
d }t|	jdrt
|	}|||
|| d S )Nr,   zH_produce_guard_code must be called from inside GuardedCode. Called from r   __weakref__)r   f_backr   dir	__class__rS   extendrR   r2   r^   r   rw   rk   ru   r   )rW   r_   Z	code_listrt   r   Z	cur_frameZcaller	func_nameZ
name_validZguarded_objectZguarded_object_typeZobj_refr4   r4   r5   rl     s<    
z GuardBuilder._produce_guard_code)T)NF)%rq   
__module____qualname__r   r   objectra   r   r   r   rY   r   r^   r   r   rg   rn   rp   rs   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rl   r4   r4   r4   r5   r7   S   s>    ;L r7   c                   @   sf   e Zd Zdeeeef  eeeef  eeeeef gdf  dddZ	dd Z
dd Zd	d
 ZdS )r8   N)f_locals	f_globalsguard_fail_fnc                    s   |r
|j nd }d| _g | _t | _|| _dd } fdd}t| j||||| dd}t| j||| dd}	t	|t	|	 t
|pg tjdD ]4}
tjs|
 rd	|
jvrd
|
jvrq|
||	 q| ||	||| _| j  d S )NTc                 S   s$   | d u r|S |d u r| S i | |S r[   r4   )leftrightr4   r4   r5   combine_scopes  s
    z5CheckFunctionManager.__init__.<locals>.combine_scopesc                    sD   |   }|tju r|  S |   }|d us6J ||  S r[   )guard_sourcer   ZCONSTANTr2   selectrg   )ro   r   ZbuilderZw_globalZw_localr4   r5   r:     s    
z1CheckFunctionManager.__init__.<locals>.source_ref)rX   F)key__defaults____kwdefaults__)r   valid	_weakrefsr   	_seen_idsr   r7   r9   r   rw   sortedr   sort_keyr   Zguard_nn_modulesr   r2   createcompile_check_fnZcheck_fnclear)rW   r   r   r   r   r   r   r:   local_builderglobal_builderr_   r4   r   r5   rY     sD    		

zCheckFunctionManager.__init__c                 C   s  t |jt |j@ rJ dd |j D }|dd |jD 7 }|dg7 }d|}dg|j |j }dg|j |j }|j|j }	|j }
|
	|j d }d }|	r
|j
|j
 }t|dtji}|j}|j}|dd	|	 d
 d	|	dg }|d| d
 | jr| jjjjng }|D ]}t|tr| jj|j }| jj|j }|dkrf|dksnJ d| jj| jsJ d| jj| jsJ d| jj| j  d| jj| j  }|| || ntd| q&||j  ||j  |j rJ dt!|}t"#d| fd|fd|fd|	fgt$t%&  }|	t' dd|  d| d| d}t(j)*dd dkrt+d| t,t- t. }t/||j| |d |0  }||_1||_2||_3||_4|j|_5||_6|S )Nc                 S   s   g | ]}|d kr|qS Z___implicit0r4   r   r4   r4   r5   r   .  rC   z9CheckFunctionManager.compile_check_fn.<locals>.<listcomp>c                 S   s   g | ]}|d kr|qS r   r4   r   r4   r4   r5   r   /  rC   z**___kwargs_ignored,z___guarded_code.validdynamic_shapesz___check_tensors(ri   rj   z%tensor_check_names=tensor_check_namesz___check_tensors_verbose(r   z.Deduped args out of bounds, cannot be negativezDeduped arg must be a tensorz is zUnknown GuardEnvExpr: z and Z___guarded_codeZ___check_tensorsZ___check_tensors_verboserT   zdef ___make_guard_fn(z):
    return lambda z: 
ZTORCHDYNAMO_PRINT_GUARDS1ZGUARDSZ___make_guard_fn)7r   rQ   r;   r   joinrR   rT   rV   rM   updaterU   TensorGuardsr   r   checkZcheck_verbosere   r   Ztracing_contextZguards_contextaotautograd_guardsr`   r   Z
pos_to_argZinput_pos_aZinput_pos_bZ	graphargsZ	is_tensorro   r2   RuntimeErrorr   rS   uniquecollectionsOrderedDictr   r   rI   r]   osenvironr^   printr   guard_fail_hookrJ   execvaluesclosure_varsargs
code_partsverbose_code_partsglobal_scoper   )rW   r   r   Z
guards_outr   largsr   r   r   rT   rV   Zcheck_tensors_fnZcheck_tensors_verbose_fnrU   Ztensor_guardsZverbose_argsr   r_   Zpos_aZpos_bZ	code_partrR   r   Zpy_codeoutguard_fnr4   r4   r5   r   )  s    





*

	

z%CheckFunctionManager.compile_check_fnc                 C   s
   d| _ d S )NF)r   )rW   rw   r4   r4   r5   
invalidate  s    zCheckFunctionManager.invalidatec                 C   sT   z8t || jvr6| jt|| j | jt | W n tyJ   Y n0 t |S )zadd a weakref, return the id)	r   r   r   re   r   rw   r   add	TypeError)rW   rr   r4   r4   r5   r9     s    zCheckFunctionManager.id_ref)NNNN)rq   r   r   r   r   ra   r   r   r
   rY   r   r   r9   r4   r4   r4   r5   r8     s       =gr8   )r   rR   r   lastrZ   c           	   
   C   s   | j s|sdS dd | D }|| j d}| jD ]<}t|| j|}t|tr\|} qtq6t|t	r6|s6|} qtq6z&| j dur|  t
|pdt|  W n2 ty } ztjddd W Y d}~n
d}~0 0 |rtt|  | dS )z(
    called whenever a guard fails.
    Nc                 S   s   i | ]\}}t ||qS r4   r=   r>   r4   r4   r5   rB     rC   z#guard_fail_hook.<locals>.<dictcomp>zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard evalT)exc_info)r   rI   r   r   r   r\   r   r`   ra   r   r   r&   	Exceptionrc   errorr"   re   )	r   rR   r   r   r;   reasonpartZfail_reasoner4   r4   r5   r     s2    



r   r   rR   r   r   c                 C   sN   t d|j d|j d|j  t dd| j d  t dd| j d S )NzERROR RUNNING GUARDS  :zlambda ri   z and
  )r   co_nameco_filenameco_firstlinenor   r   r   r   r4   r4   r5   guard_error_hook  s
    r  c                 c   s,   t  }| D ]}||vr
|V  || q
d S r[   )r   r   )seqseenxr4   r4   r5   r     s
    r   )RrK   r   loggingr   r   r-   typesr   inspectr   r   typingr   r   r   r   r   r	   r
   r   r   r   rN   Ztorch._guardsr   r   r   r   r   r   Z%torch.fx.experimental.symbolic_shapesr   r   r   r   r   Z
eval_framer   r   excr   r   r   r   utilsr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   	getLoggerrq   rc   Z_CZ_dynamor   r   Zcheck_obj_idZcheck_type_idr   Zis_grad_enabled__getitem__r   r   r]   r0   r1   r7   r8   CodeTypera   r   r   r   r  r   r4   r4   r4   r5   <module>   sd   , 4



    6%