{"action":"created","comment":{"url":"https://api.github.com/repos/mlpack/mlpack/pulls/comments/133525242","pull_request_review_id":56706169,"id":133525242,"diff_hunk":"@@ -0,0 +1,280 @@\n+/**\n+ * @file ham_tests.cpp\n+ * @author Konstantin Sidorov\n+ *\n+ * Tests for everything related with\n+ * Hierarchical Attentve Memory unit implementation.\n+ *\n+ * mlpack is free software; you may redistribute it and/or modify it under the\n+ * terms of the 3-clause BSD license.  You should have received a copy of the\n+ * 3-clause BSD license along with mlpack.  If not, see\n+ * http://www.opensource.org/licenses/BSD-3-Clause for more information.\n+ */\n+#include <vector>\n+#include <algorithm>\n+#include <utility>\n+\n+#include <mlpack/core.hpp>\n+\n+#include <mlpack/core/data/binarize.hpp>\n+\n+#include <mlpack/methods/ann/augmented/tree_memory.hpp>\n+#include <mlpack/methods/ann/augmented/ham_unit.hpp>\n+#include <mlpack/methods/ann/layer/layer.hpp>\n+#include <mlpack/methods/ann/ffn.hpp>\n+\n+#include <boost/test/unit_test.hpp>\n+#include \"test_tools.hpp\"\n+\n+using namespace mlpack::ann::augmented;\n+using namespace mlpack::ann;\n+\n+FFN<MeanSquaredError<> > ReplaceWriter(size_t dim)\n+{\n+  FFN<MeanSquaredError<> > writeModel;\n+  writeModel.Add<Linear<> >(2 * dim, dim);\n+  writeModel.ResetParameters();\n+  writeModel.Parameters().rows(0, dim * dim - 1) = arma::zeros(dim * dim);\n+  writeModel.Parameters().rows(dim * dim, 2 * dim * dim - 1) =\n+      arma::vectorise(arma::eye(dim, dim));\n+  writeModel.Parameters().rows(2 * dim * dim, 2 * dim * dim + dim - 1) = arma::zeros(dim);\n+  return writeModel;\n+}\n+\n+FFN<MeanSquaredError<> > AddJoiner(size_t dim) {\n+  FFN<MeanSquaredError<> > joinModel;\n+  joinModel.Add<Linear<> >(2 * dim, dim);\n+  joinModel.ResetParameters();\n+  joinModel.Parameters().rows(0, dim * dim - 1) = arma::vectorise(arma::eye(dim, dim));\n+  joinModel.Parameters().rows(dim * dim, 2 * dim * dim - 1) = arma::vectorise(arma::eye(dim, dim));\n+  joinModel.Parameters().rows(2 * dim * dim, 2 * dim * dim + dim - 1) = arma::zeros(dim);\n+  return joinModel;\n+}\n+\n+template<typename T>\n+arma::Mat<T> convertToArma(std::vector<std::vector<T>> stlArray)\n+{\n+  size_t rows = stlArray[0].size(), cols = stlArray.size();\n+  arma::Mat<T> target(rows, cols);\n+  size_t ptr = 0;\n+  for (std::vector<T> el : stlArray)\n+  {\n+    target.col(ptr++) = arma::Col<T>(el);\n+  }\n+  return target;\n+}\n+\n+BOOST_AUTO_TEST_SUITE(HAMTest);\n+\n+BOOST_AUTO_TEST_CASE(TreeMemoryTestMinimum)\n+{\n+  /*AddJoiner<double> J;\n+  ReplaceWriter<double> W;*/\n+  FFN<MeanSquaredError<> > J = AddJoiner(1), W = ReplaceWriter(1);\n+  // With these definitions, mem is exactly one of the well-known data structres\n+  // in competitive programming - segment tree.\n+  TreeMemory<double> mem(1, 1, J, W);\n+  std::vector<std::vector<double>> initMemSTL = {{0}};\n+  arma::mat initMem = convertToArma(initMemSTL);\n+  mem.Initialize(initMem);\n+  BOOST_REQUIRE_EQUAL(mem.Leaf(0).n_elem, 1);\n+  BOOST_REQUIRE_EQUAL(mem.Leaf(0).at(0, 0), 0.);\n+  mem.Update(0, arma::mat(\"12.\"));\n+  BOOST_REQUIRE_EQUAL(mem.Leaf(0).n_elem, 1);\n+  BOOST_REQUIRE_EQUAL(mem.Leaf(0).at(0, 0), 12.);\n+}\n+\n+BOOST_AUTO_TEST_CASE(TreeMemoryTestMinimumNDim)\n+{\n+  /*AddJoiner<double> J;\n+  ReplaceWriter<double> W;*/\n+  size_t memSize = 5;\n+  FFN<MeanSquaredError<> > J = AddJoiner(memSize), W = ReplaceWriter(memSize);\n+  TreeMemory<double> mem(\n+      1, memSize, J, W);\n+  std::vector<std::vector<double>> initMemSTL = {{0, 0, 0, 0, 0}};\n+  arma::mat initMem = convertToArma(initMemSTL);\n+  mem.Initialize(initMem);\n+  BOOST_REQUIRE_EQUAL(mem.Leaf(0).n_elem, memSize);\n+  for (size_t i = 0; i < memSize; ++i) {\n+    BOOST_REQUIRE_EQUAL(mem.Leaf(0).at(i, 0), 0.);\n+  }\n+  mem.Update(0, 12 * arma::ones(memSize, 1));\n+  BOOST_REQUIRE_EQUAL(mem.Leaf(0).n_elem, memSize);\n+  for (size_t i = 0; i < memSize; ++i)\n+    BOOST_REQUIRE_EQUAL(mem.Leaf(0).at(i, 0), 12.);\n+}\n+\n+BOOST_AUTO_TEST_CASE(TreeMemoryTestPowerOfTwo)\n+{\n+  /*AddJoiner<double> J;\n+  ReplaceWriter<double> W;*/\n+  FFN<MeanSquaredError<> > J = AddJoiner(1), W = ReplaceWriter(1);\n+  TreeMemory<double> mem(8, 1, J, W);\n+  std::vector<std::vector<double>> initMemSTL =\n+      {{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}};\n+  arma::mat initMem = convertToArma(initMemSTL);\n+  mem.Initialize(initMem);\n+  for (size_t idx = 0; idx < 15; ++idx)\n+    BOOST_REQUIRE_EQUAL(mem.Cell(idx).at(0, 0), 0);\n+  mem.Update(0, arma::mat(\"1.\"));\n+  mem.Update(1, arma::mat(\"2.\"));\n+  BOOST_REQUIRE_EQUAL(mem.Leaf(0).n_elem, 1);\n+  BOOST_REQUIRE_EQUAL(mem.Leaf(0).at(0, 0), 1);\n+  BOOST_REQUIRE_EQUAL(mem.Leaf(0).n_elem, 1);\n+  BOOST_REQUIRE_EQUAL(mem.Leaf(1).at(0, 0), 2);\n+  BOOST_REQUIRE_EQUAL(mem.Cell(\n+    mem.Parent(mem.LeafIndex(0))).at(0, 0), 3);\n+  BOOST_REQUIRE_EQUAL(mem.Cell(\n+    mem.Parent(mem.Parent(mem.LeafIndex(0)))).at(0, 0), 3);  \n+  BOOST_REQUIRE_EQUAL(mem.Cell(\n+    mem.Parent(mem.Parent(mem.Parent(mem.LeafIndex(0))))).at(0, 0), 3); \n+  BOOST_REQUIRE_EQUAL(mem.Cell(\n+    mem.Parent(mem.LeafIndex(0))).n_elem, 1);\n+  BOOST_REQUIRE_EQUAL(mem.Cell(\n+    mem.Parent(mem.Parent(mem.LeafIndex(0)))).n_elem, 1);  \n+  BOOST_REQUIRE_EQUAL(mem.Cell(\n+    mem.Parent(mem.Parent(mem.Parent(mem.LeafIndex(0))))).n_elem, 1); \n+}\n+\n+BOOST_AUTO_TEST_CASE(TreeMemoryTestPowerOfTwoNDim)\n+{\n+  /*AddJoiner<double> J;\n+  ReplaceWriter<double> W;*/\n+  size_t memSize = 4;\n+  FFN<MeanSquaredError<> > J = AddJoiner(memSize), W = ReplaceWriter(memSize);\n+  TreeMemory<double> mem(\n+      8, memSize, J, W);\n+  std::vector<std::vector<double>> initMemSTL =\n+      {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},\n+       {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};\n+  arma::mat initMem = convertToArma(initMemSTL);","path":"src/mlpack/tests/ham_test.cpp","position":151,"original_position":151,"commit_id":"6097324055f80c077bd8db520a3f1c450c96fde3","original_commit_id":"6097324055f80c077bd8db520a3f1c450c96fde3","user":{"login":"rcurtin","id":1845039,"avatar_url":"https://avatars0.githubusercontent.com/u/1845039?v=4","gravatar_id":"","url":"https://api.github.com/users/rcurtin","html_url":"https://github.com/rcurtin","followers_url":"https://api.github.com/users/rcurtin/followers","following_url":"https://api.github.com/users/rcurtin/following{/other_user}","gists_url":"https://api.github.com/users/rcurtin/gists{/gist_id}","starred_url":"https://api.github.com/users/rcurtin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rcurtin/subscriptions","organizations_url":"https://api.github.com/users/rcurtin/orgs","repos_url":"https://api.github.com/users/rcurtin/repos","events_url":"https://api.github.com/users/rcurtin/events{/privacy}","received_events_url":"https://api.github.com/users/rcurtin/received_events","type":"User","site_admin":false},"body":"Why not just initialize the Armadillo matrix directly? I think that would allow you to simplify a lot of code.","created_at":"2017-08-16T18:10:21Z","updated_at":"2017-08-16T18:13:41Z","html_url":"https://github.com/mlpack/mlpack/pull/1048#discussion_r133525242","pull_request_url":"https://api.github.com/repos/mlpack/mlpack/pulls/1048","_links":{"self":{"href":"https://api.github.com/repos/mlpack/mlpack/pulls/comments/133525242"},"html":{"href":"https://github.com/mlpack/mlpack/pull/1048#discussion_r133525242"},"pull_request":{"href":"https://api.github.com/repos/mlpack/mlpack/pulls/1048"}}},"pull_request":{"url":"https://api.github.com/repos/mlpack/mlpack/pulls/1048","id":128771237,"html_url":"https://github.com/mlpack/mlpack/pull/1048","diff_url":"https://github.com/mlpack/mlpack/pull/1048.diff","patch_url":"https://github.com/mlpack/mlpack/pull/1048.patch","issue_url":"https://api.github.com/repos/mlpack/mlpack/issues/1048","number":1048,"state":"open","locked":false,"title":"[GSoC] Implementing Hierarchical Memory Unit","user":{"login":"partobs-mdp","id":22127038,"avatar_url":"https://avatars0.githubusercontent.com/u/22127038?v=4","gravatar_id":"","url":"https://api.github.com/users/partobs-mdp","html_url":"https://github.com/partobs-mdp","followers_url":"https://api.github.com/users/partobs-mdp/followers","following_url":"https://api.github.com/users/partobs-mdp/following{/other_user}","gists_url":"https://api.github.com/users/partobs-mdp/gists{/gist_id}","starred_url":"https://api.github.com/users/partobs-mdp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/partobs-mdp/subscriptions","organizations_url":"https://api.github.com/users/partobs-mdp/orgs","repos_url":"https://api.github.com/users/partobs-mdp/repos","events_url":"https://api.github.com/users/partobs-mdp/events{/privacy}","received_events_url":"https://api.github.com/users/partobs-mdp/received_events","type":"User","site_admin":false},"body":"This PR is part of my GSoC project \"Augmented RNNs\".\r\n\r\nImplementing HAM unit API and tree memory structure for it, as described in [arxiv paper](https://arxiv.org/abs/1602.03218).\r\n\r\nAs far as I understand, the entire HAM-related discussion is transfered here, in contrast to task-specific discussion.","created_at":"2017-07-04T10:19:09Z","updated_at":"2017-08-16T18:13:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d65c3e5eb91d16ff1cb371b33b69da90eeff7883","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/mlpack/mlpack/pulls/1048/commits","review_comments_url":"https://api.github.com/repos/mlpack/mlpack/pulls/1048/comments","review_comment_url":"https://api.github.com/repos/mlpack/mlpack/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mlpack/mlpack/issues/1048/comments","statuses_url":"https://api.github.com/repos/mlpack/mlpack/statuses/6097324055f80c077bd8db520a3f1c450c96fde3","head":{"label":"partobs-mdp:ham","ref":"ham","sha":"6097324055f80c077bd8db520a3f1c450c96fde3","user":{"login":"partobs-mdp","id":22127038,"avatar_url":"https://avatars0.githubusercontent.com/u/22127038?v=4","gravatar_id":"","url":"https://api.github.com/users/partobs-mdp","html_url":"https://github.com/partobs-mdp","followers_url":"https://api.github.com/users/partobs-mdp/followers","following_url":"https://api.github.com/users/partobs-mdp/following{/other_user}","gists_url":"https://api.github.com/users/partobs-mdp/gists{/gist_id}","starred_url":"https://api.github.com/users/partobs-mdp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/partobs-mdp/subscriptions","organizations_url":"https://api.github.com/users/partobs-mdp/orgs","repos_url":"https://api.github.com/users/partobs-mdp/repos","events_url":"https://api.github.com/users/partobs-mdp/events{/privacy}","received_events_url":"https://api.github.com/users/partobs-mdp/received_events","type":"User","site_admin":false},"repo":{"id":90616667,"name":"mlpack","full_name":"partobs-mdp/mlpack","owner":{"login":"partobs-mdp","id":22127038,"avatar_url":"https://avatars0.githubusercontent.com/u/22127038?v=4","gravatar_id":"","url":"https://api.github.com/users/partobs-mdp","html_url":"https://github.com/partobs-mdp","followers_url":"https://api.github.com/users/partobs-mdp/followers","following_url":"https://api.github.com/users/partobs-mdp/following{/other_user}","gists_url":"https://api.github.com/users/partobs-mdp/gists{/gist_id}","starred_url":"https://api.github.com/users/partobs-mdp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/partobs-mdp/subscriptions","organizations_url":"https://api.github.com/users/partobs-mdp/orgs","repos_url":"https://api.github.com/users/partobs-mdp/repos","events_url":"https://api.github.com/users/partobs-mdp/events{/privacy}","received_events_url":"https://api.github.com/users/partobs-mdp/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/partobs-mdp/mlpack","description":"mlpack fork for my GSoC '17 project","fork":true,"url":"https://api.github.com/repos/partobs-mdp/mlpack","forks_url":"https://api.github.com/repos/partobs-mdp/mlpack/forks","keys_url":"https://api.github.com/repos/partobs-mdp/mlpack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/partobs-mdp/mlpack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/partobs-mdp/mlpack/teams","hooks_url":"https://api.github.com/repos/partobs-mdp/mlpack/hooks","issue_events_url":"https://api.github.com/repos/partobs-mdp/mlpack/issues/events{/number}","events_url":"https://api.github.com/repos/partobs-mdp/mlpack/events","assignees_url":"https://api.github.com/repos/partobs-mdp/mlpack/assignees{/user}","branches_url":"https://api.github.com/repos/partobs-mdp/mlpack/branches{/branch}","tags_url":"https://api.github.com/repos/partobs-mdp/mlpack/tags","blobs_url":"https://api.github.com/repos/partobs-mdp/mlpack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/partobs-mdp/mlpack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/partobs-mdp/mlpack/git/refs{/sha}","trees_url":"https://api.github.com/repos/partobs-mdp/mlpack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/partobs-mdp/mlpack/statuses/{sha}","languages_url":"https://api.github.com/repos/partobs-mdp/mlpack/languages","stargazers_url":"https://api.github.com/repos/partobs-mdp/mlpack/stargazers","contributors_url":"https://api.github.com/repos/partobs-mdp/mlpack/contributors","subscribers_url":"https://api.github.com/repos/partobs-mdp/mlpack/subscribers","subscription_url":"https://api.github.com/repos/partobs-mdp/mlpack/subscription","commits_url":"https://api.github.com/repos/partobs-mdp/mlpack/commits{/sha}","git_commits_url":"https://api.github.com/repos/partobs-mdp/mlpack/git/commits{/sha}","comments_url":"https://api.github.com/repos/partobs-mdp/mlpack/comments{/number}","issue_comment_url":"https://api.github.com/repos/partobs-mdp/mlpack/issues/comments{/number}","contents_url":"https://api.github.com/repos/partobs-mdp/mlpack/contents/{+path}","compare_url":"https://api.github.com/repos/partobs-mdp/mlpack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/partobs-mdp/mlpack/merges","archive_url":"https://api.github.com/repos/partobs-mdp/mlpack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/partobs-mdp/mlpack/downloads","issues_url":"https://api.github.com/repos/partobs-mdp/mlpack/issues{/number}","pulls_url":"https://api.github.com/repos/partobs-mdp/mlpack/pulls{/number}","milestones_url":"https://api.github.com/repos/partobs-mdp/mlpack/milestones{/number}","notifications_url":"https://api.github.com/repos/partobs-mdp/mlpack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/partobs-mdp/mlpack/labels{/name}","releases_url":"https://api.github.com/repos/partobs-mdp/mlpack/releases{/id}","deployments_url":"https://api.github.com/repos/partobs-mdp/mlpack/deployments","created_at":"2017-05-08T10:39:42Z","updated_at":"2017-05-08T10:42:37Z","pushed_at":"2017-08-15T11:09:36Z","git_url":"git://github.com/partobs-mdp/mlpack.git","ssh_url":"git@github.com:partobs-mdp/mlpack.git","clone_url":"https://github.com/partobs-mdp/mlpack.git","svn_url":"https://github.com/partobs-mdp/mlpack","homepage":"http://www.mlpack.org/","size":240378,"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,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"mlpack:master","ref":"master","sha":"37be9f4a5821dd9ea1fb980e1454274850f38d63","user":{"login":"mlpack","id":10216045,"avatar_url":"https://avatars0.githubusercontent.com/u/10216045?v=4","gravatar_id":"","url":"https://api.github.com/users/mlpack","html_url":"https://github.com/mlpack","followers_url":"https://api.github.com/users/mlpack/followers","following_url":"https://api.github.com/users/mlpack/following{/other_user}","gists_url":"https://api.github.com/users/mlpack/gists{/gist_id}","starred_url":"https://api.github.com/users/mlpack/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mlpack/subscriptions","organizations_url":"https://api.github.com/users/mlpack/orgs","repos_url":"https://api.github.com/users/mlpack/repos","events_url":"https://api.github.com/users/mlpack/events{/privacy}","received_events_url":"https://api.github.com/users/mlpack/received_events","type":"Organization","site_admin":false},"repo":{"id":28149409,"name":"mlpack","full_name":"mlpack/mlpack","owner":{"login":"mlpack","id":10216045,"avatar_url":"https://avatars0.githubusercontent.com/u/10216045?v=4","gravatar_id":"","url":"https://api.github.com/users/mlpack","html_url":"https://github.com/mlpack","followers_url":"https://api.github.com/users/mlpack/followers","following_url":"https://api.github.com/users/mlpack/following{/other_user}","gists_url":"https://api.github.com/users/mlpack/gists{/gist_id}","starred_url":"https://api.github.com/users/mlpack/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mlpack/subscriptions","organizations_url":"https://api.github.com/users/mlpack/orgs","repos_url":"https://api.github.com/users/mlpack/repos","events_url":"https://api.github.com/users/mlpack/events{/privacy}","received_events_url":"https://api.github.com/users/mlpack/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mlpack/mlpack","description":"mlpack: a scalable C++ machine learning library -- ","fork":false,"url":"https://api.github.com/repos/mlpack/mlpack","forks_url":"https://api.github.com/repos/mlpack/mlpack/forks","keys_url":"https://api.github.com/repos/mlpack/mlpack/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mlpack/mlpack/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mlpack/mlpack/teams","hooks_url":"https://api.github.com/repos/mlpack/mlpack/hooks","issue_events_url":"https://api.github.com/repos/mlpack/mlpack/issues/events{/number}","events_url":"https://api.github.com/repos/mlpack/mlpack/events","assignees_url":"https://api.github.com/repos/mlpack/mlpack/assignees{/user}","branches_url":"https://api.github.com/repos/mlpack/mlpack/branches{/branch}","tags_url":"https://api.github.com/repos/mlpack/mlpack/tags","blobs_url":"https://api.github.com/repos/mlpack/mlpack/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mlpack/mlpack/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mlpack/mlpack/git/refs{/sha}","trees_url":"https://api.github.com/repos/mlpack/mlpack/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mlpack/mlpack/statuses/{sha}","languages_url":"https://api.github.com/repos/mlpack/mlpack/languages","stargazers_url":"https://api.github.com/repos/mlpack/mlpack/stargazers","contributors_url":"https://api.github.com/repos/mlpack/mlpack/contributors","subscribers_url":"https://api.github.com/repos/mlpack/mlpack/subscribers","subscription_url":"https://api.github.com/repos/mlpack/mlpack/subscription","commits_url":"https://api.github.com/repos/mlpack/mlpack/commits{/sha}","git_commits_url":"https://api.github.com/repos/mlpack/mlpack/git/commits{/sha}","comments_url":"https://api.github.com/repos/mlpack/mlpack/comments{/number}","issue_comment_url":"https://api.github.com/repos/mlpack/mlpack/issues/comments{/number}","contents_url":"https://api.github.com/repos/mlpack/mlpack/contents/{+path}","compare_url":"https://api.github.com/repos/mlpack/mlpack/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mlpack/mlpack/merges","archive_url":"https://api.github.com/repos/mlpack/mlpack/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mlpack/mlpack/downloads","issues_url":"https://api.github.com/repos/mlpack/mlpack/issues{/number}","pulls_url":"https://api.github.com/repos/mlpack/mlpack/pulls{/number}","milestones_url":"https://api.github.com/repos/mlpack/mlpack/milestones{/number}","notifications_url":"https://api.github.com/repos/mlpack/mlpack/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mlpack/mlpack/labels{/name}","releases_url":"https://api.github.com/repos/mlpack/mlpack/releases{/id}","deployments_url":"https://api.github.com/repos/mlpack/mlpack/deployments","created_at":"2014-12-17T18:16:59Z","updated_at":"2017-08-15T08:33:02Z","pushed_at":"2017-08-16T16:36:12Z","git_url":"git://github.com/mlpack/mlpack.git","ssh_url":"git@github.com:mlpack/mlpack.git","clone_url":"https://github.com/mlpack/mlpack.git","svn_url":"https://github.com/mlpack/mlpack","homepage":"http://www.mlpack.org/","size":240732,"stargazers_count":1614,"watchers_count":1614,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":602,"mirror_url":null,"open_issues_count":98,"forks":602,"open_issues":98,"watchers":1614,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mlpack/mlpack/pulls/1048"},"html":{"href":"https://github.com/mlpack/mlpack/pull/1048"},"issue":{"href":"https://api.github.com/repos/mlpack/mlpack/issues/1048"},"comments":{"href":"https://api.github.com/repos/mlpack/mlpack/issues/1048/comments"},"review_comments":{"href":"https://api.github.com/repos/mlpack/mlpack/pulls/1048/comments"},"review_comment":{"href":"https://api.github.com/repos/mlpack/mlpack/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mlpack/mlpack/pulls/1048/commits"},"statuses":{"href":"https://api.github.com/repos/mlpack/mlpack/statuses/6097324055f80c077bd8db520a3f1c450c96fde3"}}}}
{"actor":{"display_login":"rcurtin"}}