o
    H&i/
                     @   s   d dl Z d dlZd dlZd dlmZmZmZ d dl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defddZdS )    N)AnyCallableTuplec                   @   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   ?C:\wamp64\www\opt\env\Lib\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   Z_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%   Zsplitsr   r   r   parse_namespace,   s   
r+   c                 C   sH   t | \}}d|v r|d\}}nd}ttj|}t||}t||S )N.default)r+   r(   getattrtorchops)r%   	namespacenameoverloadnspacketr   r   r   	lookup_op8   s   

r6   schemac                 C   s   ddl m}m} t| t|fsJ t| tr|| } |  |jkr$dS | j}t	|dko5t
dd |D }|r:dS | js?dS d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
    r   )FunctionSchema
SchemaKindFc                 s   s$    | ]}|j d uo|j j V  qd S r   )
annotationZis_write).0rr   r   r   	<genexpr>V   s    
z'is_functional_schema.<locals>.<genexpr>T)Ztorchgen.modelr8   r9   
isinstancer   parsekindZ
functionalreturnsr)   any)r7   r8   r9   ZretsZis_non_mutating_viewr   r   r   is_functional_schemaC   s   


rC   )dataclassesr   r   typingr   r   r   r/   	dataclassr   r   intr   r$   r+   Z_opsZOpOverloadPacketr6   boolrC   r   r   r   r   <module>   s    

