
    sh                    r   S SK Jr  S SKJr  S SKJrJrJrJrJ	r	  S SK
JrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJ r   S SK!J"r"  S SK#J$r$J%r%  S SK&J'r'  SS	K(J)r)  \(       a  S S
K*J+r+  \"" S5      r,\"" S5      r-\"" S5      r.\"" S5      r/\"" S5      r0\"" S5      r1\"" S5      r2\"" S5      r3\"" S5      r4\"" S5      r5\"" S5      r6\"" S5      r7\"" S5      r8\"" S5      r9\"" S5      r:\"" S5      r;\"" S5      r<\"" S5      r=\"" S5      r>\"" S5      r?Sr@S rAS!rBS"rCS#rDS$rES%rFS&rGS'rHS(rIS)rJS*rKS+rLS,rM\" \" \5      5      \>\G4\" \" \5      5      \>\H4\" \5      \9\I4\" \" \5      5      \>\I4\" \5      \9\J4\" \5      \9\L4\" \" \5      5      \>\L40rN\)rO    S2S- jrP        S3S. jrQ        S3S/ jrRS4S0 jrSg1)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                    U R                  5        VVs/ s H  nUR                  5         H  nUPM     M     nnn[        [        S U5      5      $ s  snnf )Nc                    U R                   $ N)args_with_derivativesinfos    څ/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torchgen/packaged/autograd/gen_autograd_functions.py<lambda>1get_infos_with_derivatives_list.<locals>.<lambda>  s
    D$>$>    )valueslistfilter)differentiability_infosdiffinfo_dictr,   diff_info_lists       r-   get_infos_with_derivatives_listr7     s]    
 5;;==M!((*D 	* 	=   >OPPs   $Ac           	        ^^^	^
 [        U5      nU Vs/ s H  n[        U[        5      PM     snmU Vs/ s H  n[        U[        5      PM     snmSn[	        XSS9m	S H!  nXV-   m
T	R                  T
T
UUU	U
4S j5        M#     gs  snf s  snf )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                 @   > SSTR                  5        S3-   T-   T TS.$ )N@generated from /)generated_commentautograd_function_declarationsautograd_function_definitions)template_dir_for_comments)declarationsdefinitionsfmfnames   r-   r.   ,gen_autograd_functions_lib.<locals>.<lambda>,  s7    %(#B$@$@$B#C1E&F& 3?1<r0   N)r7   process_functionFUNCTION_DECLARATIONFUNCTION_DEFINITIONr#   write_with_template)outr4   template_pathinfosffile_basenamesuffixrF   rG   rH   rI   s          @@@@r-   gen_autograd_functions_librU     s     ,,CDEGLMu!$Q(<=uMLEJKU#A':;UKKM	%	PB &

	
 ! NKs
   BBc           
        ^^ [        XSS9mSmTR                  SUU4S j5        [        U5      nTR                  SUS SS	S
TR	                  5        S3-   0S TSS1S9  g )NFr:      zpython_functions.hc                    > SSTR                  5        S3-   [        T5       V s/ s H	  n SU  S3PM     sn [        T5       V s/ s H	  n SU  S3PM     sn S.$ s  sn f s  sn f )	Nr?   r@   z/python_functions.hz(void initialize_autogenerated_functions_z(PyObject* module);#initialize_autogenerated_functions_z	(module);)rB   shard_forward_declare
shard_call)rE   range)irH   
num_shardss    r-   r.   /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                    U R                   $ r)   )namer+   s    r-   r.   r_   S  s    DIIr0   rB   r?   r@   z/python_functions.cppc                H    [        U [        5      /[        U [        5      /S.$ )N)py_function_initializerspy_function_props_and_getters)rK   PY_FUNCTION_DEFINITIONPY_FUNCTION_PROPS_AND_GETTERSr+   s    r-   r.   r_   X  s)     '=>) !'DE.	#
r0   rc   rd   )key_fnbase_envenv_callabler^   sharded_keys)r#   writer7   write_shardedrE   )rO   r4   rP   rQ   rH   r^   s       @@r-   gen_autograd_functions_pythonrm   6  s    
 
%	PBJHH	
$ ,,CDE% < < >??TU"V

 02QR#  r0   c                  ^ ^ ^!^"^#^$^%^&^'^(^)^*^+ / m*/ m)/ n/ m+/ m$/ n/ m&/ m(/ m%/ m#/ m"/ m / m!0 m'[        T R                  5       H  u  pEUR                  [        ;   a^  UR                   S3nUR                  SUR                   S35        T R                  UR                   S35        T!R                  S5        OSnUR                  SUR                   SU S35        UT'UR                  '   M     S.U U!U"U#U$U%U&U U(U)U*U+4S
 jjn[        T R                  S S9 H
  nU" USS9  M     [        T R                  S S9 H
  nU" USS9  M     [        T)5      S:  a  Sn	OSn	[        T 5      (       a7  T R                  S5        T!R                  S	5        [        R                  5       n
OSn
/ n[        T 5      (       a  UR                  S5        O.UR                  U 4S j[        T R                  5       5       5              S/U U'4S jjn/ nSnT R                    H/  nU" UT R                  5      u  nnUR                  U5        UU-  nM1     T' H  nUR                  SU S35        M     U(       a&  UR#                  [        T R                   5      * S5        T R                  [$        ;   a  SnOSn[        T(5      S:w  a  SR'                  T(5      S-   OSnSR'                  T&5      n[(        R                  [        U5      X=S 9n[+        T!T 5       VVs/ s H  u  nnU S!U 3PM     nnnSR'                  S" T  5       5      n/ n[+        T!T 5       H/  u  nnUR-                  S#5      nUR                  SU S$U S%35        M1     S&[        T'5       S'3/nT! HD  nUR-                  S#5      nUR/                  S(5      nUR                  UR1                  5       5        MF     S)/nU H  nUR                  S*U S+35        M     UR                  S,5        UR                  SR'                  T+5      T R2                  SR'                  U5      T UU[        T'5      SR'                  U5      UT*T)UT$U	U
UUUUT%T#T"US-9$ s  snnf )0N_size_zsize_t z_size_;size_t1auto z_ix = gen.range();boolc           
       > U R                   R                  nU R                   R                  nSnSnUnSnS nU[        [        5      :X  d[  U[        [        [        5      5      :X  d?  U[        [        [        [        5      5      5      :X  d  U[        [        5      :X  a  U(       a  SnTR                  SU S35        TR                  U S35        U(       a  SOSn	TR                  SU S	U S
U	 S35        TR                  [        R                  TR                  U[        S95        TR                  [        R                  TR                  U[        S95        SnU S3nSnGOrU[        [        5      :X  d0  U[        [         5      :X  d  U[#        [        [        5      5      :X  Gak  U[#        [        [        5      5      :X  aQ  TR$                  R$                  R                  R                  R&                  R)                  S5      (       a  U(       d   eSnTR                  SU S35        TR                  SU S35        TR                  U S35        TR                  U S35        U(       a  SOSn	TR                  SU SU SU	 S35        TR                  SU S35        TR                  [*        R                  TR                  U[,        S95        TR                  [.        R                  TR                  U[0        S95        SnU S3nSnGOU[3        [        [        [        5      5      5      :X  a  SnTR                  SU S35        TR                  SU S35        TR                  U S35        TR                  U S35        TR                  SU SU S35        TR                  SU S35        TR                  [*        R                  TR                  U[,        S95        TR                  [.        R                  TR                  U[0        S95        SnU S3nSnGOU[        [4        5      :X  aI  TR                  SU S35        TR                  [6        R                  TR                  U[8        S95        GOSU[        [:        5      :X  aI  TR                  S U S35        TR                  [6        R                  TR                  U[<        S95        GOU[        [>        5      :X  aI  TR                  S!U S35        TR                  [@        R                  TR                  U[8        S95        GOU[        [B        5      :X  aI  TR                  S"U S35        TR                  [@        R                  TR                  U[<        S95        GO?U[        [        [4        5      5      :X  aI  TR                  S!U S35        TR                  [@        R                  TR                  U[8        S95        GOU[        [        [:        5      5      :X  aI  TR                  S"U S35        TR                  [@        R                  TR                  U[<        S95        GOuU[        [E        [        [F        5      5      5      :X  aI  TR                  S#U S35        TR                  [@        R                  TR                  U[H        S95        GOU[        [J        5      :X  aY  TR                  URM                  5        S$U S%35        TR                  [6        R                  TR                  U[N        S95        GOU[        [P        5      :X  aI  TR                  S&U S35        TR                  [6        R                  TR                  U[R        S95        GO?U[        [T        5      :X  aI  TR                  S'U S35        TR                  [6        R                  TR                  U[V        S95        GOU[        [        [T        5      5      :X  aI  TR                  S(U S35        TR                  [X        R                  TR                  U[V        S95        GO~U[E        [        [[        S)S*S+9S,9S-9:X  ax  TR                  S.U S35        S/nTR                  SU S35        TR                  U S035        TR                  []        S15      R                  TR                  U[^        S95        OS2URM                  5       Ra                  5       ;  aJ  S3URM                  5       Ra                  5       ;  a(  S4URM                  5       ;  a  S5URM                  5       ;  d   URM                  5        S635       eTR                  URM                  5        S$U S35        U[b        ;   a5  [b        U   u  pTR                  U
R                  TR                  X+S95        OSnU(       a-  TR                  [d        R                  TR                  US795        U(       a-  TR                  [f        R                  TR                  US795        U(       a"  TR                  S8U S9U(       a  S:OS; S35        OTR                  S8U S35        TR                  S<U S35        TR                  S=U S35        Uc  TS>   Ri                  S$5      S?    S53nTR                  [k        U5      5        TR                  U5        g )@NTFzSavedVariable z_;z_.reset_data();zshared_from_this() rr   z = z	_.unpack(rs   )opra   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)nsra   )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)rw   ra   zargs.collect(z, truefalsezsaved.before(zsaved.after(r   )6nctypera   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splitstr)var	is_outputra   r   should_append_getsetdefshould_append_raw_getsetdef
visit_nameuses_cpp_saved_variable_clsunpacked_ref_typeptr
getter_defrx   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_var"process_function.<locals>.save_var  sN
   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H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 
"))))TWW4)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/'../@Ar0   c                @    [        U R                  R                  5      $ r)   r   r   ra   sas    r-   r.   "process_function.<locals>.<lambda>  s    C		<Or0   )keyF)r   c                @    [        U R                  R                  5      $ r)   r   r   s    r-   r.   r     s    S=Pr0   Tr   z)std::lock_guard<std::mutex> lock(mutex_);rv   retain_variableszconst auto& grad = grads[0];c              3  h   >#    U  H'  nS U STR                   R                  U5       S3v   M)     g7f)zconst auto& z	 = grads[z];N)available_named_gradientsindex).0ra   r,   s     r-   	<genexpr>#process_function.<locals>.<genexpr>  s:      
9 4&	$*H*H*N*Nt*T)UUWX9s   /2c           	       > U R                   nU R                  n[        U5      S:X  a  SnSU;  a  U Vs/ s H  oUR                  US   :X  d  M  UPM     nn[        U5      S:X  aQ  US   n[	        UR
                  [        5      (       a-  [        UR
                  R                  5      S;   a
  SU-   S-   nSnTR                  R                  S	5      (       a  [        nO[        nUUR                  US   UTUS      S
94$ SU;   a7  U Vs/ s H  nSTU    S3PM     n	n[        R                  [        U5      U	S9n
OSn
U Vs/ s H  nSTU    S3PM     nnSR                  U5      n/ n[        U5       H+  u  pUR!                  ["        R                  XTU   S95        M-     S[$        R                  UUUU
S94$ s  snf s  snf s  snf )Nr$   Fnot_implementedr   )TensorzTensor?zany_grad_defined ? (z) : Tensor()T	_foreach_)ra   
derivativeidxgrad_input_maskzneeds_input_grad[z],)nmasksrv   ]z || )ra   r]   r   )needs_input_gradcopy_rangesr   r   )formula	var_nameslenra   
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_templatera   r   r   r   r   r]   r   r,   input_name_to_idxs                  r-   emit_derivative)process_function.<locals>.emit_derivative  s6    $$((	y>Q&+# /#8!#8CHH	RS<TC#8  ! }%*'*C!#,,99c))?.?/ #97"B^"S26/yy##K00&?#&7#'#.."1&))A,7 /   !G+ !* ) ((9$(?'@C )   #2"<"<)nE #= # #%KT KT4#$5d$;#<A>9     &{{+;<%'K!),""/::):1)= ;  - *55!1'" /	 6   ]!4 s   F=F=
GGztask_should_compute_output({ z_ix }),z4bool any_grad_defined = any_variable_defined(grads);NodeTraceableFunctionz,
,
)r   compute_index_rangesr   r}   c              3  .   #    U  H  nS U S3v   M     g7f)zpacked_args.pack(rs   N )r   ra   s     r-   r   r     s       1F
D6$1Fs   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};)unpacksrw   compute_schemar   apply_functional_args_signaturecompute_needs_input_grad
num_inputsunpack_ivaluesr   r   r   saved_list_sizesr   thread_lockwill_release_variablesrx   
superclassall_getter_definitionsall_getsetdef_structsr   r   r   get_packed_args)r   r   r   rt   returnNone)r   r   r*   zSequence[Binding]r  ztuple[bool, str])r   r*   r   r   ra   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striprw   ),r,   templater   r   r   r   sizer   r   r   r   rx   r   r   need_any_grad_defined_varr   r   derivative_textra   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-   rK   rK   e  s   !#O#%"$FG&($&&(!M)+(*')13# )+d88988..hhZv&D##gchhZw$?@!((CHH:V)<=+228<D##eCHH:5EdV2$NO&)#((# :{B {B {Bz d++1OP& Qd,,2PQ% R
 !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$!%<<! ' "5dV8DE "
 !!!""B	

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

'(3.VX  "YY'9:7BB
e*+?  C  
 79NO'ODAq #Qqc
O $ ' ii  1F  O N8:OP	Ts#dV+A#dKL Q '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)r4   6dict[FunctionSchema, dict[str, DifferentiabilityInfo]]r  zlist[DifferentiabilityInfo])rO   r   r4   r  rP   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&   rL   r  rM   r   r  r   r   r   r   re   rf   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  r7   rU   rm   rK   r   r0   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r0   