{"action":"created","comment":{"url":"https://api.github.com/repos/stan-dev/math/pulls/comments/129398953","pull_request_review_id":52164355,"id":129398953,"diff_hunk":"@@ -1,80 +1,141 @@\n-#ifndef STAN_MATH_PRIM_ARR_FUN_APPEND_ARRAY_HPP\n-#define STAN_MATH_PRIM_ARR_FUN_APPEND_ARRAY_HPP\n+#ifndef STAN_MATH_PRIM_MAT_FUN_APPEND_ARRAY_HPP\n+#define STAN_MATH_PRIM_MAT_FUN_APPEND_ARRAY_HPP\n \n #include <stan/math/prim/mat/fun/Eigen.hpp>\n-#include <stan/math/prim/scal/meta/return_type.hpp>\n+#include <stan/math/prim/mat/meta/append_return_type.hpp>\n+#include <stan/math/prim/scal/err/check_consistent_sizes.hpp>\n #include <vector>\n \n namespace stan {\n   namespace math {\n+    /**\n+     * This function copies the value at x to y, casting from the type of T1 to\n+     * type T2. This implementation assumes the necessary copy constructors are\n+     * available to do the casting from T1 to T2.\n+     *\n+     * Specializations for std::vector and Eigen::Matrix are provided to copy\n+     * and cast the scalar elements.\n+     *\n+     * @tparam Type of source\n+     * @tparam Type of destination\n+     * @param x Source variable\n+     * @param y Target variable\n+     */\n+    template<typename T1, typename T2>\n+    inline void append_array_copy(const T1& x, T2& y) {\n+      y = T2(x);\n+    }\n \n     /**\n-     * Return the concatenation of two specified integer vectors in the\n-     *   order of the arguments.\n+     * This copies and casts the elements of x to y (by delegating to the Eigen\n+     * template cast)\n      *\n-     * @param x First vector\n-     * @param y Second vector\n-     * @return A vector of x and y concatenated together (in that order)\n+     * @tparam Scalar type of source matrix\n+     * @tparam Scalar Type of destination matrix\n+     * @tparam R Eigen RowsAtCompileTime of both matrices\n+     * @tparam C Eigen ColsAtCompileTime of both matrices\n+     * @param x Source matrix\n+     * @param y Target matrix\n      */\n-    inline std::vector<int>\n-    append_array(const std::vector<int>& x, const std::vector<int>& y) {\n-      std::vector<int> z;\n-      z.reserve(x.size() + y.size());\n-      z.insert(z.end(), x.begin(), x.end());\n-      z.insert(z.end(), y.begin(), y.end());\n-      return z;\n+    template<typename T1, typename T2, int R, int C>\n+    inline void append_array_copy(const Eigen::Matrix<T1, R, C>& x,\n+                     Eigen::Matrix<T2, R, C>& y) {\n+      y = x.template cast<T2>();\n     }\n \n     /**\n-     * Return the concatenation of two vectors containing Matrices\n-     *   of the same type in the order of the arguments.\n+     * This function copies and casts the elements of std::vector x to std::vector y.\n+     * First, y is resized to match the size of x, and then append_array_copy\n+     * is recursively called on each element of x to copy it to an element of y.\n      *\n-     * @tparam T1 Type of element in Matrices in first vector\n-     * @tparam T2 Type of element in Matrices in second vector\n-     * @tparam R Row specification of matrices\n-     * @tparam C Column specification of matrices\n-     * @param x First vector\n-     * @param y Second vector\n-     * @return A vector of x and y concatenated together (in that order)\n+     * @tparam Type of source\n+     * @tparam Type of destination\n+     * @param x Source variable\n+     * @param y Target variable\n      */\n-    template <typename T1, typename T2, int R, int C>\n-    inline std::vector<Eigen::Matrix<typename return_type<T1, T2>::type, R, C> >\n-    append_array(const std::vector<Eigen::Matrix<T1, R, C> >& x,\n-                 const std::vector<Eigen::Matrix<T2, R, C> >& y) {\n-      if (!x.empty() && !y.empty()) {\n-        check_matching_dims(\"append_array\",\n-                            \"x[1]\",\n-                            x.front(),\n-                            \"y[1]\",\n-                            y.front());\n+    template<typename T1, typename T2>\n+    inline void append_array_copy(const std::vector<T1> &x,\n+                                  std::vector<T2> &y) {\n+      y.resize(x.size());\n+      for (size_t i = 0; i < x.size(); i++) {\n+        append_array_copy(x[i], y[i]);\n       }\n+    }\n \n-      std::vector<Eigen::Matrix<typename return_type<T1, T2>::type, R, C> > z;\n-      z.reserve(x.size() + y.size());\n-      for (size_t i = 0; i < x.size(); i++)\n-        z.push_back(x[i].template cast<typename return_type<T1, T2>::type>());\n-      for (size_t i = 0; i < y.size(); i++)\n-        z.push_back(y[i].template cast<typename return_type<T1, T2>::type>());\n-      return z;\n+    /**\n+     * This function checks the sizes of both arguments are consistent.\n+     *\n+     * The basic version assumes variables are of compatible sizes. There are\n+     * specializations for Eigen::Matrices and std::vectors (where this\n+     * assumption is not true).\n+     *\n+     * @tparam T1 Type of x\n+     * @tparam T2 Type of y\n+     * @param x First argument to check\n+     * @param y Second argument to check\n+     */\n+    template<typename T1, typename T2>\n+    inline void append_array_check_size(const T1& x, const T2& y) {\n+    }\n+\n+    /**\n+     * This function checks if two Eigen::Matrices are of compatible sizes\n+     * by delegating to check_matching_dims.\n+     *\n+     * @tparam T1 Scalar type of x\n+     * @tparam T2 Scalar type of y\n+     * @tparam R Eigen RowsAtCompileTime of both matrices\n+     * @tparam C Eigen ColsAtCompileTime of both matrices\n+     * @param x First matrix\n+     * @param y Second matrix\n+     */\n+    template<typename T1, typename T2, int R, int C>\n+    inline void append_array_check_size(const Eigen::Matrix<T1, R, C>& x,\n+                     const Eigen::Matrix<T2, R, C>& y) {\n+      check_matching_dims(\"append_array\", \"x\", x, \"y\", y);\n+    }\n+\n+    /**\n+     * This function checks if two std::vectors are of compatible sizes and\n+     * then recursively calls append_array_check_size to see if the first\n+     * elements of each std::vector have compatible sizes.\n+     *\n+     * @tparam T1 Element type of x\n+     * @tparam T2 Element type of y\n+     * @param x First std::vector\n+     * @param y Second std::vector\n+     */\n+    template<typename T1, typename T2>\n+    inline void append_array_check_size(const std::vector<T1> &x,\n+                                        const std::vector<T2> &y) {\n+      check_consistent_sizes(\"append_array\", \"size of x\", x, \"size of y\", y);\n+      if (!x.empty() && !y.empty()) {","path":"stan/math/prim/mat/fun/append_array.hpp","position":153,"original_position":153,"commit_id":"1e02e53f66ddb1253bf0b8720ad7febf880407ac","original_commit_id":"1e02e53f66ddb1253bf0b8720ad7febf880407ac","user":{"login":"bob-carpenter","id":3383807,"avatar_url":"https://avatars1.githubusercontent.com/u/3383807?v=4","gravatar_id":"","url":"https://api.github.com/users/bob-carpenter","html_url":"https://github.com/bob-carpenter","followers_url":"https://api.github.com/users/bob-carpenter/followers","following_url":"https://api.github.com/users/bob-carpenter/following{/other_user}","gists_url":"https://api.github.com/users/bob-carpenter/gists{/gist_id}","starred_url":"https://api.github.com/users/bob-carpenter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bob-carpenter/subscriptions","organizations_url":"https://api.github.com/users/bob-carpenter/orgs","repos_url":"https://api.github.com/users/bob-carpenter/repos","events_url":"https://api.github.com/users/bob-carpenter/events{/privacy}","received_events_url":"https://api.github.com/users/bob-carpenter/received_events","type":"User","site_admin":false},"body":"The `!y.empty()` check is redundant given the consistency check.  \r\n\r\nIt'd be better to make sure `append_array_check_size` worked for empty containers.  This does *not* save time to put in redundant checks like this.  Branching is expensive.","created_at":"2017-07-25T19:14:10Z","updated_at":"2017-07-25T19:26:40Z","html_url":"https://github.com/stan-dev/math/pull/577#discussion_r129398953","pull_request_url":"https://api.github.com/repos/stan-dev/math/pulls/577","_links":{"self":{"href":"https://api.github.com/repos/stan-dev/math/pulls/comments/129398953"},"html":{"href":"https://github.com/stan-dev/math/pull/577#discussion_r129398953"},"pull_request":{"href":"https://api.github.com/repos/stan-dev/math/pulls/577"}}},"pull_request":{"url":"https://api.github.com/repos/stan-dev/math/pulls/577","id":131217345,"html_url":"https://github.com/stan-dev/math/pull/577","diff_url":"https://github.com/stan-dev/math/pull/577.diff","patch_url":"https://github.com/stan-dev/math/pull/577.patch","issue_url":"https://api.github.com/repos/stan-dev/math/issues/577","number":577,"state":"open","locked":false,"title":"Feature/issue 481 append array vectors of vectors","user":{"login":"bbbales2","id":4742424,"avatar_url":"https://avatars1.githubusercontent.com/u/4742424?v=4","gravatar_id":"","url":"https://api.github.com/users/bbbales2","html_url":"https://github.com/bbbales2","followers_url":"https://api.github.com/users/bbbales2/followers","following_url":"https://api.github.com/users/bbbales2/following{/other_user}","gists_url":"https://api.github.com/users/bbbales2/gists{/gist_id}","starred_url":"https://api.github.com/users/bbbales2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bbbales2/subscriptions","organizations_url":"https://api.github.com/users/bbbales2/orgs","repos_url":"https://api.github.com/users/bbbales2/repos","events_url":"https://api.github.com/users/bbbales2/events{/privacy}","received_events_url":"https://api.github.com/users/bbbales2/received_events","type":"User","site_admin":false},"body":"#### Submission Checklist\r\n\r\n- [only the append_array_test ones] Run unit tests: `./runTests.py test/unit`\r\n- [x] Run cpplint: `make cpplint`\r\n- [x] Declare copyright holder and open-source license: see below\r\n\r\n#### Summary:\r\n\r\nThis replaces this pull req: https://github.com/stan-dev/math/pull/575 (sorry bout that -- lost my commit permissions to Stan repos last week -- Sean n' Daniel said to just make a pull req. from my own fork).\r\n\r\nTwo questions @bob-carpenter:\r\n1. I expanded the new tests to test all the different ways to call append_array (up to two std::vectors deep). To avoid duplication of the test code, I put all the tests in /mix/ instead of splitting them up into individual sections. That okay?\r\n\r\n2. These new tests only test that values are being passed around correctly (either the actual value of a double, .val() of var, .val().val() of fvar<var>, etc.). I'm not testing the autodiff. I'm not testing values of derivatives in fvars. That said, I think that's about all the append_array function should really do. I can delete all the old append_array tests that test the gradients and such and I don't think we're really losing anything (here are your previous thoughts on this: https://github.com/stan-dev/math/pull/531#issuecomment-298264800)\r\n\r\nResponse to req. changes:\r\n1. I left the return-by-reference builders in place in the tests. I found it easier to work with templates like this.\r\n\r\n#### How to Verify:\r\n\r\n./runTests.py test/unit/math/prim/mat/fun/append_array_test.cpp\r\n./runTests.py test/unit/math/fwd/mat/fun/append_array_test.cpp\r\n./runTests.py test/unit/math/rev/mat/fun/append_array_test.cpp\r\n./runTests.py test/unit/math/mix/mat/fun/append_array_test.cpp\r\n\r\n#### Documentation:\r\n\r\nIn the Doxygen\r\n\r\n#### Reviewer Suggestions: \r\n\r\n@bob-carpenter \r\n\r\n#### Copyright and Licensing\r\n\r\nPlease list the copyright holder for the work you are submitting (this will be you or your assignee, such as a university or company): University of California, Santa Barbara\r\n\r\nBy submitting this pull request, the copyright holder is agreeing to license the submitted work under the following licenses:\r\n- Code: BSD 3-clause (https://opensource.org/licenses/BSD-3-Clause)\r\n- Documentation: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/)\r\n","created_at":"2017-07-19T00:57:06Z","updated_at":"2017-07-25T19:26:40Z","closed_at":null,"merged_at":null,"merge_commit_sha":"74fedbeec77adffdecc2bd3a27e9c871122d9c24","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/stan-dev/math/pulls/577/commits","review_comments_url":"https://api.github.com/repos/stan-dev/math/pulls/577/comments","review_comment_url":"https://api.github.com/repos/stan-dev/math/pulls/comments{/number}","comments_url":"https://api.github.com/repos/stan-dev/math/issues/577/comments","statuses_url":"https://api.github.com/repos/stan-dev/math/statuses/1e02e53f66ddb1253bf0b8720ad7febf880407ac","head":{"label":"bbbales2:feature/issue-481-append-array-vectors-of-vectors","ref":"feature/issue-481-append-array-vectors-of-vectors","sha":"1e02e53f66ddb1253bf0b8720ad7febf880407ac","user":{"login":"bbbales2","id":4742424,"avatar_url":"https://avatars1.githubusercontent.com/u/4742424?v=4","gravatar_id":"","url":"https://api.github.com/users/bbbales2","html_url":"https://github.com/bbbales2","followers_url":"https://api.github.com/users/bbbales2/followers","following_url":"https://api.github.com/users/bbbales2/following{/other_user}","gists_url":"https://api.github.com/users/bbbales2/gists{/gist_id}","starred_url":"https://api.github.com/users/bbbales2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bbbales2/subscriptions","organizations_url":"https://api.github.com/users/bbbales2/orgs","repos_url":"https://api.github.com/users/bbbales2/repos","events_url":"https://api.github.com/users/bbbales2/events{/privacy}","received_events_url":"https://api.github.com/users/bbbales2/received_events","type":"User","site_admin":false},"repo":{"id":86724369,"name":"math","full_name":"bbbales2/math","owner":{"login":"bbbales2","id":4742424,"avatar_url":"https://avatars1.githubusercontent.com/u/4742424?v=4","gravatar_id":"","url":"https://api.github.com/users/bbbales2","html_url":"https://github.com/bbbales2","followers_url":"https://api.github.com/users/bbbales2/followers","following_url":"https://api.github.com/users/bbbales2/following{/other_user}","gists_url":"https://api.github.com/users/bbbales2/gists{/gist_id}","starred_url":"https://api.github.com/users/bbbales2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bbbales2/subscriptions","organizations_url":"https://api.github.com/users/bbbales2/orgs","repos_url":"https://api.github.com/users/bbbales2/repos","events_url":"https://api.github.com/users/bbbales2/events{/privacy}","received_events_url":"https://api.github.com/users/bbbales2/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/bbbales2/math","description":"Stan Math Library","fork":true,"url":"https://api.github.com/repos/bbbales2/math","forks_url":"https://api.github.com/repos/bbbales2/math/forks","keys_url":"https://api.github.com/repos/bbbales2/math/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bbbales2/math/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bbbales2/math/teams","hooks_url":"https://api.github.com/repos/bbbales2/math/hooks","issue_events_url":"https://api.github.com/repos/bbbales2/math/issues/events{/number}","events_url":"https://api.github.com/repos/bbbales2/math/events","assignees_url":"https://api.github.com/repos/bbbales2/math/assignees{/user}","branches_url":"https://api.github.com/repos/bbbales2/math/branches{/branch}","tags_url":"https://api.github.com/repos/bbbales2/math/tags","blobs_url":"https://api.github.com/repos/bbbales2/math/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bbbales2/math/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bbbales2/math/git/refs{/sha}","trees_url":"https://api.github.com/repos/bbbales2/math/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bbbales2/math/statuses/{sha}","languages_url":"https://api.github.com/repos/bbbales2/math/languages","stargazers_url":"https://api.github.com/repos/bbbales2/math/stargazers","contributors_url":"https://api.github.com/repos/bbbales2/math/contributors","subscribers_url":"https://api.github.com/repos/bbbales2/math/subscribers","subscription_url":"https://api.github.com/repos/bbbales2/math/subscription","commits_url":"https://api.github.com/repos/bbbales2/math/commits{/sha}","git_commits_url":"https://api.github.com/repos/bbbales2/math/git/commits{/sha}","comments_url":"https://api.github.com/repos/bbbales2/math/comments{/number}","issue_comment_url":"https://api.github.com/repos/bbbales2/math/issues/comments{/number}","contents_url":"https://api.github.com/repos/bbbales2/math/contents/{+path}","compare_url":"https://api.github.com/repos/bbbales2/math/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bbbales2/math/merges","archive_url":"https://api.github.com/repos/bbbales2/math/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bbbales2/math/downloads","issues_url":"https://api.github.com/repos/bbbales2/math/issues{/number}","pulls_url":"https://api.github.com/repos/bbbales2/math/pulls{/number}","milestones_url":"https://api.github.com/repos/bbbales2/math/milestones{/number}","notifications_url":"https://api.github.com/repos/bbbales2/math/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bbbales2/math/labels{/name}","releases_url":"https://api.github.com/repos/bbbales2/math/releases{/id}","deployments_url":"https://api.github.com/repos/bbbales2/math/deployments","created_at":"2017-03-30T16:26:58Z","updated_at":"2017-03-30T16:27:37Z","pushed_at":"2017-07-23T20:44:15Z","git_url":"git://github.com/bbbales2/math.git","ssh_url":"git@github.com:bbbales2/math.git","clone_url":"https://github.com/bbbales2/math.git","svn_url":"https://github.com/bbbales2/math","homepage":null,"size":235233,"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":"develop"}},"base":{"label":"stan-dev:develop","ref":"develop","sha":"5fcd77510cd2533662895fb372f5ad938064be6a","user":{"login":"stan-dev","id":3374820,"avatar_url":"https://avatars2.githubusercontent.com/u/3374820?v=4","gravatar_id":"","url":"https://api.github.com/users/stan-dev","html_url":"https://github.com/stan-dev","followers_url":"https://api.github.com/users/stan-dev/followers","following_url":"https://api.github.com/users/stan-dev/following{/other_user}","gists_url":"https://api.github.com/users/stan-dev/gists{/gist_id}","starred_url":"https://api.github.com/users/stan-dev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stan-dev/subscriptions","organizations_url":"https://api.github.com/users/stan-dev/orgs","repos_url":"https://api.github.com/users/stan-dev/repos","events_url":"https://api.github.com/users/stan-dev/events{/privacy}","received_events_url":"https://api.github.com/users/stan-dev/received_events","type":"Organization","site_admin":false},"repo":{"id":38388440,"name":"math","full_name":"stan-dev/math","owner":{"login":"stan-dev","id":3374820,"avatar_url":"https://avatars2.githubusercontent.com/u/3374820?v=4","gravatar_id":"","url":"https://api.github.com/users/stan-dev","html_url":"https://github.com/stan-dev","followers_url":"https://api.github.com/users/stan-dev/followers","following_url":"https://api.github.com/users/stan-dev/following{/other_user}","gists_url":"https://api.github.com/users/stan-dev/gists{/gist_id}","starred_url":"https://api.github.com/users/stan-dev/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stan-dev/subscriptions","organizations_url":"https://api.github.com/users/stan-dev/orgs","repos_url":"https://api.github.com/users/stan-dev/repos","events_url":"https://api.github.com/users/stan-dev/events{/privacy}","received_events_url":"https://api.github.com/users/stan-dev/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/stan-dev/math","description":"Stan Math Library","fork":false,"url":"https://api.github.com/repos/stan-dev/math","forks_url":"https://api.github.com/repos/stan-dev/math/forks","keys_url":"https://api.github.com/repos/stan-dev/math/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stan-dev/math/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stan-dev/math/teams","hooks_url":"https://api.github.com/repos/stan-dev/math/hooks","issue_events_url":"https://api.github.com/repos/stan-dev/math/issues/events{/number}","events_url":"https://api.github.com/repos/stan-dev/math/events","assignees_url":"https://api.github.com/repos/stan-dev/math/assignees{/user}","branches_url":"https://api.github.com/repos/stan-dev/math/branches{/branch}","tags_url":"https://api.github.com/repos/stan-dev/math/tags","blobs_url":"https://api.github.com/repos/stan-dev/math/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stan-dev/math/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stan-dev/math/git/refs{/sha}","trees_url":"https://api.github.com/repos/stan-dev/math/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stan-dev/math/statuses/{sha}","languages_url":"https://api.github.com/repos/stan-dev/math/languages","stargazers_url":"https://api.github.com/repos/stan-dev/math/stargazers","contributors_url":"https://api.github.com/repos/stan-dev/math/contributors","subscribers_url":"https://api.github.com/repos/stan-dev/math/subscribers","subscription_url":"https://api.github.com/repos/stan-dev/math/subscription","commits_url":"https://api.github.com/repos/stan-dev/math/commits{/sha}","git_commits_url":"https://api.github.com/repos/stan-dev/math/git/commits{/sha}","comments_url":"https://api.github.com/repos/stan-dev/math/comments{/number}","issue_comment_url":"https://api.github.com/repos/stan-dev/math/issues/comments{/number}","contents_url":"https://api.github.com/repos/stan-dev/math/contents/{+path}","compare_url":"https://api.github.com/repos/stan-dev/math/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stan-dev/math/merges","archive_url":"https://api.github.com/repos/stan-dev/math/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stan-dev/math/downloads","issues_url":"https://api.github.com/repos/stan-dev/math/issues{/number}","pulls_url":"https://api.github.com/repos/stan-dev/math/pulls{/number}","milestones_url":"https://api.github.com/repos/stan-dev/math/milestones{/number}","notifications_url":"https://api.github.com/repos/stan-dev/math/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stan-dev/math/labels{/name}","releases_url":"https://api.github.com/repos/stan-dev/math/releases{/id}","deployments_url":"https://api.github.com/repos/stan-dev/math/deployments","created_at":"2015-07-01T18:40:54Z","updated_at":"2017-07-18T15:13:10Z","pushed_at":"2017-07-25T18:06:08Z","git_url":"git://github.com/stan-dev/math.git","ssh_url":"git@github.com:stan-dev/math.git","clone_url":"https://github.com/stan-dev/math.git","svn_url":"https://github.com/stan-dev/math","homepage":null,"size":235642,"stargazers_count":125,"watchers_count":125,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":50,"mirror_url":null,"open_issues_count":111,"forks":50,"open_issues":111,"watchers":125,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/stan-dev/math/pulls/577"},"html":{"href":"https://github.com/stan-dev/math/pull/577"},"issue":{"href":"https://api.github.com/repos/stan-dev/math/issues/577"},"comments":{"href":"https://api.github.com/repos/stan-dev/math/issues/577/comments"},"review_comments":{"href":"https://api.github.com/repos/stan-dev/math/pulls/577/comments"},"review_comment":{"href":"https://api.github.com/repos/stan-dev/math/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/stan-dev/math/pulls/577/commits"},"statuses":{"href":"https://api.github.com/repos/stan-dev/math/statuses/1e02e53f66ddb1253bf0b8720ad7febf880407ac"}}}}
{"actor":{"display_login":"bob-carpenter"}}