o
    I&i:                     @   sH  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 d dlmZ d d	lmZmZmZ G d
d de Z!dede"fddZ#dej$j%ddfddZ&dej$j%ddfddZ'G dd de(Z)G dd de)dZ*dddZ+de,de
ee*  fddZ-dS )     N)Iterable)AnyDictfinalListOptionalTupleType)HigherOrderOperator
OpOverload)
FakeTensor)ExportedProgram)ExportGraphSignature	InputKindSymIntArgumentTensorArgument)GraphModule)SymBoolSymFloatSymIntc                   @   s   e Zd ZdS )SpecViolationErrorN)__name__
__module____qualname__ r   r   AC:\wamp64\www\opt\env\Lib\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      
r!   nodec                 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 vr$| jdkr|| jrd S td| j d| j d } |s8td| j d	| d S )
Nc                    s   | d u 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r*dS t | tttfr4dS t | trDt fdd| D S dS )NTc                 3   s    | ]} |V  qd S r   r   ).0x_check_correct_valr   r   	<genexpr>/       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   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   returnsr    r   r   r   _no_returns2   s   
z_check_val.<locals>._no_returnsr3   call_functionz
Node.meta z is missing val field.z has invalid val field )metar   targetr   name)r#   r6   r3   r   r(   r   r$   "   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   |rd|v s
d|v rt dd|v r|d dksJ nd|v s!J d|v s'J |d dks/J t|d ts8J t| |||}|| j|d < |S )Ncheck_check_graph_modulez'Overriding method check is not allowed.dialectATEN)SyntaxErrorr,   r/   type__new__r=   )metaclsr:   basesattrsretr   r   r   rD   D   s   z_VerifierMeta.__new__N)	r   r   r   r=   r   r/   r	   __annotations__rD   r   r   r   r   r;   A   s   
 r;   c                   @   s   e Zd ZdZdefddZdeee df fddZ	deee df fdd	Z
d
d ZdeddfddZededdfddZedejjddfddZdS )r<   rA   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_opsW   s,   zVerifier.allowed_builtin_ops.c                 C   s   t tfS r   )r   r
   ra   r   r   r   allowed_op_typesp   s   zVerifier.allowed_op_typesc                 C   s
   t jjfS r   )r1   fxr   ra   r   r   r   allowed_getattr_typess   r"   zVerifier.allowed_getattr_typesc                 C   s   d S r   r   )rb   r   r   r   r   check_valid_opv   s   zVerifier.check_valid_opgmNc                 C   s   dS )zG
        Additional checks that are specific to some dialects.
        Nr   )rb   rh   r   r   r   check_additionaly   s   zVerifier.check_additionalepc              
   C   sb   t |jtsd S | |j zt| W d S  ty0 } z|jdkr#n|W Y d }~d S d }~ww )NZEDGE)r,   graph_signaturer   r?   Zgraph_module"_verify_exported_program_signaturer   r@   )rb   rj   er   r   r   r>      s   
zVerifier.checkc           
         s  dt tt df ffdd}dfdd}| D ]}t|tjjs$q|j	  |jj
D ]}|jdv r=td|j d	|jd
krLt| ||j q-|jdkrt|jtsat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rt drq-t 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rt| q-q| d S )Nr   .c                     "      } tdd | D rJ | S )Nc                 s       | ]}|t u V  qd S r   objectr&   tr   r   r   r*      r+   zOVerifier._check_graph_module.<locals>._allowed_getattr_types.<locals>.<genexpr>)rf   anyrH   ra   r   r   _allowed_getattr_types      z<Verifier._check_graph_module.<locals>._allowed_getattr_typesc              	      s   dt f fdd}dttt df f fdd}tjjjf}t| | s?| | vr?| |vr?t	d|  d|  d	|  d
| t| t
rPt| sPt	d|  d |  d S )Nr   c                     s"      } tdd | D sJ | 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>)rc   r2   ru   ra   r   r   _allowed_builtin_ops   rw   zSVerifier._check_graph_module.<locals>._check_valid_op.<locals>._allowed_builtin_ops.c                     rn   )Nc                 s   ro   r   rp   rr   r   r   r   r*      r+   zcVerifier._check_graph_module.<locals>._check_valid_op.<locals>._allowed_op_types.<locals>.<genexpr>)rd   rt   ru   ra   r   r   _allowed_op_types   rw   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   r1   ZautogradZ	grad_modeZset_grad_enabledr,   r   r   r!   rg   )r   rz   r{   Z_allowed_torch_functionsra   r   r   _check_valid_op   s$   

z5Verifier._check_graph_module.<locals>._check_valid_op>   Zcall_methodZcall_modulez'call_module is not valid: got a class 'z' r7   Zget_attrz/Expected get_attr target to be string, but got c                    s   t t | d |S r   )r,   getattr)r:   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   N)r   r	   r   modulesr,   r1   re   r   graphZlintnodesr   r   r9   r$   r/   rC   r}   nnModuler   byteslisthasattrri   )
rb   rh   rv   r|   rW   r#   r   r   r   r   r   )r   rb   r   r?      sn   





5zVerifier._check_graph_module)r   r   r   r@   r   rc   r   r	   r   rd   rf   rg   r   ri   r   r   r>   r1   re   r?   r   r   r   r   r<   T   s    r<   )	metaclassc              	   C   s  | j }dd | jjD }t|t|jkr%tdt| dt|j dt|j|D ]\}}t|j	t
tfrI|j	j|krItd|j	j d| |jtjkrPq+|jtjkrt|j	t
sitd|j d	|j	 d
|jd u rwtd|j d|j}|| jvrtd| dt| j| tjjstd| dq+|jtjkrt|j	t
std|j d	|j	 d
|jd u rtd|j d|j}|| jvrtd| dq+|jtjkrt|j	t
std|j d	|j	 d
|jd u rtd|j d|j}|| jvrtd| dq+td|j dt| jjd }|jdks%J dd |jd D }	t|	t|jkrOtdt|	 dt|j dt|j dt|jt|j }
|	d |
 }|	|
|
t|j  }|D ]R}||jv r|j| |j vrtd| d|j d|j  d ql||jv r|j| |jvrtd!| d"|j d#|j d qltd$| d%|j d&|j t||jD ]\}}||krtd'| d(|j d)qd S )*Nc                 S   s   g | ]
}|j d kr|jqS )r   )r   r:   )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Constant tensor z+ is not in the tensor constants dictionary.zUnknown InputKind .outputc                 S   s   g | ]}|j qS r   )r:   )r&   argr   r   r   r   B  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. )!rk   r   r   r4   Zinput_specsr   Zuser_inputszipr,   r   r   r   r:   kindr   Z
USER_INPUTZ	PARAMETERr9   Z
state_dictr1   r   	ParameterZBUFFERZCONSTANT_TENSORZtensor_constantsr   r   argsZoutput_specsZbuffers_to_mutateZuser_outputsZuser_inputs_to_mutatebuffers)Zexported_programgsZinput_node_namesZ
input_specr#   parambufferZtensor_constZoutput_nodeZoutput_nodesendZmutate_nodesZuser_output_nodesZmutation_nodeZuser_output_nodeZuser_output_namer   r   r   rl      s   









rl   r@   c                 C   s   | dkr
t j| S t j|  S )NrA   )r;   r=   get)r@   r   r   r   load_verifierm  s   
r   r   ).rx   r^   rJ   collections.abcr   typingr   r   r   r   r   r   r	   r1   Z
torch._opsr
   r   Ztorch._subclasses.fake_tensorr   Ztorch.export.exported_programr   Ztorch.export.graph_signaturer   r   r   r   Ztorch.fxr   Z%torch.fx.experimental.symbolic_shapesr   r   r   	Exceptionr   r.   r!   re   Noder%   r$   rC   r;   r<   rl   r/   r   r   r   r   r   <module>   s*    $ 
}