
    9j7                        d dl Z d dlZd dlZd dl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mZ ej                  Z e
d      ddd	ej                   d
edz  defd       Zdeej(                  z  dedededef
dZd Zedej0                  e   dee   dedededej8                  diZd Z e       Zdej@                  defdZ!dee"   dee   fdZ#y)    N)GenericAlias)devicedtypeTensortypes)
exposed_in   )_resolve_opaque_type_infois_opaque_reference_type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        z  df   dt        t        t        j                  df   t        f   ffd	d
t
        t           t        z  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t/        |
      j0                  }n|
t2        j4                  j6                  k(  r d| d       nt9        |
d      r_|
j:                  t        u rMt=        |
      }d}|t*        v rd| d} d| d|	j&                   d| dt*        j?                          d	       n8 d| d|	j&                   dt*        j?                          d       n	t*        |
   }|tA        d|       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"|        sd}|	jJ                  %tM        |	jJ                  tN        tP        t        f      rt        |	jJ                        }ntM        |	jJ                  t        t2        jR                  f      rd#|	jJ                   d#}ntM        |	jJ                  t2        jT                        rFt        |	jJ                        }d$}|jE                  |      stA        d%|d&      |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    [/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_library/infer_schema.pyerror_fnzinfer_schema.<locals>.error_fnI   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_stringL   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_typesT   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_typeb   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: zschema_type is None for param 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dtype repr z must start with '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$   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hasattrr5   tuple_to_listkeysAssertionErrorr   
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      s8   T  O#//JI 

.
/CWS 4<#%s*+	uVZZ_%t+	,T&\C/ E&**d:J4K  FI'(<(<(>? [B]dEu%UV::**777%c"%)"w00666z$'DEF .e.>.>?"77o.7HSS 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 #A$!HII$. 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(%j^3LM   *#i.*:; &MdSXS`S`NaMb cP Q
 MM[M4&,@Aw[Bx & #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                 d   | ft         j                  |     dfg}dt        t         j                  z  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.   Optionalr   s     r   r   z derived_types.<locals>.<genexpr>   s.      
 __W%(3'78
s   "%)r.   r   r@   _SpecialFormextend)rr   rs   rt   ru   rv   resultr   s    `     r   derived_typesr      s     
H		#z^4KF
tf&9&99 
  
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\   rC   r-   Scalar
ScalarTypeDevicer   )	GroupName)r   r[   r\   rC   r-   r   Numberr   r   rP   distributedis_available"torch.distributed.distributed_c10dr   r#   r.   castr@   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%/
LD %%'@V[[y15%NOF ,mT*+,<r   r   zTensor[]r   r\   rC   r   c                    | y| t         j                  j                  u r |d       t        j                  |       }|t
        urD| t        vr3t        |       rt        |       j                  S  |d|  dt         d       t        |    S t        j                  |       }|D ]*  }|t        vst        |      r |d|  dt         d       , d dj                  fd|D              }t        |      d	k(  rd
|z   dz   }d
|z   dz   S )Nz()z7No return type annotation was provided. Please add one.zReturn has unsupported type r7   r6   c                 ^    t         j                  |       x}r|S t        |       j                  S r{   )SUPPORTED_RETURN_TYPESgetr
   rO   )argr'   s     r   _return_type_strz&parse_return.<locals>._return_type_strC  s.    '++C0020I(-888r   r<   c              3   .   K   | ]  } |        y wr{   r   )r   r   r   s     r   r   zparse_return.<locals>.<genexpr>H  s     @C*3/@s   r	   r;   r   )r>   rJ   rM   r.   r/   r$   r   r   r
   rO   r0   r_   rX   )rL   r   r1   r2   r   	output_tyr   s         @r   r^   r^   (  s'   W&&,,,JKz*FU33'
30<GGG.zl ;((>'?qB
 &j11??:&D ,,5Mc5R.zl ;((>'?qB9
 		@4@@I 4yA~)Oc)	?S  r   rg   c                     | j                   t        j                  j                  t        j                  j                  fv S r{   )rI   r>   rJ   POSITIONAL_OR_KEYWORDrK   )rg   s    r   rH   rH   S  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   EllipsisUnion)r   	type_argss     r   rT   rT   Z  s     
J5I 	fll"? 	Y1	IaL!!	Y1	1!9IaL!!FLLy!1233r   )$r~   r>   r.   r   r   rP   r   r   r   torch.utils._exposed_inr   opaque_objectr
   r   r   _TestTensorCallabler-   rq   r@   r   rC   r   r   r}   r   r[   r\   r   r   r^   rN   rJ   rH   r$   rT   r   r   r   <module>r      sA        . . .  ll O C-C-
 4ZC- 	C- C-L$f)))$$ $ 	$
 $N2 H
KKL*	7&	LL( %!P 23 7,,  4d5k 4d4j 4r   