
    i5                        d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlZd dlmZm	Z	m
Z
mZ d dlmZ ddlmZmZ ej                  Z ed      dd	d
ej"                  dee   defd       Zdeeej*                  f   dedededef
dZd Ze
dej2                  e
   dee
   dedededej:                  diZd Z e       Z dejB                  defdZ"dee#   dee   fdZ$y)     N)GenericAlias)OptionalUnion)devicedtypeTensortypes)
exposed_in   )_OPAQUE_TYPESis_opaque_typeztorch.library)op_nameprototype_functionr   returnc               
   d}| j                   dt        j                  |       fddt        ffddt        t
        t        t           t        f   df   dt        t        t        j                  df   t        f   ffd	d
t
        t        t           t        f   dt        t        j                  t        f   ffdg }t               }d}t        j                  j                               D ]  \  }\  }}	t        |	      s d       |	j                   t        j"                  j$                  k(  r|s|j'                  d       d}|	j(                  t        j"                  j*                  u r d| d        |	j(                        \  }
}d}|
t,        vrt/        |
      rt0        |
   j2                  }n|
t4        j6                  j8                  k(  r d| d       nt;        |
d      r_|
j<                  t        u rMt?        |
      }d}|t,        v rd| d} d| d|	j(                   d| dt,        jA                          d	       n8 d| d|	j(                   dt,        jA                          d       n	t,        |
   }|J t        |      t        u r6||k7  rtC        d      |jE                  d      rJd| d|tG        d      d  }n5||v r1|jE                  d      s d| d        d| d|tG        d      d  }|jI                  |       |	jJ                  t        j"                  j*                  u r|j'                  | d!|        ed}|	jJ                  %tM        |	jJ                  tN        tP        t        f      rt        |	jJ                        }ntM        |	jJ                  t        t4        jR                  f      rd"|	jJ                   d"}ntM        |	jJ                  t4        jT                        r9t        |	jJ                        }d#}|jE                  |      sJ |tG        |      d }n" d| d$t        |	jJ                         d%       |j'                  | d!| d&|         ||k7  r't        |      |z
  }tG        |      d'kD  r | d(        jV                        \  }}tY        |      }|| d)d*j[                  |       d+| S d)d*j[                  |       d+| S ),aJ  Parses the schema of a given function with type hints. The schema is inferred from the
    function's type hints, and can be used to define a new operator.

    We make the following assumptions:

    * None of the outputs alias any of the inputs or each other.
    * | String type annotations "device, dtype, Tensor, types" without library specification are
      | assumed to be torch.*. Similarly, string type annotations "Optional, List, Sequence, Union"
      | without library specification are assumed to be typing.*.
    * | Only the args listed in ``mutates_args`` are being mutated. If ``mutates_args`` is "unknown",
      | it assumes that all inputs to the operator are being mutates.

    Callers (e.g. the custom ops API) are responsible for checking these assumptions.

    Args:
        prototype_function: The function from which to infer a schema for from its type annotations.
        op_name (Optional[str]): The name of the operator in the schema. If ``name`` is None, then the
            name is not included in the inferred schema. Note that the input schema to
            ``torch.library.Library.define`` requires a operator name.
        mutates_args ("unknown" | Iterable[str]): The arguments that are mutated in the function.

    Returns:
        The inferred schema.

    Example:
        >>> def foo_impl(x: torch.Tensor) -> torch.Tensor:
        >>>     return x.sin()
        >>>
        >>> infer_schema(foo_impl, op_name="foo", mutates_args={})
        foo(Tensor x) -> Tensor
        >>>
        >>> infer_schema(foo_impl, mutates_args={})
        (Tensor x) -> Tensor
    unknownNc                 (    t        d|  d d      )Nzinfer_schema(func): z Got func with signature ))
ValueError)whatsigs    U/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_library/infer_schema.pyerror_fnzinfer_schema.<locals>.error_fnF   s     /v5NseSTUVV    annotation_typec                 V    	 t        |       S # t        $ r  d|  d       Y y w xY w)NzUnsupported type annotation z. It is not a type.)eval	Exception)r   r   
pf_globals	pf_localss    r   convert_type_stringz)infer_schema.<locals>.convert_type_stringI   s<    	Y?? 	..??RS	s    ((tys.r   c                     g }d}| D ]#  } |      \  }}|j                  |       ||z  }% |rt        |      dfS | dfS )NFT)appendtuple)r"   reschangedty
ty_changedunstringify_types        r   unstringify_typesz'infer_schema.<locals>.unstringify_typesQ   s_      	"B-b1NB
JJrNz!G	" :t##:r   r(   c                     t        | t              r
 |       dfS t        j                  |       x}r. t        j                  |             \  }}|rt        ||      dfS | dfS )NTF)
isinstancestrtyping
get_originget_argsr   )r(   originargsargs_changedr!   r+   s       r   r*   z&infer_schema.<locals>.unstringify_type_   sl     b#&r*D00((,,V,!26??23F!GD,#FD14775yr   Fz>We do not support positional-only args, varargs, or varkwargs.*Tz
Parameter z must have a type annotation.z's type cannot be inferred from the schema as it is a ScriptObject. Please manually specify the schema using the `schema=` kwarg with the actual type of the ScriptObject.
__origin__z

zFor example, z.

z has unsupported type z]. We do not support Tuple inputs in schema. As a workaround, please try to use List instead. zThe valid types are: .. The valid types are: zomutates_args must either be a sequence of the names of the arguments that are mutated or the string 'unknown'. r   zTensor(az!)zM is in mutable_args but only Tensors or collections of Tensors can be mutated "ztorch.z' has an unsupported default value type z;. Please file an issue on GitHub so we can prioritize this.=r   z in mutates_args were not found in the custom op's signature. mutates_args should contain the names of all args that the custom op mutates, or just the string 'unknown' if you don't know.(, z) -> ).__globals__inspect	signaturer.   r%   r   typeobjectr/   Anyboolset	enumerate
parametersitemssupported_paramkind	ParameterKEYWORD_ONLYr$   
annotationemptySUPPORTED_PARAM_TYPESr   r   
class_nametorch_CScriptObjecthasattrr6   tuple_to_listkeysr   
startswithlenadddefaultr-   intfloatr   r   return_annotationparse_returnjoin)r   mutates_argsr   UNKNOWN_MUTATESparams	seen_argssaw_kwarg_only_argidxnameparamr   _schema_type	list_typeexample_type_strdefault_repr
dtype_repr	torch_dotmutates_args_not_seenr]   retr!   r   r   r    r   r*   r+   s                        @@@@@@@r   infer_schemarq      s   T  O#//JI 

.
/CWS 5fs*+S01	uVZZ_%t+	,U4<#45 %

D@P:Q  FI'(<(<(>? WB]dEu%UV::**777%c"%)"w00666z$'DEF .e.>.>?"77o.+O<GG EHH$9$99  'Z Z 6#..%7)/:	#)  55)6yk'G$ &<U=M=M<N Or'(+,A,F,F,H+IL  &<U=M=M<N O,,A,F,F,H+IL
 0@K&&&$. O  %%h/ (RCMO0L/MN\!))(3 &st %SEKH,H+IJKd==G--333MM[M4&12L}}$
5==3tBT(U"5==1EMMC+>?!"5==/3EMM5;;7 /
$	!,,Y777)#i.*:; &MdSXS`S`NaMb cP Q
 MM[M4&,@AoWBp & #L 1I =$%)() *U V ,C,A,ABq
((
3C!DIIf-.eC599tyy !se,,r   	base_typecpp_type	list_baseoptional_base_listoptional_list_basec                 p   | ft         j                  |     dfg}dt        t        t         j                  f   fd}|r |j                  fd ||       D               |r1|j                  fd |t         j                  |          D               |r |j                  fd ||       D               |S )N?typc                     t         j                  |    t         j                  |    t        t        j
                  j                  | f      t        t        | f      fS N)r/   SequenceListr   collectionsabclist)ry   s    r   derived_seq_typesz(derived_types.<locals>.derived_seq_types   sF    OOC KK11C6:v&	
 	
r   c              3   ,   K   | ]  }| d f  yw)z[]N .0seq_typrs   s     r   	<genexpr>z derived_types.<locals>.<genexpr>   s!      
+2W
"o&
   c              3   ,   K   | ]  }| d f  yw)z?[]Nr   r   s     r   r   z derived_types.<locals>.<genexpr>   s'      
  
#&'
r   c              3   N   K   | ]  }t         j                  |    d f  yw)z[]?N)r/   r   r   s     r   r   z derived_types.<locals>.<genexpr>   s.      
 __W%(3'78
s   "%)r/   r   r   rA   _SpecialFormextend)rr   rs   rt   ru   rv   resultr   s    `     r   derived_typesr      s     
H		#z^4PF
uT6+>+>%>? 
  
6G	6R
 	
  
 -V__Y-GH
 	

  
,Y7
 	
 Mr   c                     t         ddddft        ddddft        ddddft        ddddft        ddddft
        j                  ddddft        d	dddft        d
dddfg} t        j                  j                         r4ddlm} | j                  t        j                   t"        |      ddddf       g }| D ]  }|j%                  t'        |         t)        |      S )Nr   TFSymIntr\   rD   r.   Scalar
ScalarTypeDevicer   )	GroupName)r   r[   r\   rD   r.   r	   Numberr   r   rQ   distributedis_available"torch.distributed.distributed_c10dr   r$   r/   castrA   r   r   dict)datar   r   lines       r   get_supported_param_typesr      s     
4u-	heT*	ud+	vtUD)	eUE5)	xue4	eUE2	5%/
RD %%'@V[[y15%NOF ,mT*+,<r   r   zTensor[]r   r\   rD   r   c                    | y| t         j                  j                  u r |d       t        j                  |       }|t
        ur$| t        vr |d|  dt         d       t        |    S t        j                  |       }|D ]  }|t        vs |d|  dt         d         dj                  |D cg c]  }t        |    c}      }t        |      dk(  rd|z   d	z   }d|z   d	z   S c c}w )
Nz()z7No return type annotation was provided. Please add one.zReturn has unsupported type r8   r7   r=   r   r<   r   )
r?   rK   rN   r/   r0   r%   SUPPORTED_RETURN_TYPESr1   r_   rX   )rM   r   r2   r3   arg	output_tys         r   r^   r^   "  s   W&&,,,JKz*FU33.zl ;((>'?qB
 &j11??:&D ,,.zl ;((>'?qB 		$G31#6GHI 4yA~)Oc)	?S   Hs   0C%rg   c                     | j                   t        j                  j                  t        j                  j                  fv S r{   )rJ   r?   rK   POSITIONAL_OR_KEYWORDrL   )rg   s    r   rI   rI   E  s6    :://&&  r   
tuple_typec                 .   t        | dd      }| t        j                  u s| t        u s|dk(  s|t        S t        |      dk(  rt        |d      S t        |      dk(  r|d   t        u rt        |d      S t        t        j                  t        |            S )z}
    Convert `tuple_type` into a list type with the same type arguments. Assumes that `tuple_type` is typing.Tuple type.
    __args__Nr   r   r      )getattrr/   Tupler%   r   rX   Ellipsisr   )r   	type_argss     r   rU   rU   L  s     
J5I 	fll"? 	Y1	IaL!!	Y1	1!9IaL!!FLLy!1233r   )%r~   r?   r/   r	   r   r   r   rQ   r   r   r   torch.utils._exposed_inr
   opaque_objectr   r   _TestTensorCallabler.   rq   rA   r   rD   r   r   r}   r   r[   r\   r   r   r^   rO   rK   rI   r%   rU   r   r   r   <module>r      sB       "  . . . 8
 ll O "--
 c]- 	- -D$T6.../$$ $ 	$
 $N4 H
KKL*	7&	LL( !@ 23 7,,  4d5k 4d4j 4r   