o
    vZhEt                     @  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_coalesced	is_pinnedZis_same_sizeZ	is_set_toZq_per_channel_axisZq_scaleZq_zero_pointZqschemeZ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+   R/var/www/auris/lib/python3.10/site-packages/torchgen/native_function_generation.pypre_group_native_functionsn   s   r-   overload_name
str | Nonestrc                 C  s   | sdS |  dS )NoutZ_outr+   )r.   r+   r+   r,   &get_expected_out_variant_overload_name|   s   r2   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r4   	argumentsreturns)r'   r   inplacer9   Zself_argr   r4   remove_inplacewith_overloadr2   r.   Zremove_self_annotationwith_out_argsr   argumentr5   r7   r:   )r%   r+   r+   r,   self_to_out_signature   s"   





r@   c                 C  sL   |   tjks	J t| \}}t| jt| jj| j	
 |t|dS Nr8   )r'   r   
functionalgenerate_out_args_from_schemar   r4   r=   r2   r.   r9   r&   r>   tupler%   new_returnsnew_out_argsr+   r+   r,   functional_to_out_signature   s   

rH   #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#   )r7   is_write.0rr+   r+   r,   	<genexpr>   s    
z0generate_out_args_from_schema.<locals>.<genexpr>c                 S  s   g | ]	}|j  r|qS r+   r5   is_tensor_likerK   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#   )r7   Z	alias_set)ar+   r+   r,   <lambda>   s    z/generate_out_args_from_schema.<locals>.<lambda>c                   s   g | ]}| vr|qS r+   r+   )rL   xZused_annotationsr+   r,   rQ      s    c                 s  s     | ]}|j ttjkV  qd S r#   )r5   r   r   ZTensorrK   r+   r+   r,   rN      s       r1   !r3   )r4   r5   r7   )anyr:   lenr   r9   Zflat_allstringascii_lowercaseall	enumerater5   rP   r   r
   parseappendr   r7   )
r%   Ztensorlike_retsZvalid_annotationsZall_rets_are_tensorsrG   rF   irM   Znew_outZnew_retr+   rU   r,   rC      s<   



rC   c                 C  sL   |   tjks	J t| \}}t| j t| jj	| j
|t|dS rA   )r'   r   mutablerC   r   r4   r<   r=   r2   r.   r9   r>   rD   rE   r+   r+   r,   mutable_to_out_signature   s   


rb   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)Zkeep_return_namesF)baser;   dunder_methodZfunctional_overload)r4   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)Zkernel
structuredZcpp_namespace	generated>   Znondeterministic_seededZpt2_compliant_tagZ	view_copyr%   !use_const_ref_for_mutable_tensorsvariantsri   Zstructured_delegateZstructured_inheritsZprecomputedautogenZufunc_inner_loopZmanual_kernel_registrationmanual_cpp_bindingZpython_moduleZcategory_overrideZdevice_guardZdevice_checklocZcpp_no_default_argsis_abstract&has_composite_implicit_autograd_kernelZ4has_composite_implicit_autograd_nested_tensor_kernelZ&has_composite_explicit_autograd_kernelZ5has_composite_explicit_autograd_non_functional_kerneltags	namespacer+   )&Ztorchgen.apire   r   rB   r%   r'   r&   	with_namer   r   r4   rf   rg   ra   r.   r1   r;   r@   rb   rH   AssertionErrorunambiguous_name
has_symintr   ZCompositeExplicitAutogradr   r   setrr   r   rk   r   functionr   ZNoCheckro   rp   rs   )r)   rc   re   r%   Zkernel_nameZbackend_metadatarr   r+   r+   r,   generate_function  s   



	

		
rz   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)rr   )rL   variantr+   r+   r,   rN     s    z1add_generated_native_functions.<locals>.<genexpr>c                 s      | ]}|j V  qd S r#   )rn   rL   r)   r+   r+   r,   rN     s    c                 s  s(    | ]}|j ot|jjjd kV  qdS )set_N)Z
is_view_opr0   r%   r4   r   r+   r+   r,   rN     s    
c                 s  r   r#   )rq   r   r+   r+   r,   rN     s    
rV   zEFound an out= operator that we could not find any other variants of: c                 s  s    | ]}|j  V  qd S r#   rO   rK   r+   r+   r,   rN     s    

c                 s  s    | ]	}d t |v V  qdS )r1   N)r0   )rL   Zop_namer+   r+   r,   rN     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   rB   r;   ra   r1   rX   r\   rY   r0   r%   r4   &OUT_OPS_THAT_DONT_GET_GROUPED_PROPERLYru   *INPLACE_OPS_THAT_DONT_GET_GROUPED_PROPERLYr'   r:   rm   *MUTABLE_OPS_THAT_CANNOT_GET_AN_OUT_VARIANT-FUNCTIONAL_OPS_THAT_CANNOT_GET_AN_OUT_VARIANTrz   r   Z
grow_indexr_   )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    rV   zreturn ;(, );)rY   
dispatcherZreturns_typeZ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 )NrV   	std::get<>())aliased_return_namesrY   r:   r]   r_   )r%   r   Zaliased_retsZnon_aliased_namesZis_out_var_a_tupler`   rM   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 )Nrj   zauto z_clone = clone_arg(r   Z_clone)Zbinds)exprr5   r   c                 S     g | ]}|j qS r+   r   rL   er+   r+   r,   rQ   ?      z3gen_composite_functional_kernel.<locals>.<listcomp>outputr   z = r   
rh   r4   z {
  
  z
at::_ops::::call();
  
}
)rB   rr   r;   ra   ru   r0   r%   r   zipr   Zjit_argumentsr7   rJ   r_   r4   r   Zargument_typer?   r   r   r9   rY   r:   r   r   defnr1   rw   rv   )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 )Nrj   r   c                 S  r   r+   r   r   r+   r+   r,   rQ   b  r   z,gen_composite_out_kernel.<locals>.<listcomp>Z
tmp_outputrV   r   r   r   z  resize_out_helper(z);
  copy_arg(r   r   rh   r   r   z
 {
  auto z = at::_ops::r   r   r   r   )r1   rr   r   r%   rB   r   r   r9   r]   rY   r:   r_   r4   r   r   rv   rw   r   )r   r   r   r   Z	copy_outsr   r`   Zout_argZfunctional_return_namer   Z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!   rI   )r)   r   rc   r   r!   rd   )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   rZ   collectionsr   typingr   Ztorchgen.api.dispatcherapir   Ztorchgen.api.translater   Ztorchgen.api.typesr   r   r   Ztorchgen.contextr	   Ztorchgen.modelr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ztorchgen.utilsr   collections.abcr   r   r   r   r   r-   r2   r@   rH   rC   rb   rz   r   r   r   r   r   r+   r+   r+   r,   <module>   sF    L-


	
!

3
#
n
|
>