{"action":"created","comment":{"url":"https://api.github.com/repos/pytorch/pytorch/pulls/comments/166788240","pull_request_review_id":94906614,"id":166788240,"diff_hunk":"@@ -1,150 +1,255 @@\n #pragma once\n \n-// A wrapper around at::Tensor to represent autograd Variables. Variables\n-// can be implicitly converted to an at::Tensor.\n+#include <Python.h>\n \n-#include <mutex>\n-#include <memory>\n-#include <vector>\n-#include <functional>\n-#include <ATen/ATen.h>\n-\n-#include \"torch/csrc/assertions.h\"\n-#include \"torch/csrc/jit/ir.h\"\n-#include \"torch/csrc/jit/tracer_state.h\"\n+#include \"torch/csrc/autograd/edge.h\"\n #include \"torch/csrc/autograd/function_hook.h\"\n-#include \"torch/csrc/utils/auto_unique_ptr.h\"\n #include \"torch/csrc/autograd/variable_version.h\"\n-#include \"torch/csrc/autograd/edge.h\"\n-#include \"torch/csrc/Types.h\"\n+#include \"torch/csrc/jit/tracer_state.h\"\n+#include \"torch/csrc/utils/auto_unique_ptr.h\"\n+\n+#include <ATen/Scalar.h>\n+#include <ATen/ScalarType.h>\n+#include <ATen/Storage.h>\n+#include <ATen/Tensor.h>\n+#include <ATen/TensorImpl.h>\n+#include <ATen/Type.h>\n+\n+#include <list>\n+#include <memory>\n+#include <mutex>\n+#include <string>\n+#include <vector>\n \n namespace torch { namespace autograd {\n \n-using at::Tensor;\n-struct VariableImpl;\n+struct Function;\n+\n+//===----------------------------------------------------------------------===//\n+//                                Variable\n+//===----------------------------------------------------------------------===//\n+\n+/// A `Variable` augments a `Tensor` with the ability to interact in our\n+/// autograd machinery. `Variable` inherits from `Tensor` and may be converted\n+/// to and from `Tensor` implicitly.\n+class Variable : public at::Tensor {\n+ public:\n+  /// Creates a Variable that is a *view* of another (*base*) variable.\n+  /// The `gradient_edge` is an optional (gradient_function, input_number) pair.\n+  static Variable\n+  as_view(Variable base, at::Tensor data, Edge gradient_edge = Edge());\n+\n+  Variable() = default;\n+  Variable(at::Tensor data, bool requires_grad);\n+  Variable(at::Tensor data, Edge gradient_edge);\n+\n+  // \"Downcasts\" a `Tensor` into a `Variable`. Only call this on tensors you\n+  // know are Variables.\n+  /*implicit*/ Variable(at::Tensor const& rhs) : at::Tensor(rhs) {}\n+  /*implicit*/ Variable(at::Tensor&& rhs) noexcept\n+      : at::Tensor(std::move(rhs)) {}\n+\n+  // NOTE: Assignment operators to Tensor come for free from the constructors.\n+\n+  /// Compare this `Variable` to another `Variable` (or `Tensor`) via\n+  /// pointer-equality.\n+  bool operator==(const Variable& other) const noexcept {\n+    return this->pImpl == other.pImpl;\n+  }\n+\n+  bool operator!=(const Variable& other) const noexcept {\n+    return !(*this == other);\n+  }\n+\n+  void set_name(const std::string& name);\n+  const std::string& name() const noexcept;\n+\n+  /// Get the gradient function of the `Variable`. If this is a leaf variable,\n+  /// the pointer returned will be null.\n+  const std::shared_ptr<Function>& grad_fn() const;\n+\n+  /// Set the gradient accumulator of the `Variable`. This is only applicable\n+  /// to leaf variables. Interior variables should call `set_gradient_edge()`.\n+  void set_grad_accumulator(std::weak_ptr<Function> grad_accumulator);\n \n-struct Variable : public at::Tensor {\n-  inline Variable(VariableImpl * self, bool retain);\n-  Variable() : Tensor() {}\n-  Variable(const Variable & rhs) : Tensor(rhs) {}\n-  Variable(Variable && rhs) noexcept : Tensor(std::move(rhs)) {}\n+  /// Attempt to get a pointer to the gradient accumulator of the `Variable`,\n+  /// if it still exists. If the gradient accumulator function has been\n+  /// destroyed, returns a `nullptr`.\n+  std::shared_ptr<Function> try_get_grad_accumulator() const;\n \n-  // Implicitly casts a Tensor to a Variable. This should only be called on\n-  // Tensors which you know are actually Variables.\n-  /*implicit*/ Variable(Tensor const & rhs) : Tensor(rhs) {}\n-  /*implicit*/ Variable(Tensor && rhs) noexcept : Tensor(std::move(rhs)) {}\n+  /// Get the gradient accumulator of the `Variable` if it has one, or else\n+  /// create one on the fly and return it.\n+  std::shared_ptr<Function> grad_accumulator() const;\n \n+  /// Set the gradient edge -- i.e. `grad_fn` and `input_nr` -- of the\n+  /// `Variable`.\n+  /// NOTE: This will always set the `grad_fn`, even if this is a leaf\n+  /// variable, and never the `grad_accumulator`. For the latter, use\n+  /// `set_grad_accumulator`. This allows late construction of an interior\n+  /// `Variable`.\n+  void set_gradient_edge(Edge&& edge);\n+\n+  /// Return the \"canonical\" gradient edge of this `Variable`, i.e. either the\n+  /// gradient function if this is an interior `Variable`, or the gradient\n+  /// accumulator otherwise. If the `Variable` is interior, the returned `Edge`\n+  /// will store the input index of the `Function` to which this variable is\n+  /// connected in its `input_nr` field. For leaves, the `input_nr` is always\n+  /// zero. Note that `set_gradient_edge` and `gradient_edge` are not\n+  /// symmetric. You must use `set_gradient_edge` to set the `grad_fn` and\n+  /// `set_grad_accumulator` to set the accumulator.\n   Edge gradient_edge() const {\n     // If grad_fn is null (as is the case for a leaf node), we instead\n-    // interpret the gradient function to be a grad accumulator,\n-    // which will accumulate its inputs into the grad property of the\n-    // variable. These nodes get suppressed in some situations,\n-    // see \"suppress grad accumulation\" below. Note that only variables which\n-    // have `requires_grad = True` can have grad accumulators.\n+    // interpret the gradient function to be a gradient accumulator, which will\n+    // accumulate its inputs into the grad property of the variable. These\n+    // nodes get suppressed in some situations, see \"suppress gradient\n+    // accumulation\" below. Note that only variables which have `requires_grad =\n+    // True` can have gradient accumulators.\n     if (const auto& gradient = grad_fn()) {\n       return Edge(gradient, output_nr());\n     } else {\n       return Edge(grad_accumulator(), 0);\n     }\n   }\n \n-  inline VariableImpl* get() const;\n+  /// Return the input index of the gradient `Function` to which this `Variable`\n+  /// is connected.\n+  int output_nr() const noexcept;\n \n-  inline const Tensor & data() const;\n-  inline       Tensor & data();\n+  void set_requires_grad(bool requires_grad);\n+  bool requires_grad() const noexcept;\n \n-  inline Tensor opt_data() const;\n+  PyObject* pyobj() const noexcept;\n+  void set_pyobj(PyObject* pyobj);\n \n-  inline const Variable & grad() const;\n-  inline       Variable & grad();\n+  /// Set the type of the underlying `Tensor`.\n+  void set_type(at::Type*);","path":"torch/csrc/autograd/variable.h","position":161,"original_position":161,"commit_id":"2770506f74aa5bd4f0a6c4a3dee541a6e8e4250c","original_commit_id":"2770506f74aa5bd4f0a6c4a3dee541a6e8e4250c","user":{"login":"apaszke","id":4583066,"avatar_url":"https://avatars3.githubusercontent.com/u/4583066?v=4","gravatar_id":"","url":"https://api.github.com/users/apaszke","html_url":"https://github.com/apaszke","followers_url":"https://api.github.com/users/apaszke/followers","following_url":"https://api.github.com/users/apaszke/following{/other_user}","gists_url":"https://api.github.com/users/apaszke/gists{/gist_id}","starred_url":"https://api.github.com/users/apaszke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apaszke/subscriptions","organizations_url":"https://api.github.com/users/apaszke/orgs","repos_url":"https://api.github.com/users/apaszke/repos","events_url":"https://api.github.com/users/apaszke/events{/privacy}","received_events_url":"https://api.github.com/users/apaszke/received_events","type":"User","site_admin":false},"body":"Uuuum, what? How can you set a type of the tensor without touching the tensor? Is it a type cast or what?","created_at":"2018-02-07T23:17:23Z","updated_at":"2018-02-07T23:49:02Z","html_url":"https://github.com/pytorch/pytorch/pull/5127#discussion_r166788240","pull_request_url":"https://api.github.com/repos/pytorch/pytorch/pulls/5127","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/pytorch/pytorch/pulls/comments/166788240"},"html":{"href":"https://github.com/pytorch/pytorch/pull/5127#discussion_r166788240"},"pull_request":{"href":"https://api.github.com/repos/pytorch/pytorch/pulls/5127"}}},"pull_request":{"url":"https://api.github.com/repos/pytorch/pytorch/pulls/5127","id":167835320,"html_url":"https://github.com/pytorch/pytorch/pull/5127","diff_url":"https://github.com/pytorch/pytorch/pull/5127.diff","patch_url":"https://github.com/pytorch/pytorch/pull/5127.patch","issue_url":"https://api.github.com/repos/pytorch/pytorch/issues/5127","number":5127,"state":"open","locked":false,"title":"Improve Variable interface","user":{"login":"goldsborough","id":6429851,"avatar_url":"https://avatars3.githubusercontent.com/u/6429851?v=4","gravatar_id":"","url":"https://api.github.com/users/goldsborough","html_url":"https://github.com/goldsborough","followers_url":"https://api.github.com/users/goldsborough/followers","following_url":"https://api.github.com/users/goldsborough/following{/other_user}","gists_url":"https://api.github.com/users/goldsborough/gists{/gist_id}","starred_url":"https://api.github.com/users/goldsborough/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/goldsborough/subscriptions","organizations_url":"https://api.github.com/users/goldsborough/orgs","repos_url":"https://api.github.com/users/goldsborough/repos","events_url":"https://api.github.com/users/goldsborough/events{/privacy}","received_events_url":"https://api.github.com/users/goldsborough/received_events","type":"User","site_admin":false},"body":"This PR is a large change that revamps the `autograd::Variable` interface to provide a clean API that encapsulates implementation details and reduces code required to interact with `Variable`s.\r\n\r\nA large part of this PR are small changes to update use-sites to use the new API. I would recommend beginning by taking a look at `variable.h` and `variable.cpp`, as well as `variable_version.h`, which have large changes.\r\n\r\nI've also attempted to improve documentation of the `Variable`. Please let me know if either the API or the documentation does not make sense, or if either could be improved.\r\n\r\n@zdevito @apaszke @colesbury ","created_at":"2018-02-07T23:11:01Z","updated_at":"2018-02-07T23:49:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e5659905412d41dfa8fd7fd1d29bd39505d62bd3","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"milestone":null,"commits_url":"https://api.github.com/repos/pytorch/pytorch/pulls/5127/commits","review_comments_url":"https://api.github.com/repos/pytorch/pytorch/pulls/5127/comments","review_comment_url":"https://api.github.com/repos/pytorch/pytorch/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pytorch/pytorch/issues/5127/comments","statuses_url":"https://api.github.com/repos/pytorch/pytorch/statuses/2770506f74aa5bd4f0a6c4a3dee541a6e8e4250c","head":{"label":"goldsborough:variable","ref":"variable","sha":"2770506f74aa5bd4f0a6c4a3dee541a6e8e4250c","user":{"login":"goldsborough","id":6429851,"avatar_url":"https://avatars3.githubusercontent.com/u/6429851?v=4","gravatar_id":"","url":"https://api.github.com/users/goldsborough","html_url":"https://github.com/goldsborough","followers_url":"https://api.github.com/users/goldsborough/followers","following_url":"https://api.github.com/users/goldsborough/following{/other_user}","gists_url":"https://api.github.com/users/goldsborough/gists{/gist_id}","starred_url":"https://api.github.com/users/goldsborough/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/goldsborough/subscriptions","organizations_url":"https://api.github.com/users/goldsborough/orgs","repos_url":"https://api.github.com/users/goldsborough/repos","events_url":"https://api.github.com/users/goldsborough/events{/privacy}","received_events_url":"https://api.github.com/users/goldsborough/received_events","type":"User","site_admin":false},"repo":{"id":115096378,"name":"pytorch","full_name":"goldsborough/pytorch","owner":{"login":"goldsborough","id":6429851,"avatar_url":"https://avatars3.githubusercontent.com/u/6429851?v=4","gravatar_id":"","url":"https://api.github.com/users/goldsborough","html_url":"https://github.com/goldsborough","followers_url":"https://api.github.com/users/goldsborough/followers","following_url":"https://api.github.com/users/goldsborough/following{/other_user}","gists_url":"https://api.github.com/users/goldsborough/gists{/gist_id}","starred_url":"https://api.github.com/users/goldsborough/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/goldsborough/subscriptions","organizations_url":"https://api.github.com/users/goldsborough/orgs","repos_url":"https://api.github.com/users/goldsborough/repos","events_url":"https://api.github.com/users/goldsborough/events{/privacy}","received_events_url":"https://api.github.com/users/goldsborough/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/goldsborough/pytorch","description":"Tensors and Dynamic neural networks in Python  with strong GPU acceleration","fork":true,"url":"https://api.github.com/repos/goldsborough/pytorch","forks_url":"https://api.github.com/repos/goldsborough/pytorch/forks","keys_url":"https://api.github.com/repos/goldsborough/pytorch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/goldsborough/pytorch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/goldsborough/pytorch/teams","hooks_url":"https://api.github.com/repos/goldsborough/pytorch/hooks","issue_events_url":"https://api.github.com/repos/goldsborough/pytorch/issues/events{/number}","events_url":"https://api.github.com/repos/goldsborough/pytorch/events","assignees_url":"https://api.github.com/repos/goldsborough/pytorch/assignees{/user}","branches_url":"https://api.github.com/repos/goldsborough/pytorch/branches{/branch}","tags_url":"https://api.github.com/repos/goldsborough/pytorch/tags","blobs_url":"https://api.github.com/repos/goldsborough/pytorch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/goldsborough/pytorch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/goldsborough/pytorch/git/refs{/sha}","trees_url":"https://api.github.com/repos/goldsborough/pytorch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/goldsborough/pytorch/statuses/{sha}","languages_url":"https://api.github.com/repos/goldsborough/pytorch/languages","stargazers_url":"https://api.github.com/repos/goldsborough/pytorch/stargazers","contributors_url":"https://api.github.com/repos/goldsborough/pytorch/contributors","subscribers_url":"https://api.github.com/repos/goldsborough/pytorch/subscribers","subscription_url":"https://api.github.com/repos/goldsborough/pytorch/subscription","commits_url":"https://api.github.com/repos/goldsborough/pytorch/commits{/sha}","git_commits_url":"https://api.github.com/repos/goldsborough/pytorch/git/commits{/sha}","comments_url":"https://api.github.com/repos/goldsborough/pytorch/comments{/number}","issue_comment_url":"https://api.github.com/repos/goldsborough/pytorch/issues/comments{/number}","contents_url":"https://api.github.com/repos/goldsborough/pytorch/contents/{+path}","compare_url":"https://api.github.com/repos/goldsborough/pytorch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/goldsborough/pytorch/merges","archive_url":"https://api.github.com/repos/goldsborough/pytorch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/goldsborough/pytorch/downloads","issues_url":"https://api.github.com/repos/goldsborough/pytorch/issues{/number}","pulls_url":"https://api.github.com/repos/goldsborough/pytorch/pulls{/number}","milestones_url":"https://api.github.com/repos/goldsborough/pytorch/milestones{/number}","notifications_url":"https://api.github.com/repos/goldsborough/pytorch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/goldsborough/pytorch/labels{/name}","releases_url":"https://api.github.com/repos/goldsborough/pytorch/releases{/id}","deployments_url":"https://api.github.com/repos/goldsborough/pytorch/deployments","created_at":"2017-12-22T08:49:57Z","updated_at":"2017-12-22T08:50:02Z","pushed_at":"2018-02-07T23:10:43Z","git_url":"git://github.com/goldsborough/pytorch.git","ssh_url":"git@github.com:goldsborough/pytorch.git","clone_url":"https://github.com/goldsborough/pytorch.git","svn_url":"https://github.com/goldsborough/pytorch","homepage":"http://pytorch.org","size":22221,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"pytorch:master","ref":"master","sha":"2c27bae80256022c20e6b7c783c6e0adcb32c3bc","user":{"login":"pytorch","id":21003710,"avatar_url":"https://avatars3.githubusercontent.com/u/21003710?v=4","gravatar_id":"","url":"https://api.github.com/users/pytorch","html_url":"https://github.com/pytorch","followers_url":"https://api.github.com/users/pytorch/followers","following_url":"https://api.github.com/users/pytorch/following{/other_user}","gists_url":"https://api.github.com/users/pytorch/gists{/gist_id}","starred_url":"https://api.github.com/users/pytorch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pytorch/subscriptions","organizations_url":"https://api.github.com/users/pytorch/orgs","repos_url":"https://api.github.com/users/pytorch/repos","events_url":"https://api.github.com/users/pytorch/events{/privacy}","received_events_url":"https://api.github.com/users/pytorch/received_events","type":"Organization","site_admin":false},"repo":{"id":65600975,"name":"pytorch","full_name":"pytorch/pytorch","owner":{"login":"pytorch","id":21003710,"avatar_url":"https://avatars3.githubusercontent.com/u/21003710?v=4","gravatar_id":"","url":"https://api.github.com/users/pytorch","html_url":"https://github.com/pytorch","followers_url":"https://api.github.com/users/pytorch/followers","following_url":"https://api.github.com/users/pytorch/following{/other_user}","gists_url":"https://api.github.com/users/pytorch/gists{/gist_id}","starred_url":"https://api.github.com/users/pytorch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pytorch/subscriptions","organizations_url":"https://api.github.com/users/pytorch/orgs","repos_url":"https://api.github.com/users/pytorch/repos","events_url":"https://api.github.com/users/pytorch/events{/privacy}","received_events_url":"https://api.github.com/users/pytorch/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pytorch/pytorch","description":"Tensors and Dynamic neural networks in Python  with strong GPU acceleration","fork":false,"url":"https://api.github.com/repos/pytorch/pytorch","forks_url":"https://api.github.com/repos/pytorch/pytorch/forks","keys_url":"https://api.github.com/repos/pytorch/pytorch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pytorch/pytorch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pytorch/pytorch/teams","hooks_url":"https://api.github.com/repos/pytorch/pytorch/hooks","issue_events_url":"https://api.github.com/repos/pytorch/pytorch/issues/events{/number}","events_url":"https://api.github.com/repos/pytorch/pytorch/events","assignees_url":"https://api.github.com/repos/pytorch/pytorch/assignees{/user}","branches_url":"https://api.github.com/repos/pytorch/pytorch/branches{/branch}","tags_url":"https://api.github.com/repos/pytorch/pytorch/tags","blobs_url":"https://api.github.com/repos/pytorch/pytorch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pytorch/pytorch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pytorch/pytorch/git/refs{/sha}","trees_url":"https://api.github.com/repos/pytorch/pytorch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pytorch/pytorch/statuses/{sha}","languages_url":"https://api.github.com/repos/pytorch/pytorch/languages","stargazers_url":"https://api.github.com/repos/pytorch/pytorch/stargazers","contributors_url":"https://api.github.com/repos/pytorch/pytorch/contributors","subscribers_url":"https://api.github.com/repos/pytorch/pytorch/subscribers","subscription_url":"https://api.github.com/repos/pytorch/pytorch/subscription","commits_url":"https://api.github.com/repos/pytorch/pytorch/commits{/sha}","git_commits_url":"https://api.github.com/repos/pytorch/pytorch/git/commits{/sha}","comments_url":"https://api.github.com/repos/pytorch/pytorch/comments{/number}","issue_comment_url":"https://api.github.com/repos/pytorch/pytorch/issues/comments{/number}","contents_url":"https://api.github.com/repos/pytorch/pytorch/contents/{+path}","compare_url":"https://api.github.com/repos/pytorch/pytorch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pytorch/pytorch/merges","archive_url":"https://api.github.com/repos/pytorch/pytorch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pytorch/pytorch/downloads","issues_url":"https://api.github.com/repos/pytorch/pytorch/issues{/number}","pulls_url":"https://api.github.com/repos/pytorch/pytorch/pulls{/number}","milestones_url":"https://api.github.com/repos/pytorch/pytorch/milestones{/number}","notifications_url":"https://api.github.com/repos/pytorch/pytorch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pytorch/pytorch/labels{/name}","releases_url":"https://api.github.com/repos/pytorch/pytorch/releases{/id}","deployments_url":"https://api.github.com/repos/pytorch/pytorch/deployments","created_at":"2016-08-13T05:26:41Z","updated_at":"2018-02-07T23:15:05Z","pushed_at":"2018-02-07T23:38:05Z","git_url":"git://github.com/pytorch/pytorch.git","ssh_url":"git@github.com:pytorch/pytorch.git","clone_url":"https://github.com/pytorch/pytorch.git","svn_url":"https://github.com/pytorch/pytorch","homepage":"http://pytorch.org","size":22348,"stargazers_count":12103,"watchers_count":12103,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2513,"mirror_url":null,"archived":false,"open_issues_count":711,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":2513,"open_issues":711,"watchers":12103,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pytorch/pytorch/pulls/5127"},"html":{"href":"https://github.com/pytorch/pytorch/pull/5127"},"issue":{"href":"https://api.github.com/repos/pytorch/pytorch/issues/5127"},"comments":{"href":"https://api.github.com/repos/pytorch/pytorch/issues/5127/comments"},"review_comments":{"href":"https://api.github.com/repos/pytorch/pytorch/pulls/5127/comments"},"review_comment":{"href":"https://api.github.com/repos/pytorch/pytorch/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pytorch/pytorch/pulls/5127/commits"},"statuses":{"href":"https://api.github.com/repos/pytorch/pytorch/statuses/2770506f74aa5bd4f0a6c4a3dee541a6e8e4250c"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"apaszke"}}