o
    "iD                     @   sx  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"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.d%d d!Z/d"e,de
ee.  f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   T/home/ubuntu/SoloSpeech/.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      
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r;dS t | trKt fdd| D S dS )NTc                 3   s    | ]} |V  qd S r   r   ).0x_check_correct_valr   r   	<genexpr>3       z9_check_val.<locals>._check_correct_val.<locals>.<genexpr>F)
isinstanceintboolstrfloattorchmemory_formatdtypedevicelayoutr   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    returnsr"   r   r   r   _no_returns6   s   
z_check_val.<locals>._no_returnsr:   call_function
Node.meta z is missing val field.z has invalid val field )metar   targetr   name)r%   r=   r:   r   r*   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.   tupler1   )r%   rC   r   r   r   _check_torch_fnE   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 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.   r1   type__new__rJ   )metaclsrB   basesattrsretr   r   r   rQ   S   s   z_VerifierMeta.__new__N)	r   r   r   rJ   r   r1   r	   __annotations__rQ   r   r   r   r   rH   P   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)rW   rA   target_atomsattr_itriatomr   r   r   getattr_recursiveb   s   

rc   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 )rI   rN   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g| R S )Nr   )allowed_registered_op_types)torch._export.serde.serializer~   r   r
   )r|   r~   r   r   r   allowed_op_types   s   zVerifier.allowed_op_typesc                 C   s
   t jjfS r   )r3   fxr   r{   r   r   r   allowed_getattr_types   r$   zVerifier.allowed_getattr_typesc                 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epc                 C   s   |  |j t| d S r   )rL   graph_module"_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 ]}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>)r   anyrU   r{   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tjtj	tj
tjtjtjtjtjjf	}t| | sP| | vrP| |vrPtd|  d|  d	|  d
| t| trat| sat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>)r}   r9   r   r{   r   r   _allowed_builtin_ops   r   zSVerifier._check_graph_module.<locals>._check_valid_op.<locals>._allowed_builtin_ops.c                     r   )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>)r   r   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: z
operator 'z' is not functional)r   r   r	   r   r3   autograd	grad_modeset_grad_enabledsym_int	sym_floatsym_itesym_maxsym_minsym_notsym_sqrt_C_set_grad_enabledr.   r   r   r#   r   )r   r   r   _allowed_torch_functionsr{   r   r   _check_valid_op   s6   

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   s   z.Verifier._check_graph_module.<locals>._is_typeLoweredBackendModule
backend_idprocessed_bytescompile_specs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.   r3   r   r   graphlintnodesr   r   rA   r&   r1   rP   rc   nnModuler   byteslistr[   r^   r   )
r|   r   r   r   rq   r%   r   r   r   r   r   )r   r|   r   rL      sn   +





5zVerifier._check_graph_module)r   r   r   rM   r   r}   r   r	   r   r   r   r   r   r   r   r   rK   r3   r   rL   r   r   r   r   rI   l   s    rI   )	metaclassc              	   C   s  | j }dd | jjD }t|t|jkr%tdt| dt|j dt|j|D ]g\}}t|j	t
tfrJ|j	j|krJtd|j	j d| |jtjkrQq+|jtjkrt|j	t
sjtd|j d	|j	 d
|jd u rxt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d u rtd| d|jdu r|| jvrtd| d|jdu r|| jv rtd| dq+|jtjkr3t|j	t
std|j d	|j	 d
|jd u r!td|j d|j}|| jvr2td| dq+|jtjkrot|j	tsNtd|j d|j	 d
|jd u r]td|j d|j}|| jvrntd| dq+|jtjkrt|j	tstd|j d	|j	 d
q+td|j dt| jjd }	|	jdksJ 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 ]R}||j"v r|j"| |j&vrtd$| d%|j" d&|j& d'q||j%v r6|j%| |jvr4td(| d)|j% d*|j d'qtd+| d,|j" d-|j% t||j#D ]\}}||kr`td.| d/|j# d0qKd S )1Nc                 S   s   g | ]
}|j d kr|jqS )r   )r   rB   )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 rX   outputc                 S   s$   g | ]}t |tjjr|jn|qS r   )r.   r3   r   NoderB   )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. )'graph_signaturer   r   r;   input_specsr   user_inputszipr.   r   r   r   rB   kindr   
USER_INPUT	PARAMETERrA   
state_dictr3   r   	ParameterBUFFER
persistentCONSTANT_TENSOR	constants
CUSTOM_OBJr   TOKENr   r   r   argsoutput_specsbuffers_to_mutateuser_outputsoutput_tokensuser_inputs_to_mutatebuffers)exported_programgsinput_node_names
input_specr%   parambuffertensor_const
custom_objoutput_nodeoutput_nodes
num_tokensendmutate_nodesuser_output_nodesmutation_nodeuser_output_nodeuser_output_namer   r   r   r     s.  












r   rM   c                 C   s&   | dks| dkrt j| S t j|  S )NrN    )rH   rJ   rE   )rM   r   r   r   load_verifier  s   
r   r   )1r   rx   rd   collections.abcr   typingr   r   r   r   r   r   r	   r3   
torch._opsr
   r   torch._subclasses.fake_tensorr   torch.export.exported_programr   torch.export.graph_signaturer   r   r   r   r   torch.fxr   %torch.fx.experimental.symbolic_shapesr   r   r   	Exceptionr   r0   r#   r   r   r'   r&   rG   rP   rH   r1   rc   rI   r   r   r   r   r   r   <module>   s0   $!
 
!  