o
    ΦiEt                     @  st  d dl mZ d dlZd dlmZ d dlmZ d dlm  m	Z	 d dl
mZ d dlmZmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# d d	l$m%Z% erid d
l&m'Z' ddgZ(ddgZ)g dZ*dgZ+dDddZ,dEddZ-dFddZ.dFd d!Z/dGd#d$Z0dFd%d&Z1dHd,d-Z2dId3d4Z3dJd9d:Z4dKd<d=Z5edLd@dAZ6edLdBdCZ7dS )M    )annotationsN)defaultdict)TYPE_CHECKING)	translate)BindingDispatcherSignatureExpr)with_native_function)
AnnotationArgumentBackendIndexBackendMetadataBaseOperatorNameBaseTyBaseTypeDEFAULT_KERNEL_NAMESPACEDeviceCheckTypeDispatchKeyFunctionSchemaNativeFunctionNativeFunctionsGroupOperatorNameReturn
SchemaKindVariant)	concatMap)Sequencez'adaptive_avg_pool3d_backward.grad_inputz _slow_conv2d_backward.grad_inputZ_cummax_helperZ_cummin_helper)$Z_assert_asyncz_assert_async.msgZ_assert_tensor_metadataZ_cslt_sparse_mm_searchZ_assert_scalarZ_dimIZ_dimVZ_has_same_storage_numelZ_linalg_check_errorsZ_local_scalar_denseZ%_nested_tensor_from_mask_left_alignedZ_nnzZ_use_cudnn_ctc_lossz_use_cudnn_ctc_loss.TensorZ#_validate_compressed_sparse_indicesZallcloseZ	dense_dimequalZis_coalescedZ	is_pinnedZis_same_sizeZ	is_set_toZq_per_channel_axisZq_scaleZq_zero_pointZqschemerecord_streamZ
sparse_dimZsym_constrain_rangeZsym_constrain_range_for_sizeZ_nested_tensor_storage_offsetsZ'_chunk_grad_outputs_efficient_attentionZ_fused_sdp_choiceZ_printZ_sink_tokensZ_nested_get_ragged_idxZ
polygamma_native_functionsSequence[NativeFunction]return6dict[FunctionSchema, dict[SchemaKind, NativeFunction]]c                 C  sD   t t}| D ]}||j  }|j |vsJ |||j < q|S N)r   dictfunc	signaturekind)r   pre_grouped_native_functionsfd r+   E/home/app/PyTorch/test/pytorch/torchgen/native_function_generation.pypre_group_native_functionsn   s   r-   overload_name
str | Nonestrc                 C  s   | sdS |  dS )Nout_outr+   )r.   r+   r+   r,   &get_expected_out_variant_overload_name|   s   r3   r%   r   c              
   C  sp   |   tjks	J | jjd usJ t| j t	| jj
| j td| jjjjd | jjjjdg| jdS )Nr1   nametypedefault
annotationr5   	argumentsreturns)r'   r   inplacer:   self_argr   r5   remove_inplacewith_overloadr3   r.   remove_self_annotationwith_out_argsr   argumentr6   r8   r;   )r%   r+   r+   r,   self_to_out_signature   s"   





rC   c                 C  sL   |   tjks	J t| \}}t| jt| jj| j	
 |t|dS Nr9   )r'   r   
functionalgenerate_out_args_from_schemar   r5   r?   r3   r.   r:   r&   rA   tupler%   new_returnsnew_out_argsr+   r+   r,   functional_to_out_signature   s   

rK   #tuple[list[Return], list[Argument]]c           
   	     s  t dd | jD rJ dd | jD }t|dksJ tdd | jj  fddtjD }td	d | jD }g }g }t	| jD ]A\}}|j
 r~tt| jd
krUdnd| |j
d t||  dd}|| |r}td |j
|jd}	||	 qB|| qB||fS )Nc                 s  s"    | ]}|j d uo|j jV  qd S r#   )r8   is_write.0rr+   r+   r,   	<genexpr>   s    
z0generate_out_args_from_schema.<locals>.<genexpr>c                 S  s   g | ]	}|j  r|qS r+   r6   is_tensor_likerN   r+   r+   r,   
<listcomp>   s    z1generate_out_args_from_schema.<locals>.<listcomp>r   c                 S  s   | j d u rg S | j jS r#   )r8   	alias_set)ar+   r+   r,   <lambda>   s    z/generate_out_args_from_schema.<locals>.<lambda>c                   s   g | ]}| vr|qS r+   r+   )rO   xZused_annotationsr+   r,   rT      s    c                 s  s     | ]}|j ttjkV  qd S r#   )r6   r   r   TensorrN   r+   r+   r,   rQ      s       r1   !r4   )r5   r6   r8   )anyr;   lenr   r:   flat_allstringZascii_lowercaseall	enumerater6   rS   r   r
   parseappendr   r8   )
r%   Ztensorlike_retsZvalid_annotationsZall_rets_are_tensorsrJ   rI   irP   Znew_outZnew_retr+   rY   r,   rF      s<   



rF   c                 C  sL   |   tjks	J t| \}}t| j t| jj	| j
|t|dS rD   )r'   r   mutablerF   r   r5   r>   r?   r3   r.   r:   rA   rG   rH   r+   r+   r,   mutable_to_out_signature   s   


rg   r)   r   kr   Mtuple[NativeFunction, dict[DispatchKey, dict[OperatorName, BackendMetadata]]]c              	   C  s  ddl m} |tjkr;| j tjksJ | jjddtt	| jj
j
jd| jj
j
j| j tjkd| jj
jd}n7|tjkrn| j tjkrNt| j}n$| j tjkr\t| j}n| j tjkrjt| j}ntdtd	| tjkr~|j
 n|
|}| j r|d
7 }tj|j
t|dtdii}dht| jh d@ B }td&i d|d| jdtj hdddd dd dd dg di dddddd dd dddt!j"d| j#dt d| j$d dd!dd"dd#dd$|d%| j%|fS )'Nr   )cppT)keep_return_namesF)baser<   dunder_methodfunctional_overload)r5   r.   z^We only bother generating out= functions from either inplace or mutable or functional variantszDWe currently only generate either functional or out= NativeFunctions_symint)kernel
structuredcpp_namespace	generated>   pt2_compliant_tagnondeterministic_seeded	view_copyr%   !use_const_ref_for_mutable_tensorsvariantsrq   structured_delegatestructured_inheritsprecomputedautogenufunc_inner_loopmanual_kernel_registrationmanual_cpp_bindingpython_modulecategory_overridedevice_guarddevice_checkloccpp_no_default_argsis_abstract&has_composite_implicit_autograd_kernel4has_composite_implicit_autograd_nested_tensor_kernel&has_composite_explicit_autograd_kernel5has_composite_explicit_autograd_non_functional_kerneltags	namespacer+   )&torchgen.apirj   r   rE   r%   r'   r&   	with_namer   r   r5   rl   rm   rf   r.   r1   r<   rC   rg   rK   AssertionErrorunambiguous_name
has_symintr   CompositeExplicitAutogradr   r   setr   r   rw   r   functionr   NoCheckr   r   r   )r)   rh   rj   r%   kernel_namebackend_metadatar   r+   r+   r,   generate_function  s   



	

		
r   rslist[NativeFunction]indices6dict[DispatchKey, dict[OperatorName, BackendMetadata]]Nonec                 C  sT  t | }| D ]}tj|v }tj|v }tj|v }tj|v }tdd | D }|s3|s3|s3|r'tdd | D }	tdd | D }
tdd | D }|	s\|
s\|r]|s]q|rt	| dkrt
|tj jjtvrtdt
|tj j q|rt
|tj jjtv rq|r|tj n|r|tj n|r|tj n|tj }|j tjkptdd |jjD }td	d |jD }| o|o|}|s|st
|jjtvrt
|jjtvrtd
t
|j d|rt|tj\}}||tj< t|| | | |s'|s|r't|tj\}}||tj< t|| | | qd S )Nc                 s  s    | ]}d |j v V  qdS )coreN)r   )rO   Zvariantr+   r+   r,   rQ     s    z1add_generated_native_functions.<locals>.<genexpr>c                 s      | ]}|j V  qd S r#   )r   rO   r)   r+   r+   r,   rQ     s    c                 s  s(    | ]}|j ot|jjjd kV  qdS )set_N)
is_view_opr0   r%   r5   r   r+   r+   r,   rQ     s    
c                 s  r   r#   )r   r   r+   r+   r,   rQ     s    
r[   zEFound an out= operator that we could not find any other variants of: c                 s  s    | ]}|j  V  qd S r#   rR   rN   r+   r+   r,   rQ     s    

c                 s  s    | ]	}d t |v V  qdS )r1   N)r0   )rO   op_namer+   r+   r,   rQ     s    zBFound an operator that we could not generate an out= variant for: z.
This type of operators don't have tensor-like return, making it difficult to generate a proper out= variant. If
out= variant is not needed, please add the function name into FUNCTIONAL_OPS_THAT_CANNOT_GET_AN_OUT_VARIANT list.)r-   valuesr   rE   r<   rf   r1   r]   ra   r^   r0   r%   r5   &OUT_OPS_THAT_DONT_GET_GROUPED_PROPERLYr   *INPLACE_OPS_THAT_DONT_GET_GROUPED_PROPERLYr'   r;   r|   *MUTABLE_OPS_THAT_CANNOT_GET_AN_OUT_VARIANT-FUNCTIONAL_OPS_THAT_CANNOT_GET_AN_OUT_VARIANTr   r   
grow_indexrd   )r   r   r(   r*   Zhas_functionalZhas_inplaceZhas_mutableZhas_outZis_coreZ
are_manualZhas_view_opsZare_composite_implicitZbase_fnZbase_fn_validZ	needs_outZgets_out_variantfnmetadatar+   r+   r,   add_generated_native_functions  s   









r   retstuple[Return, ...]names	list[str]c                 C  sb   t | t |ks
J t | dkrdS t | dkr d|d  dS dt|   dd| dS )	Nr    r[   zreturn ;(, );)r^   
dispatcherreturns_typecpp_typejoin)r   r   r+   r+   r,   
return_str  s   "r   out_varc                 C  sX   |   }g }t| jdk}t|D ]\}}|d u r)||r&d| d| dn| q|S )Nr[   	std::get<>())aliased_return_namesr^   r;   rb   rd   )r%   r   Zaliased_retsZnon_aliased_namesZis_out_var_a_tuplere   rP   r+   r+   r,   gather_nonaliased_inner_rets  s   r   gr   c                 C  s  d| j jvrd S | jd urd| jjvr| j}n| jd ur&d| jjvr&| j}ntt| j jt| j j}t|j}g }g }g }tt	
| j jt	
|jD ]@\}}|jd ur|jjr|d|j d|j d |t|j dt	j||jdd ||j d qM|t	| qMdd	d
 t|| D }	d}
t|jjdkrd|
 dnd}t|j|
}t| j jj|| }d|}d|j| | jj rdnd d d| d| d|jj  d|	 d| dS )Nrs   zauto z_clone = clone_arg(r   Z_clone)binds)exprr6   r   c                 S     g | ]}|j qS r+   r   rO   er+   r+   r,   rT   ?      z3gen_composite_functional_kernel.<locals>.<listcomp>outputr   z = r   
ro   r5   z {
  
  z
at::_ops::::call();
  
}
)rE   r   r<   rf   r   r0   r%   r   zipr   jit_argumentsr8   rM   rd   r5   r   argument_typerB   r   r   r:   r^   r;   r   r   defnr1   r   r   )r   Ztarget_fsig
target_sigcontextZclone_mutable_inputsZcloned_return_namesZa_currZa_tgtexprsout_nameZmaybe_assignZinner_return_namesZret_strZclone_mutable_inputs_strr+   r+   r,   gen_composite_functional_kernel  sb   


 
"
r   c                 C  s  d| j jvrd S t| j j}t| jj}ddd t| | D }g }d}t| j jjj D ],\}}t	| jjj
dkr@|nd| d| d	}|d
|j d| d|j d| d	 q1g }	t| j j D ]'\}}
|
d urv|	|
 qht	| jjj
dkr|nd| d| d	}|	| qhd|}d|j| j jj | j j rdnd d d| d| jjj  d| d| dt| j jj
|	 dS )Nrs   r   c                 S  r   r+   r   r   r+   r+   r,   rT   b  r   z,gen_composite_out_kernel.<locals>.<listcomp>
tmp_outputr[   r   r   r   z  resize_out_helper(z);
  copy_arg(r   r   ro   r   r   z
 {
  auto z = at::_ops::r   r   r   r   )r1   r   r   r%   rE   r   r   r:   rb   r^   r;   rd   r5   r   r   r   r   r   )r   r   r   r   Z	copy_outsr   re   out_argZfunctional_return_namer   ret_nameZcopy_outs_strr+   r+   r,   gen_composite_out_kernelT  s`   
(r   )r   r    r!   r"   )r.   r/   r!   r0   )r%   r   r!   r   )r%   r   r!   rL   )r)   r   rh   r   r!   ri   )r   r   r   r   r!   r   )r   r   r   r   r!   r0   )r%   r   r   r0   r!   r   )r   r   r!   r/   )8
__future__r   r`   collectionsr   typingr   torchgen.api.dispatcherapir   torchgen.api.translater   torchgen.api.typesr   r   r   torchgen.contextr	   torchgen.modelr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   torchgen.utilsr   collections.abcr   r   r   r   r   r-   r3   rC   rK   rF   rg   r   r   r   r   r   r   r+   r+   r+   r,   <module>   sF    L-


	
!

3
#
n
|
>