o
    0hV-                     @  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._
_view_func c                 S     g | ]}|  qS  )title).0pr"   r"   ]/var/www/vscode/kcb/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&   r0   t   s   

r0   argr   c                 C  s   | j  p	| j  S N)typeis_tensor_likeis_symint_like)r3   r"   r"   r&   is_symint_or_tensor   s   r8   bindingr   c                 C  s   t | j| j | j| jdS )N)r*   nctypeargumentdefault)r   r*   r:   remove_const_refr;   r<   )r9   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lenr5   is_list_liker6   )r>   r?   returns_list_likereturns_tensor_liker"   r"   r&   returns_multi_tensor   s
   rD   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*   appendcpp_typer@   	enumerate
isinstancer;   r   r5   rA   r   r.   insert)rE   rG   getter_logicsetter_logic	state_vec	num_exprsibnum_exprgettersetterconditional	num_itemsr"   r"   r&   generate_state_getter_setter   sF   

 $




r^   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$   rX   r"   r"   r&   r'          z$process_function.<locals>.<listcomp>r   c                 S  s   g | ]	}t j|d dqS )T)remove_non_owning_ref_types)
dispatcherr;   )r$   ar"   r"   r&   r'      s    c                 S  r!   r"   )defnrb   r"   r"   r&   r'      r(   c                 S  s   g | ]}|j qS r"   ra   rb   r"   r"   r&   r'      s    c                 S  s   g | ]}t |  d qS )rJ   )r=   rg   rb   r"   r"   r&   r'      s    T)allow_expensive_conversionsrK   )
input_basec                 s  s    | ]}|j V  qd S r4   ra   rb   r"   r"   r&   	<genexpr>   s    z#process_function.<locals>.<genexpr>)r+   unpacked_argsview_idxint64_trI   rJ   []r   z: z, r    c                 S  (   g | ]}t |jtr|jj r|qS r"   )rQ   r;   r   r5   r7   rb   r"   r"   r&   r'         

symintsc                 S  rq   r"   )rQ   r;   r   r5   r6   rb   r"   r"   r&   r'     rr   tensorsopuppercase_opF)r   
superclassztorch::autograd::ViewFuncinitializer_liststateconstructor_args
clone_argssymints_vecget_symintsset_symintsnum_symintstensors_vecget_tensorsset_tensorsnum_tensorscall_input_nameop_callr"   )r   r)   	argumentsflat_allr   zipr:   r*   rQ   r   rN   exprr   
substituter+   rD   r@   r.   r   r
   r   r   r^   r	   r0   upper)r>   r_   rE   non_self_bindingsnon_self_argsnon_self_value_bindingsrz   r{   state_variables
init_exprsinitializersrX   	init_exprr*   r   op_call_argsr   view_idx_nameview_idx_typenameview_idx_declrx   symint_bindingssymints_vec_typer}   r~   r   tensor_bindingstensors_vec_typer   r   r   r"   r"   r&   process_function   s   


 


	
r   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'   ;  rc   z"gen_view_funcs.<locals>.<listcomp>c                 S  s$   g | ]}t |d urt|s|qS r4   )r   r   r   r"   r"   r&   r'   =  s    c                 S     g | ]}t |tqS r"   )r   FUNCTION_DECLARATIONr   r"   r"   r&   r'   A      c                 S  r   r"   )r   FUNCTION_DEFINITIONr   r"   r"   r&   r'   B  r   c                 S  s   g | ]	}d |j  dqS )z#include <ATen/ops/z_ops.h>)	root_namer   r"   r"   r&   r'   C  rc   	ViewFuncsF)install_dirtemplate_dirdry_run)z.hz.cppc                     s"   dd   d   dS )N@zgenerated from /)generated_commentview_func_declarationsview_func_definitionsops_headers)template_dir_for_commentsr"   declarationsdefinitionsfmfnamer   r"   r&   <lambda>L  s   z gen_view_funcs.<locals>.<lambda>)r   write_with_template)r   r   r   fnsview_fnsfile_basenamesuffixr"   r   r&   gen_view_funcs5  s"   r   )FT)r   r   r   r   r   r   r   r   )r3   r   r   r   )r9   r   r   r   )r>   r   r   r   )rE   rF   rG   r   r   rH   )r>   r   r_   r   r   r   )r   r   r   r   r   r   r   r   ))
__future__r   typingr   torchgen.api.dispatcherapire   torchgen.api.translater   torchgen.api.typesr   r   r   r   r	   r
   torchgen.code_templater   torchgen.modelr   r   r   torchgen.utilsr   gen_inplace_or_view_typer   r   r   r   r   torchgen.api.autogradr   r   r   r0   r8   r=   rD   r^   r   r   r"   r"   r"   r&   <module>   s2    	4


	

3_