o
    eiY                     @   s  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 d dl	Z	d dl
mZ d dlmZm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mZ erTd d	l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$de	j!j"ddfddZ%G dd de&Z'dede(defddZ)G dd de'dZ*G d d! d!e*Z+d)d"d#Z,d)d$d%Z-d&e(de&e* fd'd(Z.dS )*    N)Iterable)AnyfinalTYPE_CHECKING)is_opaque_type)HigherOrderOperator
OpOverload)
FakeTensor)CustomObjArgument	InputKindSymBoolArgumentSymFloatArgumentSymIntArgumentTensorArgumentTokenArgument)GraphModule)ExportedProgramc                   @   s   e Zd ZdS )SpecViolationErrorN)__name__
__module____qualname__ r   r   `/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/_export/verifier.pyr      s    r   opreturnc                 C   s
   | j j S N)_schema
is_mutabler   r   r   r   is_functional    s   
r   nodec                 C   s   t | S r   )
_check_val)r    r   r   r   _check_has_fake_tensor$   s   r"   c                    s   ddl m mm  fdddd }d| jvr1| jdkr(|| jr(d S td	| j d
| jd }|sEtd	| j d| d S )Nr   )SymBoolSymFloatSymIntc                    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 |  fr4dS t | tr;dS t | trKtfdd| D S tt| rSd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torchmemory_formatdtypedevicelayoutr	   Tensorr
   r   allr   type)valr#   r$   r%   r(   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_returnsC   s   
z_check_val.<locals>._no_returnsr8   call_function
Node.meta z is missing val field.z has invalid val field )	%torch.fx.experimental.symbolic_shapesr#   r$   r%   metar   targetr   name)r    r<   r8   r   r9   r   r!   )   s   

r!   c                 C   sl   | j d}|d u rtd| j t|ts0t|d tr2t|d tr4td| j d| d S d S d S )Ntorch_fnz*Unable to find torch_fn metadata for node r      r>   z has invalid torch_fn field )r@   getr   rB   r+   tupler.   )r    rC   r   r   r   _check_torch_fnR   s   
rG   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s|d dkr"td|d nd|vr+tdd|vr3td|d dkrBtd	|d  t|d tsTtd
t|d  t| |||}|| j|d < |S )Ncheck_check_graph_modulez'Overriding method check is not allowed.dialectATENz,subclass must define dialect != 'ATEN', got z%base class must define 'check' methodz3base class must define '_check_graph_module' methodz'base class dialect must be 'ATEN', got zdialect must be str, got )SyntaxErrorAssertionErrorrE   r+   r.   r7   __new__rJ   )metaclsrB   basesattrsretr   r   r   rQ   e   s.   z_VerifierMeta.__new__N)	r   r   r   rJ   dictr.   r7   __annotations__rQ   r   r   r   r   rH   b   s   
 rH   objrA   c                 C   sT   | d}| }t|D ]\}}t||s"tdd|d |  t||}q|S )N.z#Node referenced nonexistent target )split	enumeratehasattrRuntimeErrorjoingetattr)rX   rA   target_atomsattr_itriatomr   r   r   getattr_recursive   s   

rd   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eee df fd
dZdd ZdeddfddZedddZedejjddfddZdS )rI   rN   r   c                 C   sf   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tjtjtjtgS r   )operatorgetitemaddmulsubtruedivgelegtlteqnefloordivmodand_or_not_pownegabslshiftrshiftmathceilfloortruncroundselfr   r   r   allowed_builtin_ops   s4   zVerifier.allowed_builtin_ops.c                 C   s   t tfS r   )r   r   r   r   r   r   allowed_op_types   s   zVerifier.allowed_op_typesc                 C   s   t jjt jjjfS r   )r0   fxr   utils_pytreeTreeSpecr   r   r   r   allowed_getattr_types      zVerifier.allowed_getattr_typesc                 C   s   t jjt jjjt jt jjj	fS r   )
r0   r   r   nn	parameter	Parameterr5   r   r   r   r   r   r   r   allowed_getattr_types_for_subgm   s
   z(Verifier.allowed_getattr_types_for_subgmc                 C   s   d S r   r   )r   r   r   r   r   check_valid_op   s   zVerifier.check_valid_opgmNc                 C   s   dS )zG
        Additional checks that are specific to some dialects.
        Nr   )r   r   r   r   r   check_additional   s    zVerifier.check_additionalepr   c                 C   s    |  |j t| t| d S r   )rL   graph_module*_verify_exported_program_module_call_graph"_verify_exported_program_signature)r   r   r   r   r   rK      s   zVerifier.checkc                    s*  dt tt df ffdd}dfdd}| D ]}||u }t|tjjs(q|j	  |jj
D ]}|jdv rAtd|j d	|jd
krPt| ||j q1|jdkrt|jtsftdt|j t||j t tjjr fdd}t jdkr|dtrt drt drt dd dkrq1|dtr|dtr|dtrt drq1t dd }t dd }	t dd }
tdt  dt| dt|	 dt|
 t jdkrq1t jdkrq1t ||stdt  d|j d|| q1|jdkrt| q1q| d S ) Nr   .c                    s4   | r   }n  }tdd |D rtd|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>z/allowed_getattr_types must not contain 'object')r   r   anyrP   )is_toplevel_gmrU   r   r   r   _allowed_getattr_types   s   
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tjtj	tj
tjtjtjtjtjtjjjtjjtjjjtjjjtjjjjtjjjtjjj tjjj!tjjj"tjjj#f}t$| | sw| | vrw| |vrwt%d|  d|  d	|  d
| t$| t&r j'dkrt(| st%d|  d )|  d S )Nr   c                     s&      } tdd | D std| 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>z(allowed_builtin_ops must all be builtins)r   r6   rP   rU   r   r   r   _allowed_builtin_ops      zSVerifier._check_graph_module.<locals>._check_valid_op.<locals>._allowed_builtin_ops.c                     s&      } tdd | D rtd| S )Nc                 s   r   r   r   r   r   r   r   r)      r*   zcVerifier._check_graph_module.<locals>._check_valid_op.<locals>._allowed_op_types.<locals>.<genexpr>z*allowed_op_types must not contain 'object')r   r   rP   r   r   r   r   _allowed_op_types   r   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: TRAININGz
operator 'z' is not functional)*listrF   r7   r   r0   autograd	grad_modeset_grad_enabledsym_int	sym_floatsym_itesym_maxsym_minsym_notsym_sqrtsym_sumexport
custom_ops._call_custom_autograd_function_in_pre_dispatch_C_set_grad_enabledampautocast_mode_enter_autocast_exit_autocastr   experimentalsymbolic_shapes cast_symbool_to_symint_guardless
_functorchpredispatch_add_batch_dim_remove_batch_dim_vmap_increment_nesting_vmap_decrement_nestinglazy_load_decompositionsr+   r   r   rM   r   r   )r   r   r   _allowed_torch_functionsr   r   r   _check_valid_op   sH   


z5Verifier._check_graph_module.<locals>._check_valid_op>   call_methodcall_modulez'call_module is not valid: got a class 'z' r=   get_attrz/Expected get_attr target to be string, but got c                    s   t t | d |S r   )r+   r_   )rB   ty)attrr   r   _is_type)  r   z.Verifier._check_graph_module.<locals>._is_typeLoweredBackendModule
backend_idoriginal_modulemodule_nameaotiprocessed_bytescompile_specszInvalid get_attr type z2. 
LoweredBackendModule fields: backend_id(str) : z, processed_bytes(bytes) : z, compile_specs(list) : AOTInductorEPModuleAOTInductorRunnerWrapperz on target z. 
Valid get_attr types: placeholderr   N)rF   r7   r   modulesr+   r0   r   r   graphlintnodesr   r   rA   r!   r.   rd   r   Moduler   r\   r_   bytesr   r   )r   r   r   r   rr   r   r    r   r   r   r   r   )r   r   r   rL      s   	9


DzVerifier._check_graph_module)r   r   r   N)r   r   r   rM   r   r   rF   r7   r   r   r   r   r   r   r   r   rK   r0   r   rL   r   r   r   r   rI      s    	rI   )	metaclassc                   @   s   e Zd ZdZdS )TrainingIRVerifierr   N)r   r   r   rM   r   r   r   r   r   [  s    r   c                 C   s   | j }dd | jjD }|D ]7}|jd urE|jjD ]}|jr,|j|vr,td|j dq|jjD ]}|jrD|j|vrDtd|j dq1qd S )Nc                 S   s   h | ]}|j qS r   rB   r&   r    r   r   r   	<setcomp>a  s    z=_verify_exported_program_module_call_graph.<locals>.<setcomp>zInput z does not exist in the graph.zOutput )module_call_graphr   r   	signatureinputsrB   r   outputs)exported_programr   r   entryargr   r   r   r   _  s"   
r   c              	   C   s  | j }dd | jjD }t|t|jkrBdd |jD }t|t| }t|t| }tdt| dt|j d| d| t|j|D ]n\}}t|j	t
tttfri|j	j|kritd|j	j d	| |jtjkrpqH|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t| j| tjjstd| dqH|jtjkrt|j	t
std|j d|j	 d|jd u rtd|j d|j}	|jd u rtd|	 d|jdu r|	| jvrtd|	 d|jdu r|	| jv rtd|	 dqH|jtjkrWt|j	t
s6td|j d|j	 d|jd u rEtd|j d|j}
|
| jvrVtd|
 dqH|jtjkrt|j	tsrtd|j d|j	 d|jd u rtd|j d|j}|| jvrtd| dqH|jtjkrt|j	tstd|j d|j	 dqHtd|j dt | jjd }|j!dkrt"d |j! d!d |j#d" D }t|t|j$krd#d |j$D }t|t| }t|t| }td$t| d%t|j$ d&| d'| t|j%}t|j&t|j' t|j( | }||| }|||t|j)  }|D ]s}||j&v r[|j&| |j*vrYtd(| d)|j& d*|j* d+q8||j'v r||j'| |j+vrztd,| d-|j' d.|j+ d+q8||j(v r|j(| |j,vrtd/| d0|j( d1|j, d+q8td2| d3|j& d4|j( t||j)D ]\}}||krtd5| d6|j) d7qd S )8Nc                 S   s   g | ]
}|j d kr|jqS )r   )r   rB   r   r   r   r   
<listcomp>u  s    z6_verify_exported_program_signature.<locals>.<listcomp>c                 S   s    g | ]}t |jd r|jjqS r   )r\   r   rB   r&   specr   r   r   r   z  s
    zNumber of graph inputs (z:) does not match number of inputs in the graph signature (z$)
Placeholders missing input_specs: z#
Input_specs missing placeholders: 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 rY   outputzlast node must be output, got c                 S   s$   g | ]}t |tjjr|jn|qS r   )r+   r0   r   NoderB   )r&   r   r   r   r   r     s    r   c                 S   s*   g | ]}t |jd r|jjnt|jqS r   )r\   r   rB   r.   r   r   r   r   r     s    zNumber of output nodes zK is different Than the number of outputs specified by the graph signature: z
Nodes missing output_specs: z
Output_specs missing nodes: 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Parameter output z\ does not point to a parameter that exists. 
Dict of parameters that are mutated, in order: z 
Parameter nodes available: 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. )-graph_signaturer   r   r:   input_specssetr   zipr+   r   r   r   r   r   rB   kindr   
USER_INPUT	PARAMETERrA   
state_dictr0   r   r   BUFFER
persistentCONSTANT_TENSOR	constants
CUSTOM_OBJr
   TOKENr   r   r   rP   argsoutput_specsoutput_tokensbuffers_to_mutateparameters_to_mutateuser_inputs_to_mutateuser_outputsbuffers
parametersuser_inputs)r   gsinput_node_namesinput_spec_namesmissing_in_specsmissing_in_graph
input_specr    parambuffertensor_const
custom_objoutput_nodeoutput_nodesoutput_spec_namesmissing_out_specsmissing_out_graph
num_tokensendmutate_nodesuser_output_nodesmutation_nodeuser_output_nodeuser_output_namer   r   r   r   p  sr  











r   rM   c                 C   s(   | dks| dkrt j| tS t j|  S )NrN    )rH   rJ   rE   rI   )rM   r   r   r   load_verifier,  s   
r  r   )/r   r{   re   collections.abcr   typingr   r   r   r0   torch._library.opaque_objectr   
torch._opsr   r   torch._subclasses.fake_tensorr	   torch.export.graph_signaturer
   r   r   r   r   r   r   torch.fxr   torch.export.exported_programr   	Exceptionr   r-   r   r   r   r"   r!   rG   r7   rH   r.   rd   rI   r   r   r   r  r   r   r   r   <module>   s6   $	) P

 =