
    Vh                    `   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rd d
l*m+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= e"d      Z> e"d      Z?dZ@d ZAd!ZBd"ZCd#ZDd$ZEd%ZFd&ZGd'ZHd(ZId)ZJd*ZKd+ZLd,ZM e ee            e>eGf e ee            e>eHf ee      e9eIf e ee            e>eIf ee      e9eJf ee      e9eLf e ee            e>eLfiZNe)ZO	 	 	 	 d2d-ZP	 	 	 	 	 	 	 	 d3d.ZQ	 	 	 	 	 	 	 	 d3d/ZRd4d0ZSy1)5    )annotations)TYPE_CHECKING)
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_FUNCTIONS)Sequenceae  #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) const 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^  static variable_list ${op}_apply_functional(
  variable_list&& grads,
  std::array<bool,${num_inputs}> needs_input_grad${,apply_functional_args_signature})
{
  IndexRangeGenerator gen;
  ${compute_index_ranges}
  variable_list grad_inputs(gen.size());
  ${body}
  return grad_inputs;
}
inline variable_list ${op}_apply_functional_ivalue(const variable_list& grads, const ivalue_list& args)
{
#ifdef C10_MOBILE
  TORCH_INTERNAL_ASSERT(false, "compiled autograd doesn't work on mobile");
#else
  auto packed_args = PackedArgs(args);
  auto needs_input_grad = packed_args.unpack<std::array<bool, ${num_inputs}>>();
  ${unpack_ivalues}
  return ${op}_apply_functional(variable_list(grads), needs_input_grad${,apply_functional_args});
#endif
}

variable_list ${op}::apply(variable_list&& grads) {
  ${thread_lock}
  ${asserts}
  ${unpacks}
  ${compute_needs_input_grad}
  return ${op}_apply_functional(std::move(grads), needs_input_grad${,apply_functional_args});
}

void ${op}::compiled_args(CompiledNodeArgs& args) const {
    ${compiled_args}
}
variable_list ${op}::apply_with_saved(const variable_list& grads, SwapSavedVariables& saved) {
#ifdef C10_MOBILE
  TORCH_INTERNAL_ASSERT(false, "compiled autograd doesn't work on mobile");
#else
  ${apply_with_saved_before}

  static bool called = false;
  if (!called) {
    called = true;
    ${compute_schema}
    const auto& pyinterface = torch::dynamo::autograd::getPyCompilerInterface();
    pyinterface->bind_function(saved.get_py_compiler(), name(), ${op}_apply_functional_ivalue, schema);
  }

  variable_list output_result;

  PackedArgs packed_args;
  ${asserts}
  ${unpacks}
  ${compute_needs_input_grad}
  packed_args.pack(needs_input_grad);
  ${get_packed_args}

  output_result = compiled_autograd_apply_functional(packed_args, next_edges(), saved, grads, name());

  ${apply_with_saved_after}
  return output_result;
#endif
}

zC  auto grad_input_mask = std::array<bool, ${n}>{
    ${masks}
  };
znIndexRangeGenerator gen;
${compute_index_ranges}
auto needs_input_grad = std::array<bool, ${n}>{
  ${masks}
};zif (needs_input_grad[/*${name}*/${idx}]) {
  auto grad_result = ${derivative};
  copy_range(grad_inputs, ${name}_ix, grad_result);
}
ax  if (needs_input_grad[/*${name}*/${idx}]) {  // ${name}
  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);
}
zw  if (needs_input_grad[/*${name}*/${idx}]) {
    copy_range(grad_inputs, ${name}_ix, std::get<${i}>(grad_result));
  }
zgif (${needs_input_grad}) {
  ${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    a/home/dcms/DCMS/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_listr6     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)r6   process_functionFUNCTION_DECLARATIONFUNCTION_DEFINITIONr#   write_with_template)outr3   template_pathinfosffile_basenamesuffixrE   rF   rG   rH   s          @@@@r-   gen_autograd_functions_librS     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 )NFr9      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);)rA   shard_forward_declare
shard_call)rD   range)irG   
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  s
    DII r/   rA   r>   r?   z/python_functions.cppc                H    t        | t              gt        | t              gdS )N)py_function_initializerspy_function_props_and_getters)rI   PY_FUNCTION_DEFINITIONPY_FUNCTION_PROPS_AND_GETTERSr+   s    r-   r.   z/gen_autograd_functions_python.<locals>.<lambda>X  s+     '=>) !'DE.	#
 r/   r`   ra   )key_fnbase_envenv_callabler\   sharded_keys)r#   writer6   write_shardedrD   )rM   r3   rN   rO   rG   r\   s       @@r-   gen_autograd_functions_pythonrj   6  s    
 
=%	PBJHH	
$ ,,CDE% < < >??TU"V

 02QR#  r/   c                    !"#$%&'()*+ g *g )g }g +g $g }g &g (g %g #g "g  g !i 't         j                        D ]  \  }}|j                  t        v r^|j                   d}|j                  d|j                   d        j                  |j                   d       !j                  d       nd}|j                  d|j                   d| d       |'|j                  <    d. !"#$%& ()*+fd
}t         j                  d       D ]  } ||d        t         j                  d       D ]  } ||d        t        )      dkD  rd}	nd}	t               r7 j                  d       !j                  d	       t        j                         }
nd}
g }t               r|j                  d       n-|j                   fdt         j                        D               	 	 	 	 	 	 d/ 'fd}g }d} j                   D ].  } || j                        \  }}|j                  |       ||z  }0 'D ]  }|j                  d| d        |r&|j#                  t         j                          d        j                  t$        v rd}nd}t        (      dk7  rdj'                  (      dz   nd}dj'                  &      }t(        j                  t        |      ||       }t+        !       D cg c]  \  }}| d!|  }}}dj'                  d"  D              }g }t+        !       D ].  \  }}|j-                  d#      }|j                  d| d$| d%       0 d&t        '       d'g}!D ]C  }|j-                  d#      }|j/                  d(      }|j                  |j1                                E d)g}|D ]  }|j                  d*| d+        |j                  d,       |j                  dj'                  +       j2                  dj'                  |       ||t        '      dj'                  |      |*)|$|	|
||||%#"|-      S c c}}w )0N_size_zsize_t z_size_;size_t1auto z_ix = gen.range();boolc           	        | j                   j                  }| j                   j                  }d}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}d}n|t        t              k(  s.|t        t               k(  s|t#        t        t                    k(  ra|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}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}d}n|t        t4              k(  rLj                  d| d       j                  t6        j                  j                  |t8                     nm|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<                     nS|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                     nI|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(  r{j                  d.| d       d/}j                  d| d       j                  | d0       j                  t]        d1      j                  j                  |t^                     nd2|jM                         ja                         vrDd3|jM                         ja                         vr$d4|jM                         vrd5|jM                         vsJ |jM                          d6       j                  |jM                          d$| d       |tb        v r:tb        |   \  }
}j                  |
j                  j                  ||             nd}|r0j                  td        j                  j                  |7             |r0j                  tf        j                  j                  |7             |rj                  d8| d9|rd:nd; d       nj                  d8| d       j                  d<| d       j                  d=| d       |d>   ji                  d$      d?    d5}j                  tk        |             j                  |       y )@NTFzSavedVariable z_;z_.reset_data();zshared_from_this() ro   z = z	_.unpack(rp   )opr^   body_zTensor&_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std::vector<Tensor>&z = unpack_opt_list(z_);z#torch::List<std::optional<Tensor>>&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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)rt   r^   zargs.collect(z, truefalsezsaved.before(zsaved.after(r   )6nctyper^   r~   r   r   r   r   r   appendGETTER_DEFINITION_SAVEDVAR
substitutert   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splitstr)var	is_outputr^   r~   should_append_getsetdefshould_append_raw_getsetdef
visit_nameuses_cpp_saved_variable_clsunpacked_ref_typeptr
getter_defru   apply_functional_argsapply_functional_args_ref_types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_var  sO
   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 6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 E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D$#22#6#<#<S#A!#D"EQ G$$SY/'../@Ar/   c                @    t        | j                  j                        S r)   r   r   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_);rs   retain_variablesz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           	     x   | 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   ||d      
      fS d|v r7|D cg c]  }d|    d }	}t        j                  t        |      |	      }
nd}
|D cg c]  }d|    d }}dj                  |      }g }t        |      D ]/  \  }}|j!                  t"        j                  |||                1 dt$        j                  ||||
      fS c c}w c c}w c c}w )Nr$   Fnot_implementedr   )TensorzTensor?zany_grad_defined ? (z) : Tensor()T	_foreach_)r^   
derivativeidxgrad_input_maskzneeds_input_grad[z],)nmasksrs   ]z || )r^   r[   r   )needs_input_grad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   r,   input_name_to_idxs                  r-   emit_derivativez)process_function.<locals>.emit_derivative  s4    $$((	y>Q&+# /#8!CHH	RS<TC! ! }%*'*C!#,,9c))?.?/ #97"B^"S26/yy##K0&?#&7#'#.."1&))A,7 /   !G+ !* ((9$(?'@C  #2"<"<)nE #= # #%KT CG#$5d$;#<A>     &{{+;<%'K!), 1""/::!):1)= ;  *55!1'" /	 6   ]!4 s   F-
F-7F20F7ztask_should_compute_output({ z_ix }),z4bool any_grad_defined = any_variable_defined(grads);NodeTraceableFunctionz,
,
)r   compute_index_rangesr   rz   c              3  (   K   | ]
  }d | d  yw)zpacked_args.pack(rp   N )r   r^   s     r-   r   z#process_function.<locals>.<genexpr>  s       )-
D6$ s   r   z = packed_args.unpack<z>();zstd::array<bool, >constz#std::vector<at::TypePtr> schema = {z(  torch::dynamo::autograd::IValuePacker<z>::packed_type(),z};)unpacksrt   compute_schemar   apply_functional_args_signaturecompute_needs_input_grad
num_inputsunpack_ivaluesr   r   r   saved_list_sizesr   thread_lockwill_release_variablesru   
superclassall_getter_definitionsall_getsetdef_structsr   r   r   get_packed_args)r   r   r   rq   returnNone)r   r   r*   zSequence[Binding]r   ztuple[bool, str])r   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   COMPUTE_NEEDS_INPUT_GRADzipremovesuffixremoveprefixstriprt   ),r,   templater   r   r   r   sizer   r   r   r   ru   r   r   need_any_grad_defined_varr   r   derivative_textr^   r   r   r   r   Txr   r   r   typschema_argsr   
schema_argr   r   r   r   r   r   r   r   r   r   r   r   s,   `                               @@@@@@@@@@@@r-   rI   rI   e  s   !#O#%"$FG&($&&(!M)+(*')13# )+d889 	*S88..hhZv&D##gchhZw$?@!((CHH:V)<=+228<D##eCHH:5EdV2$NO&)#((#	*{B {B {Bz d++1OP '&'d,,2PQ &%&
 !AT"$$%78'..v6!7!B!B!D!#D23 	 
t889
 	

==0= 
=~ E %&& =
3B224
0 	O$!%<<!= " F5dV8DEF
 !!!""B	

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

'(3.VX  "YY'9:7BB
e*+?u  C  
 79NO'Aq #Qqc
'# ' ii  1F  O N8:OP M	Ts#dV+A#dKLM 's+<'=&>a@AK. (s#w'399;'( <<N! 

6zlBST	

 $		&!77yy03(G!9()yy01'+)553# 75'/   1's   :QN)r3   6dict[FunctionSchema, dict[str, DifferentiabilityInfo]]r   zlist[DifferentiabilityInfo])rM   r   r3   r  rN   r   r   r   )r,   r   r  r    r   r   )T
__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%   collections.abcr&   rJ   r   rK   r   r  r   r   r   r   rb   rc   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  r6   rS   rj   rI   r   r/   r-   <module>r!     s6   #        0 0 3 & 4 ( $ 0 & ( #@B H  (  !  ) " +    & &  !-	!  #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, , 
	,^Nr/   