
    9j,[                       d dl mZ d dlZd dlZd dlZd dlmZmZmZ d dl	m
Z
 d dlmZ d dlZd dlmc mZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZmZmZm Z m!Z!m"Z" d dl#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,Z, erd dl-m.Z.  edg d      Z/	 	 	 	 	 	 	 	 ddZ0	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ1ddZ2	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ3	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ4	 d	 	 	 	 	 	 	 	 	 d dZ5e6dk(  r e2        yy)!    )annotationsN)Counterdefaultdict
namedtuple)Path)TYPE_CHECKING)DispatcherSignature)CodeTemplate)native_function_manager)get_grouped_native_functionsparse_native_yaml)BackendIndexBackendMetadataDispatchKeyNativeFunctionNativeFunctionsGroupOperatorName)SelectiveBuilder)	concatMapcontextFileManagerNamespaceHelperTarget)
YamlLoader)SequenceParsedExternalYaml)backend_keyautograd_key
class_namecpp_namespacebackend_indicesc           	     p
   t        d |      D ci c]  }|j                  j                  | c}t        |       5 }t	        j
                  |t              }d d d        t        t              st        dt        |             g d}|j                  dd       t        d      |j                  dd       }|j                  dd       t        d	      |j                  d
d      }t        |t              st        d|       |j                  dd      }t        |t              st        d|       |j                  dg       }	|	g }	t        |	t              st        d|	 dt        |	       d      |j                  dg       }
|
g }
t        |
t              st        d|
 dt        |
       d      t        |
      }|j                  dg       }t        |t              st        d|       |j                  dg       }|	j                  |       |j                  di        |j                  di        t!        |j#                               dk7  r?t        |  ddj%                  |j#                                ddj%                  |             	 	 	 	 	 	 	 	 	 	 	 	 d(fd}d }t!        |	      dkD  rPt'        fd      5  t)        j*                        }d d d         ||	||||       }||v rt        d!|       |||<   d }t!        |      dkD  rSt'        fd"      5  t)        j*                  d#       }d d d         ||||||       }||v rt        d$|       |||<   |D ]\  }t        |t,              rS|g n$||   j/                  |      fD cg c]  }|| c}}|g n$||   j/                  |      fD cg c]  }|| c}}n|g n?|j1                         D cg c]  }||   j/                  |       c}D cg c]  }|| c}}|g n?|j1                         D cg c]  }||   j/                  |       c}D cg c]  }|| c}}|D cg c]  }||	 }}|D cg c]  }||	 }}t!        |      dk(  r#t!        |      dk(  r3t        d%|d   j2                   d&|d   j2                   d'       t5        ||||      S c c}w # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY wc c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w ))Nc                Z    t        | t              r| gS t        | j                               S N)
isinstancer   list	functionsfs    Z/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torchgen/gen_backend_stubs.py<lambda>z$parse_backend_yaml.<locals>.<lambda>3   s     Z>:qc Q[[]@S     )Loaderz'Expected yaml_values to be a dict, got )
backendr   r    extra_headers	supportedautogradfull_codegen
non_nativeir_gensymintr.   z&You must provide a value for "backend"r   r    z,You must provide a value for "cpp_namespace"use_out_as_primaryFzHYou must provide either True or False for use_out_as_primary. Provided: device_guardzBYou must provide either True or False for device_guard. Provided: r0   z,expected "supported" to be a list, but got: z
 (of type )r5   z)expected "symint" to be a list, but got: r1   z+expected "autograd" to be a list, but got: r2   r3   r4   r   z contains unexpected keys: z, z). Only the following keys are supported: c                   i }| D ]g  }t        j                  |      }|vrt        d|       t        j                  |   j
                        }||v r|dz  }t        |d
      }	|	||<   i t        ||d||      S )Nz Found an invalid operator name: _symintF)kernel
structuredr    T)dispatch_keyr6   externalr7   index)r   parseAssertionError
dispatchernamefuncr   r   )backend_ops
symint_opsr=   r6   use_device_guardmetadataopop_namekernel_namemr    native_functions_maps             r*   create_backend_indexz0parse_backend_yaml.<locals>.create_backend_index   s     9; 	"B"((,G22$'Gy%QRR$//*>w*G*L*LMKZy("uMA !"HW	" %1)
 	
r,   c                     d  dS )NzFThe provided value for "backend" must be a valid DispatchKey, but got . r.   s   r*   r+   z$parse_backend_yaml.<locals>.<lambda>   s    \]d\eefg r,   )r6   rG   zDuplicate backend key: c                     d  dS )NzThe "autograd" key was specified, which indicates that you would like to override the behavior of autograd for some operators on your backend. However "Autogradz" is not a valid DispatchKey.rQ   rR   s   r*   r+   z$parse_backend_yaml.<locals>.<lambda>   s     OOViWtv r,   AutogradzDuplicate autograd key: zCurrently, all variants of an op must either be registered to a backend key, or to a backend's autograd key. They cannot be mix and matched. If this is something you need, feel free to create an issue! z" is listed under "supported", but z is listed under "autograd".)rE   z	list[str]rF   zset[str]r=   r   r6   boolrG   rU   returnr   )r   rD   rC   openyamlloadr   r%   dictrA   typepoprU   r&   setextendlenkeysjoinr   r   r@   r   
get_kernelr'   r;   r   )backend_yaml_pathgrouped_native_functionsr!   r)   yaml_values
valid_keysr   r6   rG   r0   r5   
symint_setsupported_autogradr2   rN   r   backend_idxr   autograd_idxgrL   forward_kernelsbackward_kernelsr.   r    rM   s                          @@@r*   parse_backend_yamlrn   +   sV    S$
@ 	
Q@ 
	  6Aii*56k4(5d;6G5HI
 	
J ooi.GEFFt4JOOOT:MKLL %)=uE($/VWiVjk
 	
 #~u=&-PQaPbc
 	
 R0I	i&:9+ZPTU^P_O``ab
 	
 __Xr*F~fd#7xz$v,WXY
 	
 VJ$R8($/9:L9MN
 	

 ??>26L\" OOL"% OOHb!
;!# !!<TYY{GWGWGY=Z<[ \66:ii
6K5LN
 	




 "

 !
 
 

< '+K
9~g
 	5 &++G4K	5
 +1-
 /) #:;-!HII'2$'+L
"v
 	C ',,xy-ABL		C ,1-
 ?* #;L>!JKK(4%% 7a( &  .k:EEaHI}    '  .l;FFqIJ}   &  "# (4??B }    '  "# (5@@C }   '6G1GG'7I!1=AIIO$)S1A-Ba-G P #1%,,- .'*1122N	P c7r \:}o m@6 6d	5 	5$	C 	C, HIsd   S$S)S6.T$TT2TT6T$T)(T.0T.:T3T3)S36T Tc                   	 t        |      5 }|j                         }d d d        |g }||   j                  g|g n||   j                  gz   }
t        t        t        d |
                  }| D cg c]4  }|j                  j                  |v r|j                  j                  |vr|6 }}t        t              }|D ]-  }|||j                  j                        j                  |       / d| d}t        t        j                  |      D cg c]  \  }}|j                  d      s| c}}      }d}|j!                         D ]Y  \  }}t#        |      }||   }||k7  sdd}dj%                  |D cg c]
  } ||       c}      }|d| d	| d
| d| d| dz  }[ |dk7  rt        |      y # 1 sw Y   xY w# t        $ r}	t        d|       |	d }	~	ww xY wc c}w c c}}w c c}w )Nz2Unable to read from the specified impl_path file: c                l    | j                         D cg c]  \  }}||j                  f c}}S c c}}w r$   )itemsr;   )r?   rJ   rH   s      r*   r+   z*error_on_missing_kernels.<locals>.<lambda>'  s/    HM3D7HWhoo.  s   0z(.*)z::\s*([\w\d]*)\(: c                    t        |       5  t        j                  | j                        j	                         cd d d        S # 1 sw Y   y xY wr$   )r   r	   from_schemarD   declr(   s    r*   create_declz-error_on_missing_kernels.<locals>.create_declQ  s>    ,Q/ J.::166BGGIJ J Js   -AA
z$ is missing a kernel definition for z. We found z( kernel(s) with that name,
but expected zH kernel(s). The expected function schemas for the missing operator are:
z

)r)   r   rV   str)rW   readOSErrorrA   r?   rZ   r&   r   rD   rC   r   appendr   refindallendswithrq   r_   ra   )native_functionsr!   r   r   r   kernel_defn_file_pathr2   r)   backend_defnseindicesexpected_backend_op_namesexpected_backend_native_funcs#expected_backend_kernel_name_countsnative_fkernel_defn_regexxy!actual_backend_kernel_name_countsmissing_kernels_err_msgexpected_namefuncsexpected_overload_countactual_overload_countrw   expected_schemas_strs                             r*   error_on_missing_kernelsr     sr   '( 	%AFFHM	% {+112")F)L)L(MG
 :> 		
	: ";66;;33<8W 	
;! ;
 LWL' 2 +%hmm&8&89	

&
  
|+;<(/ **%6F	
A::c? 	

)% ! C I I K u"%e* A- P"&;;J $(99e-Lk!n-L#M # ,0{K`Ja b%& '  ( #  "$455 %O	% 	% @AV@WX
	.;,	
" .Ms?   G F6G 29G#G(
8G.
6G ;G 	G GG c                 x   t        j                  d      } | j                  dddd       | j                  dd	d
d       | j                  ddt        dd       | j                  ddt        d d       | j                         }t        |j                  |j                  |j                  |j                         y )NzGenerate backend stub files)descriptionz-sz--source-yamlz--source_yamlzApath to source yaml file containing operator external definitions)helpz-oz--output-dirz--output_dirzoutput directoryz	--dry-runz	--dry_runF)r[   defaultr   z--impl-pathz--impl_pathz9path to the source C++ file containing kernel definitions)argparseArgumentParseradd_argumentrU   ry   
parse_argsrunsource_yaml
output_dirdry_run	impl_path)parseroptionss     r*   mainr   `  s    $$1NOF
P	   nnCUV
[tUAS   H   !GW//'BSBSTr,   c                  	
 t        d      d
t        t        t        fd|                  	t        t        t        fd|                  t	        |      | j                   dd	
fd       y )Nclass_name must not be NonezAAutogenerated file by gen_backend_stubs.py. Do not edit directly!c                6    t        j                  |          S r$   dest#compute_native_function_declaration)r)   backend_dispatch_keyr!   s    r*   r+   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>  s    $BB';< r,   c                >    g S t        j                  |          S r$   r   )r)   autograd_dispatch_keyr!   s    r*   r+   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>  s.    (0  =='<= r,   NativeFunctions.hzDispatchKeyNativeFunctions.hc                 F    j                   j                   z   dS )N)generated_commentnamespace_prologuer   namespace_epiloguedispatch_declarationsBackendNamer   )prologueepilogue)autograd_declarationsbackend_declarationsr   backend_namer   r   	ns_helpers   r*   r+   z4gen_dispatchkey_nativefunc_headers.<locals>.<lambda>  s1    !2"+"4"4$"+"4"4%9<Q%Q'/
 r,   )rA   sortedr]   r   r   write_with_template)fmr   r    r!   rd   r   r   r   r   r   r   r   s    ` ` ```@@@@r*   "gen_dispatchkey_nativefunc_headersr   x  s     :;;K  " )		
	 #
 )		
  .I
  12&	
 	
r,   c                "   	 | d| dg}|rdj                  d |D              ndj                  d |D              t        d      |   t        t        t	        j
                  t        j                  dd d	                  }dt        d
      dd|rt        d      }|j                  |      nt        d      }|j                  |
|       j                  d dd 	fd       y )N/r   rx   c              3  (   K   | ]
  }d | d  yw)z
#include <>NrQ   .0hs     r*   	<genexpr>z/gen_dispatcher_registrations.<locals>.<genexpr>       0Tq:aS1B0T   c              3  (   K   | ]
  }d | d  yw)z
#include ""NrQ   r   s     r*   r   z/gen_dispatcher_registrations.<locals>.<genexpr>  r   r   r   FTrocmr5   class_method_nameskip_dispatcher_op_registrationat)namespace_strrs   zOTORCH_LIBRARY_IMPL(aten, $dispatch_key, m) {
    $dispatch_registrations_body
})r=   dispatch_registrations_bodyzTORCH_API void Register${backend_name}${dispatch_key}NativeFunctions();
TORCH_API void Register${backend_name}${dispatch_key}NativeFunctions() {
    static auto m = MAKE_TORCH_LIBRARY_IMPL(aten, $dispatch_key);
    $dispatch_registrations_body
})r   r=   r   Registerz.cppzRegisterDispatchKey.cppc                     d	sdndj                         t        j                   	d      t        j                         j	                  d 
fd      j                        dS )Nrs   z#include <ATen/Functions.h>F)per_operator_headersr   zRegisterDispatchDefinitions.inic                     j                   j                  j                         dt        t	        t        j                   t        j                  dd d                  dS )Nrs   FTr   )ns_prologuens_epilogue"static_init_dispatch_registrationsdeferred_dispatch_registrationsdispatch_namespacedispatch_namespaced_definitionsdispatch_anonymous_definitions)	r   r   lowerr&   r   r   RegisterDispatchKeyr   ANONYMOUS_DEFINITION)backend_indexr   r   r=   rd   r   selectorr   s   r*   r+   z@gen_dispatcher_registrations.<locals>.<lambda>.<locals>.<lambda>
  sq    #,#5#5#,#5#5:\7V*6*<*<*>796:! 44 - & ; ; (%*'+5?L@E 57 r,   )extra_cuda_headersexternal_backend_headersops_headersr   r   dispatch_headersdispatch_helpersdispatch_definitions)r   r   gen_registration_headersgen_registration_helperssubstitute_with_templatesplit)r   r   r   r=   external_backend_headers_strr   rd   newliner   r   r   r   s   r*   r+   z.gen_dispatcher_registrations.<locals>.<lambda>  sw    "$(D' 9'"."4"4"6 $ = =4Hu! !% = =m L$&$?$?1 %0 eGnI%
 r,   )ra   rA   r&   r   r   r   r   REGISTRATIONr   r
   
substituter   )r   r   r   r!   rd   r   r=   r   build_in_treer   r   eager_registrationheadersr   static_templatedeferred_templater   r   r   r   r   r   s   ` ` ` `` `      @@@@@@r*   gen_dispatcher_registrationsr     sY     ,a,-->?G '+yy0TG0T'T$'+yy0TG0T'T$:;;#L1M"&$$##%/L05 %	
# Gd3I&(#)+&&
 .=-G-G%(C .H .
*
 )
 +<*F*F%%(C +G +
' 
<.%!%	
 %	
)r,   c                   t        t              j                         j                  j                  }t        j
                  j                  |d      }t        j
                  j                  |      s t        j
                  j                  |d      }t        j
                  j                  |d      dfd} ||      }t        j
                  j                  |d      }t        j
                  j                  |d      }	t        ||	      }
|
j                  |
j                  }}t        |      }t        | ||      }|j                  }|j                  }|j                  }|j                   }|j                  }t#        j$                         }|y |||   j'                         }|t)        d      |t+        ||||||       t-        |||||||       ||gn||gD ]  }t/        ||||||||        y )	Nzaten/srcztorchgen/packagedzATen/templatesc                     t        |       S )N)install_dirtemplate_dirr   )r   )r   r   r   s    r*   make_file_managerzrun.<locals>.make_file_manager0  s    #,
 	
r,   z!ATen/native/native_functions.yamlzATen/native/tags.yamlr   )r   ry   rV   r   )r   __file__absoluteparentospathra   existsr   r   r!   r   rn   r   r   r    r   r   get_nop_selectornative_function_class_namerA   r   r   r   )r   r   r   r   root
common_dirr   r   native_yaml_pathtags_yaml_pathparsed_yamlr   r!   rd   parsed_backend_yamlr   r   r    r   r   r=   r   s     `                  @r*   r   r   %  s    >""$++22DdJ/J77>>*%WW\\$(;<
77<<
,<=L

 
:	&Bww||J0STWW\\*.EFN#$4nEK$$## &  <<LM,- &11K&33L'55M$//J)99O002H
 %[1LLN
:;; 	
 '
  &-K3N
 	%$		

r,   __main__)rc   ry   rd   /Sequence[NativeFunction | NativeFunctionsGroup]r!   dict[DispatchKey, BackendIndex]rV   r   r$   )r   zSequence[NativeFunction]r!   r
  r   r   r   DispatchKey | Noner   ry   r   ry   r2   zlist[OperatorName] | NonerV   None)rV   r  )rs   )r   r   r   ry   r    ry   r!   r
  rd   r	  r   r   r   r  r   ry   rV   r  )FFrs   T)r   r   r   ry   r   ry   r!   r
  rd   r	  r   r   r=   r   r   r   r   rU   r   rU   r   ry   r   rU   rV   r  )
r   ry   r   ry   r   rU   r   z
str | NonerV   r  )7
__future__r   r   r   r}   collectionsr   r   r   pathlibr   typingr   rX   torchgen.api.dispatcherapirB   torchgen.destr   torchgen.api.typesr	   torchgen.code_templater
   torchgen.contextr   torchgen.genr   r   torchgen.modelr   r   r   r   r   r   !torchgen.selective_build.selectorr   torchgen.utilsr   r   r   r   r   torchgen.yaml_utilsr   collections.abcr   r   rn   r   r   r   r   r   __name__rQ   r,   r*   <module>r     sP   "  	 	 8 8     , ,  2 / 4 H  ? S S * (
  U ]]M] 5] 	]N /3R6.R64R6 R6 %	R6
 R6 R6 ,R6 
R6jU@ 777 7 5	7
 N7 &7 .7 7 
7H  !&#ppp p 5	p
 Np &p p p p p p p 
ph OSR
R
"%R
04R
AKR
	R
j zF r,   