U
    zhD                     @   sn  d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZmZ d dlZd dlmZmZ d dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZ d d	lmZmZm Z  G d
d de!Z"ee#dddZ$ej%j&ddddZ'ej%j&ddddZ(ej%j&ddddZ)G dd de*Z+ee,edddZ-G dd de+dZ.dddd Z/e,e
ee.  d!d"d#Z0dS )$    N)Iterable)AnyDictfinalListOptionalTupleType)HigherOrderOperator
OpOverload)
FakeTensor)ExportedProgram)CustomObjArgument	InputKindSymIntArgumentTensorArgumentTokenArgument)GraphModule)SymBoolSymFloatSymIntc                   @   s   e Zd ZdS )SpecViolationErrorN)__name__
__module____qualname__ r   r   H/var/www/html/venv/lib/python3.8/site-packages/torch/_export/verifier.pyr      s   r   )opreturnc                 C   s
   | j j S N)_schemaZ
is_mutabler   r   r   r   is_functional   s    r"   )noder   c                 C   s   t | S r   )
_check_val)r#   r   r   r   _check_has_fake_tensor   s    r%   c                    st    fdd dd }d| j krH| jdkr6|| jr6d S td| j d| j d } |sptd| j d	| d S )
Nc                    s   | d krdS t | ttttfr"dS t | tjtjtjtj	fr@dS t | t
tjfrTdS t | tttfrhdS t | trvdS t | trt fdd| D S dS )NTc                 3   s   | ]} |V  qd S r   r   ).0x_check_correct_valr   r   	<genexpr>3   s     z9_check_val.<locals>._check_correct_val.<locals>.<genexpr>F)
isinstanceintboolstrfloattorchZmemory_formatZdtypeZdeviceZlayoutr   ZTensorr   r   r   r   r   all)valr(   r   r   r)   %   s    

z&_check_val.<locals>._check_correct_valc                 S   s   t | tsdS t| jjdkS )NFr   )r+   r   lenr    Zreturnsr!   r   r   r   _no_returns6   s    
z_check_val.<locals>._no_returnsr2   call_function
Node.meta z is missing val field.z has invalid val field )metar   targetr   name)r#   r4   r2   r   r(   r   r$   $   s    

r$   c                 C   sd   | j d}|d kr$td| j t|ts`t|d tr`t|d tr`td| j d| d S )Ntorch_fnz*Unable to find torch_fn metadata for node r      r6   z has invalid torch_fn field )r7   getr   r9   r+   tupler.   )r#   r:   r   r   r   _check_torch_fnE   s    r>   c                   @   s.   e Zd ZU i Zeeed f ed< dd ZdS )_VerifierMetaVerifier	_registryc                 C   s   |r6d|ksd|krt dd|kr0|d dks^tn(d|ksBtd|ksNt|d dks^tt|d tsptt| |||}|| j|d < |S )Ncheck_check_graph_modulez'Overriding method check is not allowed.dialectATEN)SyntaxErrorAssertionErrorr+   r.   type__new__rA   )metaclsr9   basesattrsretr   r   r   rI   S   s    z_VerifierMeta.__new__N)	r   r   r   rA   r   r.   r	   __annotations__rI   r   r   r   r   r?   P   s   
r?   )objr8   r   c                 C   sT   | d}| }t|D ]8\}}t||sDtdd|d |  t||}q|S )N.z#Node referenced nonexistent target )split	enumeratehasattrRuntimeErrorjoingetattr)rO   r8   Ztarget_atomsZattr_itriZatomr   r   r   getattr_recursiveb   s    

rX   c                   @   s   e Zd ZdZedddZeee df dddZ	eee df ddd	Z
d
d ZeddddZeeddddZeejjddddZdS )r@   rE   r   c                 C   sX   t jt jt jt jt jt jt jt jt j	t j
t jt jt jt jt jt jt jt jt jtjtjgS r   )operatorgetitemaddmulsubtruedivgelegtlteqnefloordivmodand_or_not_pownegabsmathceilfloorselfr   r   r   allowed_builtin_opso   s,    zVerifier.allowed_builtin_ops.c                 C   s   ddl m} ttf| S )Nr   )allowed_registered_op_types)Ztorch._export.serde.serializert   r   r
   )rr   rt   r   r   r   allowed_op_types   s    zVerifier.allowed_op_typesc                 C   s
   t jjfS r   )r0   fxr   rq   r   r   r   allowed_getattr_types   s    zVerifier.allowed_getattr_typesc                 C   s   d S r   r   )rr   r   r   r   r   check_valid_op   s    zVerifier.check_valid_opN)gmr   c                 C   s   dS )zG
        Additional checks that are specific to some dialects.
        Nr   )rr   ry   r   r   r   check_additional   s    zVerifier.check_additional)epr   c                 C   s   |  |j t| d S r   )rC   Zgraph_module"_verify_exported_program_signature)rr   r{   r   r   r   rB      s    zVerifier.checkc           
         s  t tt df dfdd}d dfdd}| D ]}t|tjjsNq8|j	  |jj
D ]h}|jdkrtd|j d	q`|jd
krt| ||j q`|jdkrt|jtstdt|j t||j t tjjr fdd}t jdkr|dtr:|dtr:|dtr:t dr:q`nTt dd }t dd }t dd }	tdt  dt| dt| dt|	 t | stdt  d|  q`|jdkr`t| q`q8| d S )N.rY   c                     s"      } tdd | D rt| S )Nc                 s   s   | ]}|t kV  qd S r   objectr&   tr   r   r   r*      s     zOVerifier._check_graph_module.<locals>._allowed_getattr_types.<locals>.<genexpr>)rw   anyrG   rM   rq   r   r   _allowed_getattr_types   s    z<Verifier._check_graph_module.<locals>._allowed_getattr_typesc              	      s   t d fdd}ttt df d fdd}tjjjtjtj	tj
tjtjtjtjtjjf	}t| | s| | kr| |krtd|  d|  d	|  d
| t| trt| std|  d |  d S )NrY   c                     s"      } tdd | D st| S )Nc                 s   s   | ]}t |V  qd S r   )inspect	isbuiltin)r&   r   r   r   r   r*      s     zfVerifier._check_graph_module.<locals>._check_valid_op.<locals>._allowed_builtin_ops.<locals>.<genexpr>)rs   r1   rG   r   rq   r   r   _allowed_builtin_ops   s    zSVerifier._check_graph_module.<locals>._check_valid_op.<locals>._allowed_builtin_ops.c                     s"      } tdd | D rt| S )Nc                 s   s   | ]}|t kV  qd S r   r}   r   r   r   r   r*      s     zcVerifier._check_graph_module.<locals>._check_valid_op.<locals>._allowed_op_types.<locals>.<genexpr>)ru   r   rG   r   rq   r   r   _allowed_op_types   s    zPVerifier._check_graph_module.<locals>._check_valid_op.<locals>._allowed_op_typesz
Operator 'z#' is not an allowed operator type: z
Valid builtin ops: zValid torch functions: z
operator 'z' is not functional)r   r   r	   r   r0   ZautogradZ	grad_modeZset_grad_enabledZsym_intZ	sym_floatZsym_iteZsym_maxZsym_minZsym_notZsym_sqrtZ_CZ_set_grad_enabledr+   r   r   r"   rx   )r   r   r   Z_allowed_torch_functionsrq   r   r   _check_valid_op   s.    

z5Verifier._check_graph_module.<locals>._check_valid_op>   call_modulecall_methodz'call_module is not valid: got a class 'z' r5   Zget_attrz/Expected get_attr target to be string, but got c                    s   t t | d |S r   )r+   rV   )r9   ty)attrr   r   _is_type   s    z.Verifier._check_graph_module.<locals>._is_typeZLoweredBackendModule
backend_idprocessed_bytescompile_specsZoriginal_modulezInvalid get_attr type z2. 
LoweredBackendModule fields: backend_id(str) : z, processed_bytes(bytes) : z, compile_specs(list) : z. 
Valid get_attr types: placeholder)r   r	   r   modulesr+   r0   rv   r   graphZlintnodesr   r   r8   r$   r.   rH   rX   nnModuler   byteslistrS   rV   rz   )
rr   ry   r   r   rg   r#   r   r   r   r   r   )r   rr   r   rC      sX    +


*
zVerifier._check_graph_module)r   r   r   rD   r   rs   r   r	   r   ru   rw   rx   r   rz   r   r   rB   r0   rv   rC   r   r   r   r   r@   l   s   r@   )	metaclassrY   c              	   C   s  | j }dd | jjD }t|t|jkrJtdt| dt|j dt|j|D ]\}}t|j	t
tfr|j	j|krtd|j	j d| |jtjkrqVqV|jtjkr>t|j	t
std|j d	|j	 d
|jd krtd|j d|j}|| jkrtd| dt| j| tjjs@td| dqV|jtjkrt|j	t
sttd|j d	|j	 d
|jd krtd|j d|j}|jd krtd| d|jdkr|| jkrtd| d|jdkr@|| jkr@td| dqV|jtjkr~t|j	t
s<td|j d	|j	 d
|jd krZtd|j d|j}|| jkr@td| dqV|jtjkrt|j	tstd|j d|j	 d
|jd krtd|j d|j}|| jkr@td| dqV|jtjkr.t|j	ts@td|j d	|j	 d
qVtd|j dqVt| jjd }	|	jdksbt dd |	j!d D }
t|
t|j"krtd t|
 d!t|j# d"t|j$ d#t|j%}t|j#t|j& | }|
|| }|
||t|j$  }|D ]}||j#krB|j#| |j'krtd$| d%|j# d&|j' d'n^||j&kr|j&| |jkrtd(| d)|j& d*|j d'ntd+| d,|j# d-|j& qt||j$D ],\}}||krtd.| d/|j$ d0qd S )1Nc                 S   s   g | ]}|j d kr|jqS )r   )r   r9   )r&   r#   r   r   r   
<listcomp>  s     
 z6_verify_exported_program_signature.<locals>.<listcomp>zNumber of graph inputs (z:) does not match number of inputs in the graph signature ()zInput spec name z does not match node name z
Parameter z! is not a tensor argument. Found z	 instead.zInputSpec for z has no target.z is not in the state dict.zState dict entry for parameter z* is not an instance of torch.nn.Parameter.zBuffer z is missing a persistence flagTFzNon-persistent buffer z( is in the state dict, it should not be.zConstant tensor z$ is not in the constants dictionary.zCustom object z( is not a custom object argument. Found zUnknown InputKind rP   outputc                 S   s$   g | ]}t |tjjr|jn|qS r   )r+   r0   rv   Noder9   )r&   argr   r   r   r   |  s   r   zNumber of output nodes zg is different Than the number of outputs specified by the graph signature: 
Number of mutated buffers: z. 
Number of user outputs: z. 
zBuffer output zV does not point to a buffer that exists. 
Dict of buffers that are mutated, in order: z 
Buffer nodes available: z 
zUser input output z^ does not point to a user input that exists. 
Dict of user inputs that are mutated, in order: z 
User input nodes available: zMutation node z: is neither a buffer nor a user input. Buffers to mutate: z, User inputs to mutate: zUser output zY is not in the correct order or is not found in the exported program's user_output list: z. )(Zgraph_signaturer   r   r3   Zinput_specsr   Zuser_inputszipr+   r   r   r   r9   kindr   Z
USER_INPUTZ	PARAMETERr8   Z
state_dictr0   r   	ParameterZBUFFER
persistentZCONSTANT_TENSOR	constantsZ
CUSTOM_OBJr   ZTOKENr   r   r   rG   argsZoutput_specsZbuffers_to_mutateZuser_outputsZoutput_tokensZuser_inputs_to_mutatebuffers)Zexported_programgsZinput_node_namesZ
input_specr#   parambufferZtensor_constZ
custom_objZoutput_nodeZoutput_nodesZ
num_tokensendZmutate_nodesZuser_output_nodesZmutation_nodeZuser_output_nodeZuser_output_namer   r   r   r|     s    







&

r|   )rD   r   c                 C   s&   | dks| dkrt j| S t j|  S )NrE    )r?   rA   r<   )rD   r   r   r   load_verifier  s    r   )1r   rn   rZ   collections.abcr   typingr   r   r   r   r   r   r	   r0   Z
torch._opsr
   r   Ztorch._subclasses.fake_tensorr   Ztorch.export.exported_programr   Ztorch.export.graph_signaturer   r   r   r   r   Ztorch.fxr   Z%torch.fx.experimental.symbolic_shapesr   r   r   	Exceptionr   r-   r"   rv   r   r%   r$   r>   rH   r?   r.   rX   r@   r|   r   r   r   r   r   <module>   s.   $!
 !  