
    '}h`                     b   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             Z	 G d d      Z
dedefd	Zd
edeeef   fdZd
edej                  j                   fdZdej                  j$                  defdZdedefdZdej                  j$                  fdZd Zy)    N)AnyCallableTuplec                   ,    e Zd ZU dZeed<   eed<   d Zy)Kernelz$Models a (function, source location)funcsourcec                 &     | j                   |i |S N)r   )selfargskwargss      S/var/www/html/test/engine/venv/lib/python3.12/site-packages/torch/_library/utils.py__call__zKernel.__call__   s    tyy$)&))    N)__name__
__module____qualname____doc__r   __annotations__strr    r   r   r   r   	   s    .
NK*r   r   c                   $    e Zd ZdZdefdZddZy)RegistrationHandlez2Does something when someone calls .destroy() on it
on_destroyc                     || _         y r   _on_destroy)r   r   s     r   __init__zRegistrationHandle.__init__   s
    %r   Nc                 $    | j                          y r   r   )r   s    r   destroyzRegistrationHandle.destroy   s    r   )returnN)r   r   r   r   r   r   r!   r   r   r   r   r      s    <&8 &r   r   
stacklevelr"   c                     t        j                  t        j                  |             }|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	   s      r   
get_sourcer-      s;       z!:;Eq/FMr   qualnamec                 r    | j                  d      }t        |      dk7  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.   splitss     r   parse_namespacer6   ,   sR    ^^D!F
6{a**2 489
 	
 !9fQir   c                     t        |       \  }}d|v r|j                  d      \  }}nd}t        t        j                  |      }t        ||      }t        ||      S )N.default)r6   r2   getattrtorchops)r.   	namespacenameoverloadnspackets         r   	lookup_oprB   8   sV    %h/OIt
d{Ch	I	&BRF68$$r   opc                 j    t        | t        j                  j                        sJ | j                  dv S )N>   atenprimprims)
isinstancer;   _ops
OpOverloadr=   )rC   s    r   
is_builtinrK   C   s,    b%**//000<<444r   schemac                 6   ddl m}m} t        | t        |f      sJ t        | t              r|j                  |       } | j                         |j                  k7  ry| j                  }t        |      dkD  xr t        d |D              }|ry| j                  syy)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              3   j   K   | ]+  }|j                   d uxr |j                   j                    - y wr   )
annotationis_write).0rs     r   	<genexpr>z'is_functional_schema.<locals>.<genexpr>[   s3      1CDD >)>)>%>>1s   13T)torchgen.modelrN   rO   rH   r   parsekind
functionalreturnsr3   any)rL   rN   rO   retsis_non_mutating_views        r   is_functional_schemar^   H   s     :fsN3444&#%%f-{{}
--->>Dt9q= S 1HL1 . >>r   c                    | j                   dk7  ry| j                  }t        |j                        dk(  sy|j                  d   j                  y|j                  d   j                  j
                  }t        |      dk7  ryt        t        |            }t        |j                        dk  ry|j                  d   }|j                  y|j                  j                  sy|j                  j
                  }t        |      dk7  ry|t        t        |            k7  ry|j                  dd D ]  }|j                   y y)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)
    rE   Fr1   r   NT)
r=   _schemar3   rZ   
alias_info	after_setnextiter	argumentsrR   )rC   rL   	alias_setloc	first_argargs         r   mutates_and_returns_first_argrj   e   s(    
||vZZFv~~!#~~a##+q!,,66I
9~
tI
C
6q   #I#(($$..I
9~
d4	?### >>% r   c              #   Z  K   t        | j                        t        |      t        |      z   k\  sJ t        t        | j                              D ]W  }| j                  |   }|j                  r"|j                  |v r|||j                     f @|t        |      k\  rO|||   f Y yw)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)r3   re   range
kwarg_onlyr>   )rL   r   r   iinfos        r   
zip_schemarp      s      v CIF$;;;;3v''() "??yyF"F499---D	> DGm s   B)B+)dataclassesr&   r(   typingr   r   r   r;   	dataclassr   r   intr   r-   r6   rI   OpOverloadPacketrB   rJ   boolrK   r^   rj   rp   r   r   r   <module>rw      s      
 ' '  * * * 3 3 	 c 	 eCHo 	 % %

 ; ; %55::(( 5T 5
  :#ejj&;&; #Lr   