U
    Mh-                     @   sN  d dl mZmZ d dlm  mZ d dlmZ d dl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 d dlmZ d	d
lmZmZmZmZmZ edZedZ d$ee!e!e"dddZ#ee!dddZ$eedddZ%ee!dddZ&ee eeee" ee" e"f dddZ'eee"ddd Z(e"ee e"dd!d"d#Z)dS )%    )ListTupleN)'NativeFunctionWithDifferentiabilityInfo)	translate)	BaseCTypeBinding
NamedCTypeSymIntTtensorTVectorCType)CodeTemplate)ArgumentNativeFunctionOptionalType)FileManager   )CALL_DISPATCHextract_bindingsget_view_infomodifies_argumentsuse_deriveda!  #define ${uppercase_op}_AVAILABLE
struct ${op} : public ${superclass} {
  ${op}(${constructor_args}) ${initializer_list}
  {};
  virtual ~${op}() override {};
  virtual std::vector<c10::SymInt> get_symints() const override;
  virtual size_t num_symints() const override;
  virtual std::vector<at::Tensor> get_tensors() const override;
  virtual size_t num_tensors() const override;
  virtual at::Tensor operator()(const at::Tensor&) const override;
  virtual std::unique_ptr<ViewFunc> clone_and_set(
      std::optional<std::vector<c10::SymInt>> = c10::nullopt,
      std::optional<std::vector<at::Tensor>> = c10::nullopt) const override;

protected:
  virtual void set_symints(std::vector<c10::SymInt>) override;
  virtual void set_tensors(std::vector<at::Tensor>) override;

private:
  ${state}
};

a  std::vector<c10::SymInt> ${op}::get_symints() const {
  ${get_symints}
}

size_t ${op}::num_symints() const {
  return static_cast<size_t>(${num_symints});
}

void ${op}::set_symints(std::vector<c10::SymInt> ${symints_vec}) {
  TORCH_INTERNAL_ASSERT(${symints_vec}.size() == num_symints());
  ${set_symints}
}

std::vector<at::Tensor> ${op}::get_tensors() const {
  ${get_tensors}
}

size_t ${op}::num_tensors() const {
  return static_cast<size_t>(${num_tensors});
}

void ${op}::set_tensors(std::vector<at::Tensor> ${tensors_vec}) {
  TORCH_INTERNAL_ASSERT(${tensors_vec}.size() == num_tensors());
  ${set_tensors}
}

at::Tensor ${op}::operator()(const at::Tensor& ${call_input_name}) const {
  return ${op_call};
}

std::unique_ptr<ViewFunc> ${op}::clone_and_set(
    std::optional<std::vector<c10::SymInt>> ${symints_vec},
    std::optional<std::vector<at::Tensor>> ${tensors_vec}) const {
  auto output = std::make_unique<${op}>(${clone_args});
  if (${symints_vec}.has_value()) {
    output->set_symints(std::move(*(${symints_vec})));
  }
  if (${tensors_vec}.has_value()) {
    output->set_tensors(std::move(*(${tensors_vec})));
  }
  return output;
}

FT)finclude_namespace
camel_casereturnc                 C   st   | j j }|dd d}|r\|d}ddd |dddD }|r\d| }|rddnd}| | S )N._Z
_view_func c                 S   s   g | ]}|  qS  )title).0pr   r   [/var/www/html/venv/lib/python3.8/site-packages/torchgen/packaged/autograd/gen_view_funcs.py
<listcomp>v   s     z"view_func_name.<locals>.<listcomp>ztorch::autograd::generated::)funcnameunambiguous_namereplace
startswithjoinsplit)r   r   r   r%   view_func_name
is_private	namespacer   r   r"   r+   n   s    

r+   )argr   c                 C   s   | j  p| j  S N)typeis_tensor_likeis_symint_like)r.   r   r   r"   is_symint_or_tensor   s    r3   )bindingr   c                 C   s   t | j| j | j| jdS )N)r%   nctypeargumentdefault)r   r%   r5   remove_const_refr6   r7   )r4   r   r   r"   r8      s    r8   )fnr   c                 C   s@   | j j}t|dkst|d j d k	}|d j }|o>|S )Nr   r   )r$   returnslenAssertionErrorr0   is_list_liker1   )r9   r:   Zreturns_list_likeZreturns_tensor_liker   r   r"   returns_multi_tensor   s
    r>   )bindingsstate_vec_typer   c              
   C   s   g }g }|j }||  d| d t| dkr>|d g }t| D ]T\}}t|jtsdt|jj	
 r|j  d}|| | d| d|j  d|j  d	}	d
| d| d|j  d|j  d	}
nt|jj	tr8d|j  d}|| d|j  d}| d| d| d|j  d}	| d|j  d| d}
n2d}|| | d|j  d}	|j  d| d}
||	 ||
 |t| d k rJ|d| d qJt|dkrdnd|}t| dkr|d| d| d |d| d |||fS ) N ;r   zauto i = 0;z.size()z.insert(z.end(), z
.begin(), z.end());z
std::copy(z.begin() + i, z.begin() + i + z	.size(), z
.begin());(z.has_value() ? 1 : 0)zif(z.has_value())z
.end(), *(z));z = z[i];1z.push_back(z);r   zi += 0z + z	.reserve(zreturn )r%   appendZcpp_typer;   	enumerate
isinstancer6   r   r<   r0   r=   r   r)   insert)r?   r@   Zgetter_logicZsetter_logicZ	state_vecZ	num_exprsibZnum_exprgettersetterZconditional	num_itemsr   r   r"   generate_state_getter_setter   sD    

 $



rO   )r9   templater   c                 C   s  t | }dd |D }| jjjdd  }dd |D }dd |D }dd |D }dd |D }t||dd	}	g }
t||	D ]6\}}|jj}t|t	st
|
| d
|j d q|d}|fdd |D }tj| jj |d}t| rLd}d}| d| }|| || || d |
| d
| d |d| d7 }t|
dkrjdd|
 nd}dd |D }tdttt}t||\}}}dd |D }tdttt}t||\}}}|jt| t| dd d |||||j||||j|||||d!S )"Nc                 S   s   g | ]}|j d kr|qS )selfr%   r    rK   r   r   r"   r#      s     
 z$process_function.<locals>.<listcomp>r   c                 S   s   g | ]}t j|d dqS )T)Zremove_non_owning_ref_types)
dispatcherr6   )r    ar   r   r"   r#      s    c                 S   s   g | ]}|  qS r   )defnrS   r   r   r"   r#      s     c                 S   s   g | ]
}|j qS r   rR   rS   r   r   r"   r#      s     c                 S   s   g | ]}t |  d qS )rB   )r8   rV   rS   r   r   r"   r#      s    T)Zallow_expensive_conversionsrC   )Z
input_basec                 s   s   | ]}|j V  qd S r/   rR   rS   r   r   r"   	<genexpr>   s     z#process_function.<locals>.<genexpr>)r&   Zunpacked_argsZview_idxZint64_trA   rB   []r   z: z, r   c                 S   s(   g | ] }t |jtr|jj r|qS r   )rH   r6   r   r0   r2   rS   r   r   r"   r#     s    Zsymintsc                 S   s(   g | ] }t |jtr|jj r|qS r   )rH   r6   r   r0   r1   rS   r   r   r"   r#     s    ZtensorsF)r   ztorch::autograd::ViewFunc)opZuppercase_opZ
superclassinitializer_liststateconstructor_args
clone_argsZsymints_vecget_symintsset_symintsnum_symintsZtensors_vecget_tensorsset_tensorsnum_tensorscall_input_nameop_call)r   r$   	argumentsZflat_allr   zipr5   r%   rH   strr<   rF   exprr   
substituter&   r>   r;   r)   r   r   r   r	   rO   r
   r+   upper)r9   rP   r?   Znon_self_bindingsZnon_self_argsZnon_self_value_bindingsr^   r_   Zstate_variablesZ
init_exprsZinitializersrK   Z	init_exprr%   rf   Zop_call_argsrg   Zview_idx_nameZview_idx_typenameZview_idx_declr\   Zsymint_bindingsZsymints_vec_typer`   ra   rb   Ztensor_bindingsZtensors_vec_typerc   rd   re   r   r   r"   process_function   s      



" 
 
rn   )outfns_with_infostemplate_pathr   c              
      s   dd |D }dd |D }dd |D  dd |D dd |D d}t | |dd	d
D ]*}||  fdd q\d S )Nc                 S   s   g | ]}t |r|jqS r   )r   r$   r    r9   r   r   r"   r#   5  s      z"gen_view_funcs.<locals>.<listcomp>c                 S   s$   g | ]}t |d k	rt|s|qS r/   )r   r   rr   r   r   r"   r#   7  s      c                 S   s   g | ]}t |tqS r   )rn   FUNCTION_DECLARATIONrr   r   r   r"   r#   ;  s     c                 S   s   g | ]}t |tqS r   )rn   FUNCTION_DEFINITIONrr   r   r   r"   r#   <  s     c                 S   s   g | ]}d |j  dqS )z#include <ATen/ops/z_ops.h>)Z	root_namerr   r   r   r"   r#   =  s     Z	ViewFuncsF)Zinstall_dirZtemplate_dirdry_run)z.hz.cppc                      s"   dd   d   dS )N@zgenerated from /)Zgenerated_commentZview_func_declarationsZview_func_definitionsops_headers)Ztemplate_dir_for_commentsr   ZdeclarationsZdefinitionsfmfnamerx   r   r"   <lambda>F  s    z gen_view_funcs.<locals>.<lambda>)r   Zwrite_with_template)ro   rp   rq   ZfnsZview_fnsZfile_basenamesuffixr   ry   r"   gen_view_funcs/  s     r~   )FT)*typingr   r   Ztorchgen.api.dispatcherapirT   Ztorchgen.api.autogradr   Ztorchgen.api.translater   Ztorchgen.api.typesr   r   r   r	   r
   r   Ztorchgen.code_templater   Ztorchgen.modelr   r   r   Ztorchgen.utilsr   Zgen_inplace_or_view_typer   r   r   r   r   rs   rt   boolrj   r+   r3   r8   r>   rO   rn   r~   r   r   r   r"   <module>   sF    4     	3`