{"action":"created","comment":{"url":"https://api.github.com/repos/dmlc/tvm/pulls/comments/182262715","pull_request_review_id":113025746,"id":182262715,"diff_hunk":"@@ -84,189 +91,170 @@ inline Tensor pool_nchw(const Tensor& x,\n   auto dheight = tvm::reduce_axis(Range(0, kernel_height));\n   auto dwidth = tvm::reduce_axis(Range(0, kernel_width));\n \n-  if (pool_type == kMaxPool) {\n-    auto temp = pad(x, pad_before, pad_after, x->dtype.min(), \"pad_temp\");\n-    return tvm::compute(\n-      { batch, channel, out_height, out_width },\n-      [&](Var n, Var c, Var h, Var w) {\n-        return tvm::max(temp(n, c, h * stride_height + dheight, w * stride_width + dwidth),\n-        { dheight, dwidth });\n-      }, \"tensor\", \"pool_max\");\n-  } else if (pool_type == kAvgPool) {\n-    auto temp = pad(x, pad_before, pad_after, 0, \"pad_temp\");\n+  Array<Expr> out_shape = x->shape;\n+  out_shape.Set(height_idx, out_height);\n+  out_shape.Set(width_idx, out_width);\n \n-    auto tsum = tvm::compute(\n-      { batch, channel, out_height, out_width },\n-      [&](Var n, Var c, Var h, Var w) {\n-        return tvm::sum(temp(n, c, h * stride_height + dheight, w * stride_width + dwidth),\n-        { dheight, dwidth });\n-      }, \"tensor\", \"pool_avg\");\n+  const int64_t *padding_h = HalideIR::Internal::as_const_int(padding_height);\n+  const int64_t *padding_w = HalideIR::Internal::as_const_int(padding_width);\n+  const bool do_pad = ((padding_h && *padding_h) || (padding_w && *padding_w));\n \n-    return tvm::compute(\n-      { batch, channel, out_height, out_width },\n-      [&](Var n, Var c, Var h, Var w) {\n-        return tsum(n, c, h, w) / (kernel_height * kernel_width);\n-      }, \"tensor\", kElementWise);\n+  if (pool_type == kMaxPool) {\n+    auto temp = do_pad ? pad(x, pad_before, pad_after, x->dtype.min(), \"pad_temp\") : x;\n+    return tvm::compute(out_shape, [&](const Array<Var>& output) {\n+      Array<Expr> indices;\n+      for (const Var& var : output) indices.push_back(var);\n+      indices.Set(height_idx, output[height_idx] * stride_height + dheight);\n+      indices.Set(width_idx, output[width_idx] * stride_width + dwidth);\n+      return tvm::max(temp(indices), { dheight, dwidth });\n+    }, \"tensor\", \"pool_max\");\n+  } else if (pool_type == kAvgPool) {\n+    auto temp = do_pad ? pad(x, pad_before, pad_after, 0, \"pad_temp\") : x;\n+    auto tsum = tvm::compute(out_shape, [&](const Array<Var>& output) {\n+      Array<Expr> indices;\n+      for (const Var& var : output) indices.push_back(var);\n+      indices.Set(height_idx, output[height_idx] * stride_height + dheight);\n+      indices.Set(width_idx, output[width_idx] * stride_width + dwidth);\n+      return tvm::sum(temp(indices), { dheight, dwidth });\n+    }, \"tensor\", \"pool_avg\");\n+\n+    return tvm::compute(out_shape,\n+    [&](const Array<Var>& output) {\n+      return tsum(output) / (kernel_height * kernel_width);\n+    }, \"tensor\", kElementWise);\n   } else {\n     LOG(ERROR) << \"Unrecognized pool_type: \" << pool_type;\n     return x;\n   }\n }\n \n-/*!\n-* \\brief Perform pooling on data in NHWC order\n-*\n-* \\param x The input tensor in NHWC order\n-* \\param kernel_size Vector of two ints: {kernel_height, kernel_width}\n-* \\param stride_size Vector of two ints: {stride_height, stride_width}\n-* \\param padding_size Vector of two ints: {padding_height, padding_width}\n-* \\param pool_type The type of pooling operator\n-* \\param ceil_mode Whether to use ceil when calculating the output size\n-*\n-* \\return The output tensor in NCHW order\n-*/\n-\n-inline Tensor pool_nhwc(const Tensor& x,\n-                        const Array<Expr>& kernel_size,\n-                        const Array<Expr>& stride_size,\n-                        const Array<Expr>& padding_size,\n-                        PoolType pool_type,\n-                        bool ceil_mode) {\n-  CHECK_EQ(x->shape.size(), 4) << \"Pooling input must be 4-D\";\n-  CHECK_EQ(kernel_size.size(), 2) << \"Pooling kernel_size must have 2 elements\";\n-  CHECK_EQ(stride_size.size(), 2) << \"Pooling stride_size must have 2 elements\";\n-  CHECK_EQ(padding_size.size(), 2) << \"Pooling padding_size must have 2 elements\";\n-\n-  auto kernel_height = kernel_size[0];\n-  auto kernel_width = kernel_size[1];\n-  auto stride_height = stride_size[0];\n-  auto stride_width = stride_size[1];\n-  auto padding_height = padding_size[0];\n-  auto padding_width = padding_size[1];\n-\n-  auto batch = x->shape[0];\n-  auto height = x->shape[1];\n-  auto width = x->shape[2];\n-  auto channel = x->shape[3];\n-\n-  auto pad_tuple = detail::GetPadTuple(padding_height, padding_width);\n-  auto pad_top = pad_tuple[0];\n-  auto pad_left = pad_tuple[1];\n-  auto pad_down = pad_tuple[2];\n-  auto pad_right = pad_tuple[3];\n-\n-  if (ceil_mode) {\n-    // Additional padding to ensure we do ceil instead of floor when\n-    // dividing by stride.\n-    pad_down += stride_height - 1;\n-    pad_right += stride_width - 1;\n-  }\n-\n-  Array<Expr> pad_before{ 0, pad_top, pad_left, 0};\n-  Array<Expr> pad_after{ 0, pad_down, pad_right, 0};\n-\n-  auto out_height = tvm::ir::Simplify(\n-    (height - kernel_height + pad_top + pad_down) / stride_height + 1);\n-  auto out_width = tvm::ir::Simplify(\n-    (width - kernel_width + pad_left + pad_right) / stride_width + 1);\n-\n-  auto dheight = tvm::reduce_axis(Range(0, kernel_height));\n-  auto dwidth = tvm::reduce_axis(Range(0, kernel_width));\n-\n-  if (pool_type == kMaxPool) {\n-    auto temp = pad(x, pad_before, pad_after, x->dtype.min(), \"pad_temp\");\n-    return tvm::compute(\n-     { batch, out_height, out_width, channel },\n-      [&](Var n, Var h, Var w, Var c) {\n-        return tvm::max(temp(n, h * stride_height + dheight, w * stride_width + dwidth, c),\n-        { dheight, dwidth });\n-      }, \"tensor\", \"pool_max\");\n-  } else if (pool_type == kAvgPool) {\n-    auto temp = pad(x, pad_before, pad_after, 0, \"pad_temp\");\n-\n-    auto tsum = tvm::compute(\n-     { batch, out_height, out_width, channel },\n-      [&](Var n, Var h, Var w, Var c) {\n-        return tvm::sum(temp(n, h * stride_height + dheight, w * stride_width + dwidth, c),\n-        { dheight, dwidth });\n-      }, \"tensor\", \"pool_avg\");\n-\n-    return tvm::compute(\n-     { batch, out_height, out_width, channel },\n-     [&](Var n, Var h, Var w, Var c) {\n-       return tsum(n, h, w, c) / (kernel_height * kernel_width);\n-      }, \"tensor\", kElementWise);\n-  } else {\n-    LOG(ERROR) << \"Unrecognized pool_type: \" << pool_type;\n-    return x;\n+inline bool find_height_width(const std::string& layout,\n+                              int* height_idx,\n+                              int* width_idx) {\n+  *height_idx = -1, *width_idx = -1;\n+  int curr_idx = 0;\n+  for (size_t i = 0; i < layout.size(); ++i) {\n+    if ((layout[i] >= 'A' && layout[i] <= 'Z') ||\n+        (layout[i] >= 'a' && layout[i] <= 'z')) {\n+      if (layout[i] == 'H') {\n+        if (*height_idx != -1) return false;\n+        *height_idx = curr_idx;\n+      } else if (layout[i] == 'W') {\n+        if (*width_idx != -1) return false;\n+        *width_idx = curr_idx;\n+      } else if (layout[i] == 'h' || layout[i] == 'w') {\n+        // do not support split on height or width, e.g., NCHW16w\n+        return false;\n+      }\n+      ++curr_idx;\n+    }\n   }\n+  if (*height_idx == -1 || *width_idx == -1) return false;\n+  return true;\n }\n \n /*!\n-* \\brief Perform pooling on data\n-*\n-* \\param x The input tensor in NCHW or NHWC order\n+* \\brief Perform pooling on height and width dimension of data.\n+*        It decides the height and width dimension according to the layout string,\n+*        in which 'W' and 'H' means width and height respectively.\n+*        Width and height dimension cannot be split.\n+*        For example, NCHW, NCHW16c, etc. are valid for pool,\n+*        while NCHW16w, NCHW16h are not.\n+*        See \\a layout for more information of the layout string convention.\n+* \\param x The input tensor.\n * \\param kernel_size Vector of two ints: {kernel_height, kernel_width}\n * \\param stride_size Vector of two ints: {stride_height, stride_width}\n * \\param padding_size Vector of two ints: {padding_height, padding_width}\n * \\param pool_type The type of pooling operator\n * \\param ceil_mode Whether to use ceil when calculating the output size\n-* \\param layout The input layout\n-*\n-* \\return The output tensor in NCHW order\n+* \\param layout The input layout. Pooling supports any layout as long as 'H' and 'W' appear.\n+*        The layout is supposed to be composed of upper cases, lower cases and numbers,","path":"topi/include/topi/nn/pooling.h","position":267,"original_position":267,"commit_id":"f02bc08425f10d87546294b6506055b3307761a9","original_commit_id":"731d325618e6211adce0716426c05859dcdca862","user":{"login":"kevinthesun","id":15520525,"avatar_url":"https://avatars3.githubusercontent.com/u/15520525?v=4","gravatar_id":"","url":"https://api.github.com/users/kevinthesun","html_url":"https://github.com/kevinthesun","followers_url":"https://api.github.com/users/kevinthesun/followers","following_url":"https://api.github.com/users/kevinthesun/following{/other_user}","gists_url":"https://api.github.com/users/kevinthesun/gists{/gist_id}","starred_url":"https://api.github.com/users/kevinthesun/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kevinthesun/subscriptions","organizations_url":"https://api.github.com/users/kevinthesun/orgs","repos_url":"https://api.github.com/users/kevinthesun/repos","events_url":"https://api.github.com/users/kevinthesun/events{/privacy}","received_events_url":"https://api.github.com/users/kevinthesun/received_events","type":"User","site_admin":false},"body":"\"Pooling supports any layout as long as 'H' and 'W' appear.\r\nThe layout is supposed to be composed of upper cases, lower cases and numbers, ...\"\r\nThese two statements look like not quite fit with each other. Maybe we can change them to \"Pooling supports any layout as long as 'H' and 'W' appear.\r\nFor example, we can add channel split factor into layout, such as NCHW16c, if this factor number is required in graph level computation.\"","created_at":"2018-04-17T22:36:01Z","updated_at":"2018-04-17T22:36:01Z","html_url":"https://github.com/dmlc/tvm/pull/1103#discussion_r182262715","pull_request_url":"https://api.github.com/repos/dmlc/tvm/pulls/1103","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/comments/182262715"},"html":{"href":"https://github.com/dmlc/tvm/pull/1103#discussion_r182262715"},"pull_request":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1103"}},"in_reply_to_id":182202745},"pull_request":{"url":"https://api.github.com/repos/dmlc/tvm/pulls/1103","id":181365711,"html_url":"https://github.com/dmlc/tvm/pull/1103","diff_url":"https://github.com/dmlc/tvm/pull/1103.diff","patch_url":"https://github.com/dmlc/tvm/pull/1103.patch","issue_url":"https://api.github.com/repos/dmlc/tvm/issues/1103","number":1103,"state":"open","locked":false,"title":"Generalize pooling to support arbitrary layout","user":{"login":"yzhliu","id":631860,"avatar_url":"https://avatars1.githubusercontent.com/u/631860?v=4","gravatar_id":"","url":"https://api.github.com/users/yzhliu","html_url":"https://github.com/yzhliu","followers_url":"https://api.github.com/users/yzhliu/followers","following_url":"https://api.github.com/users/yzhliu/following{/other_user}","gists_url":"https://api.github.com/users/yzhliu/gists{/gist_id}","starred_url":"https://api.github.com/users/yzhliu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yzhliu/subscriptions","organizations_url":"https://api.github.com/users/yzhliu/orgs","repos_url":"https://api.github.com/users/yzhliu/repos","events_url":"https://api.github.com/users/yzhliu/events{/privacy}","received_events_url":"https://api.github.com/users/yzhliu/received_events","type":"User","site_admin":false},"body":"enables pool2d support arbitrary layout, as long as there's `H` and `W`.\r\n\r\nthe change here also assumes a layout convention (I will make a PR to NNVM), upper case `C` indicates an axis (e.g., channel) and lower case with factor size `16c` indicates the split axis of `C`.\r\n\r\ncc @kevinthesun @yidawang ","created_at":"2018-04-13T01:37:43Z","updated_at":"2018-04-17T22:36:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"aa75fee2f3a844933a81c39a657f7eeafc8086c4","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":858776288,"url":"https://api.github.com/repos/dmlc/tvm/labels/status:%20review%20in%20progress","name":"status: review in progress","color":"a9c2e8","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/dmlc/tvm/pulls/1103/commits","review_comments_url":"https://api.github.com/repos/dmlc/tvm/pulls/1103/comments","review_comment_url":"https://api.github.com/repos/dmlc/tvm/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dmlc/tvm/issues/1103/comments","statuses_url":"https://api.github.com/repos/dmlc/tvm/statuses/f02bc08425f10d87546294b6506055b3307761a9","head":{"label":"yzhliu:pool2d-general","ref":"pool2d-general","sha":"f02bc08425f10d87546294b6506055b3307761a9","user":{"login":"yzhliu","id":631860,"avatar_url":"https://avatars1.githubusercontent.com/u/631860?v=4","gravatar_id":"","url":"https://api.github.com/users/yzhliu","html_url":"https://github.com/yzhliu","followers_url":"https://api.github.com/users/yzhliu/followers","following_url":"https://api.github.com/users/yzhliu/following{/other_user}","gists_url":"https://api.github.com/users/yzhliu/gists{/gist_id}","starred_url":"https://api.github.com/users/yzhliu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yzhliu/subscriptions","organizations_url":"https://api.github.com/users/yzhliu/orgs","repos_url":"https://api.github.com/users/yzhliu/repos","events_url":"https://api.github.com/users/yzhliu/events{/privacy}","received_events_url":"https://api.github.com/users/yzhliu/received_events","type":"User","site_admin":false},"repo":{"id":100872659,"name":"tvm-1","full_name":"yzhliu/tvm-1","owner":{"login":"yzhliu","id":631860,"avatar_url":"https://avatars1.githubusercontent.com/u/631860?v=4","gravatar_id":"","url":"https://api.github.com/users/yzhliu","html_url":"https://github.com/yzhliu","followers_url":"https://api.github.com/users/yzhliu/followers","following_url":"https://api.github.com/users/yzhliu/following{/other_user}","gists_url":"https://api.github.com/users/yzhliu/gists{/gist_id}","starred_url":"https://api.github.com/users/yzhliu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yzhliu/subscriptions","organizations_url":"https://api.github.com/users/yzhliu/orgs","repos_url":"https://api.github.com/users/yzhliu/repos","events_url":"https://api.github.com/users/yzhliu/events{/privacy}","received_events_url":"https://api.github.com/users/yzhliu/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/yzhliu/tvm-1","description":"End to end Tensor IR/DSL stack for deploying deep learning workloads to hardwares","fork":true,"url":"https://api.github.com/repos/yzhliu/tvm-1","forks_url":"https://api.github.com/repos/yzhliu/tvm-1/forks","keys_url":"https://api.github.com/repos/yzhliu/tvm-1/keys{/key_id}","collaborators_url":"https://api.github.com/repos/yzhliu/tvm-1/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/yzhliu/tvm-1/teams","hooks_url":"https://api.github.com/repos/yzhliu/tvm-1/hooks","issue_events_url":"https://api.github.com/repos/yzhliu/tvm-1/issues/events{/number}","events_url":"https://api.github.com/repos/yzhliu/tvm-1/events","assignees_url":"https://api.github.com/repos/yzhliu/tvm-1/assignees{/user}","branches_url":"https://api.github.com/repos/yzhliu/tvm-1/branches{/branch}","tags_url":"https://api.github.com/repos/yzhliu/tvm-1/tags","blobs_url":"https://api.github.com/repos/yzhliu/tvm-1/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/yzhliu/tvm-1/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/yzhliu/tvm-1/git/refs{/sha}","trees_url":"https://api.github.com/repos/yzhliu/tvm-1/git/trees{/sha}","statuses_url":"https://api.github.com/repos/yzhliu/tvm-1/statuses/{sha}","languages_url":"https://api.github.com/repos/yzhliu/tvm-1/languages","stargazers_url":"https://api.github.com/repos/yzhliu/tvm-1/stargazers","contributors_url":"https://api.github.com/repos/yzhliu/tvm-1/contributors","subscribers_url":"https://api.github.com/repos/yzhliu/tvm-1/subscribers","subscription_url":"https://api.github.com/repos/yzhliu/tvm-1/subscription","commits_url":"https://api.github.com/repos/yzhliu/tvm-1/commits{/sha}","git_commits_url":"https://api.github.com/repos/yzhliu/tvm-1/git/commits{/sha}","comments_url":"https://api.github.com/repos/yzhliu/tvm-1/comments{/number}","issue_comment_url":"https://api.github.com/repos/yzhliu/tvm-1/issues/comments{/number}","contents_url":"https://api.github.com/repos/yzhliu/tvm-1/contents/{+path}","compare_url":"https://api.github.com/repos/yzhliu/tvm-1/compare/{base}...{head}","merges_url":"https://api.github.com/repos/yzhliu/tvm-1/merges","archive_url":"https://api.github.com/repos/yzhliu/tvm-1/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/yzhliu/tvm-1/downloads","issues_url":"https://api.github.com/repos/yzhliu/tvm-1/issues{/number}","pulls_url":"https://api.github.com/repos/yzhliu/tvm-1/pulls{/number}","milestones_url":"https://api.github.com/repos/yzhliu/tvm-1/milestones{/number}","notifications_url":"https://api.github.com/repos/yzhliu/tvm-1/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/yzhliu/tvm-1/labels{/name}","releases_url":"https://api.github.com/repos/yzhliu/tvm-1/releases{/id}","deployments_url":"https://api.github.com/repos/yzhliu/tvm-1/deployments","created_at":"2017-08-20T16:02:56Z","updated_at":"2018-04-13T01:21:39Z","pushed_at":"2018-04-17T22:28:01Z","git_url":"git://github.com/yzhliu/tvm-1.git","ssh_url":"git@github.com:yzhliu/tvm-1.git","clone_url":"https://github.com/yzhliu/tvm-1.git","svn_url":"https://github.com/yzhliu/tvm-1","homepage":"","size":3618,"stargazers_count":0,"watchers_count":0,"language":"C++","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":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dmlc:master","ref":"master","sha":"9f908a0604d581041c6c877a02f31aa9770650be","user":{"login":"dmlc","id":11508361,"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,"name":"tvm","full_name":"dmlc/tvm","owner":{"login":"dmlc","id":11508361,"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":"bring deep learning workloads to bare metal","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-04-17T18:30:34Z","pushed_at":"2018-04-17T22:28:03Z","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":"","size":3533,"stargazers_count":1333,"watchers_count":1333,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":261,"mirror_url":null,"archived":false,"open_issues_count":24,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":261,"open_issues":24,"watchers":1333,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1103"},"html":{"href":"https://github.com/dmlc/tvm/pull/1103"},"issue":{"href":"https://api.github.com/repos/dmlc/tvm/issues/1103"},"comments":{"href":"https://api.github.com/repos/dmlc/tvm/issues/1103/comments"},"review_comments":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1103/comments"},"review_comment":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dmlc/tvm/pulls/1103/commits"},"statuses":{"href":"https://api.github.com/repos/dmlc/tvm/statuses/f02bc08425f10d87546294b6506055b3307761a9"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"kevinthesun"}}