o
    kiZ                     @  s  d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
 d dlZd dlmZ d dlmZ d dlmZ d dlmZmZmZ d d	lmZmZ d d
lmZmZmZmZ d dlmZm Z m!Z! d dl"m#Z# d dl$m%Z%m&Z& d dl'm(Z( e
rd dl)m*Z*m+Z+m,Z,m-Z- edg dZ.dVddZ/dWddZ0dXd d!Z1G d"d# d#Z2dYd$d%Z3e2j4e2j5e2j6e2j7e2j8e2j9e2j:d&d&e2j;d&d'd(d)d*d+d,d-d&d.d/d0d1d2fdZdSdTZ<e=dUkre3  dS dS )[    )annotationsN)
namedtuple)Path)AnyTYPE_CHECKING)	setValueT)BaseCppType)	GenLazyIRGenLazyNativeFuncDefinitionGenTSLazyIR)get_grouped_native_functionsparse_native_yaml)error_on_missing_kernelsgen_dispatcher_registrations"gen_dispatchkey_nativefunc_headersparse_backend_yaml)NativeFunctionNativeFunctionsGroupOperatorName)SelectiveBuilder)FileManagerNamespaceHelper)
YamlLoader)CallableIterableIteratorSequenceParsedExternalYaml)backend_keyautograd_keycpp_namespacebackend_indicesfull_codegenbackend_yaml_pathstrgrouped_native_functions/Sequence[NativeFunction | NativeFunctionsGroup]return8tuple[list[OperatorName], list[Any], list[OperatorName]]c           	      C  s   t | }tj|td}W d    n1 sw   Y  t|ts)tdt| |dg }|dg }|dg }t|t	sItdt| t|t	sWtdt| t|t	setdt| d	d
 |D }dd
 |D }|||fS )N)LoaderzExpected dict from YAML, got r"   
non_nativeir_genz&Expected full_codegen to be list, got z$Expected non_native to be list, got z Expected ir_gen to be list, got c                 S     g | ]}t |qS  r   parse.0namer-   r-   b/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torchgen/gen_lazy_tensor.py
<listcomp>v       z/parse_native_functions_keys.<locals>.<listcomp>c                 S  r,   r-   r.   r0   r-   r-   r3   r4   w   r5   )
openyamlloadr   
isinstancedictAssertionErrortypepoplist)	r#   r%   fyaml_valuesr"   r*   r+   full_codegen_opnamesir_gen_opnamesr-   r-   r3   parse_native_functions_keysb   s&   





rC   shape_inference_hdrexpected_shape_infr_decls	list[str]Nonec              
     s   z!t | }| }t|d W d    n1 sw   Y  W n ty5 } ztd|  |d }~ww  fdd|D }|rOtd|  dtj	| d S )N
z<Unable to read from the specified shape_inference_hdr file: c                   s   g | ]}| vr|qS r-   r-   )r1   declshape_infr_decl_linesr-   r3   r4      s    z3validate_shape_inference_header.<locals>.<listcomp>zGMissing shape inference function.

Please add declare this function in zD:

and implement it in the corresponding shape_inference.cpp file.

)
r6   readsetsplitOSErrorr;   	Exceptionoslinesepjoin)rD   rE   r?   shape_infr_declsemissing_declsr-   rJ   r3   validate_shape_inference_header{   s4   


rW   c                   C  s   dS )Na  at::Tensor to_meta(const at::Tensor& tensor) {
  // undefined tensors can't be converted to the meta device, since they don't have sizes/strides
  if (!tensor.defined()) return tensor;
  auto out = at::native::empty_strided_meta_symint(tensor.sym_sizes(), tensor.sym_strides(), /*dtype=*/tensor.scalar_type(), /*layout=*/tensor.layout(), /*device=*/c10::Device(c10::kMeta), /*pin_memory=*/std::nullopt);
  // needs to handle wrapped numbers, so dtype promotion works properly.
  if (tensor.unsafeGetTensorImpl()->is_wrapped_number()) {
    out.unsafeGetTensorImpl()->set_wrapped_number(true);
  }
  return out;
}
std::optional<at::Tensor> to_meta(const std::optional<at::Tensor>& tensor) {
  if (tensor.has_value()) {
    return to_meta(*tensor);
  }
  return std::nullopt;
}

std::vector<at::Tensor> to_meta(at::ITensorListRef t_list) {
  std::vector<at::Tensor> outs;
  outs.reserve(t_list.size());
  for (const auto& tensor : t_list) {
    outs.push_back(to_meta(tensor));
  }
  return outs;
}
r-   r-   r-   r-   r3   get_ltc_helper_fns   s   rX   c                   @  sn   e Zd ZU dZded< dZded< dZded< d	Zded
< dZded< e	Z
ded< eZded< dZded< dS )default_argsNoder$   	node_baseN
str | Nonenode_base_hdr&torch/csrc/lazy/core/shape_inference.hrD   ztorch::lazy::LazyTensortensor_classztorch/csrc/lazy/core/tensor.htensor_class_hdrtype[GenLazyIR]lazy_ir_generator!type[GenLazyNativeFuncDefinition] native_func_definition_generatorTorchScriptbackend_name)__name__
__module____qualname__r[   __annotations__r]   rD   r_   r`   r	   rb   r
   rd   rf   r-   r-   r-   r3   rY      s   
 
rY   c                  C  sj  t jdd} | jddddd | jdd	d
dd | jddtddd | jddtd dd | jddddd | jddttjdd | jddttjdd | jddttjd d | jd!d"ttj	d#d | jd$d%ttj
d&d | jd'd(ttjd)d |  }tt jd* }t|d+ d, d- }tj}|jrt}tj}t||j|j|j|j|j|j|j	|j
|j|||j d S ).Nz"Generate Lazy Tensor backend 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<   defaultrl   z--impl-pathz--impl_pathz9path to the source C++ file containing kernel definitionsz--gen-ts-loweringsz--gen_ts_lowerings
store_truezIGenerate TorchScript lowerings in addition to Lazy IR and NativeFunctions)actionrl   z--node-basez--node_basez7Name of backend specific custom Lazy IR Node base classz--node-base-hdrz--node_base_hdrz;Path to header file defining custom Lazy IR Node base classz--shape-inference-hdrz--shape_inference_hdrzBPath to header file defining custom Lazy shape inference functionsz--tensor-classz--tensor_classz1Name of backend specific custom Lazy Tensor classz--tensor-class-hdrz--tensor_class_hdrz5Path to header file defining custom Lazy Tensor classz--backend-namez--backend_namezName of the backend to generate   atensrcATen)argparseArgumentParseradd_argumentboolr$   rY   r[   r]   rD   r_   r`   rf   
parse_argsr   __file__absoluteparentsrb   gen_ts_loweringsr   rd   run_gen_lazy_tensorsource_yaml
output_dirdry_run	impl_path)parseroptions
torch_root	aten_pathrb   rd   r-   r-   r3   main   s   
r   FTztorch::lazyGetTensorList$GetLtcTensorOrCreateForWrappedNumberTryGetLtcTensorzTORCH_LAZY_FN_COUNTER("lazy::")zLazyTensor::Createz$torch::lazy::CreateAtenFromLtcTensorz$torch::lazy::TupleAtenFromLtcTensorsztorch::lazy::ValueLazyTensorPtrztorch::lazy::GetBackendDevicer   r~   r   r   rw   r   r\   r[   r]   r_   r`   rb   ra   rd   rc   build_in_treeper_operator_headersrf   gen_forced_fallback_codeuse_lazy_shapebackend_namespaceget_tensorlistget_tensor_or_wrap_numbertry_get_tensormetrics_countercreate_tensorcreate_from_first_tensorcreate_aten_from_ltc_tensortuple_aten_from_ltc_tensorslazy_value_classlazy_tensor_ptrget_device_fnc           .        s^  | d}|d }d|d d }tt|| tj| dd&fdd	} | }!tj| d
}"tj| d}#t|"|#}$|$j|$j}% t	|%d'dd}&t
|&dt| }'|'j|'j}(|'j})|'j t|\fd(ddt }*d u rtd   }+|d urt|% |(|+| 	 d urtt  },t|, |+d u rtdt|!|+|) |(| |(d u rǈgn|(gD ]}-t|!|+ |-|*|||dd qt|)|! dd 	
fd d! |
  ||||!d"d"fd#d! |!d$d$fd%d! d S ))Nz::	templatesinstall_dirr$   r'   r   c                   s   t |  dS )N)r   template_dirr   )r   )r   )r   r   r-   r3   make_file_managerO  s   z.run_gen_lazy_tensor.<locals>.make_file_managerznative/native_functions.yamlznative/tags.yamlr?   %NativeFunctionsGroup | NativeFunctionc                 S  s$   t | tr	| jjn| j}t|jjS )z
        We sort the native function because of the note in concat_map_codegen.
        TODO(alanwaketan): Remove this sorting hack once all ops are grouped properly.
        )r9   r   
functionalfuncr$   r2   )r?   r   r-   r-   r3   sort_native_function_  s   z1run_gen_lazy_tensor.<locals>.sort_native_function)keyr   )Callable[[NativeFunction], Sequence[str]]xs/Iterable[NativeFunctionsGroup | NativeFunction]ops_listlist[OperatorName]Iterator[str]c                 s  sP    |D ]"}t |trt| n|g}|D ]}|jj|v r$| |E dH  qqdS )z
        We code-gen for the functional variant, which is all we need for IR classes/lowerings/shape inferences, but we
        only code-gen additional entries for the inplace variant for the native functions.
        N)r9   r   r>   	functionsr   r2   )r   r   r   xfsr?   r-   r-   r3   concat_map_codegen{  s   
z/run_gen_lazy_tensor.<locals>.concat_map_codegenzbackend_key must be non-Nonezclass_name must be non-NoneF)r   r   rf   eager_registrationzNativeFunctions.cppzDispatchKeyNativeFunctions.cppc                     s   dd ddddddd	d
ddd d d dgr!dgng  D t  djjt d  
	dS )Nc                 S     g | ]}d | dqS z
#include <>r-   r1   pathr-   r-   r3   r4         
9run_gen_lazy_tensor.<locals>.<lambda>.<locals>.<listcomp>zATen/Functions.hzATen/native/TensorConversions.hzATen/NativeFunctions.hz6ATen/CompositeExplicitAutogradNonFunctionalFunctions.hzATen/MetaFunctions.hzATen/Operators.hzATen/native/CPUFallback.h!torch/csrc/lazy/core/ir_builder.hz*torch/csrc/lazy/core/lazy_graph_executor.hztorch/csrc/lazy/core/metrics.htorch/csrc/lazy/core/shape.h/zNativeFunctions.hz	/LazyIr.hz.torch/csrc/lazy/ts_backend/ts_eager_fallback.h NativeFunctions)includes
helper_fnsnative_functions_includenamespace_prologuenamespace_epiloguenative_function_definitions)rX   prologueepiloguer>   r-   )r!   r   r   r   r   r   r   r   r   r   r   r%   r   r   rd   	ns_helperr   rD   r_   r`   r   r   r-   r3   <lambda>  sb   z%run_gen_lazy_tensor.<locals>.<lambda>zLazyIr.hc                     sD   dd dD d urd dgng t   jjdS )Nc                 S  r   r   r-   r   r-   r-   r3   r4     r   r   )zATen/core/Formatting.hzc10/core/ScalarType.hztorch/csrc/lazy/core/hash.htorch/csrc/lazy/core/ir.hr   optionalvectorz
#include "")lazy_ir_sysinclazy_ir_incir_declarationsr   r   )r>   r   r   r-   )r   r"   r%   r+   lazy_ir_objr]   r   r-   r3   r     s   
zLazyNonNativeIr.hc                     s6   dd g drgng  D t  jjdS )Nc                 S  s   g | ]
}|rd | dqS r   r-   r   r-   r-   r3   r4   <  s    
r   )r   r   z+torch/csrc/lazy/core/internal_ops/ltc_ops.hr^   )lazy_non_native_ir_incnon_native_ir_nodesr   r   )dest!generate_non_native_lazy_ir_nodesr   r   r-   )r   r]   r*   r   r-   r3   r   ;  s   )r   r$   r'   r   )r?   r   r'   r$   )r   r   r   r   r   r   r'   r   )rN   rS   r   r   rQ   r   r   native_functionsr!   r   sortedr   r   r   r    rC   r   get_nop_selectorr;   native_function_class_namer   r>   r   GenLazyShapeInferenceDefinitionrW   r   r   r   write_with_template).r   r~   r   r   r   r[   r]   r_   r`   rD   rb   rd   r   r   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	lv_tokenslv_classlv_nsr   fmnative_yaml_pathtags_yaml_pathparsed_yamlr   r   parsed_backend_yamlr   r    selector
class_namerE   dispatch_keyr-   )r!   r   r   r   r   r   r   r   r"   r   r   r   r   r%   r+   r   r   r   rd   r]   r*   r   r   rD   r   r_   r`   r   r   r3   r}   #  s   
&




	4:r}   __main__)r#   r$   r%   r&   r'   r(   )rD   r$   rE   rF   r'   rG   )r'   r$   )r'   rG   )<r   r$   r~   r$   r   r$   r   rw   r   r\   r[   r$   r]   r\   r_   r$   r`   r$   rD   r$   rb   ra   rd   rc   r   rw   r   rw   rf   r$   r   rw   r   rw   r   r$   r   r$   r   r$   r   r$   r   r$   r   r$   r   rw   r   r$   r   r$   r   r$   r   r$   r   r$   r'   rG   )>
__future__r   rt   rQ   collectionsr   pathlibr   typingr   r   r7   torchgen.destr   torchgen.api.lazyr   torchgen.api.typesr   torchgen.dest.lazy_irr	   r
   r   torchgen.genr   r   torchgen.gen_backend_stubsr   r   r   r   torchgen.modelr   r   r   !torchgen.selective_build.selectorr   torchgen.utilsr   r   torchgen.yaml_utilsr   collections.abcr   r   r   r   r   rC   rW   rX   rY   r   r[   r]   r_   r`   rD   rb   rd   rf   r}   rg   r-   r-   r-   r3   <module>   st    ?


 
f  /
