o
    ]i                     @  s   d dl mZ d dlZd dlm  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mZ d dlmZmZ ed	Zed
ZdddZd ddZed!ddZed"ddZdS )#    )annotationsN)cpp)CppSignatureGroup)with_native_function)parse_native_yaml)NativeFunctionTensorOptionsArgumentsVariant)FileManagermapMaybezstd::optional<(.+)>z(?:const\s+)?([A-Z]\w+)argument_typestrreturnc                 C  s   d
dd}t | }|d u}|r| |d|d } t| }|d u r*|| |S |d}| d |  d	| |d   }|||S )Ntyper   is_optboolr   c                 S  s   |rd|  dS | S )Nzstd::optional<> )r   r   r   r   G/home/app/PyTorch/test/pytorch/tools/autograd/gen_variable_factories.pymaybe_optional_type   s   z1fully_qualified_type.<locals>.maybe_optional_type   zat::)r   r   r   r   r   r   )OPTIONAL_TYPE_PATTERNmatchstartendTYPE_PATTERN)r   r   Z	opt_matchr   r   indexqualified_typer   r   r   fully_qualified_type   s   





r   outnative_yaml_pathtags_yaml_pathtemplate_pathNonec                   sD   t ||j}dd |D  t| |dddd fdd d S )Nc                 S  s   g | ]}t |r|qS r   )is_factory_function.0fnr   r   r   
<listcomp>.   s    z*gen_variable_factories.<locals>.<listcomp>F)install_dirtemplate_dirdry_runzvariable_factories.hc                     s0   dd   d dd  D ttt dS )N@zgenerated from z/variable_factories.hc                 S  s   g | ]	}d |j  dqS )z#include <ATen/ops/z.h>)	root_namer%   r   r   r   r(   6   s    z<gen_variable_factories.<locals>.<lambda>.<locals>.<listcomp>)generated_commentops_headersfunction_definitions)template_dir_for_commentslistr   process_functionr   Zfactory_functionsfmr   r   <lambda>3   s   z(gen_variable_factories.<locals>.<lambda>)r   native_functionsr
   write_with_template)r   r    r!   r"   r7   r   r4   r   gen_variable_factories(   s   r9   fr   r   c                 C  s4   t j| jvrdS t| j}t| }|p|dS )NF_like)	r	   functionvariantsr   namefuncpythonhas_tensor_optionsendswith)r:   r>   rA   r   r   r   r$   >   s
   
r$   
str | Nonec                 C  sL  t | j}t| }|p|d}tj| jvs|sd S t	j
| dd}|jg}|jd ur2||j d}|D ]m}g }g }	d}
| D ]B}t|j}|jr\|| d|j d|j  n|| d|j  t|jtr~|	d|j d	 |j d
}
qB|	|j qB|d|  dd| d|  dd|	 d|
 d7 }q6|S )Nr;   F)method false z = zat::TensorOptions(z).requires_grad(::std::nullopt)z.requires_grad()zinline at::Tensor (z, zW) {
  at::AutoDispatchBelowADInplaceOrView guard;
  return autograd::make_variable(at::z), /*requires_grad=*/z);
}
)r   r>   r?   r@   rA   rB   r	   r<   r=   r   from_native_function	signaturesymint_signatureappend	argumentsr   r   default
isinstanceargumentr   join)r:   r>   rA   Z
is_factorycpp_sigsZsigsrsigformalsexprsrequires_gradargr   r   r   r   r3   H   sJ   


 r3   )r   r   r   r   )
r   r   r    r   r!   r   r"   r   r   r#   )r:   r   r   r   )r:   r   r   rC   )
__future__r   retorchgen.api.pythonapir@   torchgen.apir   torchgen.api.typesr   torchgen.contextr   torchgen.genr   torchgen.modelr   r   r	   torchgen.utilsr
   r   compiler   r   r   r9   r$   r3   r   r   r   r   <module>   s"   



	