
    sg~                    @   d dl mZ d dlmZ d dlmZmZmZ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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!m"Z" d dl#m$Z$m%Z% d dl&m'Z' dd	l(m)Z)  e"d
      Z* e"d      Z+ e"d      Z, e"d      Z- e"d      Z. e"d      Z/ e"d      Z0 e"d      Z1 e"d      Z2 e"d      Z3 e"d      Z4 e"d      Z5 e"d      Z6 e"d      Z7 e"d      Z8 e"d      Z9 e"d      Z: e"d      Z; e"d      Z<dZ=dZ>dZ?d Z@d!ZAd"ZBd#ZCd$ZDd%ZEd&ZFd'ZGd(ZHd)ZId*ZJ e ee            e;eDf e ee            e;eEf ee      e6eFf e ee            e;eFf ee      e6eGf ee      e6eIf e ee            e;eIfiZKe)ZL	 	 	 	 d0d+ZM	 	 	 	 	 	 	 	 d1d,ZN	 	 	 	 	 	 	 	 d1d-ZOd2d.ZPy/)3    )annotations)Sequence)
DerivativeDifferentiabilityInfoSavedAttributeuses_retain_variablesuses_single_grad)ArrayRefCTypeBaseCppType	BaseCTypeBindingboolTdoubleTintArrayRefTiTensorListRefT	ListCTypelongTMutRefCTypeOptionalCTypeoptionalIntArrayRefToptionalSymIntArrayRefTscalarTstringTsymIntArrayRefTSymIntTTENSOR_LIST_LIKE_CTYPEStensorListTtensorTVectorCType)CodeTemplate)ArgumentFunctionSchema)FileManager   )VIEW_FUNCTIONSa_  #ifdef _WIN32
struct ${op} : public ${superclass} {
  TORCH_API ${op}() = default;
#else
struct TORCH_API ${op} : public ${superclass} {
#endif
  using ${superclass}::${superclass};
  variable_list apply(variable_list&& grads) override;
  std::string name() const override { return "${op}"; }
  void release_variables() override {
    ${thread_lock}
    ${release_variables}
  }
  ${will_release_variables}
  void compiled_args(CompiledNodeArgs& args) override;
  variable_list apply_with_saved(const variable_list& inputs, SwapSavedVariables& saved) override;
  ${saved_variables}
  ${saved_list_sizes}
};
zebool retain_variables = true;
void will_release_variables() override {
  retain_variables = false;
}
a  variable_list ${op}::apply(variable_list&& grads) {
  ${thread_lock}
  ${asserts}
  IndexRangeGenerator gen;
  ${compute_index_ranges}
  variable_list grad_inputs(gen.size());
  ${body}
  return grad_inputs;
}
void ${op}::compiled_args(CompiledNodeArgs& args) {
    ${compiled_args}
}
variable_list ${op}::apply_with_saved(const variable_list& grads, SwapSavedVariables& saved) {
    ${apply_with_saved_before}
    variable_list result = apply(variable_list(grads));
    ${apply_with_saved_after}
    return result;
}
zB  auto grad_input_mask = std::array<bool, ${n}>{
    ${masks}
  };zif (task_should_compute_output({ ${name}_ix })) {
  auto grad_result = ${derivative};
  copy_range(grad_inputs, ${name}_ix, grad_result);
}
as  if (task_should_compute_output({ ${name}_ix })) {
  std::vector<Tensor> grad_result;
  grad_result.reserve(grads.size());
  for (const auto & i : c10::irange(grads.size())) {
    if (grads[i].defined()) {
      grad_result.emplace_back(${derivative});
    } else {
      grad_result.emplace_back(Tensor());
    }
  }
  copy_range(grad_inputs, ${name}_ix, grad_result);
}
z~  if (task_should_compute_output({ ${name}_ix })) {
    copy_range(grad_inputs, ${name}_ix, std::get<${i}>(grad_result));
  }
zif (task_should_compute_output({ ${idx_ranges} })) {
  ${grad_input_mask}
  auto grad_result = ${derivative};
  ${copy_ranges}
}
z`static PyTypeObject ${op}Class;
addClass<${op}>(module, ${op}Class, "${op}", ${op}_properties);
z${all_getter_definitions}

static struct PyGetSetDef ${op}_properties[] = {
  THP_FUNCTION_DEFAULT_PROPERTIES,
  ${all_getsetdef_structs}
  {nullptr} /* sentinel */
};

zU{(char*)"_saved_${name}", (getter)THP${op}_${name}_getter, nullptr, nullptr, nullptr}z]{(char*)"_raw_saved_${name}", (getter)THP${op}_${name}_raw_getter, nullptr, nullptr, nullptr}zPyObject* THP${op}_${name}_getter(THPCppFunction *self, void *_unused) {
  HANDLE_TH_ERRORS
  auto prop = static_cast<${op}*>(self->cdata.get())->${name};
  ${body}
  END_HANDLE_TH_ERRORS
}
zPyObject* THP${op}_${name}_getter(THPCppFunction *self, void *_unused) {
  HANDLE_TH_ERRORS
  const auto& prop = static_cast<${op}*>(self->cdata.get())->${name}_;
  ${body}
  END_HANDLE_TH_ERRORS
}
zPyObject* THP${op}_${name}_raw_getter(THPCppFunction *self, void *_unused) {
  HANDLE_TH_ERRORS
  const auto& prop = static_cast<${op}*>(self->cdata.get())->${name}_;
  ${body}
  END_HANDLE_TH_ERRORS
}
aW  PyObject* THP${op}_${name}_getter(THPCppFunction *self, void *_unused) {
  HANDLE_TH_ERRORS
  const auto *node = static_cast<${op}*>(self->cdata.get());
  const auto& prop = node->${name}_;
  if (node->${name}_released_) {
    PyErr_SetString(PyExc_RuntimeError, ERR_BACKWARD_TWICE);
    return nullptr;
  }
  ${body}
  END_HANDLE_TH_ERRORS
}
a[  PyObject* THP${op}_${name}_raw_getter(THPCppFunction *self, void *_unused) {
  HANDLE_TH_ERRORS
  const auto *node = static_cast<${op}*>(self->cdata.get());
  const auto& prop = node->${name}_;
  if (node->${name}_released_) {
    PyErr_SetString(PyExc_RuntimeError, ERR_BACKWARD_TWICE);
    return nullptr;
  }
  ${body}
  END_HANDLE_TH_ERRORS
}
a  PyObject* THP${op}_${name}_getter(THPCppFunction *self, void *_unused) {
  HANDLE_TH_ERRORS
  auto opt_prop = static_cast<${op}*>(self->cdata.get())->${name};
  if (!opt_prop.has_value()) {
    Py_RETURN_NONE;
  }
  auto prop = opt_prop.value();
  ${body}
  END_HANDLE_TH_ERRORS
}
a#  PyObject* THP${op}_${name}_getter(THPCppFunction *self, void *_unused) {
  HANDLE_TH_ERRORS
  auto opt_prop = static_cast<${op}*>(self->cdata.get())->${name};
  if (!opt_prop.list.has_value()) {
    Py_RETURN_NONE;
  }
  auto prop = opt_prop.list.value();
  ${body}
  END_HANDLE_TH_ERRORS
}
z3return THPVariable_Wrap(prop.unpack(self->cdata));
zspybind11::object obj = pybind11::cast(prop, pybind11::return_value_policy::reference);
return obj.release().ptr();
zPyObject* tup = PyTuple_New((Py_ssize_t) prop.size());
for (auto i: c10::irange(prop.size())) {
  PyTuple_SetItem(tup, (Py_ssize_t) i, THPVariable_Wrap(prop[i].unpack(self->cdata)));
}
return tup;
a  PyObject* tup = PyTuple_New((Py_ssize_t) prop.size());
for (auto i : c10::irange(prop.size())) {
  pybind11::object obj = pybind11::cast(prop[i], pybind11::return_value_policy::reference);
  PyTuple_SetItem(tup, (Py_ssize_t) i, obj.release().ptr());
}
return tup;
zPyObject* tup = PyTuple_New((Py_ssize_t) prop.size());
for (auto i : c10::irange(prop.size())) {
  PyTuple_SetItem(tup, (Py_ssize_t) i, PyLong_FromUnsignedLong((uint64_t) prop[i]));
}
return tup;
at  PyObject* tup = PyTuple_New((Py_ssize_t) prop.size());
for (auto i : c10::irange(prop.size())) {
    auto si = prop[i];
    if (auto m = si.maybe_as_int()) {
      PyTuple_SetItem(tup, (Py_ssize_t) i, PyLong_FromUnsignedLong(*m));
    } else {
      auto py_symint = py::cast(si).release().ptr();
      PyTuple_SetItem(tup, (Py_ssize_t) i, py_symint);
    }
}
return tup;
zPyObject* tup = PyTuple_New((Py_ssize_t) prop.size());
for (auto i : c10::irange(prop.size())) {
  PyTuple_SetItem(tup, (Py_ssize_t) i, PyFloat_FromDouble((double) prop[i]));
}
return tup;
z0return PyLong_FromUnsignedLong((int64_t) prop);
z~if (auto m = prop.maybe_as_int()) {
  return PyLong_FromUnsignedLong(*m);
} else {
  return py::cast(prop).release().ptr();
}
z*return PyFloat_FromDouble((double) prop);
z<if (prop) {
  Py_RETURN_TRUE;
} else {
  Py_RETURN_FALSE;
}
z>return PyUnicode_FromStringAndSize(prop.data(), prop.size());
a  if (prop.isComplex()) {
  auto cprop = prop.to<c10::complex<double>>();
  return PyComplex_FromDoubles(cprop.real(), cprop.imag());
} else if (prop.isFloatingPoint()) {
  return PyFloat_FromDouble(prop.to<double>());
} else if (prop.isIntegral(/*includeBool=*/false)) {
  return PyLong_FromLong(prop.to<int64_t>());
} else if (prop.isBoolean()) {
  if (prop.to<bool>()) {
    Py_RETURN_TRUE;
  } else {
    Py_RETURN_FALSE;
  }
} else {
  PyErr_SetString(PyExc_RuntimeError, "Unknown scalar type");
  return nullptr;
}
a  PyObject* tup = PyTuple_New((Py_ssize_t) prop.size());
for (auto i: c10::irange(prop.size())) {
  if (prop[i].isComplex()) {
    auto cprop = prop[i].to<c10::complex<double>>();
    PyTuple_SetItem(tup, (Py_ssize_t) i, PyComplex_FromDoubles(cprop.real(), cprop.imag()));
  } else if (prop[i].isFloatingPoint()) {
    auto double_prop = prop[i].to<double>();
    PyTuple_SetItem(tup, (Py_ssize_t) i, PyFloat_FromDouble(double_prop));
  } else if (prop[i].isIntegral(/*includeBool=*/false)) {
    auto long_prop = prop[i].to<int64_t>();
    PyTuple_SetItem(tup, (Py_ssize_t) i, PyLong_FromLong(long_prop));
  } else if (prop[i].isBoolean()) {
    if (prop[i].to<bool>()) {
      PyTuple_SetItem(tup, (Py_ssize_t) i, Py_True);
    } else {
      PyTuple_SetItem(tup, (Py_ssize_t) i, Py_False);
    }
  } else {
    PyErr_SetString(PyExc_RuntimeError, "Unknown scalar type");
    return nullptr;
  }
}
return tup;
c                    | j                         D cg c]  }|j                         D ]  }|  }}}t        t        d |            S c c}}w )Nc                    | j                   S N)args_with_derivativesinfos    d/var/www/html/venv/lib/python3.12/site-packages/torchgen/packaged/autograd/gen_autograd_functions.py<lambda>z1get_infos_with_derivatives_list.<locals>.<lambda>  s    D$>$>     )valueslistfilter)differentiability_infosdiffinfo_dictr+   diff_info_lists       r,   get_infos_with_derivatives_listr5     sb    
 5;;=!((*  	N  >OPPs   Ac           	       	
 t        |      }|D cg c]  }t        |t               c}|D cg c]  }t        |t               c}d}t	        | |d      	dD ]   }||z   
	j                  

	
fd       " yc c}w c c}w )zFunctions.h and Functions.cpp body

    These contain the auto-generated subclasses of torch::autograd::Node
    for each every differentiable torch function.
    	FunctionsFinstall_dirtemplate_dirdry_run)z.hz.cppc                 @    ddj                          dz   z    dS )N@generated from /)generated_commentautograd_function_declarationsautograd_function_definitions)template_dir_for_comments)declarationsdefinitionsfmfnames   r,   r-   z,gen_autograd_functions_lib.<locals>.<lambda>  s9    %(#B$@$@$B#C1E&F& 3?1< r.   N)r5   process_functionFUNCTION_DECLARATIONFUNCTION_DEFINITIONr#   write_with_template)outr2   template_pathinfosffile_basenamesuffixrD   rE   rF   rG   s          @@@@r,   gen_autograd_functions_librR     s     ,,CDEGLM!$Q(<=MLEJK#A':;KKM	=%	PB  
&

	

 NKs
   BBc           
         t        | |d      dj                  dfd       t        |      }j                  d|d dd	d
j	                          dz   id ddh       y )NFr8      zpython_functions.hc                     ddj                          dz   t              D  cg c]  } d|  d
 c} t              D  cg c]  } d|  d
 c} dS c c} w c c} w )	Nr=   r>   z/python_functions.hz(void initialize_autogenerated_functions_z(PyObject* module);#initialize_autogenerated_functions_z	(module);)r@   shard_forward_declare
shard_call)rC   range)irF   
num_shardss    r,   r-   z/gen_autograd_functions_python.<locals>.<lambda>  s    !$ < < >??RS"T z*& ;1#=PQ& z* 6aS	B
 &s   AAzpython_functions.cppc                    | j                   S r(   )namer*   s    r,   r-   z/gen_autograd_functions_python.<locals>.<lambda>  s
    DII r.   r@   r=   r>   z/python_functions.cppc                H    t        | t              gt        | t              gdS )N)py_function_initializerspy_function_props_and_getters)rH   PY_FUNCTION_DEFINITIONPY_FUNCTION_PROPS_AND_GETTERSr*   s    r,   r-   z/gen_autograd_functions_python.<locals>.<lambda>  s+     '=>) !'DE.	#
 r.   r_   r`   )key_fnbase_envenv_callabler[   sharded_keys)r#   writer5   write_shardedrC   )rL   r2   rM   rN   rF   r[   s       @@r,   gen_autograd_functions_pythonri     s    
 
=%	PBJHH	
$ ,,CDE% < < >??TU"V

 02QR#  r.   c                    g g g }g g g }g g g g g  j                   D ]g  }|j                  t        v r/|j                   d}|j	                  d|j                   d       nd}|j	                  d|j                   d| d       i d f
d}t         j                  d	 
      D ]  } ||d        t         j                  d 
      D ]  } ||d        t              dkD  rd}nd}t               rt        j                         }	nd}	g }
t               r|
j	                  d       n-|
j                   fdt         j                        D               	 	 	 	 	 	 d fd}|
j                         d} j                  D ].  } || j                         \  }}|
j	                  |       ||z  }0 |r&|
j!                  t         j                         d        j                  t"        v rd}nd}t              dk7  rdj%                        dz   nd}dj%                        }|j                   j&                  ||||	|
|||      S )N_size_zsize_t z_size_;1auto z_ix = gen.range();c           	     :  
 | j                   j                  }| j                   j                  }d}d}|}d}|t        t              k(  sS|t        t        t                    k(  s8|t        t        t        t                          k(  s|t        t              k(  r|rd}j                  d| d       j                  | d       |rdnd}j                  d| d	| d
| d       j                  t        j                  j                  |t                     j                  t        j                  j                  |t                     d}| d}n|t        t              k(  s.|t        t               k(  s|t#        t        t                    k(  r_|t#        t        t                    k(  rGj$                  j$                  j                  j                  j&                  j)                  d      r|sJ d}j                  d| d       j                  d| d       j                  | d       j                  | d       |rdnd}j                  d| d| d| d       j                  d| d       j                  t*        j                  j                  |t,                     j                  t.        j                  j                  |t0                     d}| d}n|t3        t        t        t                          k(  rd}j                  d| d       j                  d| d       j                  | d       j                  | d       j                  d| d| d       j                  d| d       j                  t*        j                  j                  |t,                     j                  t.        j                  j                  |t0                     d}| d}n|t        t4              k(  rLj                  d| d       j                  t6        j                  j                  |t8                     nk|t        t:              k(  rLj                  d| d       j                  t6        j                  j                  |t<                     n|t        t>              k(  rLj                  d| d       j                  t@        j                  j                  |t8                     n|t        tB              k(  rLj                  d| d       j                  t@        j                  j                  |t<                     nQ|t        t        t4                    k(  rLj                  d| d       j                  t@        j                  j                  |t8                     n|t        t        t:                    k(  rLj                  d| d       j                  t@        j                  j                  |t<                     n|t        tE        t        tF                          k(  rLj                  d | d       j                  t@        j                  j                  |tH                     n|t        tJ              k(  r\j                  |jM                          d!| d"       j                  t6        j                  j                  |tN                     n|t        tP              k(  rLj                  d#| d       j                  t6        j                  j                  |tR                     nG|t        tT              k(  rLj                  d$| d       j                  t6        j                  j                  |tV                     n|t        t        tT                    k(  rLj                  d%| d       j                  tX        j                  j                  |tV                     n|tE        t        t[        d&d'(      )      *      k(  ryj                  d+| d       j                  d| d       j                  | d,       j                  t]        d-      j                  j                  |t^                     nd.|jM                         ja                         vrDd/|jM                         ja                         vr$d0|jM                         vrd1|jM                         vsJ |jM                          d2       j                  |jM                          d!| d       |tb        v r:tb        |   \  }	}
j                  |	j                  j                  ||
             nd}|r0j                  td        j                  j                  |3             |r0j                  tf        j                  j                  |3             |rj                  d4| d5|rd6nd7 d       nj                  d4| d       j                  d8| d       j                  d9| d       y ):NTFzSavedVariable z_;z_.reset_data();zshared_from_this() rm   z = z	_.unpack(rn   )opr]   body__foreachzstd::vector<SavedVariable> zbool z_released_ = false;z
_.clear();z_released_ = true;nullptrz = unpack_list(z_, zTORCH_CHECK(!z _released_, ERR_BACKWARD_TWICE);z = unpack_opt_list(z_);zstd::vector<int64_t> ;zstd::vector<c10::SymInt> zc10::OptionalArray<int64_t> z c10::OptionalArray<c10::SymInt> zc10::OptionalArray<double>  z = 0;zc10::SymInt zstd::string zstd::optional<std::string> atScalar)nsr]   )type)elemzstd::vector<at::Scalar> z	.clear();ar  PyObject* THP${op}_${name}_getter(THPCppFunction *self, void *_unused) {
  HANDLE_TH_ERRORS
  const auto *node = static_cast<${op}*>(self->cdata.get());
  const auto& prop = node->${name};
  if (node->${name}_released_) {
    PyErr_SetString(PyExc_RuntimeError, ERR_BACKWARD_TWICE);
    return nullptr;
  }
  ${body}
  END_HANDLE_TH_ERRORS
}
                            refview*&z. looks like it contains a non-owning reference)rq   r]   zargs.collect(, truefalsezsaved.before(zsaved.after()4nctyper]   r{   r   r   r   r   r   appendGETTER_DEFINITION_SAVEDVAR
substituterq   GETTER_BODY_SAVEDVARGETTER_DEFINITION_RAW_SAVEDVARGETTER_BODY_RAW_SAVEDVARr   r   r   funcbase
startswithGETTER_DEFINITION_VEC_SAVEDVARGETTER_BODY_VEC_SAVEDVAR"GETTER_DEFINITION_RAW_VEC_SAVEDVARGETTER_BODY_RAW_VEC_SAVEDVARr   r   GETTER_DEFINITIONGETTER_BODY_ARRAYREF_LONGr   GETTER_BODY_ARRAYREF_SYMINTr   GETTER_DEFINITION_OPT_ARRAYREFr   r
   r   GETTER_BODY_ARRAYREF_DOUBLEr   cpp_typeGETTER_BODY_INT64_Tr   GETTER_BODY_SYMINTr   GETTER_BODY_STRINGGETTER_DEFINITION_OPTr   r    GETTER_BODY_VEC_SCALARlowerMISC_GETTER_DEFSPY_GETSETDEF_STRUCTPY_RAW_GETSETDEF_STRUCT)var	is_outputr]   r{   should_append_getsetdefshould_append_raw_getsetdef
visit_nameuses_cpp_saved_variable_clsptr
getter_defrr   apply_with_saved_afterapply_with_saved_beforeassertscompiled_argsgetter_definitionsr+   py_getsetdef_structsrelease_variablessaved_variablesunpacks              r,   save_varz"process_function.<locals>.save_var3  s	   zzzz"&&+#
&+# Ig&&}Yw%788{=71C#DEE	'**y*.'""^D6#<=$$v_%=>*3&CMME$s4&	#bAB%%*55wwT0D 6 
 %%.99wwT0H : 
 +/' 6JIk**y11{9W#566 {9W#566IINN'',,11<<ZHYV*.'""%@b#IJ""U4&0C#DE $$vZ%89$$v-?%@A*3&CMME$tfCuBGHNN]4&0PQR%%.99wwT0H : 
 %%2==wwT0L > 
 +/' 6JY}Yw-?@AA*.'""%@b#IJ""U4&0C#DE $$vZ%89$$v-?%@AMME$':4&DENN]4&0PQR%%.99wwT0H : 
 %%2==wwT0L > 
 +/' 6JY|,,""%:4&#BC%%!,,wwT0I - 
 Y//""%>tfA#FG%%!,,wwT0K - 
 Y344""%A$q#IJ%%.99wwT0I : 
 Y677""%EdV1#MN%%.99wwT0K : 
 ]9\#:;;""%A$q#IJ%%.99wwT0I : 
 ]9_#=>>""%EdV1#MN%%.99wwT0K : 
 ]=71C#DEE""%@a#HI%%.99wwT0K : 
 Yu%%""dmmo%6avU#CD%%!,,wwT0C - 
 Yw''""\$q#9:%%!,,wwT0B - 
 Yw''""\$q#9:%%!,,wwT0B - 
 ]9W#566""%@a#HI%%%00wwT0B 1 
 ]t( CD
 
 ""%=dV1#EF""U4&0C#DE $$vY%78 %%  *ww/  6 T]]_2244$--/"7"7"99t}}.t}}.	R
 --/""PQR/
 ""dmmo%6avQ#?@''#3D#9 
D"))))TWW4d)K +0'" ''#..$''.E ' '''22dggD2I '  
|2	fw-OrR   =B!?@&&zl"'EF%%ZL&CDr.   c                @    t        | j                  j                        S r(   strr   r]   sas    r,   r-   z"process_function.<locals>.<lambda>&  s    C		<O r.   )keyF)r   c                @    t        | j                  j                        S r(   r   r   s    r,   r-   z"process_function.<locals>.<lambda>(  s    S=P r.   Tr   z)std::lock_guard<std::mutex> lock(mutex_);rp   zconst auto& grad = grads[0];c              3  b   K   | ]&  }d | dj                   j                  |       d ( yw)zconst auto& z	 = grads[z];N)available_named_gradientsindex).0r]   r+   s     r,   	<genexpr>z#process_function.<locals>.<genexpr>=  s;      
 4&	$*H*H*N*Nt*T)UUWX
s   ,/c                4   | j                   }| j                  }t        |      dk(  rd}d|vrz|D cg c]  }|j                  |d   k(  s| }}t        |      dk(  rJ|d   }t	        |j
                  t              r+t        |j
                  j                        dv r
d|z   dz   }d}j                  j                  d	      rt        }nt        }||j                  |d   |
      fS d|v r4|D cg c]  }d| d
 }	}t        j                  |	t        |            }
nd}
dj                  d |D              }g }t        |      D ]+  \  }}|j!                  t"        j                  ||             - dt$        j                  ||||
      fS c c}w c c}w )Nr$   Fnot_implementedr   )TensorzTensor?zany_grad_defined ? (z) : Tensor()T	_foreach_)r]   
derivativegrad_input_maskztask_should_compute_output({ z_ix }),)masksnrp   r   c              3  &   K   | ]	  }| d   yw)_ixN )r   r   s     r,   r   z<process_function.<locals>.emit_derivative.<locals>.<genexpr>h  s     "@aS9"@s   )r]   rZ   )
idx_rangescopy_rangesr   r   )formula	var_nameslenr]   
isinstanceargumentr!   r   r{   r   DERIVATIVE_SINGLE_FOREACHDERIVATIVE_SINGLEr   GRAD_INPUT_MASKjoin	enumerater   DERIVATIVE_MULTI_COPY_RANGEDERIVATIVE_MULTI)r   r)   r   r   checks_any_grad_definedargmatching_argsderivative_templater   r   r   r   r   rZ   r+   s                 r,   emit_derivativez)process_function.<locals>.emit_derivativeB  s    $$((	y>Q&+# /#8!CHH	RS<TC! ! }%*'*C!#,,9c))?.?/ #97"B^"S26/yy##K0&?#&7#'#..IaLW.U 
 !G+JSEF4QCx@  #2"<"<3y> #= # #%"@i"@@J%'K!), X1""#>#I#IqTU#I#VWX*55%'" /	 6   C!*s   F
F0Fz4bool any_grad_defined = any_variable_defined(grads);NodeTraceableFunctionz,
,
)rq   compute_index_rangesr   r   saved_list_sizesr   thread_lockwill_release_variablesrr   
superclassall_getter_definitionsall_getsetdef_structsr   r   r   )r   r   r   boolreturnNone)r   r   r)   zSequence[Binding]r   ztuple[bool, str])r)   r{   r   r]   r   sortedall_saved_inputsall_saved_outputsr   r   WILL_RELEASE_VARIABLESr   r	   extendused_named_gradientsderivativesinsertUNTRACEABLE_FUNCTIONSr   rq   )r+   templater   r   r   sizer   r   r   r   rr   r   need_any_grad_defined_varr   r   derivative_textr   r   r   r   r   r   r   r   r   r   r   r   s   `                  @@@@@@@@@r,   rH   rH     s   !#O#%"$FG&($&&(!M)+(*)) P88..hhZv&D##gchhZw$?@D##eCHH:5EdV2$NOPqE qEf d++1OP '&'d,,2PQ &%&
 !AT"!7!B!B!D!#D23 	 
t889
 	

//0/ 
/b 	KK %&& =
3B224
0 	O$!%<<!= !!!""B	

 yy))
(
 366J2Kq2P

'(3.VX  "YY'9:771'+)553# 75   r.   N)r2   6dict[FunctionSchema, dict[str, DifferentiabilityInfo]]r   zlist[DifferentiabilityInfo])rL   r   r2   r   rM   r   r   r   )r+   r   r   r    r   r   )Q
__future__r   typingr   torchgen.api.autogradr   r   r   r   r	   torchgen.api.typesr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   torchgen.code_templater    torchgen.modelr!   r"   torchgen.utilsr#   gen_inplace_or_view_typer%   rI   r   rJ   r   r   r   r   r   ra   rb   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   GETTER_BODY_DOUBLEGETTER_BODY_BOOLr   GETTER_BODY_SCALARr   r   r   r5   rR   ri   rH   r   r.   r,   <module>r     s   #       0 0 3 & 4 $ 0 &  # .  !  ) " +    & &  !-	!  #Y 
 'a  !	  *	  ".	"  "."   &2& "  %  "."    
            * 8 )E"#&;=P%Q)G$%(=?Q'Rg*,>?)G$%(=?Q'Re(*:;g*,>?)G$%(=?Q'R   ' 	QS	Q 	Q
	
S
 
 
	
D,	,S, , 
	,^r.   