U
    9%eZ                      @   sB  d dl Z d dlZd dlZd dlZd dlmZ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 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$ 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/m0Z0m1Z1 eddddddgZ2e3eee"e#f  eee$ ee ee$ f dddZ4e3ee3 ddddZ5e3dddZ6G dd dZ7dddd Z8e7j9e7j:e7j;e7j<e7j=e7j>e7j?d!d!e7j@d!d"d#d$d%d&d'd(d!d)d*d+d,d-fe3e3e3eAee3 e3ee3 e3e3e3ee ee eAeAe3eAeAe3e3e3e3e3e3eAe3e3e3e3e3dd.d/d0ZBeCd1kr>e8  dS )2    N)Counter
namedtuple)AnyCallableDictIterableIteratorListOptionalSequenceTupleTypeUnion)	setValueT)BaseCppType)	GenLazyIRGenLazyNativeFuncDefinitionGenTSLazyIR)get_grouped_native_functionsparse_native_yaml)NativeFunctionNativeFunctionsGroupOperatorName)SelectiveBuilder)	concatMapFileManagerNamespaceHelper)
YamlLoader   )error_on_missing_kernelsgen_dispatcher_registrations"gen_dispatchkey_nativefunc_headersparse_backend_yamlParsedExternalYamlbackend_keyautograd_keycpp_namespacebackend_indicesfull_codegen)backend_yaml_pathgrouped_native_functionsreturnc           
   	   C   s   dd t dd |D }t| }tj|td}W 5 Q R X t|tsHt|dg }|dg }|dg }t|t	sztt|t	stt|t	std	d
 |D }dd
 |D }	|||	fS )Nc                 S   s   i | ]}|j j|qS  )funcname).0fr,   r,   W/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torchgen/gen_lazy_tensor.py
<dictcomp>n   s    z/parse_native_functions_keys.<locals>.<dictcomp>c                 S   s   t | tr| gS t|  S )N)
isinstancer   list	functions)r0   r,   r,   r1   <lambda>q       z-parse_native_functions_keys.<locals>.<lambda>)Loaderr(   
non_nativeir_genc                 S   s   g | ]}t |qS r,   r   parser/   r.   r,   r,   r1   
<listcomp>   s     z/parse_native_functions_keys.<locals>.<listcomp>c                 S   s   g | ]}t |qS r,   r;   r=   r,   r,   r1   r>      s     )
r   openyamlloadr   r3   dictAssertionErrorpopr4   )
r)   r*   Znative_functions_mapr0   Zyaml_valuesr(   r9   r:   Zfull_codegen_opnamesZir_gen_opnamesr,   r,   r1   parse_native_functions_keysj   s$    
rE   )shape_inference_hdrexpected_shape_infr_declsr+   c              
      s   z.t | }| }t|d W 5 Q R X W n2 tk
r` } ztd|  |W 5 d }~X Y nX d}tt||} fdd|D }|rt	d|  dt
j| d S )N
z<Unable to read from the specified shape_inference_hdr file: zcompute_shape_(\w+)c                    s   g | ]}| kr|qS r,   r,   )r/   declZshape_infr_decl_linesr,   r1   r>      s     z3validate_shape_inference_header.<locals>.<listcomp>zGMissing shape inference function.

Please add declare this function in zH:

and implement it in the the corresponding shape_inference.cpp file.

)r?   readsetsplitOSErrorrC   r   refindall	Exceptionoslinesepjoin)rF   rG   r0   Zshape_infr_declseZshape_infr_regexZactual_shape_infr_name_countsZmissing_declsr,   rJ   r1   validate_shape_inference_header   s2    



rV   )r+   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=*/c10::make_optional(tensor.scalar_type()), /*layout=*/c10::make_optional(tensor.layout()), /*device=*/c10::make_optional(c10::Device(c10::kMeta)), /*pin_memory=*/c10::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;
}
c10::optional<at::Tensor> to_meta(const c10::optional<at::Tensor>& tensor) {
  if (tensor.has_value()) {
    return to_meta(*tensor);
  }
  return c10::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,   r1   get_ltc_helper_fns   s    rW   c                   @   sz   e Zd ZU dZeed< dZee ed< dZeed< dZ	eed< d	Z
eed
< eZee ed< eZee ed< dZeed< dS )default_argsNode	node_baseNnode_base_hdr&torch/csrc/lazy/core/shape_inference.hrF   ztorch::lazy::LazyTensortensor_classztorch/csrc/lazy/core/tensor.htensor_class_hdrlazy_ir_generator native_func_definition_generatorZTorchScriptbackend_name)__name__
__module____qualname__rZ   str__annotations__r[   r
   rF   r]   r^   r   r_   r   r   r`   ra   r,   r,   r,   r1   rX      s   
rX   c                  C   sn  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jj }t|d* d+ d, }tj}|jr0t}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)typedefaultrh   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)actionrh   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 generateZatensrcZATen)argparseArgumentParseradd_argumentboolre   rX   rZ   r[   rF   r]   r^   ra   
parse_argspathlibPath__file__parentabsoluter_   Zgen_ts_loweringsr   r`   run_gen_lazy_tensorsource_yaml
output_dirdry_run	impl_path)parseroptionsZ
torch_root	aten_pathr_   r`   r,   r,   r1   main   s        r   FTztorch::lazyZGetTensorListZ$GetLtcTensorOrCreateForWrappedNumberZTryGetLtcTensorzTORCH_LAZY_FN_COUNTER("lazy::")zLazyTensor::Createz$torch::lazy::CreateAtenFromLtcTensorz$torch::lazy::TupleAtenFromLtcTensorsztorch::lazy::ValueZLazyTensorPtrztorch::lazy::GetBackendDevice)r   ry   rz   r{   r|   rZ   r[   r]   r^   rF   r_   r`   build_in_treeper_operator_headersra   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_fnr+   c           .         s  | d}|d }d|d d }tt|| tj| dttdfdd} | }!tj| d}"tj| d}#t|"|#}$|$j	|$j
 }% t|%tttf td	d
d}&t|&dt| }'|'j|'j}(|'j})|'j
 t|\fttgtt f ttttf  tt tt dddt }*d k	sBt   }+|d k	rlt|% |(|+| d k	rt t!"  },t#|, |+d k	stt$|!|+|) |(| |(d k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::Z	templates)install_dirr+   c                    s   t |  dS )N)r   template_dirr{   )r   )r   )r{   r   r,   r1   make_file_manager]  s
      z.run_gen_lazy_tensor.<locals>.make_file_managerznative/native_functions.yamlznative/tags.yaml)r0   r+   c                 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.
        )r3   r   Z
functionalr-   re   r.   )r0   r-   r,   r,   r1   sort_native_functionm  s    z1run_gen_lazy_tensor.<locals>.sort_native_function)key)r-   xsops_listr+   c                 s   sN   |D ]D}t |trt| n|g}|D ]}|jj|k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)r3   r   r4   r5   r-   r.   )r-   r   r   xfsr0   r,   r,   r1   concat_map_codegen  s
    
z/run_gen_lazy_tensor.<locals>.concat_map_codegenF)r   r   ra   Zeager_registrationzNativeFunctions.cppzDispatchKeyNativeFunctions.cppc                      s   dd ddddddd	d
ddd d d dgrBdgng  D t  djjt d  
	dS )Nc                 S   s   g | ]}d | dqS z
#include <>r,   r/   pathr,   r,   r1   r>     s   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 ZNativeFunctions)ZincludesZ
helper_fnsZnative_functions_includenamespace_prologuenamespace_epilogueZnative_function_definitions)rW   prologueepiloguer4   r,   )r'   r$   r   r   r   r   r   r   r   r   r   r*   r   r   r`   	ns_helperrz   rF   r]   r^   r   r   r,   r1   r6     sb    z%run_gen_lazy_tensor.<locals>.<lambda>zLazyIr.hc                      sD   dd dD d k	r"d dgng t   jjdS )Nc                 S   s   g | ]}d | dqS r   r,   r   r,   r,   r1   r>   *  s   r   )zATen/core/Formatting.hzc10/core/ScalarType.hzc10/util/Optional.hztorch/csrc/lazy/core/hash.htorch/csrc/lazy/core/ir.hr   Zvectorz
#include "")Zlazy_ir_sysincZlazy_ir_incZir_declarationsr   r   )r4   r   r   r,   )r   r(   r*   r:   lazy_ir_objr[   r   r,   r1   r6   )  s       zLazyNonNativeIr.hc                      s:   dd ddddgrgng  D t  jjdS )Nc                 S   s   g | ]}|rd | dqS r   r,   r   r,   r,   r1   r>   H  s   r   r   r   z+torch/csrc/lazy/core/internal_ops/ltc_ops.hr\   )Zlazy_non_native_ir_incZnon_native_ir_nodesr   r   )destZ!generate_non_native_lazy_ir_nodesr   r   r,   )r   r[   r9   r   r,   r1   r6   G  s      )(rM   rT   r   r   rR   r   re   r   r   native_functionsr'   r   r   r   r   sortedr"   r$   r%   r&   rE   r   r   r   r	   r   r   r   Zget_nop_selectorrC   Znative_function_class_namer   r4   r   ZGenLazyShapeInferenceDefinitionrV   r!   r    r   Zwrite_with_template).r   ry   rz   r{   r|   rZ   r[   r]   r^   rF   r_   r`   r   r   ra   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z	lv_tokensZlv_classZlv_nsr   fmZnative_yaml_pathZtags_yaml_pathZparsed_yamlr   r   Zparsed_backend_yamlr%   r&   selector
class_namerG   Zdispatch_keyr,   )r'   r$   r   r   r   r   r   r{   r(   r   r   r   r   r*   r:   r   r   r   r`   r[   r9   r   rz   rF   r   r]   r^   r   r   r1   rx   1  s    &

    


 	

4:   rx   __main__)Drn   rR   rs   rO   collectionsr   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r@   Ztorchgen.destr   Ztorchgen.api.lazyr   Ztorchgen.api.typesr   Ztorchgen.dest.lazy_irr   r   r   Ztorchgen.genr   r   Ztorchgen.modelr   r   r   Z!torchgen.selective_build.selectorr   Ztorchgen.utilsr   r   r   Ztorchgen.yaml_utilsr   Zgen_backend_stubsr   r    r!   r"   r#   re   rE   rV   rW   rX   r   rZ   r[   r]   r^   rF   r_   r`   ra   rq   rx   rb   r,   r,   r,   r1   <module>   s   4C  f  -
