o
    ,is                     @   s<  d dl mZ d dlmZmZmZmZmZ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' d	d
gZ(ddgZ)g dZ*dgZ+dee  deeee$e f f fddZ,dee- de-fddZ.dedefddZ/dedefddZ0dedeee# ee f fddZ1dedefddZ2de d e$dee eeed! f f fd"d#Z3d$ee  d%eeee"ef f ddfd&d'Z4d(ee#d)f d*ee- de-fd+d,Z5ded-e-dee- fd.d/Z6ed0e!dee- fd1d2Z7ed0e!dee- fd3d4Z8dS )5    )defaultdict)DictListOptionalSequenceTupleUnionN)	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)	concatMapz'adaptive_avg_pool3d_backward.grad_inputz _slow_conv2d_backward.grad_input_cummax_helper_cummin_helper)#_assert_asyncz_assert_async.msg_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returnc                 C   sD   t t}| D ]}||j  }|j |vsJ |||j < q|S N)r   dictfunc	signaturekind)rD   pre_grouped_native_functionsfd rN   a/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torchgen/native_function_generation.pypre_group_native_functionsf   s   rP   overload_namec                 C   s   | sdS |  dS )Nout_outrN   )rQ   rN   rN   rO   &get_expected_out_variant_overload_namet   s   rT   rH   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 )NrR   nametypedefault
annotationrV   	argumentsreturns)rJ   r   inplacer[   self_argr   rV   remove_inplacewith_overloadrT   rQ   remove_self_annotationwith_out_argsr   argumentrW   rY   r\   )rH   rN   rN   rO   self_to_out_signature}   s"   





rd   c                 C   sL   |   tjks	J t| \}}t| jt| jj| j	
 |t|dS NrZ   )rJ   r   
functionalgenerate_out_args_from_schemar   rV   r`   rT   rQ   r[   rI   rb   tuplerH   new_returnsnew_out_argsrN   rN   rO   functional_to_out_signature   s   

rl   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d	D }td
d | jD }g }g }t| jD ]A\}}|j	 r}t
t| jdkrTdnd| |jd t||  dd}|| |r|td |j|jd}	||	 qA|| qA||fS )Nc                 s   s"    | ]}|j d uo|j jV  qd S rF   )rY   is_write.0rrN   rN   rO   	<genexpr>   s    
z0generate_out_args_from_schema.<locals>.<genexpr>c                 S   s   g | ]	}|j  r|qS rN   rW   is_tensor_likern   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   )rY   	alias_set)arN   rN   rO   <lambda>   s    z/generate_out_args_from_schema.<locals>.<lambda>c                    s   g | ]}| vr|qS rN   rN   )ro   xused_annotationsrN   rO   rt      s    abcdefghijklmnopqrstuvwxyzc                 s   s     | ]}|j ttjkV  qd S rF   )rW   r   r   Tensorrn   rN   rN   rO   rq      s       rR   !rU   )rV   rW   rY   )anyr\   lenr   r[   flat_allall	enumeraterW   rs   r   r   parseappendr   rY   )
rH   tensorlike_retsvalid_annotationsall_rets_are_tensorsrk   rj   irp   new_outnew_retrN   ry   rO   rg      s@   




rg   c                 C   sL   |   tjks	J t| \}}t| j t| jj	| j
|t|dS re   )rJ   r   mutablerg   r   rV   r_   r`   rT   rQ   r[   rb   rh   ri   rN   rN   rO   mutable_to_out_signature   s   


r   rL   k)r   r   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)rV   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   rf   rH   rJ   rI   	with_namer   r   rV   r   r   r   rQ   rR   r]   rd   r   rl   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indicesc                 C   s8  t | }| D ]}tj|v }tj|v }tj|v }tj|v }|s(|s(|s(|rtdd | D }tdd | D }	tdd | D }
|sO|	sO|
rPq|rst	| dkrst
|tj jjtvrrt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
|rt|tj\}}||tj< t|| | | |s|s|rt|tj\}}||tj< t|| | | qd S )Nc                 s       | ]}|j V  qd S rF   )r   ro   rL   rN   rN   rO   rq     s    z1add_generated_native_functions.<locals>.<genexpr>c                 s   s(    | ]}|j ot|jjjd kV  qdS )set_N)
is_view_opstrrH   rV   r   rN   rN   rO   rq     s    
c                 s   r   rF   )r   r   rN   rN   rO   rq     s    
r}   zEFound an out= operator that we could not find any other variants of: c                 s   s    | ]}|j  V  qd S rF   rr   rn   rN   rN   rO   rq     s    

c                 s   s    | ]	}d t |v V  qdS )rR   N)r   )ro   op_namerN   rN   rO   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.)rP   valuesr   rf   r]   r   rR   r   r   r   r   rH   rV   &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
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_functionsy  s   









r   rets.namesc                 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   rp   rN   rN   rO   gather_nonaliased_inner_rets   s   r   gc                 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)exprrW   r   c                 S      g | ]}|j qS rN   r   ro   erN   rN   rO   rt   8      z3gen_composite_functional_kernel.<locals>.<listcomp>outputr   z = r   
r   rV   z {
  
  z
at::_ops::::call();
  
}
)rf   r   r]   r   r   r   rH   r   zipr   jit_argumentsrY   rm   r   rV   r   argument_typerc   r   r	   r[   r   r\   r   r   defnrR   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   rt   [  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   )rR   r   r   rH   rf   r   r	   r[   r   r   r\   r   rV   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_kernelM  s`   
(r  )9collectionsr   typingr   r   r   r   r   r   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   r   r   r   r   rP   r   rT   rd   rl   rg   r   r   r   r   r   r  r  rN   rN   rN   rO   <module>   sf     L,
	!
5#
n
"{>