
    4g0jhw                    v   d dl mZ d dlZd dlmZ d dlmZ d dlmc 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rd d
l&m'Z' ddgZ(ddgZ)g dZ*dgZ+d8dZ,d9dZ-d:dZ.d:dZ/d;dZ0d:d Z1d<d&Z2d=d,Z3d>d1Z4d?d3Z5ed@d6            Z6ed@d7            Z7dS )A    )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                F   t          t                    }| D ]}||j                                                 }|j                                        |v r1t          d|j                                         d|j                   |||j                                        <   |S )NzDuplicate schema kind z for )r   dictfunc	signaturekindAssertionError)rD   pre_grouped_native_functionsfds       f/home/wildlama/miniconda3/envs/lam/lib/python3.11/site-packages/torchgen/native_function_generation.pypre_group_native_functionsrR   p   s    
 	D !   ()9)9););<6;;==A !V!&++--!V!Vaf!V!VWWW!&++--''    overload_name
str | Nonestrc                    | sdn|  dS )Nout_out )rT   s    rQ   &get_expected_out_variant_overload_namer[      s    %A55m+A+A+AArS   rJ   r   c                <   |                                  t          j        k    r$t          d|                                             | j        j        t          d          t          | j                                        	                    t          | j        j                            | j                                                            t          d| j        j        j        j        d | j        j        j        j                  g          | j                  S )NzExpected inplace schema, got z Expected self_arg to be non-NonerX   nametypedefault
annotationr^   	argumentsreturns)rL   r   inplacerM   rc   self_argr   r^   remove_inplacewith_overloadr[   rT   remove_self_annotationwith_out_argsr   argumentr_   ra   rd   )rJ   s    rQ   self_to_out_signaturerl      s    yy{{j(((JTYY[[JJKKK~&?@@@
 Y%%''552493JKK
 
 .7799GG09> #~6?J	  	
 	
    rS   c                   |                                  t          j        k    r$t          d|                                             t	          |           \  }}t          | j                            t          | j        j	                            | j
                                                            |          t          |                    S )Nz Expected functional schema, got rb   )rL   r   
functionalrM   generate_out_args_from_schemar   r^   rh   r[   rT   rc   rK   rj   tuplerJ   new_returnsnew_out_argss      rQ   functional_to_out_signaturert      s    yy{{j+++M		MMNNN =d C CK
 Y$$2493JKK
 
 .**,,::
 
 k""   rS   #tuple[list[Return], list[Argument]]c           
     8  
 t          d | j        D                       rt          d          d | j        D             }t          |          dk    rt          d          t	          d | j        j                  

fdt          j        D             }t          d | j        D                       }g }g }t          | j                  D ]\  }}|j                                        rt          t          | j                  d	k    rd
nd
| |j        d t          j        ||          d                    }|                    |           |r1t#          d |j        |j                  }	|                    |	           |                    |           ||fS )Nc              3  @   K   | ]}|j         d uo|j         j        V  d S N)ra   is_write.0rs     rQ   	<genexpr>z0generate_out_args_from_schema.<locals>.<genexpr>   s3      
T
T!1<t#=(=
T
T
T
T
T
TrS   z8Mutable schema kinds should not return mutable argumentsc                D    g | ]}|j                                         |S rZ   r_   is_tensor_likerz   s     rQ   
<listcomp>z1generate_out_args_from_schema.<locals>.<listcomp>   s+    JJJQ!&2G2G2I2IJqJJJrS   r   z(Expected at least one tensor-like returnc                ,    | j         g n| j         j        S rx   )ra   	alias_set)as    rQ   <lambda>z/generate_out_args_from_schema.<locals>.<lambda>   s    ,""!,2H rS   c                    g | ]}|v|	S rZ   rZ   )r{   xused_annotationss     rQ   r   z1generate_out_args_from_schema.<locals>.<listcomp>   s$    XXXqaGW>W>W>W>W>WrS   c              3  Z   K   | ]&}|j         t          t          j                  k    V  'd S rx   )r_   r   r   Tensorrz   s     rQ   r}   z0generate_out_args_from_schema.<locals>.<genexpr>   s3      WWQqv&-)@)@@WWWWWWrS      rX   !r]   )r^   r_   ra   )anyrd   rM   lenr   rc   flat_allstringascii_lowercaseall	enumerater_   r   r   r   parseappendr   ra   )rJ   tensorlike_retsvalid_annotationsall_rets_are_tensorsrs   rr   ir|   new_outnew_retr   s             @rQ   ro   ro      s   
 
T
Tt|
T
T
TTT YWXXXJJ$,JJJO
?q  GHHH HH  YXXXF$:XXXWW$,WWWWW#%L !#K$,'' " "16  "" 	"!$,//144UU)))V%+/@/C,F,F,FGG	  G (((# , !GLW=O   ""7+++q!!!!$$rS   c                   |                                  t          j        k    r$t          d|                                             t	          |           \  }}t          | j                                                            t          | j        j
                            | j                            |          t          |                    S )NzExpected mutable schema, got rb   )rL   r   mutablerM   ro   r   r^   rg   rh   r[   rT   rc   rj   rp   rq   s      rQ   mutable_to_out_signaturer      s    yy{{j(((JTYY[[JJKKK !>d C CKY%%''552493JKK
 
 ...|<<k""   rS   rO   r   kr   Mtuple[NativeFunction, dict[DispatchKey, dict[OperatorName, BackendMetadata]]]c                0   ddl m} |t          j        k    r| j                                        t          j        k    rt          d          | j                            d                              t          t          | j        j        j        j        d| j        j        j        j        | j                                        t          j        k              | j        j        j                            }n|t          j        k    r| j                                        t          j        k    rt%          | j                  }n| j                                        t          j        k    rt'          | j                  }nZ| j                                        t          j        k    rt)          | j                  }nt          d	          t          d
          |                                t          j        k    r|j                                        n|                    |          }| j                                        r|dz  }t.          j        |j        t3          |dt4                    ii}dht7          | j        h dz            z  }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tB          j"        d| j#        dt7                      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)basere   dunder_methodfunctional_overload)r^   rT   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_seededrJ   !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	namespacerZ   )&torchgen.apir   r   rn   rJ   rL   rM   rK   	with_namer   r   r^   r   r   r   rT   rX   re   rl   r   rt   unambiguous_name
has_symintr   CompositeExplicitAutogradr   r   setr   r   r   r   functionr   NoCheckr   r   r   )rO   r   r   rJ   kernel_namebackend_metadatar   s          rQ   generate_functionr     s    !     J!!!6;;==J111 !TUUU v$77AA%).!"#&+"2"@()9K(K    fk7	 	 	
 
 
jn		 6;;==J...(00DDV[[]]j000+AF33DDV[[]]j333.qv66DD p   R
 
 	
 99;;*.(( 		""$$$XXd^^ 
 	v !y -I" 6  0
 =3	NNNN  D
 	 	
 	
 	
	
./.Q.Q	
 &''		

 u	
 !%	
 !%	
 	
 B	
  R	
 (-u	
  %u	
 $	
 #d	
 	
  )00!	
" #	
$ !$%	
& '	
( 495)	
* BG+	
, 484-	
. CH%/	
4 5	
6 kk7	
: 	= rS   rslist[NativeFunction]indices6dict[DispatchKey, dict[OperatorName, BackendMetadata]]Nonec                x   t          |           }|                                D ]}t          j        |v }t          j        |v }t          j        |v }t          j        |v }t          d |                                D                       }|s|s|s|r%t          d |                                D                       }	t          d |                                D                       }
t          d |                                D                       }|	s|
s|r|s|rt          |                                          dk    rft          |t          j                 j        j                  t          vr4t          dt          |t          j                 j                             |r2t          |t          j                 j        j                  t          v r|r|t          j                 n9|r|t          j                 n%|r|t          j                 n|t          j                 }|j                                        t          j        k    p"t          d |j        j        D                       }t          d |j        D                       }| o|o|}|sg|set          |j        j                  t&          vrEt          |j        j                  t(          vr%t          d	t          |j                   d
          |rVt+          |t          j                  \  }}||t          j        <   t-          j        ||           |                     |           |sZ|s|rVt+          |t          j                  \  }}||t          j        <   t-          j        ||           |                     |           d S )Nc              3  (   K   | ]}d |j         v V  dS )coreN)r   )r{   variants     rQ   r}   z1add_generated_native_functions.<locals>.<genexpr>  s)      GGf,GGGGGGrS   c              3  $   K   | ]}|j         V  d S rx   )r   r{   rO   s     rQ   r}   z1add_generated_native_functions.<locals>.<genexpr>  s%      FFaQ1FFFFFFrS   c              3  h   K   | ]-}|j         o!t          |j        j        j                  d k    V  .dS )set_N)
is_view_oprV   rJ   r^   r   s     rQ   r}   z1add_generated_native_functions.<locals>.<genexpr>  sN        EF@QV[%5!6!6&!@     rS   c              3  $   K   | ]}|j         V  d S rx   )r   r   s     rQ   r}   z1add_generated_native_functions.<locals>.<genexpr>  s6       ) )=>8) ) ) ) ) )rS   r   zEFound an out= operator that we could not find any other variants of: c              3  H   K   | ]}|j                                         V  d S rx   r   rz   s     rQ   r}   z1add_generated_native_functions.<locals>.<genexpr>  sI       M M,-%%''M M M M M MrS   c              3  8   K   | ]}d t          |          v V  dS )rX   N)rV   )r{   op_names     rQ   r}   z1add_generated_native_functions.<locals>.<genexpr>  s-      QQgES\\1QQQQQQrS   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.)rR   valuesr   rn   re   r   rX   r   r   r   rV   rJ   r^   &OUT_OPS_THAT_DONT_GET_GROUPED_PROPERLYrM   *INPLACE_OPS_THAT_DONT_GET_GROUPED_PROPERLYrL   rd   r   *MUTABLE_OPS_THAT_CANNOT_GET_AN_OUT_VARIANT-FUNCTIONAL_OPS_THAT_CANNOT_GET_AN_OUT_VARIANTr   r   
grow_indexr   )r   r   rN   rP   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metadatas                     rQ   add_generated_native_functionsr     s0    $>b#A#A )0022 q q#.!3 (A- (A-.A%GGAHHJJGGGGG  d	+ d	 d	N d	FF188::FFFFFJ   JK((**    L &) ) )BC((**) ) ) & &"  \ -C G  3qxxzz??a// *.).344AB B )}`cdefpftdudz`{`{}}   
 *,-2788=> >  .*$%% .Qz)** .Qz~&&z,- " $L--//:3EE  M M181EM M M J JM QQQQQQQI#*{J}J = )**EF FGL-..HI I )u_bcjco_p_p u u u     0*.IIH$&*.!':::		"
 " w 2B 0*:OPPH+-*'(':::		"cq qrS   retstuple[Return, ...]names	list[str]c                   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          j        |                                            dd	                    |           d
S )Nz#Returns and names length mismatch: z vs r    r   zreturn ;(, );)r   rM   
dispatcherreturns_typecpp_typejoin)r   r   s     rQ   
return_strr    s    
4yyCJJM#d))MMUMM
 
 	
 4yyA~~r	Ta$q$$$$X066??AAXXDIIeDTDTXXXXrS   out_varc                    |                                  }g }t          | j                  dk    }t          |          D ]'\  }}| |                    |r	d| d| dn|           (|S )Nr   	std::get<>())aliased_return_namesr   rd   r   r   )rJ   r  aliased_retsnon_aliased_namesis_out_var_a_tupler   r|   s          rQ   gather_nonaliased_inner_retsr    s    ,,..LT\**Q.,''  19$$/AN+A++++++w   rS   gr   c                   d| j         j        vrd S | j        d| j        j        vr| j        }nC| j        d| j        j        vr| j        }n&t	          t          | j         j                            t          | j         j                  }t          |j                  }g }g }g }t          t          j
        | j         j                  t          j
        |j                            D ]\  }}|j        |j        j        r|                    d|j         d|j         d           |                    t          |j         dt          j        ||j                                       |                    |j         d           |                    t          j        |                     d                    d	 t'          ||                                          D                       }	d
}
t+          |j        j                  dk    rd|
 dnd}t/          |j        |
          }t1          | j         j        j        ||z             }d                    |          }d|                    |                                | j        j                                        rdndz              d| d| d|j        j                                         d|	 d| dS )Nr   zauto z_clone = clone_arg(r   _clone)binds)exprr_   r   c                    g | ]	}|j         
S rZ   r  r{   es     rQ   r   z3gen_composite_functional_kernel.<locals>.<listcomp>J  s    RRR!qvRRRrS   outputr   z = r   
r   r^   z {
  
  z
at::_ops::::call();
  
}
)rn   r   re   r   rM   rV   rJ   r   zipr  jit_argumentsra   ry   r   r^   r	   argument_typerk   r  r   rc   r   rd   r  r  defnrX   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_strs                  rQ   gen_composite_functional_kernelr2     s     !,+++tyAIN!B!B9	
	;ain#D#D9 S!233444
al/
0
0C$X]33J$&G  !233 //  8 8 'E,<,E' ''GGGGGG   NN"K///#1&LLL      &&&+'='='=>>>>NN:.v667777IIRRy*:N:N:P:P'Q'QRRRSSEH,/0E,F,F,J,J(8((((PRL5hmXNN	!#58K#K G  $yy)=>>sxxzz!%**?*?*A*AIYYrJKK     $=->>@@  JO  	   rS   c                   d| j         j        vrd S t          | j         j                  }t          | j        j                  }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	           _g }	t          | j         j                                                  D ]_\  }}
|
|	                    |
           t          | j        j        j
                  dk    r|nd| d| d}|	                    |           `d                    |          }d|                    | j         j        j                                        | j         j                                        rdndz              d| d| j        j        j                                         d| d| dt#          | j         j        j
        |	           dS )Nr   r   c                    g | ]	}|j         
S rZ   r  r  s     rQ   r   z,gen_composite_out_kernel.<locals>.<listcomp>m  s    LLLALLLrS   
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  )rX   r   r   rJ   rn   r  r   rc   r   r   rd   r   r^   r  r#  r   r   r  )r  r%  r&  r,  	copy_outsr-  r   out_argfunctional_return_namer   ret_namecopy_outs_strs               rQ   gen_composite_out_kernelr;  _  s    !%*$$t aej
)
)C$Q\%677JIILL3==??J4H4H4J4JKKLLL E IH
 4 899 

 


7 1<$,--22 H-Q--(--- 	
 	9\9 9%;9 9L9 929 9 9	
 	
 	
 	
 D !!@!@!B!BCC 	0 	08KK!!!! q|(011Q66 111h111 #
 KK.////IIi((Mquz//11!%*BWBWBYBY5aYY_abcc   |05FFHH QV    aej $''	   rS   )rD   rE   rF   rG   )rT   rU   rF   rV   )rJ   r   rF   r   )rJ   r   rF   ru   )rO   r   r   r   rF   r   )r   r   r   r   rF   r   )r   r   r   r   rF   rV   )rJ   r   r  rV   rF   r   )r  r   rF   rU   )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   rR   r[   rl   rt   ro   r   r   r   r  r  r2  r;  rZ   rS   rQ   <module>rG     s   " " " " " "  # # # # # #             , , , , , , , , , , , , , , , A A A A A A A A A A 1 1 1 1 1 1                                     & % $ $ $ $ $  )(((((( . '* & 	. *'1 '1 '1 -^ . *( ( ( (B B B B   F   ,+% +% +% +%f   Hd d d d^y y y yx
Y 
Y 
Y 
Y	 	 	 	 9 9 9 9| 6 6 6 6 6 6rS   