o
    vZhV-                     @  s  d dl mZ d dlmZ d dlm  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rWd dlmZ edZ edZ!	d6d7ddZ"d8ddZ#d9dd Z$d:d"d#Z%d;d)d*Z&d<d-d.Z'd=d4d5Z(dS )>    )annotations)TYPE_CHECKINGN)	translate)	BaseCTypeBinding
NamedCTypeSymIntTtensorTVectorCType)CodeTemplate)ArgumentNativeFunctionOptionalType)FileManager   )CALL_DISPATCHextract_bindingsget_view_infomodifies_argumentsuse_derived)'NativeFunctionWithDifferentiabilityInfoa+  #define ${uppercase_op}_AVAILABLE
struct ${op} : public ${superclass} {
  ${op}(${constructor_args}) ${initializer_list}
  {}
  virtual ~${op}() override = default;
  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>> = ::std::nullopt,
      std::optional<std::vector<at::Tensor>> = ::std::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fr   include_namespacebool
camel_casereturnstrc                 C  st   | j j }|dd d}|r.|d}ddd |dddD }|r.d| }|r2dnd}| | S )N._Z
_view_func c                 S     g | ]}|  qS  )title).0pr!   r!   X/var/www/auris/lib/python3.10/site-packages/torchgen/packaged/autograd/gen_view_funcs.py
<listcomp>|       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/   t   s   

r/   argr   c                 C  s   | j  p	| j  S N)typeis_tensor_likeis_symint_like)r2   r!   r!   r%   is_symint_or_tensor   s   r7   bindingr   c                 C  s   t | j| j | j| jdS )N)r)   nctypeargumentdefault)r   r)   r9   remove_const_refr:   r;   )r8   r!   r!   r%   r<      s   r<   fnc                 C  s@   | j j}t|dksJ |d j d u}|d j }|o|S )Nr   r   )r(   returnslenr4   is_list_liker5   )r=   r>   Zreturns_list_likeZreturns_tensor_liker!   r!   r%   returns_multi_tensor   s
   rA   bindingslist[Binding]state_vec_typer    tuple[list[str], list[str], str]c              
   C  s  g }g }|j }||  d| d t| dkr|d g }t| D ]\}}t|jts1J |jj	 rd|j  d}|| | d| d|j  d|j  d	}	d
| d| d|j  d|j  d	}
nOt|jjt
rd|j  d}|| d|j  d}| d| d| d|j  d}	| d|j  d| d}
nd}|| | d|j  d}	|j  d| d}
||	 ||
 |t| d k r|d| d q%t|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
isinstancer:   r   r4   r@   r   r-   insert)rB   rD   Zgetter_logicZsetter_logicZ	state_vecZ	num_exprsibZnum_exprgettersetterZconditional	num_itemsr!   r!   r%   generate_state_getter_setter   sF   

 $




rT   templater   c                 C  sP  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 ]\}}|jj}t|t	sMJ |

| d
|j d q>d}|gdd |D }tj| jj |d}t| rd}d}| d| }|
| |
| |
| d |

| d
| d |d| d7 }t|
dkrdd|
 nd}dd |D }tdttt}t||\}}}dd |D }tdttt}t||\}}}|jd2i dt| dt| d d! d"d#d$|d%|d&|d'|d(|jd)|d*|d+|d,|jd-|d.|d/|d0|d1|S )3Nc                 S  s   g | ]	}|j d kr|qS )selfr)   r#   rP   r!   r!   r%   r&          z$process_function.<locals>.<listcomp>r   c                 S  s   g | ]	}t j|d dqS )T)Zremove_non_owning_ref_types)
dispatcherr:   )r#   ar!   r!   r%   r&      s    c                 S  r    r!   )defnrX   r!   r!   r%   r&      r'   c                 S  s   g | ]}|j qS r!   rW   rX   r!   r!   r%   r&      s    c                 S  s   g | ]}t |  d qS )rG   )r<   r\   rX   r!   r!   r%   r&      s    T)Zallow_expensive_conversionsrH   )Z
input_basec                 s  s    | ]}|j V  qd S r3   rW   rX   r!   r!   r%   	<genexpr>   s    z#process_function.<locals>.<genexpr>)r*   Zunpacked_argsZview_idxZint64_trF   rG   []r   z: z, r   c                 S  (   g | ]}t |jtr|jj r|qS r!   )rM   r:   r   r4   r6   rX   r!   r!   r%   r&         

Zsymintsc                 S  ra   r!   )rM   r:   r   r4   r5   rX   r!   r!   r%   r&     rb   ZtensorsopZuppercase_opF)r   
superclassztorch::autograd::ViewFunc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_callr!   )r   r(   	argumentsZflat_allr   zipr9   r)   rM   r   rK   exprr   
substituter*   rA   r?   r-   r   r
   r   r   rT   r	   r/   upper)r=   rU   rB   Znon_self_bindingsZnon_self_argsZnon_self_value_bindingsrg   rh   Zstate_variablesZ
init_exprsZinitializersrP   Z	init_exprr)   ro   Zop_call_argsrp   Zview_idx_nameZview_idx_typenameZview_idx_declre   Zsymint_bindingsZsymints_vec_typeri   rj   rk   Ztensor_bindingsZtensors_vec_typerl   rm   rn   r!   r!   r%   process_function   s   


 


	
rv   outfns_with_infos-list[NativeFunctionWithDifferentiabilityInfo]template_pathNonec              
     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#   r=   r!   r!   r%   r&   ;  rY   z"gen_view_funcs.<locals>.<listcomp>c                 S  s$   g | ]}t |d urt|s|qS r3   )r   r   r|   r!   r!   r%   r&   =  s    c                 S     g | ]}t |tqS r!   )rv   FUNCTION_DECLARATIONr|   r!   r!   r%   r&   A      c                 S  r}   r!   )rv   FUNCTION_DEFINITIONr|   r!   r!   r%   r&   B  r   c                 S  s   g | ]	}d |j  dqS )z#include <ATen/ops/z_ops.h>)Z	root_namer|   r!   r!   r%   r&   C  rY   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fnamer   r!   r%   <lambda>L  s   z gen_view_funcs.<locals>.<lambda>)r   Zwrite_with_template)rw   rx   rz   fnsZview_fnsZfile_basenamesuffixr!   r   r%   gen_view_funcs5  s"   r   )FT)r   r   r   r   r   r   r   r   )r2   r   r   r   )r8   r   r   r   )r=   r   r   r   )rB   rC   rD   r   r   rE   )r=   r   rU   r   r   r   )rw   r   rx   ry   rz   r   r   r{   ))
__future__r   typingr   Ztorchgen.api.dispatcherapirZ   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   Ztorchgen.api.autogradr   r~   r   r/   r7   r<   rA   rT   rv   r   r!   r!   r!   r%   <module>   s2    	4


	

3_