o
    Zh4S                     @   s  U 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mZ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 erIddlmZ g dZed	d
G dd de	Zi Zeeeej f ed< dd Ze eej< G dd dZej ej!ej"ej#ej$j%e j&ej'e e(dej)e*ddZ+e,eD ]	Z-e.ee-e+e-< qdddefddZ/dej0j1dejfddZ2i Z3ee4e5e5f ejf ed< dej0j1dejfddZ6ed	d
ded e4d! d"ee5d#f fd$d%Z7ed	d
d<d&ed'e8fd(d)Z9ed	d
d*d+ Z:ed	d
d,ed-efd.d/Z;ed	d
					d=ded e4ed0f d"e
ee5ef  d1e
e4e  d2e
ee5ef  d3e8de
e fd4d5Z<ed	d
			d>d6ej=j>de5d e4e d"e
ee5ef  d3e8de
e fd7d8Z?d9ejd e4ed0f d"ee5ef d3e8de
e f
d:d;Z@dS )?    N)AnyCallablecast
NamedTupleOptionalTYPE_CHECKING)boolean_dispatched)
OpOverloadOpOverloadPacket   )compatibility)Argument)ArgsKwargsPaircheck_for_mutable_operationget_signature_for_torch_opcreate_type_hinttype_matchesnormalize_functionnormalize_moduleF)Zis_backward_compatiblec                   @   s2   e Zd ZU dZeedf ed< eeef ed< dS )r   z<
    Simple named tuple for wrapping args/kwargs pairs.
    .argskwargsN)	__name__
__module____qualname____doc__tupler   __annotations__dictstr r   r   H/var/www/auris/lib/python3.10/site-packages/torch/fx/operator_schemas.pyr      s   
 r   _manual_overridesc                  C   s>   g } dd }|  t| dtfdd}|  t| | S )Nc                 S      d S Nr   )selfr   r   r    nonzero/      z!_nonzero_schemas.<locals>.nonzeroas_tuplec                S   r"   r#   r   )r$   r'   r   r   r    r%   4   r&   )appendinspect	signaturebool)
signaturesr%   r   r   r    _nonzero_schemas,   s   r-   c                   @   s   e Zd Zdd ZdS )_FakeGlobalNamespacec                 C   s   |dkrt S td)Ntorchz!Expected a torch namespace lookup)r/   RuntimeError)r$   namer   r   r    __getattr__@   s   z _FakeGlobalNamespace.__getattr__N)r   r   r   r2   r   r   r   r    r.   ?   s    r.   t)TensorZDeviceZLayoutnumberFutureZAnyEnumTypeZQSchemeZ	__torch__NoneTypeZStorager3   ts_typeztorch._C.JitTypereturnc                 C   s   t | jtS )z
    Convert a TorchScript type to a Python type (including subtypes) via
    eval'ing the annotation_str. _type_eval_globals sets up expressions
    like "List" and "Future" to map to actual types (typing.List and jit.Future)
    )evalZannotation_str_type_eval_globals)r8   r   r   r     _torchscript_type_to_python_typeW   s   r<   	ts_schemac              	   C   s  ddl m} g }| jD ]\}t|j}| r|jn|j}|jdkr$|jnd}|j	r,|j
n|j}|dkr\||jks:J |j}t|D ]\}}	|	j|jksMJ ||	j|j|	j|	jd||< qA||||||d qdd | jD }
t|
dkryd }nt|
d	kr|
d }nt|
}t j||d
S )Nr   )	Parameterr$   inputfrom)r1   kinddefault
annotationc                 S   s   g | ]}t |jqS r   )r<   type).0retr   r   r    
<listcomp>   s    
z9_torchscript_schema_to_signature_impl.<locals>.<listcomp>r   )return_annotation)r)   r>   	argumentsr<   rD   Zhas_default_valuedefault_valueemptyr1   Z
kwarg_onlyKEYWORD_ONLYPOSITIONAL_OR_KEYWORDPOSITIONAL_ONLY	enumeraterA   rB   rC   r(   returnslenr   	Signature)r=   r>   
parametersargarg_typerB   r1   rA   idxpZreturn_typesreturn_typer   r   r    %_torchscript_schema_to_signature_impl`   sB   


rY   _SCHEMA_TO_SIGNATURE_CACHEc                 C   s6   | j | jf}t|}|d ur|S t| }|t|< |S r#   )r1   Zoverload_namerZ   getrY   )r=   	cache_keyZ	cache_valresr   r   r     _torchscript_schema_to_signature   s   
r^   targetr   )r   .r   r   c              	   C   s   t | dd\}}|rS|rUg }t||D ]\}}z|j|i | |||f W q ty1   Y qw dd }t|dkr>d S t|dkrP|d \}	}
||
 d S 	 d S d S d S )NT)return_schemasc                 S   s   | j rtd|  dd S )Nz!Tried to trace mutable operation z|. FX only supports functional code, so operations that mutate operands in-place (e.g. via `out` arguments) are not supported)Z
is_mutabler0   )schemar   r   r    throw_if_mutable   s
   
z5check_for_mutable_operation.<locals>.throw_if_mutabler   r   )r   zipbindr(   	TypeErrorrQ   )r_   r   r   r,   schemasmatched_schemascandidate_signaturera   rb   _Zschema_to_checkr   r   r    r      s$   r   opr`   c                    s   t  tr
 jg}n7t  tr fdd  D }n&t }|r*|r(|dfS dS tjj	
 }|du r;|r9dS dS tj|}dd |D }|rN||fS |S )a  
    Given an operator on the `torch` namespace, return a list of `inspect.Signature`
    objects corresponding to the overloads of that op.. May return `None` if a signature
    could not be retrieved.

    Args:
        op (Callable): An operator on the `torch` namespace to look up a signature for

    Returns:
        Optional[List[inspect.Signature]]: A list of signatures for the overloads of this
            operator, or None if the operator signatures could not be retrieved. If
            return_schemas=True, returns a tuple containing the optional Python signatures
            and the optional TorchScript Function signature
    c                    s   g | ]}t  |jqS r   )getattr_schema)rE   overloadrj   r   r    rG      s    z.get_signature_for_torch_op.<locals>.<listcomp>N)NNc                 S   s   g | ]}t |qS r   )r^   rE   ra   r   r   r    rG      s    )
isinstancer	   rl   r
   Z	overloadsr!   r[   r/   jitZ	_builtinsZ_find_builtin_CZ_jit_get_schemas_for_operator)rj   r`   rf   overrideZaten_fnr,   r   rn   r    r      s   



r   c                 C   s   zEt | ttfrCt | trdd }ndd }t| dkr!|tW S | d }| D ]}t||r/q't||r7|}q'|t  W S ||W S W | S  tyW   td|   Y | S w )a  
    Produces a type hint for the given argument.

    The :func:`create_type_hint` looks for a type hint compatible with the input argument `x`.

    If `x` is a `list` or `tuple`, it looks for an object in the list whose type is a superclass
    of the rest, and uses that as `base_type` for the `List` or `Tuple` to be returned.
    If no such object is found, it defaults to `List[Any]`.

    If `x` is neither a `list` nor a `tuple`, it returns `x`.
    c                 S   s   t |  S r#   )listxr   r   r    ret_type  s   z"create_type_hint.<locals>.ret_typec                 S   s   t | df S )N.)r   ru   r   r   r    rw     s   r   z@We were not able to successfully create type hint from the type )	rp   rt   r   rQ   r   
issubclass	Exceptionwarningswarn)rv   rw   Z	base_typer3   r   r   r    r      s.   





r   signature_typeargument_typec                    s  t | d| }|  u rdS |tju r#|  kr#| j}t fdd|D S t | dd tu rd| jd  tu r:tu r:dS tsJt	
d|  d dS t  dd tu rZt jd S fd	d
}| S | tu ro tju rodS | tju r| tthv r|dS t rt| rt | S dS )N
__origin__Tc                 3   s    | ]}t | V  qd S r#   )r   rE   c)r}   r   r    	<genexpr>'      ztype_matches.<locals>.<genexpr>r   z.Does not support nested parametric types, got z. Please file a bug.Fc                    s>   t | dd tur
dS | j}| jdkrdS t fdd|D S )Nr~   F)r   Tc                 3   s"    | ]}|t u pt| V  qd S r#   )Ellipsisrx   r   sig_el_typer   r    r   >  s     z=type_matches.<locals>.is_homogeneous_tuple.<locals>.<genexpr>)rk   r   __args__all)r3   	containedr   r   r    is_homogeneous_tuple8  s   
z*type_matches.<locals>.is_homogeneous_tuple)rk   typingUnionr   anyrt   intr)   isclassrz   r{   rx   r/   ZdtypenumbersNumberfloat)r|   r}   Zsig_origin_typeZsig_containedr   r   )r}   r   r    r     s4   


	
r   .	arg_typeskwarg_typesnormalize_to_only_use_kwargsc              	   C   s   |du ri }d}t | tjsVt | ttfsV| }| tv r?t | tr"J t|  }|d |d }	}
t|	j	t|
j	kr=dS |	}t
|sEJ tt|}t||||}|S t
| s\J t| }g }|r|D ]}z|j|i | || W qg ty   Y qgw t|dkr	 |S t|dkrt|d |||}|S |dus|dur|r|nttt d}|r|ni }|D ]=}d}z!|j|i |}|j D ]\}}|j	| }|ot|j|}qW n ty   d}Y nw |rt||||} |S q|S d	d
d |D }tdt|  d| |S )a  
    Returns normalized arguments to PyTorch functions. This means that
    `args/kwargs` will be matched up to the functional's
    signature and return exclusively kwargs in positional order if
    `normalize_to_only_use_kwargs` is True.
    Also populates default values. Does not support positional-only
    parameters or varargs parameters (*args, **kwargs). Does not support modules.

    May require `arg_types` and `kwarg_types` in order to disambiguate overloads.

    Args:
        target (Callable): Function that we are normalizing
        args (Tuple[Any]): Tuple of args to the function
        kwargs (Optional[Dict[str, Any]]): Dict of kwargs to the function
        arg_types (Optional[Tuple[Any]]): Tuple of arg types for the args
        kwarg_types (Optional[Dict[str, Any]]): Dict of arg types for the kwargs
        normalize_to_only_use_kwargs (bool): Whether to normalize to only use kwargs.

    Returns:

        Returns normalized_args_and_kwargs, or `None` if not successful.
    Nif_trueif_falser   r   r   TF
c                 s   s    | ]}t |V  qd S r#   )r   ro   r   r   r    r     s    
z%normalize_function.<locals>.<genexpr>z Tried to normalize arguments to zy but the schema match was ambiguous! Please provide argument types to the normalize_arguments() call. Available schemas:
)rp   typesBuiltinFunctionTyper
   r	   r   r   r)   r*   rS   callableunwrap&_args_kwargs_to_normalized_args_kwargsr   rd   r(   re   rQ   r   r   r   rI   itemsr   rC   joinr0   r/   typename)r_   r   r   r   r   r   new_args_and_kwargsZtarget_for_analysisZ
dispatchedr   r   sigZtorch_op_schemasrg   rh   Zsig_matchesZbound_typesZarg_namerU   paramZschema_printoutsr   r   r    r   O  s   

A-*

r   rootc           
   
   C   s   z|  |}W n ty } z	td| d|d}~ww t|jdrI|jj}ttj|d|jkrIt	
t	|j}|du r@i }t||||}	|	S dS )a(  
    Returns normalized arguments to PyTorch modules. This means that
    `args/kwargs` will be matched up to the functional's
    signature and return exclusively kwargs in positional order if
    `normalize_to_only_use_kwargs` is True.
    Also populates default values. Does not support positional-only
    parameters or varargs parameters (*args, **kwargs).

    Args:
        root (nn.Module): root module upon which we query modules
        target (Callable): Function that we are normalizing
        args (Tuple[Any]): Tuple of args to the function
        kwargs (Optional[Dict[str, Any]]): Dict of kwargs to the function
        normalize_to_only_use_kwargs (bool): Whether to normalize to only use kwargs.

    Returns:

        Returns normalized_args_and_kwargs, or `None` if not successful.
    z$Tried to normalize node with target z# but root did not have that target!Nr   )Zget_submoduleAttributeErrorr0   hasattr	__class__r   rk   r/   nnr)   r*   r   forwardr   )
r   r_   r   r   r   Zsubmode	classnamer   r   r   r   r    r     s*   
r   r   c           	         s   t jjt jjh t fdd| j D r#t| j g dkr#dS | j	|i |}|
  i }g }t| jD ]\}}|sM|t|k rM||j|  q8|j| ||< q8tt||S )a  
    Given a call target, args, and kwargs, return the arguments normalized into
    an ArgsKwargsPair, or None if the type signature is not supported by
    this normalization.

    Args:

        sig (inspect.Signature): Signature object for the target
        args (Tuple): Arguments that appear at the callsite for `target`
        kwargs (Dict): Keyword arguments that appear at the callsite for `target`
        normalize_to_only_use_kwargs (bool): Whether to normalize to only use kwargs.

    Returns:

        Optional[ArgsKwargsPair]: Normalized args and kwargs for `target`, or `None` if
            this target is not supported.
    c                 3   s    | ]}|j  vV  qd S r#   )rA   )rE   rW   Zsupported_parameter_typesr   r    r     r   z9_args_kwargs_to_normalized_args_kwargs.<locals>.<genexpr>)r?   r@   to	generatorN)r)   r>   rM   rL   r   rS   valuesrt   keysrd   apply_defaultsrO   rQ   r(   rI   r   r   )	r   r   r   r   Z
bound_argsZ
new_kwargsnew_argsir   r   r   r    r     s   r   )F)NNNF)NF)Aenumr)   r   r   r   rz   r   r   r   r   r   r   r/   Ztorch._jit_internalr   Z
torch._opsr	   r
   Z_compatibilityr   noder   __all__r   r!   r   rt   rR   r   r-   r%   r.   r4   ZdeviceZlayoutr   rq   r6   EnumZqschemerD   ZUntypedStorageTypeVarr;   dirkrk   r<   rr   ZFunctionSchemarY   rZ   r   r   r^   r   r+   r   r   r   r   r   Moduler   r   r   r   r   r    <module>   s   
 		
3

'"
,2

z.

