o
    kihw                     @  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_input_cummax_helper_cummin_helper)&_assert_asyncz_assert_async.msg_assert_tensor_metadata_cslt_sparse_mm_search_assert_scalar_dimI_dimV_has_same_storage_numel_linalg_check_errors_local_scalar_dense%_nested_tensor_from_mask_left_aligned_nnz_use_cudnn_ctc_lossz_use_cudnn_ctc_loss.Tensor_use_miopen_ctc_lossz_use_miopen_ctc_loss.Tensor#_validate_compressed_sparse_indicesallclose	dense_dimequalis_coalesced	is_pinnedis_same_size	is_set_toq_per_channel_axisq_scaleq_zero_pointqschemerecord_stream
sparse_dimsym_constrain_rangesym_constrain_range_for_size_nested_tensor_storage_offsets'_chunk_grad_outputs_efficient_attention_fused_sdp_choice_print_sink_tokens_nested_get_ragged_idx
polygamma_native_functionsSequence[NativeFunction]return6dict[FunctionSchema, dict[SchemaKind, NativeFunction]]c                 C  s\   t t}| D ]%}||j  }|j |v r$td|j  d|j |||j < q|S )NzDuplicate schema kind z for )r   dictfunc	signaturekindAssertionError)rC   pre_grouped_native_functionsfd rO   m/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torchgen/native_function_generation.pypre_group_native_functionsp   s   rQ   overload_name
str | Nonestrc                 C  s   | sdS |  dS )Nout_outrO   )rR   rO   rO   rP   &get_expected_out_variant_overload_name   s   rW   rH   r   c              
   C  s   |   tjkrtd|    | jjd u rtdt| j 	t
| jj| j td| jjjjd | jjjjdg| jdS )NzExpected inplace schema, got z Expected self_arg to be non-NonerU   nametypedefault
annotationrY   	argumentsreturns)rJ   r   inplacerK   r^   self_argr   rY   remove_inplacewith_overloadrW   rR   remove_self_annotationwith_out_argsr   argumentrZ   r\   r_   )rH   rO   rO   rP   self_to_out_signature   s&   





rg   c                 C  sZ   |   tjkrtd|    t| \}}t| jt| jj	| j
 |t|dS )Nz Expected functional schema, got r]   )rJ   r   
functionalrK   generate_out_args_from_schemar   rY   rc   rW   rR   r^   rI   re   tuplerH   new_returnsnew_out_argsrO   rO   rP   functional_to_out_signature   s   

rn   #tuple[list[Return], list[Argument]]c           
   	     s  t dd | jD rtddd | jD }t|dkr tdtdd	 | jj  fd
dtjD }t	dd | jD }g }g }t
| jD ]A\}}|j rtt| jdkrYdnd| |jd t||  dd}|| |rtd |j|jd}	||	 qF|| qF||fS )Nc                 s  s"    | ]}|j d uo|j jV  qd S N)r\   is_write.0rrO   rO   rP   	<genexpr>   s     z0generate_out_args_from_schema.<locals>.<genexpr>z8Mutable schema kinds should not return mutable argumentsc                 S  s   g | ]	}|j  r|qS rO   rZ   is_tensor_likerr   rO   rO   rP   
<listcomp>   s    z1generate_out_args_from_schema.<locals>.<listcomp>r   z(Expected at least one tensor-like returnc                 S  s   | j d u rg S | j jS rp   )r\   	alias_set)arO   rO   rP   <lambda>   s    z/generate_out_args_from_schema.<locals>.<lambda>c                   s   g | ]}| vr|qS rO   rO   )rs   xused_annotationsrO   rP   rx      s    c                 s  s     | ]}|j ttjkV  qd S rp   )rZ   r   r   Tensorrr   rO   rO   rP   ru      s       rU   !rX   )rY   rZ   r\   )anyr_   rK   lenr   r^   flat_allstringascii_lowercaseall	enumeraterZ   rw   r   r
   parseappendr   r\   )
rH   tensorlike_retsvalid_annotationsall_rets_are_tensorsrm   rl   irt   new_outnew_retrO   r}   rP   ri      s<   



ri   c                 C  sZ   |   tjkrtd|    t| \}}t| j t	| jj
| j|t|dS )NzExpected mutable schema, got r]   )rJ   r   mutablerK   ri   r   rY   rb   rc   rW   rR   r^   re   rj   rk   rO   rO   rP   mutable_to_out_signature   s   


r   rM   r   kr   Mtuple[NativeFunction, dict[DispatchKey, dict[OperatorName, BackendMetadata]]]c              	   C  s  ddl m} |tjkr=| j tjkrtd| 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rp| j tjkrPt| j}n$| j tjkr^t| j}n| j tjkrlt| 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   )cppz1Cannot generate functional from functional schemaT)keep_return_namesF)baser`   dunder_methodfunctional_overload)rY   rR   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>   	view_copypt2_compliant_tagnondeterministic_seededrH   !use_const_ref_for_mutable_tensorsvariantsr   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	namespacerO   )&torchgen.apir   r   rh   rH   rJ   rK   rI   	with_namer   r   rY   r   r   r   rR   rU   r`   rg   r   rn   unambiguous_name
has_symintr   CompositeExplicitAutogradr   r   setr   r   r   r   functionr   NoCheckr   r   r   )rM   r   r   rH   kernel_namebackend_metadatar   rO   rO   rP   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   )rs   variantrO   rO   rP   ru     s    z1add_generated_native_functions.<locals>.<genexpr>c                 s      | ]}|j V  qd S rp   )r   rs   rM   rO   rO   rP   ru     s    c                 s  s(    | ]}|j ot|jjjd kV  qdS )set_N)
is_view_oprT   rH   rY   r   rO   rO   rP   ru     s    
c                 s  r   rp   )r   r   rO   rO   rP   ru     s    
r   zEFound an out= operator that we could not find any other variants of: c                 s  s    | ]}|j  V  qd S rp   rv   rr   rO   rO   rP   ru     s    

c                 s  s    | ]	}d t |v V  qdS )rU   N)rT   )rs   op_namerO   rO   rP   ru     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.)rQ   valuesr   rh   r`   r   rU   r   r   r   rT   rH   rY   &OUT_OPS_THAT_DONT_GET_GROUPED_PROPERLYrK   *INPLACE_OPS_THAT_DONT_GET_GROUPED_PROPERLYrJ   r_   r   *MUTABLE_OPS_THAT_CANNOT_GET_AN_OUT_VARIANT-FUNCTIONAL_OPS_THAT_CANNOT_GET_AN_OUT_VARIANTr   r   
grow_indexr   )r   r   rL   rN   has_functionalhas_inplacehas_mutablehas_outis_core
are_manualhas_view_opsare_composite_implicitbase_fnbase_fn_valid	needs_outgets_out_variantfnmetadatarO   rO   rP   add_generated_native_functions  s   









r   retstuple[Return, ...]names	list[str]c                 C  sz   t | t |krtdt |  dt | t | dkrdS t | dkr,d|d  dS dt|   dd	| d
S )Nz#Returns and names length mismatch: z vs r    r   zreturn ;(, );)r   rK   
dispatcherreturns_typecpp_typejoin)r   r   rO   rO   rP   
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_   r   r   )rH   r   aliased_retsnon_aliased_namesis_out_var_a_tupler   rt   rO   rO   rP   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 )Nr   zauto z_clone = clone_arg(r   _clone)binds)exprrZ   r   c                 S     g | ]}|j qS rO   r   rs   erO   rO   rP   rx   J      z3gen_composite_functional_kernel.<locals>.<listcomp>outputr   z = r   
r   rY   z {
  
  z
at::_ops::::call();
  
}
)rh   r   r`   r   rK   rT   rH   r   zipr   jit_argumentsr\   rq   r   rY   r   argument_typerf   r   r   r^   r   r_   r   r   defnrU   r   r   )r   target_fsig
target_sigcontextclone_mutable_inputscloned_return_namesa_curra_tgtexprsout_namemaybe_assigninner_return_namesret_strclone_mutable_inputs_strrO   rO   rP   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 )Nr   r   c                 S  r   rO   r   r  rO   rO   rP   rx   m  r  z,gen_composite_out_kernel.<locals>.<listcomp>
tmp_outputr   r   r   r   z  resize_out_helper(z);
  copy_arg(r   r  r   r   r  z
 {
  auto z = at::_ops::r  r	  r  r
  )rU   r   r   rH   rh   r   r   r^   r   r   r_   r   rY   r   r  r   r   r   )r   r  r  r  	copy_outsr  r   out_argfunctional_return_namer   ret_namecopy_outs_strrO   rO   rP   gen_composite_out_kernel_  s`   
(r$  )rC   rD   rE   rF   )rR   rS   rE   rT   )rH   r   rE   r   )rH   r   rE   ro   )rM   r   r   r   rE   r   )r   r   r   r   rE   r   )r   r   r   r   rE   rT   )rH   r   r   rT   rE   r   )r   r   rE   rS   )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   rQ   rW   rg   rn   ri   r   r   r   r   r   r  r$  rO   rO   rO   rP   <module>   sF    L/


	
#

3
$
o
|
>