o
    "i;!                     @   s  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 d dl	Z	d dl
mZ d dl	mZ e jG dd dZG dd dZded	efd
dZded	eeef fddZded	e	jjfddZde	jjd	efddZded	efddZded	efddZded	efddZde	jjfddZdd Zdejd eed!f d"eeef d	eeejef  fd#d$Z de	jjd	efd%d&Z!d	efd'd(Z"d)d* Z#dejfd+d,Z$dejfd-d.Z%dS )/    N)AnyCallableDictIterableTuple)_Cc                   @   s*   e Zd ZU dZeed< eed< dd ZdS )Kernelz$Models a (function, source location)funcsourcec                 O   s   | j |i |S N)r	   )selfargskwargs r   R/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/_library/utils.py__call__   s   zKernel.__call__N)__name__
__module____qualname____doc__r   __annotations__strr   r   r   r   r   r      s
   
 r   c                   @   s(   e Zd ZdZdefddZd	ddZdS )
RegistrationHandlez2Does something when someone calls .destroy() on it
on_destroyc                 C   s
   || _ d S r   _on_destroy)r   r   r   r   r   __init__   s   
zRegistrationHandle.__init__returnNc                 C   s   |    d S r   r   )r   r   r   r   destroy   s   zRegistrationHandle.destroy)r   N)r   r   r   r   r   r   r   r   r   r   r   r      s    r   
stacklevelr   c                 C   s&   t t| }|j d|j }|S )zGet a string that represents the caller.

    Example: "/path/to/foo.py:42"

    Use stacklevel=1 to get the caller's source
    Use stacklevel=2 to get the caller's caller's source
    etc.
    :)inspectgetframeinfosys	_getframefilenamelineno)r   framer
   r   r   r   
get_source!   s   	r(   qualnamec                 C   s6   |  d}t|dkrtd|  d|d |d fS )Nz::   zAExpected `qualname` to be of the form "namespace::name", but got zf. The qualname passed to the torch.library APIs must consist of a namespace and a name, e.g. aten::sinr      )splitlen
ValueError)r)   splitsr   r   r   parse_namespace/   s   
r0   c                 C   sH   t | \}}d|v r|d\}}nd}ttj|}t||}t||S )N.default)r0   r,   getattrtorchops)r)   	namespacenameoverloadnspacketr   r   r   	lookup_op;   s   

r;   opc                 C   s   t | tjjs	J | jdv S )N>   atenprimprims)
isinstancer4   _ops
OpOverloadr6   )r<   r   r   r   
is_builtinF   s   
rC   schemac                 C   sT   dd }t | tjjr|| S ddlm} t | tr|| } t | |s&J || S )zCheck if the schema is functional.

    An operator is functional if:
    - it does not mutate any of its inputs
    - it does not return a view on any of its inputs
    - it has at least one return
    c                 S   sD   | j rdS | j}t|dkotdd |D }|rdS | js dS dS )NFr   c                 s   s$    | ]}|j d uo|j j V  qd S r   )
alias_infois_write).0rr   r   r   	<genexpr>X   s    
z>is_functional_schema.<locals>.is_functional.<locals>.<genexpr>T)
is_mutablereturnsr-   any)rD   retsis_non_mutating_viewr   r   r   is_functionalT   s   z+is_functional_schema.<locals>.is_functionalr   )FunctionSchema)r@   r4   r   rP   torchgen.modelr   parse)rD   rO   rP   r   r   r   is_functional_schemaK   s   	

rS   typc              	   C   sh   | t t j kp3| t t t j kp3| t t t j kp3| t t t t j kS r   )r   ListType
TensorTypegetOptionalTyperT   r   r   r   is_tensorlist_like_typen   s   rZ   c                 C   s"   | t j kp| t t j kS r   )r   rV   rW   rX   rY   r   r   r   is_tensor_like_typex   s   "r[   c                 C   s   | j dkrdS | j}t|jdksdS |jd jdu rdS |jd jj}t|dkr,dS tt|}t|jdk r;dS |jd }|jdu rGdS |jj	sMdS |jj}t|dkrYdS |tt|krcdS |jdd D ]
}|jdurt dS qjdS )aN  Check if an op is an inplace aten op, i.e. it mutates and returns the first arg.

    TODO: torchgen/model.py's FunctionSchema.parse is the source of truth for this,
    but not all PyTorch builds have torchgen (due to the yaml dependency being weird).
    Figure this out.

    Example: add_(Tensor(a!) x, Tensor y) -> Tensor(a)
    r=   Fr+   r   NT)
r6   _schemar-   rK   rE   	after_setnextiter	argumentsrF   )r<   rD   	alias_setloc	first_argargr   r   r   mutates_and_returns_first_arg|   s8   
	


re   c                 C   s   g }i }t t| jD ]3}| j| }|jr*|j|v r#||j ||j< q|j||j< q|t|k r8|||  q||j qt||fS r   )ranger-   r`   
kwarg_onlyr7   default_valueappendtuple)rD   r   r   new_args
new_kwargsiinfor   r   r   fill_defaults   s   

ro   r   .r   c                 c   s    t | jt |t | ksJ tt | jD ]&}| j| }|jr/|j|v r.|||j fV  q|t |kr6q||| fV  qdS )zzips schema.arguments and (args, kwargs) together.

    Assumes that (args, kwargs) were the inputs to some torch._ops.OpOverload:
    that is, kwargs must be keyword-only arguments and default values may be omitted.
    N)r-   r`   rf   rg   r7   )rD   r   r   rm   rn   r   r   r   
zip_schema   s   

rp   c                 C   sD   t | tjjs	J t| rdS | j}|jsdS t|jdkr dS dS )NFr   T)	r@   r4   rA   rB   rC   r\   rJ   r-   rK   )r<   rD   r   r   r   can_generate_trivial_fake_impl   s   rq   c                   C   s   t tddS )zIf an op was defined in C++ and extended from Python using the
    torch.library APIs, returns if we require that there have been a
    m.set_python_module("mylib.ops") call from C++ that associates
    the C++ op with a python module.
    REQUIRES_SET_PYTHON_MODULET)r3   _utils_internalr   r   r   r   requires_set_python_module   s   rt   c                 O   s~   t | tjjjs
J g }tjj|| f\}}|D ]}t |tjr6tj	
|tj	jjr6|t| q| ||||S r   )r@   r4   utils_python_dispatchTorchDispatchMode_pytreetree_flattenvaluesTensorr   _dispatch_keyshasDispatchKeyPythonri   type__torch_dispatch__)	curr_modeop_overloadr   r   overload_typesargs_flattened_ar   r   r   handle_dispatch_mode   s   r   c                 C   s   t dd | jD S )Nc                 s   s    | ]}|j V  qd S r   )rg   )rG   r   r   r   r   rI      s    z&has_kwarg_only_args.<locals>.<genexpr>)rL   r`   )rD   r   r   r   has_kwarg_only_args   s   r   c                 C   s2   | j D ]}t|jst|jsq|jsq dS dS )NTF)r`   r[   r   rZ   rg   )rD   r   r   r   r   has_kwarg_only_tensors   s   
r   )&dataclassesr!   r#   typingr   r   r   r   r   r4   torch._utils_internalrs   r   	dataclassr   r   intr   r(   r0   rA   rB   r;   boolrC   rS   rZ   r[   re   ro   rP   Argumentrp   rq   rt   r   r   r   r   r   r   r   <module>   sB   

#
&


	