#pragma once

#include <torch/csrc/jit/tracer.h>
#include <torch/csrc/python_headers.h>
#include <torch/csrc/utils/pybind.h>
#include <torch/csrc/jit/source_range.h>

#include <memory>
#include <string>

namespace torch {
namespace jit {

namespace script {
  struct Module;
}

namespace tracer {
void initPythonTracerBindings(PyObject* module);

std::string getPythonInterpreterStackTrace();
SourceRange getPythonInterpreterSourceRange();

Node* preRecordPythonTrace(
    THPObjectPtr pyobj,
    const std::string& arg_types,
    at::ArrayRef<autograd::Variable> inputs,
    std::vector<THPObjectPtr> scalar_args);

std::shared_ptr<Graph> createGraphByTracing(
    const py::function& func,
    TypedStack inputs,
    const py::function& var_name_lookup_fn,
    bool force_outplace,
    script::Module* self = nullptr);
} // namespace tracer
} // namespace jit
} // namespace torch
