o
    hEt                     @  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#_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  sD   t t}| D ]}||j  }|j |vsJ |||j < q|S N)r   dictfunc	signaturekind)rB   pre_grouped_native_functionsfd rN   w/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/torchgen/native_function_generation.pypre_group_native_functionsn   s   rP   overload_name
str | Nonestrc                 C  s   | sdS |  dS )Nout_outrN   )rQ   rN   rN   rO   &get_expected_out_variant_overload_name|   s   rV   rH   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 )NrT   nametypedefault
annotationrX   	argumentsreturns)rJ   r   inplacer]   self_argr   rX   remove_inplacewith_overloadrV   rQ   remove_self_annotationwith_out_argsr   argumentrY   r[   r^   )rH   rN   rN   rO   self_to_out_signature   s"   





rf   c                 C  sL   |   tjks	J t| \}}t| jt| jj| j	
 |t|dS Nr\   )rJ   r   
functionalgenerate_out_args_from_schemar   rX   rb   rV   rQ   r]   rI   rd   tuplerH   new_returnsnew_out_argsrN   rN   rO   functional_to_out_signature   s   

rn   #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 rF   )r[   is_write.0rrN   rN   rO   	<genexpr>   s    
z0generate_out_args_from_schema.<locals>.<genexpr>c                 S  s   g | ]	}|j  r|qS rN   rY   is_tensor_likerq   rN   rN   rO   
<listcomp>   s    z1generate_out_args_from_schema.<locals>.<listcomp>r   c                 S  s   | j d u rg S | j jS rF   )r[   	alias_set)arN   rN   rO   <lambda>   s    z/generate_out_args_from_schema.<locals>.<lambda>c                   s   g | ]}| vr|qS rN   rN   )rr   xused_annotationsrN   rO   rw      s    c                 s  s     | ]}|j ttjkV  qd S rF   )rY   r   r   Tensorrq   rN   rN   rO   rt      s       rT   !rW   )rX   rY   r[   )anyr^   lenr   r]   flat_allstringascii_lowercaseall	enumeraterY   rv   r   r
   parseappendr   r[   )
rH   tensorlike_retsvalid_annotationsall_rets_are_tensorsrm   rl   irs   new_outnew_retrN   r|   rO   ri      s<   



ri   c                 C  sL   |   tjks	J t| \}}t| j t| jj	| j
|t|dS rg   )rJ   r   mutableri   r   rX   ra   rb   rV   rQ   r]   rd   rj   rk   rN   rN   rO   mutable_to_out_signature   s   


r   rL   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)rX   rQ   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	namespacerN   )&torchgen.apir   r   rh   rH   rJ   rI   	with_namer   r   rX   r   r   r   rQ   rT   r_   rf   r   rn   AssertionErrorunambiguous_name
has_symintr   CompositeExplicitAutogradr   r   setr   r   r   r   functionr   NoCheckr   r   r   )rL   r   r   rH   kernel_namebackend_metadatar   rN   rN   rO   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   )rr   variantrN   rN   rO   rt     s    z1add_generated_native_functions.<locals>.<genexpr>c                 s      | ]}|j V  qd S rF   )r   rr   rL   rN   rN   rO   rt     s    c                 s  s(    | ]}|j ot|jjjd kV  qdS )set_N)
is_view_oprS   rH   rX   r   rN   rN   rO   rt     s    
c                 s  r   rF   )r   r   rN   rN   rO   rt     s    
r   zEFound an out= operator that we could not find any other variants of: c                 s  s    | ]}|j  V  qd S rF   ru   rq   rN   rN   rO   rt     s    

c                 s  s    | ]	}d t |v V  qdS )rT   N)rS   )rr   op_namerN   rN   rO   rt     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.)rP   valuesr   rh   r_   r   rT   r   r   r   rS   rH   rX   &OUT_OPS_THAT_DONT_GET_GROUPED_PROPERLYr   *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   rK   rM   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metadatarN   rN   rO   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   rN   rN   rO   
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   rs   rN   rN   rO   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)exprrY   r   c                 S     g | ]}|j qS rN   r   rr   erN   rN   rO   rw   ?      z3gen_composite_functional_kernel.<locals>.<listcomp>outputr   z = r   
r   rX   z {
  
  z
at::_ops::::call();
  
}
)rh   r   r_   r   r   rS   rH   r   zipr   jit_argumentsr[   rp   r   rX   r   argument_typere   r   r   r]   r   r^   r   r   defnrT   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_strrN   rN   rO   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   rN   r   r  rN   rN   rO   rw   b  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
  )rT   r   r   rH   rh   r   r   r]   r   r   r^   r   rX   r   r  r   r   r   )r   r  r  r  	copy_outsr  r   out_argfunctional_return_namer   ret_namecopy_outs_strrN   rN   rO   gen_composite_out_kernelT  s`   
(r$  )rB   rC   rD   rE   )rQ   rR   rD   rS   )rH   r   rD   r   )rH   r   rD   ro   )rL   r   r   r   rD   r   )r   r   r   r   rD   r   )r   r   r   r   rD   rS   )rH   r   r   rS   rD   r   )r   r   rD   rR   )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   rP   rV   rf   rn   ri   r   r   r   r   r   r  r$  rN   rN   rN   rO   <module>   sF    L-


	
!

3
#
n
|
>