
    `iܔ                       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)ZOd>d1ZPd?d6ZQd?d7ZRd@d<ZSd=S )A    )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}zstatic PyObject* 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
}
zstatic PyObject* 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
}
zstatic PyObject* 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
}
a^  static 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
}
ab  static 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   static 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*  static 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_infos6dict[FunctionSchema, dict[str, DifferentiabilityInfo]]returnlist[DifferentiabilityInfo]c                z    d |                                  D             }t          t          d |                    S )Nc                @    g | ]}|                                 D ]}|S  )values).0diffinfo_dictinfos      /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torchgen/packaged/autograd/gen_autograd_functions.py
<listcomp>z3get_infos_with_derivatives_list.<locals>.<listcomp>  sK       !((**   	       c                    | j         S N)args_with_derivativesr1   s    r2   <lambda>z1get_infos_with_derivatives_list.<locals>.<lambda>  s	    D$> r4   )r.   listfilter)r'   diff_info_lists     r2   get_infos_with_derivatives_listr=     sJ     4;;==  N >>OOPPPr4   outstrtemplate_pathNonec           	        	 t          |          }d |D             d |D             d}t          | |d          dD ]$}||z   	                    			fd           %dS )	zFunctions.h and Functions.cpp body

    These contain the auto-generated subclasses of torch::autograd::Node
    for each every differentiable torch function.
    c                8    g | ]}t          |t                    S r-   )process_functionFUNCTION_DECLARATIONr/   fs     r2   r3   z.gen_autograd_functions_lib.<locals>.<listcomp>"  s$    MMM!$Q(<==MMMr4   c                8    g | ]}t          |t                    S r-   )rD   FUNCTION_DEFINITIONrF   s     r2   r3   z.gen_autograd_functions_lib.<locals>.<listcomp>#  s$    KKK#A':;;KKKr4   	FunctionsFinstall_dirtemplate_dirdry_run)z.hz.cppc                 F    dd                                  d z    dS )N@generated from /)generated_commentautograd_function_declarationsautograd_function_definitions)template_dir_for_comments)declarationsdefinitionsfmfnames   r2   r9   z,gen_autograd_functions_lib.<locals>.<lambda>,  s=    %(LB$@$@$B$BLLULL&M2>1<	  r4   N)r=   r#   write_with_template)
r>   r'   r@   infosfile_basenamesuffixrW   rX   rY   rZ   s
         @@@@r2   gen_autograd_functions_libr_     s     ,,CDDEMMuMMMLKKUKKKKM	=%	P	P	PB  
 
&
      		
 		
 		
 		

 
r4   c           
         t          | |d          d                    dfd           t          |          }                    d|d dd	d
                                 dz   id ddh           d S )NFrK      zpython_functions.hc                     dd                                   dz   d t                    D             d t                    D             dS )NrP   rQ   z/python_functions.hc                    g | ]}d | d	S )z(void initialize_autogenerated_functions_z(PyObject* module);r-   r/   is     r2   r3   zCgen_autograd_functions_python.<locals>.<lambda>.<locals>.<listcomp>A  s4     & & & R1QQQ& & &r4   c                    g | ]}d | d	S )#initialize_autogenerated_functions_z	(module);r-   rd   s     r2   r3   zCgen_autograd_functions_python.<locals>.<lambda>.<locals>.<listcomp>E  s4        CaBBB  r4   )rS   shard_forward_declare
shard_call)rV   range)rY   
num_shardss   r2   r9   z/gen_autograd_functions_python.<locals>.<lambda>>  sz    !$S < < > >SSS"T& &z**& & & z**  
 
 r4   zpython_functions.cppc                    | j         S r6   namer8   s    r2   r9   z/gen_autograd_functions_python.<locals>.<lambda>R  s    DI r4   rS   rP   rQ   z/python_functions.cppc                \    t          | t                    gt          | t                    gdS )N)py_function_initializerspy_function_props_and_getters)rD   PY_FUNCTION_DEFINITIONPY_FUNCTION_PROPS_AND_GETTERSr8   s    r2   r9   z/gen_autograd_functions_python.<locals>.<lambda>W  s6     '=>>) !'DEE.	#
 #
 r4   rp   rq   )key_fnbase_envenv_callablerk   sharded_keys)r#   writer=   write_shardedrV   )r>   r'   r@   r\   rY   rk   s       @@r2   gen_autograd_functions_pythonrz   5  s    
 
=%	P	P	PBJHH	
 	
 	
 	
 	
  $ ,,CDDE%%U < < > >UUU"V

 
 02QR#      r4   r1   r   templater    c                H	    !"#$%&'() g (g 'g }g )g "g }g $g &g #g !g  g g i %t           j                  D ]\  }}|j        t          v r[|j         d}|                    d|j         d                               |j         d                               d           nd}|                    d|j         d| d           |%|j        <   d8 !"#$ &'()fd}t           j        d           D ]} ||d           t           j        d           D ]} ||d           t          '          dk    rd}	nd}	t                     rD                    d                               d           t                                          }
nd}
g }t                     r|                    d           n3|                     fdt           j                  D                        d9 %fd!}g }d} j        D ]0} || j                  \  }}|                    |           ||z  }1%D ]}|                    d"| d#           |r)|                    t           j                   d$            j        t$          v rd%}nd&}t          &          dk    rd'                    &          d(z   nd}d)                    $          }t(                              t          |          ||*          }d+ t+                    D             }d)                    d, D                       }g }t+                    D ]6\  }}|                    d-          }|                    d| d.| d/           7d0t          %           d1g}D ]S}|                    d-          }|                    d2          }|                    |                                           Td3g}|D ]}|                    d4| d5           |                    d6           |                    d)                    )           j        d)                    |          ||t          %          d)                    |          |('|"|	|
||||#! |7          S ):N_size_zsize_t z_size_;size_t1auto z_ix = gen.range();varr   	is_outputboolr)   rA   c           	     ^   | j         j        }| j         j        }d}d}|}d}d }|t          t                    k    sq|t          t          t                              k    sL|t          t          t          t                                        k    s|t          t                    k    r|rd}                    d| d                               | d           |rdnd}	                    d| d	| d
|	 d                               t          
                    j        |t                                                   t          
                    j        |t                               d}| d}d}	n|t          t                    k    s>|t          t                     k    s&|t#          t          t                              k    rx|t#          t          t                              k    r2j        j        j        j        j                            d          r|sJ d}                    d| d                               d| d                               | d                               | d           |rdnd}	                    d| d| d|	 d                               d| d                               t*          
                    j        |t,                                                   t.          
                    j        |t0                               d}| d}d}n$|t3          t          t          t                                        k    rd}                    d| d                               d| d                               | d                               | d                               d| d| d                               d| d                               t*          
                    j        |t,                                                   t.          
                    j        |t0                               d}| d}d}n|t          t4                    k    rU                    d| d                               t6          
                    j        |t8                               nl|t          t:                    k    rU                    d | d                               t6          
                    j        |t<                               n|t          t>                    k    rU                    d!| d                               t@          
                    j        |t8                               n|t          tB                    k    rU                    d"| d                               t@          
                    j        |t<                               n%|t          t          t4                              k    rU                    d!| d                               t@          
                    j        |t8                               n|t          t          t:                              k    rU                    d"| d                               t@          
                    j        |t<                               n1|t          tE          t          tF                                        k    rU                    d#| d                               t@          
                    j        |tH                               n|t          tJ                    k    ri                    |&                                 d$| d%                               t6          
                    j        |tN                               n)|t          tP                    k    rU                    d&| d                               t6          
                    j        |tR                               n|t          tT                    k    rU                    d'| d                               t6          
                    j        |tV                               nO|t          t          tT                              k    rU                    d(| d                               tX          
                    j        |tV                               n|tE          t          t[          d)d*+          ,          -          k    r                    d.| d           d/}                    d| d                               | d0                               t]          d1          
                    j        |t^                               nd2|&                                0                                vrTd3|&                                0                                vr,d4|&                                vrd5|&                                vsJ |&                                 d6                                |&                                 d$| d           |tb          v rAtb          |         \  }
}                    |

                    j        ||                     nd}|r4                    td          
                    j        |7                     |r4                    tf          
                    j        |7                     |r!                    d8| d9|rd:nd; d           n                    d8| d                               d<| d                               d=| d           |$d>         4                    d$          d?          d5}                    tk          |                                         |           d S )@NTFzSavedVariable z_;z_.reset_data();zshared_from_this() r   z = z	_.unpack(r   )oprn   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)nsrn   )type)elemzstd::vector<at::Scalar> zstd::vector<at::Scalar>&z	.clear();ay  static 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)r   rn   zargs.collect(z, truefalsezsaved.before(zsaved.after(r   )6nctypern   r   r   r   r   r   r   appendGETTER_DEFINITION_SAVEDVAR
substituter   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splitr?   )r   r   rn   r   should_append_getsetdefshould_append_raw_getsetdef
visit_nameuses_cpp_saved_variable_clsunpacked_ref_typeptr
getter_defr   apply_functional_argsapply_functional_args_ref_typesapply_with_saved_afterapply_with_saved_beforeassertscompiled_argsgetter_definitionsr1   py_getsetdef_structsrelease_variablessaved_variablesunpacks               r2   save_varz"process_function.<locals>.save_var  s   zz"&&+#
&+#  Ig&&&&}Yw%7%78888{=71C1C#D#DEEEE	'****y**.'""#<D#<#<#<===$$%=%=%=>>>*3;&&CMMA$AA4AA#AAABBB%%*55wT0D 6    
 %%.99wT0H :    
 +/' J )Ik****y1111{9W#5#56666 {9W#5#56666IN',1<<ZHHMV V*.'""#I#I#I#IJJJ""#D4#D#D#DEEE $$%8%8%8999$$%@%@%@AAA*3B&&CMMG$GGtGGGGGHHHNNQ4QQQRRR%%.99wT0H :    
 %%2==wT0L >    
 +/' J 6Y}Yw-?-?@@AAAA*.'""#I#I#I#IJJJ""#D4#D#D#DEEE $$%8%8%8999$$%@%@%@AAAMMD$DD4DDDEEENNQ4QQQRRR%%.99wT0H :    
 %%2==wT0L >    
 +/' J EY|,,,,""#B4#B#B#BCCC%%!,,wT0I -     
 Y////""#Ft#F#F#FGGG%%!,,wT0K -     
 Y34444""#I$#I#I#IJJJ%%.99wT0I :     
 Y67777""#Md#M#M#MNNN%%.99wT0K :     
 ]9\#:#:;;;;""#I$#I#I#IJJJ%%.99wT0I :     
 ]9_#=#=>>>>""#Md#M#M#MNNN%%.99wT0K :     
 ]=71C1C#D#DEEEE""#H#H#H#HIII%%.99wT0K :     
 Yu%%%%""dmmoo#C#C#C#C#CDDD%%!,,wT0C -     
 Yw''''""#9$#9#9#9:::%%!,,wT0B -     
 Yw''''""#9$#9#9#9:::%%!,,wT0B -     
 ]9W#5#56666""#H#H#H#HIII%%%00wT0B 1     
 ]t( C C CDDD
 
 
 
 
 ""#Ed#E#E#EFFF :""#D4#D#D#DEEE $$%7%7%7888 %%   *w/      6 T]]__224444$--//"7"7"9"999t}}..t}}...--//QQQ /./
 ""dmmoo#?#?#?#?#?@@@'''#3D#9 
D"))))TW4d)KK    +0'" 	 ''#..$'.EE   ' 	 '''22dgD2II   ' 	A  R
RR	.NffwRRR      !?!?!?!?@@@&&'Ez'E'E'EFFF%%&CZ&C&C&CDDD$#22#6#<#<S#A#A!#D G G G$$SYY///'../@AAAAAr4   c                4    t          | j        j                  S r6   r?   r   rn   sas    r2   r9   z"process_function.<locals>.<lambda>  s    C	<O<O r4   )keyF)r   c                4    t          | j        j                  S r6   r   r   s    r2   r9   z"process_function.<locals>.<lambda>  s    S=P=P r4   Tr   z)std::lock_guard<std::mutex> lock(mutex_);r   retain_variableszconst auto& grad = grads[0];c              3  Z   K   | ]%}d | dj                             |           dV  &dS )zconst auto& z	 = grads[z];N)available_named_gradientsindex)r/   rn   r1   s     r2   	<genexpr>z#process_function.<locals>.<genexpr>  s\       
 
 Y4XX$*H*N*Nt*T*TXXX
 
 
 
 
 
r4   
derivativer   r7   Sequence[Binding]tuple[bool, str]c           	     j   | j         }| j        t                    dk    rd}d|vrhfd|D             }t          |          dk    rG|d         }t          |j        t
                    r%t          |j        j                  dv r
d|z   dz   }d	}j        	                    d
          rt          }nt          }||                    d         |d                            fS d|v r8fdD             }t                              t                    |          }nd}fdD             }	d                    |	          }	g }
t                    D ];\  }}|
                    t"                              |||                              <dt$                              |	|
||          fS )Nr$   Fnot_implementedc                6    g | ]}|j         d          k    |S )r   rm   )r/   arg	var_namess     r2   r3   z=process_function.<locals>.emit_derivative.<locals>.<listcomp>  s1     ! ! !CH	RS<T<TC<T<T<Tr4   r   )TensorzTensor?zany_grad_defined ? (z) : Tensor()T	_foreach_)rn   r   idxgrad_input_maskc                (    g | ]}d |          dS )needs_input_grad[z],r-   r/   rn   input_name_to_idxs     r2   r3   z=process_function.<locals>.emit_derivative.<locals>.<listcomp>  s;        D(9$(?CCC  r4   )nmasksr   c                (    g | ]}d |          dS )r   ]r-   r   s     r2   r3   z=process_function.<locals>.emit_derivative.<locals>.<listcomp>  s8          CG>$5d$;>>>     r4   z || )rn   re   r   )needs_input_gradcopy_rangesr   r   )formular   len
isinstanceargumentr!   r?   r   rn   r   DERIVATIVE_SINGLE_FOREACHDERIVATIVE_SINGLEr   GRAD_INPUT_MASKjoin	enumerater   DERIVATIVE_MULTI_COPY_RANGEDERIVATIVE_MULTI)r   r7   r   checks_any_grad_definedmatching_argsr   derivative_templater   r   r   r   re   r   r   r1   r   s                @r2   emit_derivativez)process_function.<locals>.emit_derivative  se    $(	y>>Q&+# //! ! ! !#8! ! ! }%%**'*C!#,99 7c)? ?.?/ ?/ #97"B^"S26/y##K00 8&?##&7#'#.."1&))A,7 /    !G++    )   #2"<"<)nnE #= # # #%       KT       &{{+;<<%'K!),,  1""/::!):1)= ;     
 *55!1'" /	 6    r4   ztask_should_compute_output({ z_ix }),z4bool any_grad_defined = any_variable_defined(grads);NodeTraceableFunctionz,
,
)r   compute_index_rangesr   c                "    g | ]\  }}| d | S )r   r-   )r/   Txs      r2   r3   z$process_function.<locals>.<listcomp>  s6     ' ' 'Aq 

q

' ' 'r4   c              3  "   K   | ]
}d | dV  dS )zpacked_args.pack(r   Nr-   )r/   rn   s     r2   r   z#process_function.<locals>.<genexpr>  s?          )-$D$$$           r4   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};)unpacksr   compute_schemar   apply_functional_args_signaturecompute_needs_input_grad
num_inputsunpack_ivaluesr   r   r   saved_list_sizesr   thread_lockwill_release_variablesr   
superclassall_getter_definitionsall_getsetdef_structsr   r   r   get_packed_args)r   r   r   r   r)   rA   )r   r   r7   r   r)   r   )r   r7   r   r   rn   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stripr   )*r1   r{   r  r   r   r   sizer   r   r  r  r   r   r   need_any_grad_defined_varr   r   derivative_textrn   r  r  r  r	  r  r  r  typschema_argsr  
schema_argr   r   r   r   r   r   r   r   r   r   r   r   s*   `                             @@@@@@@@@@@@r2   rD   rD   d  s   !#O#%"$FG&($&&(!M)+(*')13# )+d899 	* 	*S8...h&&&D##$?ch$?$?$?@@@!((CH)<)<)<===+228<<<<D##$NCH$N$Nd$N$N$NOOO&)#(##{B {B {B {B {B {B {B {B {B {B {B {B {B {B {B {B {Bz d+1O1OPPP ' '&&&&&d,2P2PQQQ & &%%%%% !!AT"" $$$%7888'..v666!7!B!B!D!D!#D 
23333 	 
 
 
 
t899
 
 
 	
 	
 	

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

 y)))

(
 366J2K2Kq2P2P

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

TzTTT	
 	
 	
 	
 $		&!!7yy003(G!9())yy001'+)553# 75'/    r4   N)r'   r(   r)   r*   )r>   r?   r'   r(   r@   r?   r)   rA   )r1   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&   rE   r  rI   r   r  r   r   r   r   rr   rs   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=   r_   rz   rD   r-   r4   r2   <module>r3     sp   # " " " " "                                                                        0 0 / / / / / 3 3 3 3 3 3 3 3 & & & & & & 4 4 4 4 4 4  )(((((( $|  0 &  ( #l@B B H ,  (<   !L   )L  " +l    <  & &   !-	! !  #lY  
 ',a   !L	 	  *\	 	  ".	" 	"  "." "   &2\& & "  %   "." "    
            * 8 M))E""##&;=P%QM))G$$%%(=?Q'RIg*,>?M))G$$%%(=?Q'RIe(*:;Ig*,>?M))G$$%%(=?Q'R   ' 	Q 	Q 	Q 	Q
 
 
 
B, , , ,^N N N N N Nr4   