{"action":"created","comment":{"url":"https://api.github.com/repos/dmlc/tvm/pulls/comments/217867560","pull_request_review_id":155693741,"id":217867560,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNzg2NzU2MA==","diff_hunk":"@@ -0,0 +1,108 @@\n+/*!\n+ *  Copyright (c) 2018 by Contributors\n+ * \\file tvm/relay/environment.h\n+ * \\brief The global environment: contains information needed to\n+ * compile & optimize Relay programs.\n+ */\n+#ifndef TVM_RELAY_ENVIRONMENT_H_\n+#define TVM_RELAY_ENVIRONMENT_H_\n+\n+#include <tvm/relay/error.h>\n+#include <tvm/relay/expr.h>\n+#include <tvm/relay/op.h>\n+#include <tvm/relay/source_map.h>\n+#include <tvm/relay/type.h>\n+#include <string>\n+#include <vector>\n+\n+namespace tvm {\n+namespace relay {\n+\n+struct Environment;\n+\n+/*! \\brief The global environment of Relay programs.\n+ *\n+ *  The global environment contains the global\n+ *  information needed to compile a Relay program.\n+ *\n+ *  It contains all global functions, and configuration\n+ *  options.\n+ *\n+ *  Many operations require access to the global\n+ *  Environment. We pass the Environment by value\n+ *  in a functional style as an explicit argument,\n+ *  but we mutate the Environment while optimizing\n+ *  Relay programs.\n+ *\n+ *  The functional style allows users to construct custom\n+ *  environments easily, for example each thread can store\n+ *  an Environment while auto-tuning.\n+ * */\n+\n+class EnvironmentNode : public RelayNode {\n+ private:\n+  /*! \\brief A map from string names to global variables ensures global\n+   * uniqueness. */\n+  tvm::Map<std::string, GlobalVar> global_map_;\n+  /*! \\brief A map from file names to source fragments. */\n+  SourceMap source_map_;\n+  /*! \\brief A list of the errors reported during the current run. */\n+  std::vector<SpannedError> errors_;\n+\n+ public:\n+  /*! \\brief A map from ids to all global functions. */\n+  tvm::Map<GlobalVar, Function> functions;\n+\n+  EnvironmentNode() {}\n+\n+  void VisitAttrs(tvm::AttrVisitor* v) final {}\n+\n+  TVM_DLL static Environment make(tvm::Map<GlobalVar, Function> global_funcs);\n+\n+  void Add(const GlobalVar& var, const Function& func, bool update = false);\n+  void Update(const GlobalVar& var, const Function& func);\n+  void Remove(const GlobalVar& var);\n+\n+  /*! \\brief Lookup a global function by its variable. */\n+  GlobalVar GetGlobalVar(const std::string& str);\n+\n+  /*! \\brief Lookup a global function by its variable. */\n+  Function Lookup(const GlobalVar& id);\n+\n+  /*! \\brief Lookup a global function by its string name */\n+  Function Lookup(const std::string& s);\n+\n+  // TODO(@jroesch, @tqchen): what are the semantics here\n+  void Merge(const Environment& env);\n+\n+  /*! \\brief Add a source fragment to the environment. */\n+  SourceName AddSource(std::string file_name, std::string source);\n+\n+  using Transformer = runtime::TypedPackedFunc<\n+      runtime::TypedPackedFunc<Function(const GlobalVar&, const Function&)>(const Environment&)>;\n+\n+  /*! \\brief Apply a function over every function in the global environment. */\n+  void Transform(Transformer tranformer);\n+\n+  void AddDiagnostic(SpannedError);","path":"include/tvm/relay/environment.h","position":87,"original_position":87,"commit_id":"5a0410c9e1e097a8b1fd6eb5cffbe901e5a53771","original_commit_id":"5a0410c9e1e097a8b1fd6eb5cffbe901e5a53771","user":{"login":"tqchen","id":2577440,"node_id":"MDQ6VXNlcjI1Nzc0NDA=","avatar_url":"https://avatars3.githubusercontent.com/u/2577440?v=4","gravatar_id":"","url":"https://api.github.com/users/tqchen","html_url":"https://github.com/tqchen","followers_url":"https://api.github.com/users/tqchen/followers","following_url":"https://api.github.com/users/tqchen/following{/other_user}","gists_url":"https://api.github.com/users/tqchen/gists{/gist_id}","starred_url":"https://api.github.com/users/tqchen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tqchen/subscriptions","organizations_url":"https://api.github.com/users/tqchen/orgs","repos_url":"https://api.github.com/users/tqchen/repos","events_url":"https://api.github.com/users/tqchen/events{/privacy}","received_events_url":"https://api.github.com/users/tqchen/received_events","type":"User","site_admin":false},"body":"remove diagnostic for now","created_at":"2018-09-15T00:04:59Z","updated_at":"2018-09-15T00:26:38Z","html_url":"https://github.com/dmlc/tvm/pull/1672#discussion_r217867560","pull_request_url":"https://api.github.com/repos/dmlc/tvm/pulls/1672","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/comments/217867560"},"html":{"href":"https://github.com/dmlc/tvm/pull/1672#discussion_r217867560"},"pull_request":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1672"}}},"pull_request":{"url":"https://api.github.com/repos/dmlc/tvm/pulls/1672","id":211596782,"node_id":"MDExOlB1bGxSZXF1ZXN0MjExNTk2Nzgy","html_url":"https://github.com/dmlc/tvm/pull/1672","diff_url":"https://github.com/dmlc/tvm/pull/1672.diff","patch_url":"https://github.com/dmlc/tvm/pull/1672.patch","issue_url":"https://api.github.com/repos/dmlc/tvm/issues/1672","number":1672,"state":"open","locked":false,"title":"[High level OPT][RFC] NNVMv2 IR - Relay","user":{"login":"jroesch","id":696509,"node_id":"MDQ6VXNlcjY5NjUwOQ==","avatar_url":"https://avatars2.githubusercontent.com/u/696509?v=4","gravatar_id":"","url":"https://api.github.com/users/jroesch","html_url":"https://github.com/jroesch","followers_url":"https://api.github.com/users/jroesch/followers","following_url":"https://api.github.com/users/jroesch/following{/other_user}","gists_url":"https://api.github.com/users/jroesch/gists{/gist_id}","starred_url":"https://api.github.com/users/jroesch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jroesch/subscriptions","organizations_url":"https://api.github.com/users/jroesch/orgs","repos_url":"https://api.github.com/users/jroesch/repos","events_url":"https://api.github.com/users/jroesch/events{/privacy}","received_events_url":"https://api.github.com/users/jroesch/received_events","type":"User","site_admin":false},"body":"# [RFC]: Relay a new high level IR for TVM\r\n\r\nRelay is a new high level intermediate representation (IR) intended to act as v2.0 of NNVM.\r\n\r\nSee #1673 for the full RFC details.\r\n\r\n## Python 2.7 Support\r\n\r\nOur goal is to adapt the core IR code to support 2.7 as well as 3.X. We plan on addressing this near the end of the PR review window after other TODOs have been addressed.\r\n\r\n## Features\r\n\r\nThis PR was extracted from a larger work-in-progress version of Relay, and as such it still needs some additional features before it is ready to merge into TVM mainline. We are opening the PR in a \"nearly finished\" state so other contributors can provide review and feedback on the alpha design and implementation of Relay.\r\n\r\n## Core IR \r\n- [x] Add base nodes for IR\r\n- [x] Add `Type` nodes for IR\r\n- [x] Add `Expr` nodes for IR\r\n- [x] IR C++ Docs\r\n- [ ] IR Python Docs\r\n- [x] Add operator registry with TVM integration\r\n- [x] Add new attribute system exposed in C++ and Python\r\n- [x] Improve construction of nodes\r\n- [x] Add type inference for Relay\r\n   + [x] Fix helpers in the Environment\r\n   + [ ] Add few more type relation examples.\r\n   + [ ] Restore kind checker\r\n   + [x] Increase test coverage\r\n- [x] Add compiler to TVM runtime for Relay \r\n   + [x] Port mono-morphization pass \r\n   + [x] Port TVM RTS compiler\r\n- [x] Demonstrate writing a pass in both C++ (type inference) and Python.\r\n- [ ] IR Builder Docs\r\n- [ ] Restore code for printing NDArray's in Numpy style\r\n- [ ] Restore error display\r\n\r\n## Code Map\r\n\r\nThis section contains a high level overview of the code organization by file.\r\n\r\n### Core IR\r\n- `include/tvm/relay/base.h` and `src/relay/ir/base.cc` contain the base classes for Relay AST.\r\n    We reuse the `tvm::Node` infrastructure to enable Python interoperability.\r\n- `include/tvm/relay/type.h` and `src/relay/ir/type.cc` contain the type classes for the Relay Type AST. \r\n- `include/tvm/relay/expr.h` and `src/relay/ir/expr.cc` contain the expression classes for the Relay expression AST. This is a small functional language with functions, control-flow, operators, and constants.\r\n- `include/tvm/relay/op.h` and `src/relay/ir/op.cc` contains the definition of the Relay operator registry. Relay's operator registry stores high level information about operators such as type, and metadata useful for optimization similar to NNVM.\r\n- `include/tvm/relay/environment.h` and `src/relay/ir/environment.cc` contains the global environment, which contains all global functions and configuration options for the compiler.\r\n- `include/tvm/relay/error.h`\r\n- `include/tvm/relay/expr_functor.h` and `include/tvm/relay/expr_visitor.h` define traversal strategies over Relay expressions.\r\n- `include/tvm/relay/logging.h` contains a wrapper around logging which can be controlled with an environment variable. This is useful for extra logging information while debugging the compiler.\r\n- `include/tvm/relay/pass.h` exports the current set of Relay passes (only type inference right now).\r\n- include/tvm/relay/source_map.h src/relay/source_map.cc\r\n\r\n### Operators\r\n- `src/relay/op/tensor/elemwise.cc` provides examples of registering Relay operators.\r\n- `src/relay/op/type_relations.cc` and `src/relay/op/type_relations.h` defines common\r\ntype relations (i.e shape inference functions) for operators.\r\n\r\n### Type Inference \r\n- `include/tvm/relay/pass/type_infer.h` and `src/relay/pass/type_infer.cc` implement type inference, and type checking. Given a Relay expression (`e`) they infer a type (`T`) written (`e : T`) and check that `e` has type `T`. This process proceeds by building partial types for an expression and iteratively filling the type in by solving constraints introduced in the program.\r\n- `src/relay/pass/incomplete_type.h` introduces an \"incomplete type\" (known as a type variable in the programming language and compiler literature), this represents a portion of the type we do not yet know.\r\n- `src/relay/pass/unifier.h` and `src/relay/pass/unifier.cc` implement type [unification](https://en.wikipedia.org/wiki/Unification_(computer_science)). They solve equations between types which arise due to type inference/checking, the idea is that there are some unknown portions of the type (incomplete types) and our goal is to fill them in given a set of equations on types. \r\n- `include/tvm/relay/pass/alpha_eq.h` and `src/relay/pass/alpha_eq.cc` implements structural equivalence of Relay types and expressions. This is called alpha equivalence in the programming language and compiler literature.\r\n- `src/relay/pass/resolve.h` and `src/relay/pass/resolve.cc` implement a procedure which will resolve incomplete types into complete ones based on solutions in the unifier. \r\n- `src/relay/pass/type_functor.h` and `src/relay/pass/type_visitor.h` implement useful traversal strategies over types.\r\n- `src/relay/pass/type_subst.h` and `src/relay/pass/type_subst.cc` implement type substitution.\r\n\r\n### Python Core IR\r\n- `python/tvm/relay/__init__.py` is the entry point of the Relay namespace.\r\n- `python/tvm/relay/_env.py` exports the FFI to the `Environment` and `python/tvm/relay/_env.pyi` adds MyPy stubs.\r\n- `python/tvm/relay/_ir_pass.py` exports the FFI to the pass functions and `python/tvm/relay/_ir_pass.pyi` adds MyPy stubs.\r\n- `python/tvm/relay/_make.py` exports the constructor functions used in `expr.py`, etc.\r\n- `python/tvm/relay/base.py`, `python/tvm/relay/env.py`, `python/tvm/relay/expr.py`, and `python/tvm/relay/type.py` export their C++ counterparts to Python.\r\n- `python/tvm/relay/ir_builder.py` contains a first attempt at an IRBuilder for Relay.\r\n- `python/tvm/relay/ir_pass.py` contain the pass functions exported by Relay.\r\n\r\n## Python Operators\r\n- `python/tvm/relay/op/__init__.py` entry point into `relay.op` namespace.\r\n- `python/tvm/relay/op/_make.py` exposes functions which build calls to each op.\r\n- `python/tvm/relay/op/tensor.py` contains explicit definitions of operators which dispatch to the primitives defined in `op/_make.py`, this means Relay's Python API has explicit signatures for each op, and don't rely on `*args` and `**kwargs`.\r\n- `python/tvm/relay/op/_tensor.py` backend registry for compiler related data about ops in `tensor.py`.\r\n- `python/tvm/relay/op/op.py` exposes functionality on the Operator Registry.\r\n\r\n## Python Compiler to TVM RTS\r\n- `python/tvm/relay/tvm_rts_backend.py` contains a soon to be updated version of a compiler from Relay to the TVM RTS.\r\n\r\n\r\n## Timeline\r\n\r\n- Complete PR checklists.\r\n- Leave PR open for ~2 weeks for review and feedback while finishing up TODOs.\r\n- Merge PR with @tqchen when he returns from vacation.\r\n\r\n# Thanks\r\n \r\nFinally I would like to thank all the people who helped out with the development of Relay. Although I am the author of most of these commits the work is derived from months of hard work from @MarisaKirisame @slyubomirsky @joshpoll @weberlo @tqchen and @ztatlock.\r\n","created_at":"2018-08-29T00:39:15Z","updated_at":"2018-09-15T00:26:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f10b00c994cf6b4fc37ed41e1132311501897264","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":540459689,"node_id":"MDU6TGFiZWw1NDA0NTk2ODk=","url":"https://api.github.com/repos/dmlc/tvm/labels/status:%20RFC","name":"status: RFC","color":"15d3d0","default":false},{"id":858780915,"node_id":"MDU6TGFiZWw4NTg3ODA5MTU=","url":"https://api.github.com/repos/dmlc/tvm/labels/status:%20need%20review","name":"status: need review","color":"fbca04","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/dmlc/tvm/pulls/1672/commits","review_comments_url":"https://api.github.com/repos/dmlc/tvm/pulls/1672/comments","review_comment_url":"https://api.github.com/repos/dmlc/tvm/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dmlc/tvm/issues/1672/comments","statuses_url":"https://api.github.com/repos/dmlc/tvm/statuses/5a0410c9e1e097a8b1fd6eb5cffbe901e5a53771","head":{"label":"jroesch:relay","ref":"relay","sha":"5a0410c9e1e097a8b1fd6eb5cffbe901e5a53771","user":{"login":"jroesch","id":696509,"node_id":"MDQ6VXNlcjY5NjUwOQ==","avatar_url":"https://avatars2.githubusercontent.com/u/696509?v=4","gravatar_id":"","url":"https://api.github.com/users/jroesch","html_url":"https://github.com/jroesch","followers_url":"https://api.github.com/users/jroesch/followers","following_url":"https://api.github.com/users/jroesch/following{/other_user}","gists_url":"https://api.github.com/users/jroesch/gists{/gist_id}","starred_url":"https://api.github.com/users/jroesch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jroesch/subscriptions","organizations_url":"https://api.github.com/users/jroesch/orgs","repos_url":"https://api.github.com/users/jroesch/repos","events_url":"https://api.github.com/users/jroesch/events{/privacy}","received_events_url":"https://api.github.com/users/jroesch/received_events","type":"User","site_admin":false},"repo":{"id":135759537,"node_id":"MDEwOlJlcG9zaXRvcnkxMzU3NTk1Mzc=","name":"tvm","full_name":"jroesch/tvm","owner":{"login":"jroesch","id":696509,"node_id":"MDQ6VXNlcjY5NjUwOQ==","avatar_url":"https://avatars2.githubusercontent.com/u/696509?v=4","gravatar_id":"","url":"https://api.github.com/users/jroesch","html_url":"https://github.com/jroesch","followers_url":"https://api.github.com/users/jroesch/followers","following_url":"https://api.github.com/users/jroesch/following{/other_user}","gists_url":"https://api.github.com/users/jroesch/gists{/gist_id}","starred_url":"https://api.github.com/users/jroesch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jroesch/subscriptions","organizations_url":"https://api.github.com/users/jroesch/orgs","repos_url":"https://api.github.com/users/jroesch/repos","events_url":"https://api.github.com/users/jroesch/events{/privacy}","received_events_url":"https://api.github.com/users/jroesch/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jroesch/tvm","description":"Open deep learning compiler stack for cpu, gpu and specialized accelerators","fork":true,"url":"https://api.github.com/repos/jroesch/tvm","forks_url":"https://api.github.com/repos/jroesch/tvm/forks","keys_url":"https://api.github.com/repos/jroesch/tvm/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jroesch/tvm/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jroesch/tvm/teams","hooks_url":"https://api.github.com/repos/jroesch/tvm/hooks","issue_events_url":"https://api.github.com/repos/jroesch/tvm/issues/events{/number}","events_url":"https://api.github.com/repos/jroesch/tvm/events","assignees_url":"https://api.github.com/repos/jroesch/tvm/assignees{/user}","branches_url":"https://api.github.com/repos/jroesch/tvm/branches{/branch}","tags_url":"https://api.github.com/repos/jroesch/tvm/tags","blobs_url":"https://api.github.com/repos/jroesch/tvm/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jroesch/tvm/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jroesch/tvm/git/refs{/sha}","trees_url":"https://api.github.com/repos/jroesch/tvm/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jroesch/tvm/statuses/{sha}","languages_url":"https://api.github.com/repos/jroesch/tvm/languages","stargazers_url":"https://api.github.com/repos/jroesch/tvm/stargazers","contributors_url":"https://api.github.com/repos/jroesch/tvm/contributors","subscribers_url":"https://api.github.com/repos/jroesch/tvm/subscribers","subscription_url":"https://api.github.com/repos/jroesch/tvm/subscription","commits_url":"https://api.github.com/repos/jroesch/tvm/commits{/sha}","git_commits_url":"https://api.github.com/repos/jroesch/tvm/git/commits{/sha}","comments_url":"https://api.github.com/repos/jroesch/tvm/comments{/number}","issue_comment_url":"https://api.github.com/repos/jroesch/tvm/issues/comments{/number}","contents_url":"https://api.github.com/repos/jroesch/tvm/contents/{+path}","compare_url":"https://api.github.com/repos/jroesch/tvm/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jroesch/tvm/merges","archive_url":"https://api.github.com/repos/jroesch/tvm/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jroesch/tvm/downloads","issues_url":"https://api.github.com/repos/jroesch/tvm/issues{/number}","pulls_url":"https://api.github.com/repos/jroesch/tvm/pulls{/number}","milestones_url":"https://api.github.com/repos/jroesch/tvm/milestones{/number}","notifications_url":"https://api.github.com/repos/jroesch/tvm/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jroesch/tvm/labels{/name}","releases_url":"https://api.github.com/repos/jroesch/tvm/releases{/id}","deployments_url":"https://api.github.com/repos/jroesch/tvm/deployments","created_at":"2018-06-01T20:15:33Z","updated_at":"2018-09-14T20:24:25Z","pushed_at":"2018-09-14T23:29:44Z","git_url":"git://github.com/jroesch/tvm.git","ssh_url":"git@github.com:jroesch/tvm.git","clone_url":"https://github.com/jroesch/tvm.git","svn_url":"https://github.com/jroesch/tvm","homepage":"http://www.tvm.ai","size":7562,"stargazers_count":3,"watchers_count":3,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":2,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":1,"open_issues":2,"watchers":3,"default_branch":"master"}},"base":{"label":"dmlc:master","ref":"master","sha":"ef39eac34de4e8a3070b3d9083626ea9fddada8c","user":{"login":"dmlc","id":11508361,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNTA4MzYx","avatar_url":"https://avatars2.githubusercontent.com/u/11508361?v=4","gravatar_id":"","url":"https://api.github.com/users/dmlc","html_url":"https://github.com/dmlc","followers_url":"https://api.github.com/users/dmlc/followers","following_url":"https://api.github.com/users/dmlc/following{/other_user}","gists_url":"https://api.github.com/users/dmlc/gists{/gist_id}","starred_url":"https://api.github.com/users/dmlc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmlc/subscriptions","organizations_url":"https://api.github.com/users/dmlc/orgs","repos_url":"https://api.github.com/users/dmlc/repos","events_url":"https://api.github.com/users/dmlc/events{/privacy}","received_events_url":"https://api.github.com/users/dmlc/received_events","type":"Organization","site_admin":false},"repo":{"id":70746484,"node_id":"MDEwOlJlcG9zaXRvcnk3MDc0NjQ4NA==","name":"tvm","full_name":"dmlc/tvm","owner":{"login":"dmlc","id":11508361,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNTA4MzYx","avatar_url":"https://avatars2.githubusercontent.com/u/11508361?v=4","gravatar_id":"","url":"https://api.github.com/users/dmlc","html_url":"https://github.com/dmlc","followers_url":"https://api.github.com/users/dmlc/followers","following_url":"https://api.github.com/users/dmlc/following{/other_user}","gists_url":"https://api.github.com/users/dmlc/gists{/gist_id}","starred_url":"https://api.github.com/users/dmlc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmlc/subscriptions","organizations_url":"https://api.github.com/users/dmlc/orgs","repos_url":"https://api.github.com/users/dmlc/repos","events_url":"https://api.github.com/users/dmlc/events{/privacy}","received_events_url":"https://api.github.com/users/dmlc/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dmlc/tvm","description":"Open deep learning compiler stack for cpu, gpu and specialized accelerators","fork":false,"url":"https://api.github.com/repos/dmlc/tvm","forks_url":"https://api.github.com/repos/dmlc/tvm/forks","keys_url":"https://api.github.com/repos/dmlc/tvm/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dmlc/tvm/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dmlc/tvm/teams","hooks_url":"https://api.github.com/repos/dmlc/tvm/hooks","issue_events_url":"https://api.github.com/repos/dmlc/tvm/issues/events{/number}","events_url":"https://api.github.com/repos/dmlc/tvm/events","assignees_url":"https://api.github.com/repos/dmlc/tvm/assignees{/user}","branches_url":"https://api.github.com/repos/dmlc/tvm/branches{/branch}","tags_url":"https://api.github.com/repos/dmlc/tvm/tags","blobs_url":"https://api.github.com/repos/dmlc/tvm/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dmlc/tvm/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dmlc/tvm/git/refs{/sha}","trees_url":"https://api.github.com/repos/dmlc/tvm/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dmlc/tvm/statuses/{sha}","languages_url":"https://api.github.com/repos/dmlc/tvm/languages","stargazers_url":"https://api.github.com/repos/dmlc/tvm/stargazers","contributors_url":"https://api.github.com/repos/dmlc/tvm/contributors","subscribers_url":"https://api.github.com/repos/dmlc/tvm/subscribers","subscription_url":"https://api.github.com/repos/dmlc/tvm/subscription","commits_url":"https://api.github.com/repos/dmlc/tvm/commits{/sha}","git_commits_url":"https://api.github.com/repos/dmlc/tvm/git/commits{/sha}","comments_url":"https://api.github.com/repos/dmlc/tvm/comments{/number}","issue_comment_url":"https://api.github.com/repos/dmlc/tvm/issues/comments{/number}","contents_url":"https://api.github.com/repos/dmlc/tvm/contents/{+path}","compare_url":"https://api.github.com/repos/dmlc/tvm/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dmlc/tvm/merges","archive_url":"https://api.github.com/repos/dmlc/tvm/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dmlc/tvm/downloads","issues_url":"https://api.github.com/repos/dmlc/tvm/issues{/number}","pulls_url":"https://api.github.com/repos/dmlc/tvm/pulls{/number}","milestones_url":"https://api.github.com/repos/dmlc/tvm/milestones{/number}","notifications_url":"https://api.github.com/repos/dmlc/tvm/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dmlc/tvm/labels{/name}","releases_url":"https://api.github.com/repos/dmlc/tvm/releases{/id}","deployments_url":"https://api.github.com/repos/dmlc/tvm/deployments","created_at":"2016-10-12T22:20:28Z","updated_at":"2018-09-14T19:37:21Z","pushed_at":"2018-09-14T23:29:47Z","git_url":"git://github.com/dmlc/tvm.git","ssh_url":"git@github.com:dmlc/tvm.git","clone_url":"https://github.com/dmlc/tvm.git","svn_url":"https://github.com/dmlc/tvm","homepage":"https://tvm.ai","size":7105,"stargazers_count":1999,"watchers_count":1999,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":454,"mirror_url":null,"archived":false,"open_issues_count":49,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":454,"open_issues":49,"watchers":1999,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1672"},"html":{"href":"https://github.com/dmlc/tvm/pull/1672"},"issue":{"href":"https://api.github.com/repos/dmlc/tvm/issues/1672"},"comments":{"href":"https://api.github.com/repos/dmlc/tvm/issues/1672/comments"},"review_comments":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1672/comments"},"review_comment":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1672/commits"},"statuses":{"href":"https://api.github.com/repos/dmlc/tvm/statuses/5a0410c9e1e097a8b1fd6eb5cffbe901e5a53771"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"tqchen"}}