
    9jhw                       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+	 	 	 	 ddZ,ddZ-ddZ.ddZ/	 	 	 	 d dZ0ddZ1	 	 	 	 	 	 d!dZ2	 	 	 	 	 	 d"dZ3d#dZ4d$dZ5ed%d       Z6ed%d       Z7y)&    )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_c                D   t        t              }| D ]  }||j                  j                            }|j                  j	                         |v r3t        d|j                  j	                          d|j                         |||j                  j	                         <    |S )NzDuplicate schema kind z for )r   dictfunc	signaturekindAssertionError)native_functionspre_grouped_native_functionsfds       c/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torchgen/native_function_generation.pypre_group_native_functionsrO   p   s    
 	D !  ()9)9);<66;;=A #9!&&++-affX!VWW!&&++-	
 ('    c                    | sdS |  dS )Nout_out )overload_names    rN   &get_expected_out_variant_overload_namerV      s    %5Am_D+AArP   c                   | j                         t        j                  k7  rt        d| j                                | j                  j
                  t        d      t        | j                  j                         j                  t        | j                  j                              | 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-NonerR   nametypedefault
annotationrY   	argumentsreturns)rH   r   inplacerI   r^   self_argr   rY   remove_inplacewith_overloadrV   rU   remove_self_annotationwith_out_argsr   argumentrZ   r\   r_   )rF   s    rN   self_to_out_signaturerg      s    yy{j(((<TYY[MJKK~~&?@@
 YY%%'5524993J3JK
 ..779GG0099>> #~~66??JJ		
  rP   c                   | j                         t        j                  k7  rt        d| j                                t	        |       \  }}t        | j                  j                  t        | j                  j                              | j                  j                         j                  |      t        |            S )Nz Expected functional schema, got r]   )rH   r   
functionalrI   generate_out_args_from_schemar   rY   rc   rV   rU   r^   rG   re   tuplerF   new_returnsnew_out_argss      rN   functional_to_out_signaturero      s    yy{j+++?		}MNN =d CK
 YY$$24993J3JK
 ..**,::
 k" rP   c           
        t        d | j                  D              rt        d      | j                  D cg c]  }|j                  j	                         s|! }}t        |      dk(  rt        d      t        d | j                  j                        }t        j                  D cg c]	  }||vs| }}t        d | j                  D              }g }g }t        | j                        D ]  \  }	}|j                  j	                         rt        t        | j                        dk(  rdnd|	 |j                  d t        j                  ||	    d	      
      }
|j!                  |
       |st#        d |
j                  |
j$                        }|j!                  |       |j!                  |        ||fS c c}w c c}w )Nc              3  h   K   | ]*  }|j                   d uxr |j                   j                   , y wN)r\   is_write.0rs     rN   	<genexpr>z0generate_out_args_from_schema.<locals>.<genexpr>   s+     
T!1<<t#=(=(==
T   02z8Mutable schema kinds should not return mutable argumentsr   z(Expected at least one tensor-like returnc                J    | j                   g S | j                   j                  S rr   )r\   	alias_set)as    rN   <lambda>z/generate_out_args_from_schema.<locals>.<lambda>   s    ," !,,2H2H rP   c              3  h   K   | ]*  }|j                   t        t        j                        k(   , y wrr   )rZ   r   r   Tensorrt   s     rN   rw   z0generate_out_args_from_schema.<locals>.<genexpr>   s"     WQqvv&--)@@Wrx      rR   !rX   )rY   rZ   r\   )anyr_   rI   rZ   is_tensor_likelenr   r^   flat_allstringascii_lowercaseall	enumerater   r   parseappendr   r\   )rF   rv   tensorlike_retsused_annotationsxvalid_annotationsall_rets_are_tensorsrn   rm   inew_outnew_rets               rN   rj   rj      s   
 
Tt||
TTWXX"&,,JQ!&&2G2G2IqJOJ
?q GHH H %+$:$:XqaGW>WXXW$,,WW#%L !#K$,,' "166  "!$,,/14UCs)VV%++/@/C.DA,FG	G (# !GLLW=O=O ""7+q!#"$ $$G K Ys   F;F;(	G 2G c                   | j                         t        j                  k7  rt        d| j                                t	        |       \  }}t        | j                  j                         j                  t        | j                  j                              | j                  j                  |      t        |            S )NzExpected mutable schema, got r]   )rH   r   mutablerI   rj   r   rY   rb   rc   rV   rU   r^   re   rk   rl   s      rN   mutable_to_out_signaturer      s    yy{j(((<TYY[MJKK !>d CKYY%%'5524993J3JK
 ....|<k" rP   c                   ddl m} |t        j                  k(  r| j                  j                         t        j                  k(  rt        d      | j                  j                  d      j                  t        t        | j                  j                  j                  j                  d| j                  j                  j                  j                  | j                  j                         t        j                  k(        | j                  j                  j                              }n|t        j                   k(  r| j                  j                         t        j"                  k(  rt%        | j                        }n| j                  j                         t        j                  k(  rt'        | j                        }nW| j                  j                         t        j                  k(  rt)        | j                        }nt        d	      t        d
      |j                         t        j                   k(  r|j                  j+                         n|j                  |      }| j                  j-                         r|dz  }t.        j0                  |j                  t3        |dt4              ii}dht7        | j8                  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        jD                  d| jF                  dt7               d | jH                  d!dd"dd#dd$dd%|d&| jJ                  |fS )(Nr   )cppz1Cannot generate functional from functional schemaT)keep_return_namesF)baser`   dunder_methodfunctional_overload)rY   rU   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_seededrF   !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	namespacerT   )&torchgen.apir   r   ri   rF   rH   rI   rG   	with_namer   r   rY   r   r   r   rU   rR   r`   rg   r   ro   unambiguous_name
has_symintr   CompositeExplicitAutogradr   r   setr   r   r   r   functionr   NoCheckr   r   r   )rL   kr   rF   kernel_namebackend_metadatar   s          rN   generate_functionr     s:    !J!!!66;;=J111 !TUU vv$7AA%))..!"#&&++"2"2"@"@()9K9K(K  ffkk77	
 
jnn	 66;;=J...(0DVV[[]j000+AFF3DVV[[]j333.qvv6D p  R
 	
 99;*..( 			""$XXd^ 
 	vvy --II" 60
 =3	NN D
 	 	
	
./.Q.Q	
 &&'		

 	
 !%	
 !%	
 	
 	
  	
 (-	
  %	
 	
 #	
 	
  )00!	
" #	
$ !$%	
& '	
( 49)	
* BG+	
, 48-	
. CH/	
4 5	
6 kk7	
: 	= rP   c                l   t        |       }|j                         D ]  }t        j                  |v }t        j                  |v }t        j
                  |v }t        j                  |v }t        d |j                         D              }|s|s|s|sut        d |j                         D              }	t        d |j                         D              }
t        d |j                         D              }|	s|
s|r|s|rt        |j                               dk(  rjt        |t        j                     j                  j                        t        vr2t        dt        |t        j                     j                               f|r8t        |t        j                     j                  j                        t        v r|r|t        j
                     n<|r|t        j                     n'|r|t        j                     n|t        j                     }|j                  j!                         t        j                  k(  xs& t        d |j                  j"                  D              }t        d |j$                  D              }| xr |xr |}|sn|slt        |j                  j                        t&        vrGt        |j                  j                        t(        vr"t        d	t        |j                         d
      |rWt+        |t        j                        \  }}||t        j                  <   t-        j.                  ||       | j1                  |       |r9|s|s?t+        |t        j                        \  }}||t        j                  <   t-        j.                  ||       | j1                  |        y )Nc              3  8   K   | ]  }d |j                   v   yw)coreN)r   )ru   variants     rN   rw   z1add_generated_native_functions.<locals>.<genexpr>  s     Gf,Gs   c              3  4   K   | ]  }|j                     y wrr   )r   ru   rL   s     rN   rw   z1add_generated_native_functions.<locals>.<genexpr>  s     FaQ11F   c              3     K   | ]>  }|j                   xr, t        |j                  j                  j                        d k7   @ yw)set_N)
is_view_opstrrF   rY   r   s     rN   rw   z1add_generated_native_functions.<locals>.<genexpr>  s9      EF@QVV[[%5%5!6&!@@s   AAc              3  4   K   | ]  }|j                     y wrr   )r   r   s     rN   rw   z1add_generated_native_functions.<locals>.<genexpr>  s      )=>88)r   r   zEFound an out= operator that we could not find any other variants of: c              3  P   K   | ]  }|j                   j                            y wrr   )rZ   r   rt   s     rN   rw   z1add_generated_native_functions.<locals>.<genexpr>  s$      M,-%%'Ms   $&c              3  6   K   | ]  }d t        |      v   yw)rR   N)r   )ru   op_names     rN   rw   z1add_generated_native_functions.<locals>.<genexpr>  s     QgES\1Qs   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.)rO   valuesr   ri   r`   r   rR   r   r   r   r   rF   rY   &OUT_OPS_THAT_DONT_GET_GROUPED_PROPERLYrI   *INPLACE_OPS_THAT_DONT_GET_GROUPED_PROPERLYrH   r_   r   *MUTABLE_OPS_THAT_CANNOT_GET_AN_OUT_VARIANT-FUNCTIONAL_OPS_THAT_CANNOT_GET_AN_OUT_VARIANTr   r   
grow_indexr   )rsindicesrK   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metadatas                     rN   add_generated_native_functionsr     sH    $>b#A )002 q#..!3 ((A- ((A-..A%GAHHJGG +NF188:FFJ  JK((* L &) )BC((*) &" \-CG3qxxz?a/ *..)..334AB )_`cdefpftftdudzdz`{_|}  
 *,,-22778=>   *$$%  z))*  z~~&z,,- " $LL--/:3E3EE  M181E1EM JM QQQI#*{J}J=))*EFGLL--.HI )^_bcjcoco_p^q rr u   0*..IH$&*..!'':		"
 "w2B0*:O:OPH+-*''('':		"cqrP   c                4   t        |       t        |      k7  r#t        dt        |        dt        |             t        |       dk(  ryt        |       dk(  r	d|d    dS dt        j                  |       j	                          dd	j                  |       d
S )Nz#Returns and names length mismatch: z vs r    r   zreturn ;(, );)r   rI   
dispatcherreturns_typecpp_typejoin)retsnamess     rN   
return_strr     s    
4yCJ1#d)DUM
 	
 4yA~	Taq
!$$006??AB!DIIeDTCUUWXXrP   c                    | j                         }g }t        | j                        dkD  }t        |      D ]$  \  }}|	|j	                  |r	d| d| dn|       & |S )Nr   	std::get<>())aliased_return_namesr   r_   r   r   )rF   out_varaliased_retsnon_aliased_namesis_out_var_a_tupler   rv   s          rN   gather_nonaliased_inner_retsr    ss    ,,.LT\\*Q.,' 19$$/A)A3b	+w
 rP   c                   d| j                   j                  vry | j                  %d| j                  j                  vr| j                  }nY| 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|j                  d|j                   d|j                   d       |j                  t        |j                   dt        j                   ||j                                     |j                  |j                   d       |j                  t        j"                  |              dj%                  t'        ||j)                               D 	cg c]  }	|	j*                   c}	      }
d	}t-        |j                  j.                        d
kD  rd| dnd}t1        |j                  |      }t3        | j                   j                  j.                  ||z         }dj%                  |      }d|j5                  |j                         | j6                  j                  j9                         rdndz          d| d| d|j                  j                  j;                          d|
 d| dS c c}	w )Nr   zauto z_clone = clone_arg(r   _clone)binds)exprrZ   r   outputr   z = r   
r   rY   z {
  
  z
at::_ops::::call();
  
}
)ri   r   r`   r   rI   r   rF   r   zipr   jit_argumentsr\   rs   r   rY   r	   argument_typerf   r   r   r^   r  r   r_   r  r   defnrR   r   r   )gtarget_fsig
target_sigcontextclone_mutable_inputscloned_return_namesa_curra_tgteexprsout_namemaybe_assigninner_return_namesret_strclone_mutable_inputs_strs                   rN   gen_composite_functional_kernelr"     s    !,,+++yyAIINN!B99	
	;aiinn#D99 S!2!2344
all//
0C$X]]3J$&G   !2!23  / 8 'E,<,<,E,E ''}$7}BG NN"KK=/#11&L  &&&++f'=>NN:..v67#8$ IIy*:N:N:P'QR!qvvRSEH,/0E0E,F,JU8*C(PRL5hmmXN	!!#58K#KG  $yy)=>sxxz!%%***?*?*AYrJK L M .
8==-->>@A P
) 	  Ss   6Mc                   d| j                   j                  vry t        | j                   j                        }t        | j                  j                        }dj                  t        |j                         |j                               D cg c]  }|j                   c}      }g }d}t        | j                   j                  j                  j                         D ]n  \  }}t        | j                  j                  j                        dk(  r|nd| d| d}	|j                  d|j                   d|	 d	|j                   d|	 d
	       p g }
t        | j                   j                  j                               D ]a  \  }}||
j                  |       t        | j                  j                  j                        dk(  r|nd| d| d}	|
j                  |	       c dj                  |      }d|j                  | j                   j                  j                  j!                         | j                   j                  j#                         rdndz          d| d| j                  j                  j                  j!                          d| d| dt%        | j                   j                  j                  |
       dS c c}w )Nr   r   
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   rF   ri   r   r   r^   r  r   r   r_   r   rY   r   r  r   r   r   )r  r  r  r  r  	copy_outsr  r   out_argfunctional_return_namer   ret_namecopy_outs_strs                rN   gen_composite_out_kernelr*  _  s    !%%**$ aeejj
)C$Q\\%6%67JII"3==?J4H4H4JKLALE IH

 4 4 8 89 


7 1<<$$,,-2 QCr(1- 	
 	\\N"%;$< =LL>2329	


 D !!@!@!BC 	08KK! q||((001Q6  2hZq1 #
 KK./	0 IIi(Mquuzz//1!%%**BWBWBYY_abc d ezq||0055FFHIQVPW X/ aeejj  $'( )	 G 	Ms   K)rJ   zSequence[NativeFunction]returnz6dict[FunctionSchema, dict[SchemaKind, NativeFunction]])rU   
str | Noner+  r   )rF   r   r+  r   )rF   r   r+  z#tuple[list[Return], list[Argument]])rL   r   r   r   r+  zMtuple[NativeFunction, dict[DispatchKey, dict[OperatorName, BackendMetadata]]])r   zlist[NativeFunction]r   z6dict[DispatchKey, dict[OperatorName, BackendMetadata]]r+  None)r   ztuple[Return, ...]r   	list[str]r+  r   )rF   r   r   r   r+  r.  )r  r   r+  r,  )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   rO   rV   rg   ro   rj   r   r   r   r   r  r"  r*  rT   rP   rN   <module>r:     s=   "  #   , , , A A 1    & % ( . '* & 	. *'1 -^ . *(.(;(BF,+%
+%(+%fHdd$dRd^yyCy 
yx
Y	 9 9| 6 6rP   