
    Ph                        d dl mZmZmZ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      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< e#d      Z=dZ>dZ?dZ@dZAd ZBd!ZCd"ZDd#ZEd$ZFd%ZGd&ZHd'ZId(ZJd)ZK e ee            e<eEf e ee            e<eFf ee      e7eGf e ee            e<eGf ee      e7eHf ee      e7eJf e ee            e<eJfiZLe*ZMd*ee&eeNef   f   d+ee   fd,ZOd-eNd*ee&eeNef   f   d.eNd+d/fd0ZPd-eNd*ee&eeNef   f   d.eNd+d/fd1ZQd2ed3e#d+eNfd4ZRy/)5    )DictListSequenceTuple)
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;
differentiability_infosreturnc                     | j                         D cg c]  }|j                         D ]  }|  }}}t        t        d |            S c c}}w )Nc                     | j                   S N)args_with_derivativesinfos    |C:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torchgen/packaged/autograd/gen_autograd_functions.py<lambda>z1get_infos_with_derivatives_list.<locals>.<lambda>  s
    D$>$>    )valueslistfilter)r(   diffinfo_dictr/   diff_info_lists       r0   get_infos_with_derivatives_listr8     s]    
 5;;==M!((*D 	* 	=   >OPPs   Aouttemplate_pathNc           	        	
 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   r0   r1   z,gen_autograd_functions_lib.<locals>.<lambda>  s7    %(#B$@$@$B#C1E&F& 3?1<r2   N)r8   process_functionFUNCTION_DECLARATIONFUNCTION_DEFINITIONr%   write_with_template)r9   r(   r:   infosffile_basenamesuffixrI   rJ   rK   rL   s          @@@@r0   gen_autograd_functions_librU     s     ,,CDEGLMu!$Q(<=uMLEJKU#A':;U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 )NFr=      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 )	NrB   rC   z/python_functions.hz(void initialize_autogenerated_functions_z(PyObject* module);#initialize_autogenerated_functions_z	(module);)rE   shard_forward_declare
shard_call)rH   range)irK   
num_shardss    r0   r1   z/gen_autograd_functions_python.<locals>.<lambda>  s    !$ < < >??RS"T z*&*A ;1#=PQ*& z**A 6aS	B*
&s   AAzpython_functions.cppc                     | j                   S r,   )namer.   s    r0   r1   z/gen_autograd_functions_python.<locals>.<lambda>  s    DIIr2   rE   rB   rC   z/python_functions.cppc                 H    t        | t              gt        | t              gdS )N)py_function_initializerspy_function_props_and_getters)rM   PY_FUNCTION_DEFINITIONPY_FUNCTION_PROPS_AND_GETTERSr.   s    r0   r1   z/gen_autograd_functions_python.<locals>.<lambda>  s)     '=>) !'DE.	#
r2   rb   rc   )key_fnbase_envenv_callabler^   sharded_keys)r%   writer8   write_shardedrH   )r9   r(   r:   rQ   rK   r^   s       @@r0   gen_autograd_functions_pythonrl     s    
 
=%	PBJHH	
$ ,,CDE% < < >??TU"V

 02QR#  r2   r/   templatec                 :    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t
        d	t        d
d f 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t"        dt$        t&           d
t(        t        t*        f   f fd}|
j                         d} j,                  D ].  } || j                         \  }}|
j	                  |       ||z  }0 |r&|
j/                  t         j,                         d        j                  t0        v rd}nd}t              dk7  rdj3                        dz   nd}dj3                        }|j                   j4                  ||||	|
|||       S )!N_size_zsize_t z_size_;1auto z_ix = gen.range();var	is_outputr)   c           	        
 | j                   j                  }| j                   j                  }d}d}|}|t        t              k(  sS|t        t        t                    k(  s8|t        t        t        t                          k(  s|t        t              k(  r|r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 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(  r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             j                  d4| d       j                  d5| d       
j                  d6| d       y )7NTFzSavedVariable z_;z_.reset_data();zshared_from_this() rq   z = z	_.unpack(rr   )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c10::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)rw   r`   zargs.collect(zsaved.before(zsaved.after()4nctyper`   r   r   r    r   r   r   appendGETTER_DEFINITION_SAVEDVAR
substituterw   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)rs   rt   r`   r   should_append_getsetdefshould_append_raw_getsetdef
visit_nameptr
getter_defrx   apply_with_saved_afterapply_with_saved_beforeassertscompiled_argsgetter_definitionsr/   py_getsetdef_structsrelease_variablessaved_variablesunpacks             r0   save_varz"process_function.<locals>.save_var/  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 	}ZL;<&&zl"'EF%%ZL&CDr2   c                 @    t        | j                  j                        S r,   strr   r`   sas    r0   r1   z"process_function.<locals>.<lambda>  s    C		<Or2   )keyF)rt   c                 @    t        | j                  j                        S r,   r   r   s    r0   r1   z"process_function.<locals>.<lambda>  s    S=Pr2   Tr   z)std::lock_guard<std::mutex> lock(mutex_);rv   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     r0   	<genexpr>z#process_function.<locals>.<genexpr>0  s;      
9 4&	$*H*H*N*Nt*T)UUWX9s   ,/
derivativer-   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`   r   grad_input_maskztask_should_compute_output({ z_ix }),)masksnrv   z, c              3   &   K   | ]	  }| d   yw)_ixN )r   r   s     r0   r   z<process_function.<locals>.emit_derivative.<locals>.<genexpr>[  s     "@iaS9is   )r`   r]   )
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   r]   r/   s                 r0   emit_derivativez)process_function.<locals>.emit_derivative5  s    $$((	y>Q&+# /#8!#8CCHH	RS<TC#8  ! }%*'*C!#,,9c))?.?/ #97"B^"S26/yy##K0&?#&7#'#..IaLW.U 
 !G+JSJSQ4QCx@)   #2"<"<3y> #= # #%"@i"@@J%'K!),1""#>#I#IqTU#I#VW -*55%'" /	 6   C!*s   F
F0Fz4bool any_grad_defined = any_variable_defined(grads);NodeTraceableFunctionz,
,
)rw   compute_index_rangesr   r   saved_list_sizesr   thread_lockwill_release_variablesrx   
superclassall_getter_definitionsall_getsetdef_structsr   r   r   )r-   r   r   r`   r   r	   boolsortedall_saved_inputsall_saved_outputsr   r
   WILL_RELEASE_VARIABLESr   r   extendused_named_gradientsr   r   r   r   r   derivativesinsertUNTRACEABLE_FUNCTIONSr   rw   )r/   rm   r   r   r   sizer   rs   r   r   rx   r   need_any_grad_defined_varr   r   derivative_textr   r   r   r   r   r   r   r   r   r   r   r   s   `                  @@@@@@@@@r0   rM   rM     s   !#O#%"$FG&($&&(!M)+(*))88..hhZv&D##gchhZw$?@D##eCHH:5EdV2$NO *hEn hE hE$ hE hET d++1OP& Qd,,2PQ% R
 !AT"!7!B!B!D!#D23 	 
t889
 	

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

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

'(3.VX  "YY'9:771'+)553# 75   r2   )Stypingr   r   r   r   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'   rN   r   rO   r   r   r   r   r   rd   re   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   r   r8   rU   rl   rM   r   r2   r0   <module>r      su   / .      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<Q7Q2R"RS	Q	
 	Q
	
!.$s<Q7Q2R"RS
 
 
	
D,	,!.$s<Q7Q2R"RS, , 
	,^v0 vL vS vr2   