U
    d(o                    @   s  U d dl Z d dlmZ d dlmZ d dlZd dlmZmZmZm	Z	m
Z
mZmZmZmZ d dlmZmZ d dlZeddG dd	 d	Zed
dZG dd deZejejejhZejejhZejejejejejejejejej ej!ej"ej#ej$ej%ej&ej'gZ(ee)dddZ*ee)dddZ+ee)dddZ,ee)dddZ-G dd deZ.i Z/ee0ee. f e1d< e.j2e.j3e.j4e.j5e.j6he/d< e.j7e.j8he/d< e.j9e.j:he/d< e/d e/d B e/d< e/d e/d B e/d< e/d e/d B e/d< G d d! d!eZ;G d"d# d#eZ<ed$d%Z=eddG d&d' d'Z>ed(d)Z?eddG d*d+ d+Z@eddG d,d- d-ZAeddG d.d/ d/ZBeddG d0d1 d1ZCeddG d2d3 d3ZDeddG d4d5 d5ZEeddG d6d7 d7ZFed8d9ZGeddG d:d; d;eFZHeddG d<d= d=eFZIeddG d>d? d?eFZJeddG d@dA dAZKeddG dBdC dCZLeddG dDdE dEZMeddG dFdG dGZNeddG dHdI dIZOdJdKdLdMdNdOdPdQdRdSdTgZPeddG dUdV dVZQeddG dWdX dXZRe>e@eCe)dYdZd[ZSeddG d\d] d]ZTe>e)d^d_d`ZUe>dXd^dadbZVe0e
eLdcf dddedfZWeddG dgdh dhZXd dlYmZ  m[Z[ dS )i    N)assert_never)	dataclass)	ListDictOptionalIteratorTupleSetSequenceCallableUnion)EnumautoT)frozenc                   @   s,   e Zd ZU eed< eed< edddZdS )Locationfilelinereturnc                 C   s   d | j| jS )Nz{}:{})formatr   r   self r   2/tmp/pip-unpacked-wheel-ua33x9lu/torchgen/model.py__str__)   s    zLocation.__str__N)__name__
__module____qualname__str__annotations__intr   r   r   r   r   r   $   s   
r   Variant)functionmethodc                   @   s  e Zd ZdZeZe Ze Ze Ze Z	e Z
e Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Ze Z e Z!e Z"e"Z#e Z$e Z%e Z&e Z'e Z(e Z)e Z*e Z+e Z,e Z-e Z.e Z/e Z0e Z1e Z2e Z3e Z4e Z5e Z6e Z7e Z8e Z9e Z:e Z;e Z<e Z=e Z>e Z?e Z@e ZAe ZBe ZCe ZDeDZEe$ZFe%ZGe?ZHe@ZIeAZJeKdddZLeKdddZMeNeKd ddd	ZOd
S )DispatchKeyr   r   c                 C   s   | j S Nnamer   r   r   r   r      s    zDispatchKey.__str__c                 C   s   t |  S r%   )r   lowerr   r   r   r   r(      s    zDispatchKey.lowervaluer   c                 C   s6   t j D ]\}}|| kr
|  S q
td|  d S )Nzunknown dispatch key )r$   __members__itemsAssertionErrorr*   kvr   r   r   parse   s    
zDispatchKey.parseN)Pr   r   r   	UndefinedZCatchAllr   ZDenseZFPGAZORTMPSZVulkanZMetalZMKLDNNZOpenGLZOpenCLZIDEEPZ	QuantizedZCustomRNGKeyId	MkldnnCPUZSparseSparseCsrCPUSparseCsrCUDA
ZeroTensorMetaZBackendSelectZNamedZAutogradOtherZAutogradFunctionalityZAutogradNestedTensorZTracerZAutocastZBatchedZVmapModeZTESTING_ONLY_GenericWrapperZTESTING_ONLY_GenericModeZEndOfFunctionalityKeysCPUCUDAZHIPZXLAZLazyZIPUZXPUZNestedTensorZPrivateUse1ZPrivateUse2ZPrivateUse3QuantizedCPUQuantizedCUDAZQuantizedXPU	SparseCPU
SparseCUDAZ	SparseHIPZ	SparseXPUNestedTensorCPUNestedTensorCUDAZAutogradCPUAutogradCUDAZAutogradXLAZAutogradLazyZAutogradIPUZAutogradMPSZAutogradXPUZAutogradPrivateUse1ZAutogradPrivateUse2ZAutogradPrivateUse3ZAutogradCompositeImplicitAutogradCompositeExplicitAutogradZEndOfAliasKeysZCPUTensorIdCUDATensorIdZPrivateUse1_PreAutogradZPrivateUse2_PreAutogradZPrivateUse3_PreAutogradr   r   r(   staticmethodr1   r   r   r   r   r$   1   s   r$   )dkr   c                 C   s   | t jt jhkS r%   )r$   rC   rB   rF   r   r   r   is_generic_dispatch_key   s    rH   c                 C   s$   | t jt jt jt jt jt jt jhkS r%   )r$   r:   r<   r>   r6   r@   rA   rD   rG   r   r   r   is_cuda_dispatch_key   s    rI   c                 C   s   | t kS r%   )STRUCTURED_DISPATCH_KEYSrG   r   r   r   is_structured_dispatch_key   s    rK   c                 C   s   | t kS r%   )UFUNC_DISPATCH_KEYSrG   r   r   r   is_ufunc_dispatch_key   s    rM   c                   @   s   e Zd Ze Ze Ze Ze Ze Ze Z	e Z
e Ze Ze Ze Ze Ze ZedddZeeed  dddZeed dddZeeed  d	d
dZdS )
ScalarTyper   c                 C   s   | j S r%   r&   r   r   r   r   r      s    zScalarType.__str__r)   c                 C   s(   t j D ]\}}|| kr
|  S q
d S r%   )rN   r+   r,   r.   r   r   r   maybe_parse   s    
zScalarType.maybe_parsec                 C   s$   t | }|d k	s td|  |S )Nzunknown dtype )rN   rO   r-   )r*   Zmb_rr   r   r   r1      s    
zScalarType.parse)valuesr   c                 C   sB   t  }| dD ],}|tkr,|t|  q|t| q|S )N, )setsplitDTYPE_CLASSESupdateaddrN   r1   )rP   Zdtypesr*   r   r   r   	parse_set   s    zScalarType.parse_setN)r   r   r   r   ByteCharShortIntLongZHalfFloatDoubleZComplexHalfComplexFloatComplexDoubleZBoolZBFloat16r   r   rE   r   rO   r1   r	   rW   r   r   r   r   rN      s(   rN   rT   IntegralZFloatingComplexZAllZAllAndComplexZFloatingAndComplexc                   @   sX   e Zd Ze Ze Ze Ze Ze Ze Z	e Z
edddZeed dddZdS )UfuncKeyr   c                 C   s   | j S r%   r&   r   r   r   r   r     s    zUfuncKey.__str__r)   c                 C   s6   t j D ]\}}|| kr
|  S q
td|  d S )Nzunknown ufunc key )rc   r+   r,   r-   r.   r   r   r   r1     s    
zUfuncKey.parseN)r   r   r   r   ZCUDAFunctorZCUDAFunctorOnOtherZCUDAFunctorOnSelfZ	CPUScalarZ	CPUVectorZ
ScalarOnlyGenericr   r   rE   r1   r   r   r   r   rc     s   rc   c                   @   s   e Zd ZdZdZdS )DeviceCheckTyper      N)r   r   r   NoCheck	ExactSamer   r   r   r   re   '  s   re   ViewSchemaKind)aliasingaliasing_inplacenon_aliasingc                   @   s  e Zd ZU ded< eed< eed< eed< ee ed< ee ed< ee	 ed< eed	< eed
< ded< e
d ed< eedf ed< eed< ed ed< ee ed< ed ed< ee ed< eed< eed< eed< ee ed< ed-eeef dee eee  ed eeed f f dddZdd d!d"Zdd d#d$Zeed d%d&Zeed d'd(Zeed d)d*Zeed d+d,ZdS ).NativeFunctionFunctionSchemafunc!use_const_ref_for_mutable_tensorsdevice_guarddevice_checkpython_modulecategory_overridevariantsmanual_kernel_registrationmanual_cpp_bindingr   locOperatorNameautogenUfuncInnerLoopufunc_inner_loop
structuredstructured_delegatestructured_inherits
Precomputeprecomputedcpp_no_default_argsis_abstract&has_composite_implicit_autograd_kernel&has_composite_explicit_autograd_kerneltagsN)ry   BackendMetadata)eirx   
valid_tagsignore_keysr   c           .         sJ  |   }|d}t|ts*td| t| |dg }t|tsNtt|}|dd}t|t	spt|dd}	t|	tstt }
|	
dD ]>}|dkr|
tj q|d	kr|
tj qtd
| q|dd}t|t	std| |dd}t|t	s$td| |dd}t|t	sJtd| |dd}|dkszt|tsztd| |dkrtj}nt| }|dd}t|t	std| |dd}|dkst|tstd| d}|dk	rt|}|dd}|dks2t|ts2td| |dd}|dksbt|tsbtd| |dkstj|
kstd|dd}|dkst|tstd| |dd}|dks|dkst|rt|nd}|dd}t|tstt }t|dkr`t|dks*t|
dD ]*}||krN|| ntd| q4t|tsptddlm} |dd}|dkst|tst|i }|dk	r|rtdd}| D ]\} }| d krqt| tst|| 
d!D ]}!t|! }"|r(|"|kr(q|"tksHtd"|" d#| d$t||oXt|"d%||"< |"tjkr|| krd}qqt|d&kr|rtd'|s
| tjhks
td(|  d)|tj  d*n(|s
|dkr
t| dd%|tj< tj |kr*tj|kr*td+|d,d}#t|#tsFt|#dkrTg nd-d. |#
dD }$|d/i }%i }&t|%trt!|%t"j#|&t"j#< nt|%tr|% D ]f\}!}'|!d krĐqt|!tstd0|! t|'tstd1| t"|!}(t!|'|(|&|(< qntd2|% |&rv|s:td3t$D ]6}"|"|ksZtd4|" tt%& |"dd5||"< q>|rd})n| tjhk})tj| k}*tj | k}+ fd6d7| D },|d d |rtd8| |dk	rt'D ] }-|-|kstd9|- d:qt( ||
|||||$|&|||||||||)|*|+|d;|,fS )<zp
        Parse a NativeFunction from a dictionary as directly parsed
        from native_functions.yaml
        ro   znot a str: r   rp   Fru   r"   rQ   r#   zillegal variant rv   znot a bool: rw   rq   Trr   Nr}   r~   r   rs   z&functions in modules cannot be methodsrt   r   r    r   zillegal tag )cppdispatchzncannot specify both manual_kernel_registration and dispatch; with manual registration, dispatch has no effect!Z__line__,zDispatch key z of kernel z! is not a supported dispatch key.)r}   rf   zSunnecessary dispatch table for this function; just delete the dispatch key entirelyzQunexpected name for singleton CompositeImplicitAutograd dispatch entry: expected z	 but got zR.  Rename your implementation to the expected name, then delete the dispatch tablea  cannot specify both CompositeExplicitAutograd and CompositeImplicitAutograd on a single kernel; each strictly subsumes the other.  If you wanted to provide an explicit autograd implementation, specify CompositeExplicitAutograd; otherwise specify CompositeImplicitAutograd onlyrz   c                 S   s   g | ]}t |qS r   )ry   r1   .0xr   r   r   
<listcomp>Y  s     z,NativeFunction.from_yaml.<locals>.<listcomp>r|   z#ufunc_inner_loop key is not a str: z%ufunc_inner_loop value is not a str: z"ufunc_inner_loop not str or dict: zufunc must be structuredz2ufunc should not have explicit dispatch entry for )kernelr}   c                    s   i | ]\}}| j |iqS r   r&   )r   r/   r0   ro   r   r   
<dictcomp>  s      z,NativeFunction.from_yaml.<locals>.<dictcomp>zleftover entries: z+if structured_delegate, then must not have z* in dispatch dictionary (it is delegated!))ro   rp   ru   r}   r~   r   r   rz   r|   rv   rw   rs   rt   rq   rr   rx   r   r   r   r   r   ))copypop
isinstancer   r-   rn   r1   listrR   boolrS   rV   r!   r"   r#   re   rh   ry   r   lenZtorchgen.apir   dictr,   r$   stripdispatch_keysr   rK   rB   r'   keysrC   r{   rc   rd   rL   ufuncZschema_kernel_namerJ   rm   ).r   rx   r   r   efuncsZcpp_no_default_args_listr   rp   Z
variants_sru   r0   rv   rw   rq   Zdevice_check_srr   r}   Zstructured_delegate_sr~   r   rs   rt   Zprecomputed_dictr   Ztags_sr   tr   Zraw_dispatchr   Z%redundant_composite_implicit_autogradksr/   dispatch_keyZautogen_strrz   Zraw_ufunc_inner_loopr|   Zvo	ufunc_keyr   r   r   Zbackend_metadatakeyr   r   r   	from_yaml  s   

   
 

   




 	 


 

zNativeFunction.from_yamlr   c                 C   s    | j rtd| jstdd S )NzMThis function is structured, but there was no valid functional variant of it.zThis function delegates to another structured out function, but no valid function was found (the delegate may not exist, or it has the wrong type))r}   r-   r~   r   r   r   r   validate_unstructured  s    z$NativeFunction.validate_unstructuredc                 C   s  | j jjr | jtjhks td| jrL| j  t	jks>td| j
sLtd| jrx| j  t	jksjtd| j
sxtd| jr| jrtddd | j  D }t| j|}t|dkstd	| | jd k	r| jstd
t| j jdr
| jtjks
tdd S )NzNative functions with out arguments MUST be declared with only function variant; e.g., variants: function; otherwise you will tickle a Python argument binding bug (which usually manifests itself as the result variable being undefined.)zYPut structured field on the out= variant of a function; did you mean structured_delegate?z:device_guard: False is not respected by structured kernelszQstructured_delegate field not allowed on out= functions; did you mean structured?z?Cannot have both structured and structured_delegate on functionc                 S   s   h | ]}|j d k	r|jqS r%   )defaultr'   r   ar   r   r   	<setcomp>  s    
 z/NativeFunction.__post_init__.<locals>.<setcomp>r   zInvalid cpp_no_default_args: z4structured_inherits must also imply structured: TrueZ_foreachzsforeach kernels fall back to slow path when tensor are on different devices, device_check not allowed to be enabled)ro   	argumentsoutru   r!   r"   r-   r}   kind
SchemaKindrq   r~   schema_order_argumentsrR   
differencer   r   r   r   r'   
startswithrr   re   rg   )r   Zdefaulted_argumentsZinvalid_argsr   r   r   __post_init__  sP    

zNativeFunction.__post_init__c                 C   s   | j p
| jS r%   )r   r   r   r   r   r   has_composite_kernel  s    z#NativeFunction.has_composite_kernelc                 C   sT   | j j}t|dko$tdd |D }d| jk}tdd | j  D }|pR|pR|S )Nr   c                 s   s"   | ]}|j d k	o|j j V  qd S r%   
annotationis_writer   rr   r   r   	<genexpr>  s    z,NativeFunction.is_view_op.<locals>.<genexpr>inplace_viewc                 s   s$   | ]}|j d k	o|j jdkV  qd S )Nr   )r   alias_set_after)r   inpr   r   r   r     s   )ro   returnsr   anyr   r   )r   ZretsZis_non_mutating_viewZis_inplace_viewZis_wildcard_viewr   r   r   
is_view_op  s    
zNativeFunction.is_view_opc                 C   s<   | j r&| jjjjr&d| jks ttjS | j r2tjS tj	S d S )Nr   )
r   ro   r'   inplacer   r-   ri   rk   rj   rl   r   r   r   r   view_schema_kind  s    zNativeFunction.view_schema_kindc                 C   s   | j jjjS r%   )ro   r'   baser   r   r   r   	root_name  s    zNativeFunction.root_name)N)r   r   r   r   r   re   r   r   r	   r!   r   r   rc   rE   objectr$   r   r   r   r   propertyr   r   ri   r   r   r   r   r   r   rm   <  sX   
	
 

  ,	rm   r   )
functionalr   r   mutablec                   @   s   e Zd ZU eed< ee ed< ee ed< eed< eedddZddd	d
Z	ddddZ
ee dddZeedddZeeeef ed  dddZdS )NativeFunctionsGroupr   r   r   r   r   c                 C   s   | j jS r%   )r   r}   r   r   r   r   r}   %  s    zNativeFunctionsGroup.structuredNc                 C   s  | j j }|  D ],}||j krtd| d|j  q| j j tj ksXt| j jrttd|jj d| j	j tj	kst| j
d k	r| j
j tj
kst| jd k	r| jj tjkst| jr>| j	jrt| j j| j	jjkst| j jj d| j j d| j	jj | j
d k	r>| j
j| j	jjks>tdd |  D }d	d
d |D }|j}d	dd |D }t|dkrt|dkrtd| d| dt|jj ||krtd| d| d| dd S )Nz_NativeFunctionsGroup constructed from two NativeFunctions that don't have matching signatures:  != zView operator shouldn't be grouped into NativeFunctionsGroup objects.This is likely because you tried to add an out= variant for 'z', which is an existing view operator.out= variants of view operators are not valid. Please reach out to to the core team if you have questions.z delegates to z but its actual delegate is c                 S   s"   g | ]}d |j krt|jjqS )	generated)r   r   ro   r'   )r   fr   r   r   r   L  s    
 z6NativeFunctionsGroup.__post_init__.<locals>.<listcomp>rQ   c                 s   s   | ]}t |V  qd S r%   r   r   r   r   r   r   O  s     z5NativeFunctionsGroup.__post_init__.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S r%   r   r   r   r   r   r   Q  s     r   z,The codegen expects to be able to generate 'zv'. In order to generate them however, we expect them to be called out explicitly in the yaml. Please add an 'autogen: z' line to the entry for z*'. To do so, it expects a line: 'autogen: z'. Instead, it found 'autogen: ')r   ro   	signature	functionsr-   r   r   r   r'   r   r   r   r}   r   r~   joinrz   r   RuntimeErrorr   )r   Ztest_sigr   Zgenerated_fnsZgenerated_fns_strZexpected_generated_fnsZexpected_generated_fns_strr   r   r   r   *  sH    


"
z"NativeFunctionsGroup.__post_init__rn   c                 C   s   | j j S r%   )r   ro   r   r   r   r   r   r   _  s    zNativeFunctionsGroup.signaturec                 c   s8   | j V  | jV  | jd k	r"| jV  | jd k	r4| jV  d S r%   )r   r   r   r   r   r   r   r   r   b  s    

zNativeFunctionsGroup.functionsc                 C   s   | j jS r%   )r   r   r   r   r   r   r   j  s    zNativeFunctionsGroup.root_name)dr   c                 C   s   | st t| dkrd S t| } | tjd }| tjd }| tjd }| tjd }| r`t |d k	slt |d krxd S t	||||dS )Nrf   )r   r   r   r   )
r-   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   	from_dictn  s$    zNativeFunctionsGroup.from_dict)r   r   r   rm   r   r   r   r   r}   r   r   r   r   r   r   rE   r   r   r   r   r   r   r   r     s   
5
r   c                   @   s   e Zd ZU eed< eed< dS )r   r   r}   N)r   r   r   r   r   r   r   r   r   r   r     s   
	r   c                   @   s@   e Zd ZU eed< ee ed< eed< eeed dddZ	dS )r{   r'   supported_dtypesr   )r*   r   r   c                 C   sj   |  dd\}}|d dks t|d dks0tt }|dd  dD ]}|t|O }qHt|||dS )	N rf   r   ()rQ   )r'   r   r   )rS   r-   rR   rN   rW   r{   )r*   r   r'   Zsupported_dtypes_strr   r/   r   r   r   r1     s      zUfuncInnerLoop.parseN)
r   r   r   r   r   r	   rN   rc   rE   r1   r   r   r   r   r{     s
   
r{   c                   @   s   e Zd ZU eed< eed< eed< eed< edef ed< eeeedef f eeedef f ddd	d
Z	e
edddZeee
f edddZeee
f ee dddZee dddZdS )BackendIndexr   use_out_as_primaryrq   externalry   indexN)parent_indexchild_indexr   c                 C   sT   |  D ]F\}}|  D ]4\}}|| | ks@td| d| || | |< qqd S )Nzduplicate operator z for dispatch key )r,   r-   )r   r   r/   r0   op_namemetadatar   r   r   
grow_index  s    
zBackendIndex.grow_index)gr   c                 C   s   | j r|jS |jS d S r%   )r   r   r   )r   r   r   r   r   primary  s    zBackendIndex.primaryc                 C   s   |  |}|d k	S r%   )
get_kernel)r   r   mr   r   r   
has_kernel  s    
zBackendIndex.has_kernelc                 C   sN   t |tr|}nt |tr&| |}nt| |jj| jkr@d S | j|jj S r%   )r   rm   r   r   r   ro   r'   r   )r   r   r   r   r   r   r     s    

zBackendIndex.get_kernelr   c                 C   s   | j rt| j dS d S d S )NZNativeFunctions)r   r   r   r   r   r   r   native_function_class_name  s    z'BackendIndex.native_function_class_name)r   r   r   r$   r   r   r   r   rE   r   r   rm   r   r   r   r   r   r   r   r   r   r   r   r     s    

r   c                   @   s  e Zd ZU ded< ded< ed ed< ed dd	d
Zeed dddZ	e
dddZddddZe
dddZe
dddZedddZeee  dddZdddde
e
e
d dddZd dd d!Zdd d"d#d$Zee
dd%d&Zedd'd(ZdS ))rn   ry   r'   	Argumentsr   )Return.r   Argumentr   c                 C   s   t | jj| jj| jjS r%   )	itertoolschainr   flat_positionalflat_kwarg_onlyr   r   r   r   r   r   1  s
    z%FunctionSchema.schema_order_arguments)ro   r   c           
      C   s   d| kst d| d}| d | }| |td d  }|dd\}}|d dks^t d|d d }t|}t|}t|}t|||d}	t	|	| kst t	|	 d	|  |	S )
N -> z:function schema missing return type (spaces are mandatory)r   rf   r   r   zExpecting closing )r'   r   r   r   )
r-   rfindr   rS   ry   r1   r   parse_returnsrn   r   )
ro   
last_indexZ	func_declreturn_declopsargsr'   r   r   r   r   r   r   r1   8  s     


"zFunctionSchema.parsec                 C   s   t dd | jD S )Nc                 s   s$   | ]}|j d k	r|j jr|V  qd S r%   r   r   r   r   r   r   M  s   
 z5FunctionSchema.returns_are_aliased.<locals>.<genexpr>)r   r   r   r   r   r   returns_are_aliasedK  s    z"FunctionSchema.returns_are_aliasedNc                    s:  t | jj| jD ]\}|jjkstdq| jjD ]. t fdd| jD r6tdt|  q6t	| jjdd | jj
D  }dd | jD }dd | jD }t|d	kst|d	kstd
t|  |D ]"tfdd|D stdq| jjrRtdd | jjD r2t| jd	ksRtdn t| jjt| jksRtd| jjjr| jj}|r|jjr|jjjst|jjttjkrt| jdkr| jd	 j|jjkstnt| jd	kst| jjd k	r
|  tjks
tdt|  |  r6|  tjks6tdt|  d S )NzsOut arguments must have matching return Tensor; furthermore, the ith-argument needs to correspond to the ith returnc                 3   s   | ]} j |j kV  qd S r%   r   r   r   r   r   r   \  s    z/FunctionSchema.__post_init__.<locals>.<genexpr>z^If you have a schema with mutable positional args, we expect them to not be returned. schema: c                 S   s   g | ]}|j d kr|qS r   r&   r   argr   r   r   r   c  s    
 z0FunctionSchema.__post_init__.<locals>.<listcomp>c                 S   s"   g | ]}|j d k	r|j jr|qS r%   r   r   retr   r   r   r   f  s   
 c                 S   s"   g | ]}|j d ks|j js|qS r%   r   r   r   r   r   r   k  s   
 r   zYNativeFunctions must have either only mutable returns, or only immutable returns. Found: c                    s   g | ]} j |j kqS r   r   r   )r   r   r   r   y  s     zAll mutable returns must be aliased either to a keyword argument, or to "self". Did you forget to mark an out argument as keyword-only?c                 s   s   | ]}|j ttjkV  qd S r%   )typeBaseTypeBaseTyTensorr   r   r   r   r     s     z3out= ops that accept tensor lists as out arguments zMMust return as many arguments as there are out arguments, or no return at allrf   zFound an operator that is not functional, but has tensor options arguments.This is not allowed- tensor options arguments are only allowed for factory functions.schema: zFound an operator that is not functional, but its overload contains the string 'functional'.This is a special keyword in the codegen, please use a different overload name.schema: )zipr   r   r   r   r-   post_self_positional_mutabler   r   r   r   r   r'   r   self_argargumentr   r  r  r  r  tensor_optionsr   r   r   is_functional_fn)r   r   Zout_and_selfZmutable_returnsZimmutable_returnsZself_ar   )r   r   r   r   S  s~    






zFunctionSchema.__post_init__c                 C   s   d| j jkS )Nr   r'   overload_namer   r   r   r   r
    s    zFunctionSchema.is_functional_fnc                 C   s   t | jjS r%   )r   r   r   r   r   r   r   	is_out_fn  s    zFunctionSchema.is_out_fnc                 C   s`   t | jj}| jjj}tdd | jjD }|r8|r8t|rBtjS |rLtjS |rVtj	S tj
S dS )a	  
        What kind of schema is this?  A functional schema is one
        that returns a newly allocated output; an inplace schema
        modifies the self argument inplace; an out schema writes
        the result into an explicitly provided out argument.
        c                 s   s    | ]}|j d k	o|j jV  qd S r%   r   r   r   r   r   r     s   z&FunctionSchema.kind.<locals>.<genexpr>N)r   r   r   r'   r   r   post_self_positionalr-   r   r   r   )r   Zis_outZ
is_inplaceZ
is_mutabler   r   r   r     s    
zFunctionSchema.kindc                    s   g }| j D ]|  fdd| jjD }t|dkr<|d  q
t|dkrZ||d j q
ddd |D }td j d	| d
q
|S )Nc                    s&   g | ]}|j d k	r|j  j kr|qS r%   r   r   r   r   r   r     s   
 z7FunctionSchema.aliased_return_names.<locals>.<listcomp>r   rf   rQ   c                 s   s   | ]}|j V  qd S r%   r&   r   r   r   r   r     s     z6FunctionSchema.aliased_return_names.<locals>.<genexpr>zFound a return (z)that aliases multiple inputs (r   )r   r   flat_allr   appendr'   r   r-   )r   outsZaliased_argsZaliased_namesr   r  r   aliased_return_names  s    

z#FunctionSchema.aliased_return_namesF)strip_defaultstrip_view_copy_namekeep_return_names)r  r  r  r   c          
         s  t t d fdd}jjj}|r8|dr8|dd}t fddtjj	dk	rbjj	j
gng jjjjD }tt|j}|| }jj|d	}	tjd
krtt|	dd}	tjdkrtt|	dd}	ttt|djjjddd|	|dS )a
  
                Certain schemas are 'related', in that they are simply
                inplace/out/functional versions of the same function.  This method
                factors these schemas into the "core" functional signature which
                is equal across all versions.

                Here is what normalization happens to the schema to convert
                it to a signature:
                - The overload name is stripped (name is retained, since
                  it expresses semantic content about what the function does)
                - Inplace is set False
                - Out arguments are stripped
                - Mutable post_self_positional args are converted to returns
                - Mutability annotations are stripped  (this is sound
                  because you cannot overload on mutability annotation)
                - Return names are stripped since they are not overloadable and
                  some variants have return names but some not
                - TensorOptions are dropped
                  because out= variants of factory functions don't include them
                  (and we want to be able to pair up factory functions with their out variants)

                Finally, we want to be able to pair up related "view" and their
                corresponding "view_copy" operators. We do this by optionally
                stripping the trailing "_copy" from the base name.

                Example of a mutable op before and after:

                f.func (Mutable operator):
        _fused_moving_avg_obs_fq_helper(Tensor self, Tensor observer_on, Tensor fake_quant_on, Tensor(a!) running_min, Tensor(b!) running_max, Tensor(c!) scale, Tensor(d!) zero_point, float averaging_const, int quant_min, int quant_max, int ch_axis, bool per_row_fake_quant=False, bool symmetric_quant=False) -> (Tensor output, Tensor mask)  # noqa: B950

                f.func (Corresponding functional operator):
        _fused_moving_avg_obs_fq_helper.functional(Tensor self, Tensor observer_on, Tensor fake_quant_on, Tensor running_min, Tensor running_max, Tensor scale, Tensor zero_point, float averaging_const, int quant_min, int quant_max, int ch_axis, bool per_row_fake_quant=False, bool symmetric_quant=False) -> (Tensor output, Tensor mask, Tensor running_min_out, Tensor running_max_out, Tensor scale_out, Tensor zero_point_out)  # noqa: B950

                f.func.signature() output:
        _fused_moving_avg_obs_fq_helper(Tensor self, Tensor observer_on, Tensor fake_quant_on, Tensor running_min, Tensor running_max, Tensor scale, Tensor zero_point, float averaging_const, int quant_min, int quant_max, int ch_axis, bool per_row_fake_quant=False, bool symmetric_quant=False) -> (Tensor, Tensor, Tensor, Tensor, Tensor, Tensor)  # noqa: B950
        )r   r   c                    s   t  r| jnd | jd dS )Nr'   r  r   )r   r'   r  r  )r  r   r   strip_ret_annotation.  s
    z6FunctionSchema.signature.<locals>.strip_ret_annotation_copyr   c                 3   sX   | ]P  j d k	r j jrt fddjD strB j dnd  jd dV  qd S )Nc                 3   s   | ]} j |j kV  qd S r%   r   r   r   r   r   r   N  s     z5FunctionSchema.signature.<locals>.<genexpr>.<genexpr>_outr  )r   r   r   r   r   r'   r  )r   r  r   r   r   r   :  s   		
z+FunctionSchema.signature.<locals>.<genexpr>Nr  zarange.start_stepzScalar stepzScalar step=1zbernoulli.pzfloat pzfloat p=0.5Fr   r   dunder_methodr  r   )r   r'   r   endswithreplacetupler   r   r   r  r  r   r  mapr   r   r   r   r1   rn   ry   BaseOperatorNamer  )
r   r  r  r  r  	base_nameZreturns_from_mutable_inputsZoriginal_returnsr   Zargs_sigr   r  r   r     sD    ,
	
zFunctionSchema.signaturec                 C   s   | j ddS )NTr  )r   r   r   r   r   view_signaturek  s    zFunctionSchema.view_signature)r'   r   c                 C   s   t || j| jdS )Nr   )rn   r   r   )r   r'   r   r   r   	with_namen  s
    zFunctionSchema.with_namec                 C   s   |   tjtjtjfkS r%   )r   r   r   r   r   r   r   r   r   modifies_argumentsu  s    z!FunctionSchema.modifies_argumentsc                 C   sX   t | j}t| jdkr(t | jd }nddtt | j d }| j d| d| S )Nrf   r   r   rQ   r   z) -> )r   r   r   r   r   r"  r'   )r   Zall_arguments_strr   r   r   r   r   y  s
    
zFunctionSchema.__str__)r   r   r   r   r   r   r   rE   r   r1   r   r   r   r
  r  r   r   r   r   r  r   r&  r'  r   r(  r   r   r   r   r   rn   '  s4   
Z"irn   c                   @   sP   e Zd ZU eedf ed< eed< eed< eed dddZedd	d
Z	dS )
Annotation.	alias_setr   r   )annr   c                 C   s   |  d}|dkr@d}td| d | | |td d   }nd}td| }|d k	sftd|  |df}|dd	k}t|||d
}t|| kst| d|  |S )Nz -> *r   *z^([a-z])(!?)(!?)$r   zunrecognized alias annotation rf      !)r*  r   r   r   )findrematchr   r-   groupr)  r   )r+  Zbecomes_wildcard_indexZ	after_setr   r*  r   r   r   r   r   r1     s*    

  zAnnotation.parser   c                 C   s>   d | j}| jr$| d | j }| jr.dnd}| | S )N|r   r.  r   )r   r*  r   r   )r   r*  r   r   r   r   r     s
    zAnnotation.__str__N)
r   r   r   r   r   r   r   rE   r1   r   r   r   r   r   r)    s   
r)  c                   @   sp   e Zd Zeed dddZeed dddZedddZedd	d
Z	edddZ
ed dddZdS )Type)r   r   c                 C   s,   t | }t|| ks(t| d|  |S )Nr   )r4  _parser   r-   )r   r   r   r   r   r1     s    
z
Type.parsec                 C   s   t d| }|d k	r(tt|dS t d| }|d k	rt|dd k	rXt|dnd }tt|d|dS ztt	|  W S  t
k
r   td|  Y nX d S )Nz^(.+)\?$rf   z^(.+)\[([0-9]+)?\]$r-  )elemsizezunrecognized type )r0  r1  OptionalTyper4  r1   r2  r    ListTyper  r  KeyErrorr   )r   r   r7  r   r   r   r5    s     zType._parser   c                 C   s   t d S r%   NotImplementedErrorr   r   r   r   r     s    zType.__str__c                 C   s   t d S r%   r;  r   r   r   r   is_tensor_like  s    zType.is_tensor_likec                 C   s   t d S r%   r;  r   r   r   r   is_nullable  s    zType.is_nullabler9  c                 C   s   t d S r%   r;  r   r   r   r   is_list_like  s    zType.is_list_likeN)r   r   r   rE   r   r1   r5  r   r   r=  r>  r   r?  r   r   r   r   r4    s   r4  r  )	GeneratorrN   r  r    ZDimnamefloatr   r   LayoutDeviceZScalarZMemoryFormatZQSchemeZStorageZStreamZSymIntZConstQuantizerPtrc                   @   sR   e Zd ZU eed< edddZedddZedddZ	e
d	 dd
dZdS )r  r'   r   c                 C   s
   | j j  S r%   r&   r   r   r   r   r     s    zBaseType.__str__c                 C   s   | j tjkS r%   )r'   r  r  r   r   r   r   r=    s    zBaseType.is_tensor_likec                 C   s   dS )NFr   r   r   r   r   r>    s    zBaseType.is_nullabler9  c                 C   s   d S r%   r   r   r   r   r   r?    s    zBaseType.is_list_likeN)r   r   r   r  r   r   r   r   r=  r>  r   r?  r   r   r   r   r    s
   
r  c                   @   sR   e Zd ZU eed< edddZedddZedddZ	e
d	 dd
dZdS )r8  r6  r   c                 C   s   | j  dS )N?)r6  r   r   r   r   r     s    zOptionalType.__str__c                 C   s
   | j  S r%   r6  r=  r   r   r   r   r=    s    zOptionalType.is_tensor_likec                 C   s   dS )NTr   r   r   r   r   r>    s    zOptionalType.is_nullabler9  c                 C   s
   | j  S r%   )r6  r?  r   r   r   r   r?    s    zOptionalType.is_list_likeN)r   r   r   r4  r   r   r   r   r=  r>  r   r?  r   r   r   r   r8  
  s
   
r8  c                   @   s^   e Zd ZU eed< ee ed< edddZe	dddZ
e	ddd	Zed  dd
dZdS )r9  r6  r7  r   c                 C   s$   | j r| j  nd}| j d| dS )Nr   [])r7  r6  )r   r7  r   r   r   r   '  s    zListType.__str__c                 C   s
   | j  S r%   rE  r   r   r   r   r=  +  s    zListType.is_tensor_likec                 C   s
   | j  S r%   )r6  r>  r   r   r   r   r>  .  s    zListType.is_nullablec                 C   s   | S r%   r   r   r   r   r   r?  1  s    zListType.is_list_likeN)r   r   r   r4  r   r   r    r   r   r   r=  r>  r?  r   r   r   r   r9  "  s   
r9  c                   @   sj   e Zd ZU eed< eed< ee ed< ee ed< eed dddZ	e
edd	d
ZedddZdS )r   r'   r  r   r   r   r   c           
      C   s   |  dd\}}d|kr(|d\}}n|}d }td|}|rv|ddksVtdd|d }t|d}n|}d }t|}t	||||d	}	t
|	| kstt
|	 d
|  |	S )Nr   rf   =Tensor\((.+)\)(.*)r-  r   rD  z[],unrecognized alias analysis form with Tensorr  r'   r  r   r   r   )rsplitrS   r0  r1  r2  r-   r)  r1   r4  r   r   )
r   type_and_annotZname_and_defaultr'   r   r1  type_sr   r  r   r   r   r   r1   S  s.    
"zArgument.parser   c                 C   s   | j d k	o| j jS r%   r   r   r   r   r   r   v  s    zArgument.is_writec                 C   sl   | j  }| jr0|dkst|dd| j d}| jd kr>|S d}| jrTd| j }| d| j | S d S )Nr  zTensor?zTensor[]r  Tensor(r   r   rI  r   )r  r   r-   r   r'   r   )r   r  Z
mb_defaultr   r   r   r   z  s    
zArgument.__str__N)r   r   r   r   r   r4  r   r)  rE   r1   r   r   r   r   r   r   r   r   r   5  s   
"r   c                   @   sb   e Zd ZU ee ed< eed< ee ed< eed dddZ	e
eddd	Zedd
dZdS )r   r'   r  r   rH  c                 C   s   d| kr|  dd\}}n| }d }td|}|rh|ddksHtdd|d }t|d}n|}d }t|}t|||d}t	|| kstt	| d	|  |S )
Nr   rf   rJ  r-  rK  rL  r  r  r   )
rN  r0  r1  r2  r-   r)  r1   r4  r   r   )r   rO  r'   r1  rP  r   r  r   r   r   r   r1     s*    
"zReturn.parser   c                 C   s   | j d k	o| j jS r%   r   r   r   r   r   r     s    zReturn.is_writec                 C   sR   | j  }| jr0|dkst|dd| j d}| jd kr>|S | d| j S d S )NrQ  r  rR  r   r   )r  r   r-   r   r'   )r   r  r   r   r   r     s    
zReturn.__str__N)r   r   r   r   r   r   r4  r)  rE   r1   r   r   r   r   r   r   r   r   r     s   
r   c                   @   s   e Zd ZU eed< dS )SelfArgumentr  N)r   r   r   r   r   r   r   r   r   rS    s   
rS  c                   @   s@   e Zd ZU eed< eed< eed< eed< ee dddZdS )	TensorOptionsArgumentsdtypelayoutdevice
pin_memoryr   c                 C   s   | j | j| j| jgS r%   rU  rV  rW  rX  r   r   r   r   all  s    zTensorOptionsArguments.allN)r   r   r   r   r   r
   rZ  r   r   r   r   rT    s
   
rT  c                   @   s  e Zd ZU eedf ed< ee ed< eedf ed< eedf ed< ee ed< eedf ed< eedf ed< e	e
e d	d
dZe	e
e d	ddZe	e
e d	ddZe	e
e d	ddZe	e
e d	ddZe	e
eeeef  d	ddZe	e
eeef  d	ddZe	e
eeef  d	ddZe	e
eeeef  d	ddZee d	ddZdded d d!d"Zd d	d#d$Zee d d%d&d'Zeeeee ee ee f d(d)d*Zeed d(d+d,Zed	d-d.Zd/d	d0d1Z d/S )2r   .pre_self_positionalr  r  pre_tensor_options_kwarg_onlyr	  post_tensor_options_kwarg_onlyr   r   c                 C   s    g }| | j | | j |S r%   )extendr   r   r   r   r   r   r   flat_non_out  s    zArguments.flat_non_outc                 C   s8   g }| | j | jd k	r(|| jj | | j |S r%   )r^  r[  r  r  r  r  r_  r   r   r   r     s    
zArguments.flat_positionalc                 C   s   dd | j D S )Nc                 S   s   g | ]}|j r|qS r   )r   r   r   r   r   r     s      z:Arguments.post_self_positional_mutable.<locals>.<listcomp>)r  r   r   r   r   r    s    z&Arguments.post_self_positional_mutablec                 C   s:   g }| | j | jd k	r*| | j  | | j |S r%   )r^  r\  r	  rZ  r]  r_  r   r   r   r     s    
zArguments.flat_kwarg_onlyc                 C   s,   g }| | j | | j | | j |S r%   )r^  r   r   r   r_  r   r   r   r    s
    zArguments.flat_allc                 C   s    g }| | j | | j |S r%   )r^  
positional
kwarg_onlyr_  r   r   r   non_out  s    zArguments.non_outc                 C   s6   g }| | j | jd k	r&|| j | | j |S r%   )r^  r[  r  r  r  r_  r   r   r   ra    s    
zArguments.positionalc                 C   s6   g }| | j | jd k	r&|| j | | j |S r%   )r^  r\  r	  r  r]  r_  r   r   r   rb    s    
zArguments.kwarg_onlyc                 C   s,   g }| | j | | j | | j |S r%   )r^  ra  rb  r   r_  r   r   r   rZ  (  s
    zArguments.allc                 C   s   dd | j D S )Nc                 S   s$   g | ]}|j d k	r|j jr|jqS r%   )r   r   r'   r   r   r   r   r   1  s   
 z/Arguments.mutable_arg_names.<locals>.<listcomp>)r  r   r   r   r   mutable_arg_names0  s    zArguments.mutable_arg_namesFr  )r  r   c             	      sz   t t d fdd}ttt|| j| jd k	r>t|| jjnd tt|| jtt|| j	tt|| j
 d t ddS )N)r   r   c                    s   t | j| j s| jnd d dS )NrM  )r   r'   r  r   r   r  r   r   strip_arg_annotation:  s    z1Arguments.signature.<locals>.strip_arg_annotationr   r[  r  r  r\  r	  r]  r   )r   r   r!  r"  r[  r  rS  r  r  r\  r]  )r   r  re  r   r  r   r   7  s(    


zArguments.signaturec                 C   s.   | j d k	sttj| ttj| j jd ddS )Nr   )r  )r  r-   dataclassesr   rS  r  r   r   r   r   remove_self_annotationZ  s    z Arguments.remove_self_annotation)r  r   c                 C   s$   t | jdksttj| t|dS )Nr   )r   )r   r   r-   rg  r   r!  )r   r  r   r   r   with_out_argsc  s
    zArguments.with_out_args)r   r   c                 C   s   g }g }g }|}|  dD ]r}|s$q|dkrB||ks<td|}qt|}|jd k	rv|jjrv||krhq||kr|}n||k	st|| q|||fS )NrQ   r,  z:invalid syntax: kwarg-only specifier * can only occur once)rS   r-   r   r1   r   r   r  )r   ra  rb  r   Zarguments_accr   Zpargr   r   r   	_preparsej  s.    
zArguments._preparsec              	   C   s  t | \}}}d}t|D ]\}}|jdkr|} q8q|dk	rj|d| }t|| }||d d }	ng }d}|}	g }
d}g }|
}ttttgt	f ddd}|dt
d|d	t
d
|dt
d|dt
dg}d}|t|k r|t|t| kr|tdd t||||t|  D r|||
ks>tt|| ||d  ||d  ||d  d}|t|7 }|}q|||  |d7 }qt t||t|	t|
|t|t|dS )z.
        Input: 'int x, int y, int z'
        Nr   rf   )r'   tyr   c                    s    fddS )Nc                    s   | j  ko| jtfkS r%   )r'   r  r8  r   r'   rk  r   r   <lambda>      z/Arguments.parse.<locals>.pred.<locals>.<lambda>r   rl  r   rl  r   pred  s    zArguments.parse.<locals>.predrU  rN   rV  rB  rW  rC  rX  r   r   c                 s   s   | ]\}}||V  qd S r%   r   )r   pr   r   r   r   r     s   z"Arguments.parse.<locals>.<genexpr>r-     rY  rf  )r   rj  	enumerater'   rS  r   r4  r   r   r   r1   r   rZ  r  r-   rT  r  r!  )r   ra  rb  r   Zself_ixir   r[  r  r  r\  r	  r]  Zkwarg_only_accro  Z
predicatesr   r   r   r1     sd    





zArguments.parsec                 C   sZ   g }| tt| j | js"| jr,|d | tt| j | tt| j d|S )Nr,  rQ   )r^  r"  r   r   r   r   r  r   )r   Zall_argumentsr   r   r   r     s    
zArguments.__str__Nc                 C   sP   | j d kr| jrt| jd kr(| jr(tdd | jD }t|dksLtdd S )Nc                 S   s"   g | ]}|j d k	r|j jr|qS r%   r   r   r   r   r   r     s   
 z+Arguments.__post_init__.<locals>.<listcomp>r   zOmutable pre_self_positional arguments are not currently supported in the schema)r  r[  r-   r	  r]  r   )r   Zmutable_pre_self_positionalsr   r   r   r     s    




zArguments.__post_init__)!r   r   r   r   r   r   r   rS  rT  r   r
   r`  r   r  r   r  r   rc  ra  rb  rZ  r   r   rd  r   r   rh  ri  rE   rj  r1   r   r   r   r   r   r   r     sH   
#	(#O	r   rV   submuldivmodpowlshiftrshiftandxororc                   @   sH   e Zd ZU eed< eed< eed< eed dddZeddd	Zd
S )r#  r   r   r  )opr   c                    s   | dkst | drt dtd| }|d k	r~d}|d t fddtD rhd} dd   qd	} d
 dkst n*d	}|   d dkrd} d d  nd	}t ||d}t|| kst t| d|  |S )Nr   r  zs_out suffix is reserved and not permitted for operator names; did you mean to specify an out overload name instead?z^__([^_]+)__$Trf   c                 3   s   | ]} d | kV  qdS )rs  Nr   )r   nr   r   r   r   #  s     z)BaseOperatorName.parse.<locals>.<genexpr>Fr   rs  r   _r  r   )	r-   r  r0  r1  r2  r   AUGMENTED_ASSIGNMENT_NAMESr#  r   )r~  r   r  r   r   r   r  r   r1     s,    
"zBaseOperatorName.parser   c                 C   sF   | j r&| jrdnd}d| | j dS | jr0dnd}| j | S d S )Nrs  r   __r  )r  r   r   )r   rs  r   r   r   r   9  s
    zBaseOperatorName.__str__N)	r   r   r   r   r   r   rE   r1   r   r   r   r   r   r#    s   
 r#  c                   @   sl   e Zd ZU eed< eed< eed dddZedddZedd	d
Z	d dddZ
ed dddZdS )ry   r'   r  )r   r   c                 C   sZ   d| kr|  dd\}}n| }d}tt||d}t|| ksVtt| d|  |S )N.rf   r   r  r   )rS   ry   r#  r1   r   r-   )r   r'   r  r   r   r   r   r1   I  s    "zOperatorName.parser   c                 C   s$   | j r| j d| j  S | j S d S )Nr  r  r'   r   r   r   r   r   T  s    zOperatorName.__str__c                 C   s$   | j r| j d| j  S | j S d S )Nr  r  r   r   r   r   unambiguous_name_  s    zOperatorName.unambiguous_namec                 C   s    t t| jjd| jjd| jdS NFr  r  )ry   r#  r'   r   r  r  r   r   r   r   remove_inplacee  s    zOperatorName.remove_inplace)overloadr   c                 C   s   t t| jjd| jjd|dS r  )ry   r#  r'   r   r  )r   r  r   r   r   with_overloado  s    zOperatorName.with_overloadN)r   r   r   r#  r   r   rE   r1   r   r  r  r  r   r   r   r   ry   D  s   


ry   )r   r   br   c                 C   s(   | j  tjk	o&||  o&||jS r%   )ro   r   r   r   r   )r   r   r  r   r   r   "gets_generated_out_inplace_wrapperz  s
    

r  c                   @   sz   e Zd ZU eed< ee ed< ee ed< ddddZdd	eee d
ddZ	e
edddZe
edddZdS )NativeFunctionsViewGroupview	view_copyview_inplaceNr   c                 C   s   | j jst| jd krFt| j rtt| j jj dt| j dnh| jjjjj	
ds^t| j j | jjjddks~td| jjkstt| jjjt| j jf d| jd k	r| j j | jj kst| j jr| jd k	r| jjstt| j jj dt| jjj d	d S )
Nz appears to be a new operator that aliases its inputs. The codegen expects you to add a corresponding operator to native_functions.yaml: z3. See Note [view_copy NativeFunctions] for details.r  Tr%  r  z appears to be a view_copy operator. The codegen expects view_copy operators to be annotated with the 'view_copy' tag in native_functions.yaml. See Note [view_copy NativeFunction] for details.z and z] must either both have CompositeImplicitAutograd kernels, or both not have composite kernels.)r  r   r-   r  gets_generated_view_copyr   ro   r'   get_view_copy_namer   r  r   r   r  r   r   r   r   r   r     s&    


"z&NativeFunctionsViewGroup.__post_init__T)include_copy)r  r   c                c   s4   | j V  | jd k	r| jV  | jd k	r0|r0| jV  d S r%   )r  r  r  )r   r  r   r   r   r     s
    
z"NativeFunctionsViewGroup.functionsc                 C   s   | j jS r%   )r  r   r   r   r   r   r     s    z"NativeFunctionsViewGroup.root_namec                 C   s   | j jS r%   )r  r   r   r   r   r   	composite  s    z"NativeFunctionsViewGroup.composite)r   r   r   rm   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r    s   
r  )r   r   c                 C   s&   | j s
dS | jrdS d| jkr"dS dS )NFr   T)r   r   r   )r   r   r   r   r    s    
r  c                 C   s\   dg}t | jj|kr"t| s"t| jjjj d}tt|d| jjjjd| jjj	d}|S )NZnarrowr  Fr  r  )
r   ro   r'   r  r-   r   ry   r#  r  r  )r   Z-list_of_ops_with_explicit_view_copy_operatorsr$  Zview_copy_namer   r   r   r    s      
r  .)r   r   c                 C   sH   | dkrdS | d dkr0| d dkr0| dd } t dd	 | d
D S )z$
    Input: '()'
    Output: []
    z()r   r   r   r   r   rf   c                 s   s   | ]}t |V  qd S r%   )r   r1   r   r   r   r   r     s     z parse_returns.<locals>.<genexpr>rQ   )r!  rS   )r   r   r   r   r     s
    r   c                   @   sT   e Zd ZU eeee f ed< ee ed< ee	d dddZ
ee dddZd	S )
r   r   rV   )srcr   c           
      C   s   t | tstg }d| d krF| d d}dd |D }| d d } i }| D ]P}t |ts`td|ksptd|d\}}|d}dd |D }|||< qNt||d}	|	 | kstd	|	S )
Nr   r   r   c                 S   s   g | ]}t | qS r   r   r1   r   r   r'   r   r   r   r   	  s     z$Precompute.parse.<locals>.<listcomp>zLprecomputed parameters without replacement are allowed only in the last linec                 S   s   g | ]}t | qS r   r  r  r   r   r   r   "	  s     )r   rV   zr.to_list() != src)r   r   r-   rS   r   r   to_list)
r  Zadd_argsZadd_listr   Zraw_replace_itemr   Zwith_list_rawZ	with_listZwith_list_argsr   r   r   r   r1   	  s&    	


zPrecompute.parser   c                 C   sD   g }| j  D ]0\}}ddd |D }|| d|  q|S )NrQ   c                 s   s   | ]}t |V  qd S r%   r   )r   paramr   r   r   r   ,	  s     z%Precompute.to_list.<locals>.<genexpr>r   )r   r,   r   r  )r   Zreplace_listZkernel_paramZreplacement_paramsreplacementsr   r   r   r  )	  s
    zPrecompute.to_listN)r   r   r   r   r   r   r   r   rE   r   r1   r  r   r   r   r   r     s
   
!r   )\r0  Ztorchgen.utilsr   rg  r   typingr   r   r   r   r   r	   r
   r   r   enumr   r   r   r   r!   r$   r3   r:   r9   rJ   rL   r=   r5   r4   r>   r6   r;   r<   rB   rC   r?   r@   r8   r7   r   r   rH   rI   rK   rM   rN   rT   r   r   rX   rY   r[   r\   rZ   r]   r^   r_   r`   rc   re   ri   rm   r   r   r   r{   r   rn   r)  r4  r  r  r8  r9  r   r   rS  rT  r   r  r#  ry   r  r  r  r  r   r   Ztorchgen.api.ufuncapir   r   r   r   r   <module>   s    ,	
`*	    \
jp  c-(R4
  016  82