{"action":"created","comment":{"url":"https://api.github.com/repos/dmlc/tvm/pulls/comments/228407811","pull_request_review_id":168660076,"id":228407811,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyODQwNzgxMQ==","diff_hunk":"@@ -0,0 +1,356 @@\n+\"\"\"A compiler from Relay programs to TVM's graph runtime.\n+\"\"\"\n+from __future__ import absolute_import\n+import json\n+import attr\n+from . import ir_pass\n+from .op import Op\n+from .ty import TensorType\n+from .expr import Var, Function, Let, Call, If, GlobalVar, Constant, Let\n+from ..build_module import build\n+from typing import Any, Dict, List, Tuple\n+from .. contrib import graph_runtime\n+from .ir_pass import infer_type, monomorph\n+from .. import cpu\n+\n+class AbstractExprVisitor(object):\n+    \"\"\"A visitor over Expr in Python.\"\"\"\n+\n+    # pylint: disable=no-else-return\n+    def visit(self, expr):\n+        \"\"\"Apply the visitor to an expression.\"\"\"\n+        if isinstance(expr, Function):\n+            return self.visit_function(expr)\n+        elif isinstance(expr, Call):\n+            return self.visit_call(expr)\n+        elif isinstance(expr, Let):\n+            return self.visit_let(expr)\n+        elif isinstance(expr, Var):\n+            return self.visit_var(expr)\n+        elif isinstance(expr, GlobalVar):\n+            return self.visit_global_var(expr)\n+        elif isinstance(expr, If):\n+            return self.visit_if(expr)\n+        elif isinstance(expr, Tuple):\n+            return self.visit_tuple(expr)\n+        elif isinstance(expr, Constant):\n+            return self.visit_constant(expr)\n+        else:\n+            raise Exception(f\"warning unhandled case: {type(expr)}\")\n+\n+    def visit_function(self, _):\n+        raise Exception(\"Abstract method please implement me.\")\n+\n+    def visit_let(self, _):\n+        raise Exception(\"Abstract method please implement me.\")\n+\n+    def visit_call(self, _):\n+        raise Exception(\"Abstract method please implement me.\")\n+\n+    def visit_var(self, _):\n+        raise Exception(\"Abstract method please implement me.\")\n+\n+    def visit_type(self, typ):\n+        return typ\n+\n+    def visit_if(self, _):\n+        raise Exception(\"Abstract method please implement me.\")\n+\n+    def visit_tuple(self, _):\n+        raise Exception(\"Abstract method please implement me.\")\n+\n+    def visit_constant(self, _):\n+        raise Exception(\"Abstract method please implement me.\")\n+\n+    def visit_global_var(self, _):\n+        raise Exception(\"Abstract method please implement me.\")\n+\n+class ExprMutator(AbstractExprVisitor):\n+    \"\"\"A functional visitor over Expr in Python.\"\"\"\n+\n+    def visit_function(self, fn):\n+        new_body = self.visit(fn.body)\n+        return Function(\n+            list(fn.params),\n+            fn.ret_type, new_body,\n+            fn.type_params)\n+\n+    def visit_let(self, let):\n+        new_var = self.visit(let.var)\n+        new_val = self.visit(let.value)\n+        new_body = self.visit(let.body)\n+        return Let(new_var, new_val, new_body)\n+\n+    def visit_call(self, call):\n+        new_fn = self.visit(call.op)\n+        new_args = [self.visit(arg) for arg in call.args]\n+        return Call(new_fn, new_args, call.attrs)\n+\n+    def visit_var(self, var):\n+        return var\n+\n+    def visit_global_id(self, global_var):\n+        return global_var\n+\n+    def visit_if(self, ite):\n+        return If(\n+            self.visit(ite.guard),\n+            self.visit(ite.true_b),\n+            self.visit(ite.false_b))\n+\n+    def visit_tuple(self, tup):\n+        return Tuple([self.visit(field) for field in tup.fields])\n+\n+    def visit_constant(self, const):\n+        return const\n+\n+@attr.s\n+class NodeRef(object):\n+    ident = attr.ib()\n+    index = attr.ib(default=0)\n+    version = attr.ib(default=0)\n+\n+    def to_json(self):\n+        return [self.ident, self.index, self.version]\n+\n+\n+@attr.s\n+class Node(object):\n+    name = attr.ib()\n+    attrs = attr.ib()\n+    is_output = attr.ib()\n+\n+    def to_json(self) -> Any:\n+        raise Exception(\"Abstract method, please implement me.\")\n+\n+\n+@attr.s\n+class InputNode(Node):\n+    \"\"\"An input node in the graph representation we lower to before NNVM's graph.\"\"\"\n+    name = attr.ib()\n+    attrs = attr.ib()\n+    is_output = attr.ib(default=False)\n+\n+    def to_json(self):\n+        return {\n+            \"op\": \"null\",\n+            \"name\": self.name,\n+            \"inputs\": []\n+        }\n+\n+\n+@attr.s\n+class OpNode(Node):\n+    \"\"\"An operator node in the graph representation we lower to before NNVM's graph.\"\"\"","path":"python/tvm/relay/to_tvm.py","position":144,"original_position":144,"commit_id":"344d3b489bf5c506f345f1d01a5482ef0f2ea2bd","original_commit_id":"344d3b489bf5c506f345f1d01a5482ef0f2ea2bd","user":{"login":"zhiics","id":5145158,"node_id":"MDQ6VXNlcjUxNDUxNTg=","avatar_url":"https://avatars1.githubusercontent.com/u/5145158?v=4","gravatar_id":"","url":"https://api.github.com/users/zhiics","html_url":"https://github.com/zhiics","followers_url":"https://api.github.com/users/zhiics/followers","following_url":"https://api.github.com/users/zhiics/following{/other_user}","gists_url":"https://api.github.com/users/zhiics/gists{/gist_id}","starred_url":"https://api.github.com/users/zhiics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhiics/subscriptions","organizations_url":"https://api.github.com/users/zhiics/orgs","repos_url":"https://api.github.com/users/zhiics/repos","events_url":"https://api.github.com/users/zhiics/events{/privacy}","received_events_url":"https://api.github.com/users/zhiics/received_events","type":"User","site_admin":false},"body":"May I ask if this graph is more like the one generated after graphcompile? If so, it seems that it not before nnvm. Am I missing something?","created_at":"2018-10-26T05:18:11Z","updated_at":"2018-10-26T05:35:28Z","html_url":"https://github.com/dmlc/tvm/pull/1954#discussion_r228407811","pull_request_url":"https://api.github.com/repos/dmlc/tvm/pulls/1954","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/comments/228407811"},"html":{"href":"https://github.com/dmlc/tvm/pull/1954#discussion_r228407811"},"pull_request":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1954"}}},"pull_request":{"url":"https://api.github.com/repos/dmlc/tvm/pulls/1954","id":224797181,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI0Nzk3MTgx","html_url":"https://github.com/dmlc/tvm/pull/1954","diff_url":"https://github.com/dmlc/tvm/pull/1954.diff","patch_url":"https://github.com/dmlc/tvm/pull/1954.patch","issue_url":"https://api.github.com/repos/dmlc/tvm/issues/1954","number":1954,"state":"open","locked":false,"title":"[RELAY][WIP] Add Relay evaluator and compiler for TVM runtime system.","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":"This PR implements the evaluation machinery for Relay, including basic passes for lowering and transforming Relay programs to make them suitable for compilation. \r\n\r\n### Passes\r\n- [x] LowerOps, is a phase which collects the set of operations used by an expression and converts them into `LoweredFunc` using the appropriate TVM operator and schedule.\r\n- [ ] FuseOps, is a phase which implements operator fusion, and is still currently underdevelopment. \r\n\r\n### Interpreter\r\nThis PR ships a simple interpreter for Relay programs, which can be used as its reference semantics. \r\nThe interpretation of operator calls utilizes TVM compiled operators on CPU, but the evaluation of other expressions is naive.\r\n\r\n### TVM Graph Runtime.\r\n\r\nThis PR ships a compiler located in `to_tvm.py` which converts a Relay program into a TVM graph, as well as using the above passes to generate a `tvm::Module` enabling users to deploy a subset of Relay programs to the TVM RTS.\r\n\r\n### Testing\r\n\r\nWe ship some more tests for both the evaluator and the RTS, as well as a couple new cases for type inference.","created_at":"2018-10-22T20:05:23Z","updated_at":"2018-10-26T05:35:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f0748980ea442806c27627d0af78d854566fe5f8","assignee":{"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},"assignees":[{"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}],"requested_reviewers":[],"requested_teams":[],"labels":[{"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/1954/commits","review_comments_url":"https://api.github.com/repos/dmlc/tvm/pulls/1954/comments","review_comment_url":"https://api.github.com/repos/dmlc/tvm/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dmlc/tvm/issues/1954/comments","statuses_url":"https://api.github.com/repos/dmlc/tvm/statuses/344d3b489bf5c506f345f1d01a5482ef0f2ea2bd","head":{"label":"jroesch:relay-eval","ref":"relay-eval","sha":"344d3b489bf5c506f345f1d01a5482ef0f2ea2bd","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","private":false,"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},"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-10-22T18:47:02Z","pushed_at":"2018-10-25T23:36:14Z","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":8962,"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":0,"mirror_url":null,"archived":false,"open_issues_count":1,"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":0,"open_issues":1,"watchers":3,"default_branch":"master"}},"base":{"label":"dmlc:master","ref":"master","sha":"0f7aa30b7bc59d1d8c3a3b15ae21180858ddf651","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","private":false,"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},"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-10-26T03:40:44Z","pushed_at":"2018-10-26T05:34:52Z","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":8204,"stargazers_count":2221,"watchers_count":2221,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":519,"mirror_url":null,"archived":false,"open_issues_count":64,"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":519,"open_issues":64,"watchers":2221,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1954"},"html":{"href":"https://github.com/dmlc/tvm/pull/1954"},"issue":{"href":"https://api.github.com/repos/dmlc/tvm/issues/1954"},"comments":{"href":"https://api.github.com/repos/dmlc/tvm/issues/1954/comments"},"review_comments":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1954/comments"},"review_comment":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1954/commits"},"statuses":{"href":"https://api.github.com/repos/dmlc/tvm/statuses/344d3b489bf5c506f345f1d01a5482ef0f2ea2bd"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"zhiics"}}