payload: {"action":"created","comment":{"url":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/comments/256435695","pull_request_review_id":203260052,"id":256435695,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI1NjQzNTY5NQ==","diff_hunk":"@@ -428,27 +679,199 @@ GKO_INSTANTIATE_FOR_EACH_VALUE_AND_INDEX_TYPE(\n     GKO_DECLARE_DENSE_MOVE_TO_SELLP_KERNEL);\n \n \n+namespace kernel {\n+\n+\n+template <typename Operator, typename ValueType>\n+__device__ void reduce_array(size_type size,\n+                             const ValueType *__restrict__ source,\n+                             ValueType *__restrict__ result,\n+                             Operator reduce_op = Operator{})\n+{\n+    const auto tidx = threadIdx.x + blockIdx.x * blockDim.x;\n+    auto thread_result = zero<ValueType>();\n+    for (auto i = tidx; i < size; i += blockDim.x * gridDim.x) {\n+        thread_result = reduce_op(thread_result, source[i]);\n+    }\n+    result[threadIdx.x] = thread_result;\n+\n+    __syncthreads();\n+\n+    for (auto i = blockDim.x >> 1; i >= 1; i >>= 1) {\n+        if (threadIdx.x < i && threadIdx.x + i < blockDim.x) {\n+            result[threadIdx.x] =\n+                reduce_op(result[threadIdx.x + i], result[threadIdx.x]);\n+        }\n+        __syncthreads();\n+    }\n+}\n+\n+\n+__global__ __launch_bounds__(default_block_size) void reduce_nnz(\n+    size_type size, const size_type *__restrict__ nnz_per_row,\n+    size_type *__restrict__ result)\n+{\n+    extern __shared__ size_type block_sum[];\n+    reduce_array(size, nnz_per_row, block_sum,\n+                 [](const size_type &x, const size_type &y) { return x + y; });\n+\n+    if (threadIdx.x == 0) {\n+        result[blockIdx.x] = block_sum[0];\n+    }\n+}\n+\n+\n+}  // namespace kernel\n+\n+\n template <typename ValueType>\n void count_nonzeros(std::shared_ptr<const CudaExecutor> exec,\n-                    const matrix::Dense<ValueType> *source,\n-                    size_type *result) NOT_IMPLEMENTED;\n+                    const matrix::Dense<ValueType> *source, size_type *result)\n+{\n+    const auto num_rows = source->get_size()[0];\n+    auto nnz_per_row = Array<size_type>(exec, num_rows);\n+\n+    calculate_nonzeros_per_row(exec, source, &nnz_per_row);\n+\n+    const auto n = ceildiv(num_rows, default_block_size);\n+    const size_type grid_dim =\n+        (n <= default_block_size) ? n : default_block_size;\n+\n+    auto block_results = Array<size_type>(exec, grid_dim);\n+\n+    kernel::reduce_nnz<<<grid_dim, default_block_size,\n+                         default_block_size * sizeof(size_type)>>>(\n+        num_rows, as_cuda_type(nnz_per_row.get_const_data()),\n+        as_cuda_type(block_results.get_data()));\n+\n+    auto d_result = Array<size_type>(exec, 1);\n+\n+    kernel::reduce_nnz<<<1, default_block_size,\n+                         default_block_size * sizeof(size_type)>>>(\n+        grid_dim, as_cuda_type(block_results.get_const_data()),\n+        as_cuda_type(d_result.get_data()));\n+\n+    exec->get_master()->copy_from(exec.get(), 1, d_result.get_const_data(),\n+                                  result);\n+    d_result.clear();\n+    block_results.clear();\n+    nnz_per_row.clear();\n+}\n \n GKO_INSTANTIATE_FOR_EACH_VALUE_TYPE(GKO_DECLARE_DENSE_COUNT_NONZEROS_KERNEL);\n \n \n+namespace kernel {\n+\n+\n+__global__ __launch_bounds__(default_block_size) void reduce_max_nnz(\n+    size_type size, const size_type *__restrict__ nnz_per_row,\n+    size_type *__restrict__ result)\n+{\n+    extern __shared__ size_type block_max[];\n+\n+    reduce_array(\n+        size, nnz_per_row, block_max,\n+        [](const size_type &x, const size_type &y) { return max(x, y); });\n+\n+    if (threadIdx.x == 0) {\n+        result[blockIdx.x] = block_max[0];\n+    }\n+}\n+\n+\n+}  // namespace kernel\n+\n+\n template <typename ValueType>\n void calculate_max_nnz_per_row(std::shared_ptr<const CudaExecutor> exec,\n                                const matrix::Dense<ValueType> *source,\n-                               size_type *result) NOT_IMPLEMENTED;\n+                               size_type *result)\n+{\n+    const auto num_rows = source->get_size()[0];\n+    auto nnz_per_row = Array<size_type>(exec, num_rows);\n+\n+    calculate_nonzeros_per_row(exec, source, &nnz_per_row);\n+\n+    const auto n = ceildiv(num_rows, default_block_size);\n+    const size_type grid_dim =\n+        (n <= default_block_size) ? n : default_block_size;\n+\n+    auto block_results = Array<size_type>(exec, grid_dim);\n+\n+    kernel::reduce_max_nnz<<<grid_dim, default_block_size,\n+                             default_block_size * sizeof(size_type)>>>(\n+        num_rows, as_cuda_type(nnz_per_row.get_const_data()),\n+        as_cuda_type(block_results.get_data()));\n+\n+    auto d_result = Array<size_type>(exec, 1);\n+\n+    kernel::reduce_max_nnz<<<1, default_block_size,\n+                             default_block_size * sizeof(size_type)>>>(\n+        grid_dim, as_cuda_type(block_results.get_const_data()),\n+        as_cuda_type(d_result.get_data()));\n+\n+    exec->get_master()->copy_from(exec.get(), 1, d_result.get_const_data(),\n+                                  result);\n+    d_result.clear();\n+    block_results.clear();\n+    nnz_per_row.clear();\n+}\n \n GKO_INSTANTIATE_FOR_EACH_VALUE_TYPE(\n     GKO_DECLARE_DENSE_CALCULATE_MAX_NNZ_PER_ROW_KERNEL);\n \n \n+namespace kernel {\n+\n+\n+template <typename ValueType>\n+__global__ __launch_bounds__(default_block_size) void count_nnz_per_row(\n+    size_type num_rows, size_type num_cols, size_type stride,\n+    const ValueType *__restrict__ work, size_type *__restrict__ result)\n+{\n+    __shared__ size_type part_results[default_block_size];\n+    const auto warp_size = cuda_config::warp_size;\n+    const auto tidx = threadIdx.x + blockIdx.x * blockDim.x;\n+    const auto global_warpid = tidx / warp_size;\n+    const auto local_warpid = threadIdx.x / warp_size;\n+\n+    if (global_warpid < num_rows) {\n+        part_results[threadIdx.x] = 0;\n+        for (auto i = threadIdx.x % warp_size; i < num_cols; i += warp_size) {\n+            if (work[stride * global_warpid + i] != zero<ValueType>()) {\n+                part_results[threadIdx.x] += 1;\n+            }\n+        }\n+        __syncthreads();\n+        if (threadIdx.x % warp_size == 0) {\n+            result[global_warpid] = 0;\n+            for (auto i = 0; i < warp_size; i++) {\n+                result[global_warpid] +=\n+                    part_results[local_warpid * warp_size + i];\n+            }\n+        }","path":"cuda/matrix/dense_kernels.cu","position":471,"original_position":471,"commit_id":"342e5b184d503b87ee5bf8589ff8279d74e1e9a5","original_commit_id":"342e5b184d503b87ee5bf8589ff8279d74e1e9a5","user":{"login":"thoasm","id":17714526,"node_id":"MDQ6VXNlcjE3NzE0NTI2","avatar_url":"https://avatars0.githubusercontent.com/u/17714526?v=4","gravatar_id":"","url":"https://api.github.com/users/thoasm","html_url":"https://github.com/thoasm","followers_url":"https://api.github.com/users/thoasm/followers","following_url":"https://api.github.com/users/thoasm/following{/other_user}","gists_url":"https://api.github.com/users/thoasm/gists{/gist_id}","starred_url":"https://api.github.com/users/thoasm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thoasm/subscriptions","organizations_url":"https://api.github.com/users/thoasm/orgs","repos_url":"https://api.github.com/users/thoasm/repos","events_url":"https://api.github.com/users/thoasm/events{/privacy}","received_events_url":"https://api.github.com/users/thoasm/received_events","type":"User","site_admin":false},"body":"You can use the following function that uses `reduce`, which, in turn, uses efficient shuffle operations which work inside a warp.\r\n\r\nYou need to add `#include \"cuda/components/cooperative_groups.cuh\"` to your includes and change the function to this:\r\n```c++\r\ntemplate <typename ValueType>\r\n__global__ __launch_bounds__(default_block_size) void count_nnz_per_row(\r\n    size_type num_rows, size_type num_cols, size_type stride,\r\n    const ValueType *__restrict__ work, size_type *__restrict__ result)\r\n{\r\n    constexpr auto warp_size = cuda_config::warp_size;\r\n    const auto tidx = threadIdx.x + blockIdx.x * blockDim.x;\r\n    const auto row_idx = tidx / warp_size;\r\n\r\n    if (row_idx < num_rows) {\r\n        size_type part_result{};\r\n        for (auto i = threadIdx.x % warp_size; i < num_cols; i += warp_size) {\r\n            if (work[stride * row_idx + i] != zero<ValueType>()) {\r\n                part_result += 1;\r\n            }\r\n        }\r\n        \r\n        auto warp_tile = group::tiled_partition<warp_size>(group::this_thread_block());\r\n        result[row_idx] = reduce(warp_tile, part_result, [](const size_type &a, const size_type &b) {return a + b;});\r\n    }\r\n}\r\n```","created_at":"2019-02-13T15:05:56Z","updated_at":"2019-02-13T15:05:56Z","html_url":"https://github.com/ginkgo-project/ginkgo/pull/198#discussion_r256435695","pull_request_url":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/198","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/comments/256435695"},"html":{"href":"https://github.com/ginkgo-project/ginkgo/pull/198#discussion_r256435695"},"pull_request":{"href":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/198"}},"in_reply_to_id":256377536},"pull_request":{"url":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/198","id":244447912,"node_id":"MDExOlB1bGxSZXF1ZXN0MjQ0NDQ3OTEy","html_url":"https://github.com/ginkgo-project/ginkgo/pull/198","diff_url":"https://github.com/ginkgo-project/ginkgo/pull/198.diff","patch_url":"https://github.com/ginkgo-project/ginkgo/pull/198.patch","issue_url":"https://api.github.com/repos/ginkgo-project/ginkgo/issues/198","number":198,"state":"open","locked":false,"title":"Matrix conversion kernels for cuda","user":{"login":"fritzgoebel","id":46599674,"node_id":"MDQ6VXNlcjQ2NTk5Njc0","avatar_url":"https://avatars2.githubusercontent.com/u/46599674?v=4","gravatar_id":"","url":"https://api.github.com/users/fritzgoebel","html_url":"https://github.com/fritzgoebel","followers_url":"https://api.github.com/users/fritzgoebel/followers","following_url":"https://api.github.com/users/fritzgoebel/following{/other_user}","gists_url":"https://api.github.com/users/fritzgoebel/gists{/gist_id}","starred_url":"https://api.github.com/users/fritzgoebel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fritzgoebel/subscriptions","organizations_url":"https://api.github.com/users/fritzgoebel/orgs","repos_url":"https://api.github.com/users/fritzgoebel/repos","events_url":"https://api.github.com/users/fritzgoebel/events{/privacy}","received_events_url":"https://api.github.com/users/fritzgoebel/received_events","type":"User","site_admin":false},"body":"Dense to Coo, Csr, Ell. Coo to Dense. Csr to Dense. Ell to Dense.","created_at":"2019-01-14T13:43:01Z","updated_at":"2019-02-13T15:05:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"abc062c0a0f4f4ad5b290b37170589b62e2043da","assignee":{"login":"fritzgoebel","id":46599674,"node_id":"MDQ6VXNlcjQ2NTk5Njc0","avatar_url":"https://avatars2.githubusercontent.com/u/46599674?v=4","gravatar_id":"","url":"https://api.github.com/users/fritzgoebel","html_url":"https://github.com/fritzgoebel","followers_url":"https://api.github.com/users/fritzgoebel/followers","following_url":"https://api.github.com/users/fritzgoebel/following{/other_user}","gists_url":"https://api.github.com/users/fritzgoebel/gists{/gist_id}","starred_url":"https://api.github.com/users/fritzgoebel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fritzgoebel/subscriptions","organizations_url":"https://api.github.com/users/fritzgoebel/orgs","repos_url":"https://api.github.com/users/fritzgoebel/repos","events_url":"https://api.github.com/users/fritzgoebel/events{/privacy}","received_events_url":"https://api.github.com/users/fritzgoebel/received_events","type":"User","site_admin":false},"assignees":[{"login":"fritzgoebel","id":46599674,"node_id":"MDQ6VXNlcjQ2NTk5Njc0","avatar_url":"https://avatars2.githubusercontent.com/u/46599674?v=4","gravatar_id":"","url":"https://api.github.com/users/fritzgoebel","html_url":"https://github.com/fritzgoebel","followers_url":"https://api.github.com/users/fritzgoebel/followers","following_url":"https://api.github.com/users/fritzgoebel/following{/other_user}","gists_url":"https://api.github.com/users/fritzgoebel/gists{/gist_id}","starred_url":"https://api.github.com/users/fritzgoebel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fritzgoebel/subscriptions","organizations_url":"https://api.github.com/users/fritzgoebel/orgs","repos_url":"https://api.github.com/users/fritzgoebel/repos","events_url":"https://api.github.com/users/fritzgoebel/events{/privacy}","received_events_url":"https://api.github.com/users/fritzgoebel/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"hartwiganzt","id":20345566,"node_id":"MDQ6VXNlcjIwMzQ1NTY2","avatar_url":"https://avatars2.githubusercontent.com/u/20345566?v=4","gravatar_id":"","url":"https://api.github.com/users/hartwiganzt","html_url":"https://github.com/hartwiganzt","followers_url":"https://api.github.com/users/hartwiganzt/followers","following_url":"https://api.github.com/users/hartwiganzt/following{/other_user}","gists_url":"https://api.github.com/users/hartwiganzt/gists{/gist_id}","starred_url":"https://api.github.com/users/hartwiganzt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hartwiganzt/subscriptions","organizations_url":"https://api.github.com/users/hartwiganzt/orgs","repos_url":"https://api.github.com/users/hartwiganzt/repos","events_url":"https://api.github.com/users/hartwiganzt/events{/privacy}","received_events_url":"https://api.github.com/users/hartwiganzt/received_events","type":"User","site_admin":false},{"login":"tcojean","id":35342290,"node_id":"MDQ6VXNlcjM1MzQyMjkw","avatar_url":"https://avatars1.githubusercontent.com/u/35342290?v=4","gravatar_id":"","url":"https://api.github.com/users/tcojean","html_url":"https://github.com/tcojean","followers_url":"https://api.github.com/users/tcojean/followers","following_url":"https://api.github.com/users/tcojean/following{/other_user}","gists_url":"https://api.github.com/users/tcojean/gists{/gist_id}","starred_url":"https://api.github.com/users/tcojean/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tcojean/subscriptions","organizations_url":"https://api.github.com/users/tcojean/orgs","repos_url":"https://api.github.com/users/tcojean/repos","events_url":"https://api.github.com/users/tcojean/events{/privacy}","received_events_url":"https://api.github.com/users/tcojean/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":978496195,"node_id":"MDU6TGFiZWw5Nzg0OTYxOTU=","url":"https://api.github.com/repos/ginkgo-project/ginkgo/labels/CUDA","name":"CUDA","color":"76b900","default":false},{"id":1199782836,"node_id":"MDU6TGFiZWwxMTk5NzgyODM2","url":"https://api.github.com/repos/ginkgo-project/ginkgo/labels/Matrix%20Format","name":"Matrix Format","color":"9b184a","default":false}],"milestone":{"url":"https://api.github.com/repos/ginkgo-project/ginkgo/milestones/1","html_url":"https://github.com/ginkgo-project/ginkgo/milestone/1","labels_url":"https://api.github.com/repos/ginkgo-project/ginkgo/milestones/1/labels","id":4050870,"node_id":"MDk6TWlsZXN0b25lNDA1MDg3MA==","number":1,"title":"Ginkgo 1.0.0 release","description":"This milestone is for tracking what is required for the Ginkgo version 1.0.0 release.","creator":{"login":"tcojean","id":35342290,"node_id":"MDQ6VXNlcjM1MzQyMjkw","avatar_url":"https://avatars1.githubusercontent.com/u/35342290?v=4","gravatar_id":"","url":"https://api.github.com/users/tcojean","html_url":"https://github.com/tcojean","followers_url":"https://api.github.com/users/tcojean/followers","following_url":"https://api.github.com/users/tcojean/following{/other_user}","gists_url":"https://api.github.com/users/tcojean/gists{/gist_id}","starred_url":"https://api.github.com/users/tcojean/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tcojean/subscriptions","organizations_url":"https://api.github.com/users/tcojean/orgs","repos_url":"https://api.github.com/users/tcojean/repos","events_url":"https://api.github.com/users/tcojean/events{/privacy}","received_events_url":"https://api.github.com/users/tcojean/received_events","type":"User","site_admin":false},"open_issues":18,"closed_issues":1,"state":"open","created_at":"2019-02-12T12:23:48Z","updated_at":"2019-02-13T14:45:59Z","due_on":"2019-03-01T08:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/198/commits","review_comments_url":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/198/comments","review_comment_url":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ginkgo-project/ginkgo/issues/198/comments","statuses_url":"https://api.github.com/repos/ginkgo-project/ginkgo/statuses/342e5b184d503b87ee5bf8589ff8279d74e1e9a5","head":{"label":"fritzgoebel:develop","ref":"develop","sha":"342e5b184d503b87ee5bf8589ff8279d74e1e9a5","user":{"login":"fritzgoebel","id":46599674,"node_id":"MDQ6VXNlcjQ2NTk5Njc0","avatar_url":"https://avatars2.githubusercontent.com/u/46599674?v=4","gravatar_id":"","url":"https://api.github.com/users/fritzgoebel","html_url":"https://github.com/fritzgoebel","followers_url":"https://api.github.com/users/fritzgoebel/followers","following_url":"https://api.github.com/users/fritzgoebel/following{/other_user}","gists_url":"https://api.github.com/users/fritzgoebel/gists{/gist_id}","starred_url":"https://api.github.com/users/fritzgoebel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fritzgoebel/subscriptions","organizations_url":"https://api.github.com/users/fritzgoebel/orgs","repos_url":"https://api.github.com/users/fritzgoebel/repos","events_url":"https://api.github.com/users/fritzgoebel/events{/privacy}","received_events_url":"https://api.github.com/users/fritzgoebel/received_events","type":"User","site_admin":false},"repo":{"id":165666901,"node_id":"MDEwOlJlcG9zaXRvcnkxNjU2NjY5MDE=","name":"ginkgo","full_name":"fritzgoebel/ginkgo","private":false,"owner":{"login":"fritzgoebel","id":46599674,"node_id":"MDQ6VXNlcjQ2NTk5Njc0","avatar_url":"https://avatars2.githubusercontent.com/u/46599674?v=4","gravatar_id":"","url":"https://api.github.com/users/fritzgoebel","html_url":"https://github.com/fritzgoebel","followers_url":"https://api.github.com/users/fritzgoebel/followers","following_url":"https://api.github.com/users/fritzgoebel/following{/other_user}","gists_url":"https://api.github.com/users/fritzgoebel/gists{/gist_id}","starred_url":"https://api.github.com/users/fritzgoebel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fritzgoebel/subscriptions","organizations_url":"https://api.github.com/users/fritzgoebel/orgs","repos_url":"https://api.github.com/users/fritzgoebel/repos","events_url":"https://api.github.com/users/fritzgoebel/events{/privacy}","received_events_url":"https://api.github.com/users/fritzgoebel/received_events","type":"User","site_admin":false},"html_url":"https://github.com/fritzgoebel/ginkgo","description":"Numerical linear algebra software package","fork":true,"url":"https://api.github.com/repos/fritzgoebel/ginkgo","forks_url":"https://api.github.com/repos/fritzgoebel/ginkgo/forks","keys_url":"https://api.github.com/repos/fritzgoebel/ginkgo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fritzgoebel/ginkgo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fritzgoebel/ginkgo/teams","hooks_url":"https://api.github.com/repos/fritzgoebel/ginkgo/hooks","issue_events_url":"https://api.github.com/repos/fritzgoebel/ginkgo/issues/events{/number}","events_url":"https://api.github.com/repos/fritzgoebel/ginkgo/events","assignees_url":"https://api.github.com/repos/fritzgoebel/ginkgo/assignees{/user}","branches_url":"https://api.github.com/repos/fritzgoebel/ginkgo/branches{/branch}","tags_url":"https://api.github.com/repos/fritzgoebel/ginkgo/tags","blobs_url":"https://api.github.com/repos/fritzgoebel/ginkgo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fritzgoebel/ginkgo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fritzgoebel/ginkgo/git/refs{/sha}","trees_url":"https://api.github.com/repos/fritzgoebel/ginkgo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fritzgoebel/ginkgo/statuses/{sha}","languages_url":"https://api.github.com/repos/fritzgoebel/ginkgo/languages","stargazers_url":"https://api.github.com/repos/fritzgoebel/ginkgo/stargazers","contributors_url":"https://api.github.com/repos/fritzgoebel/ginkgo/contributors","subscribers_url":"https://api.github.com/repos/fritzgoebel/ginkgo/subscribers","subscription_url":"https://api.github.com/repos/fritzgoebel/ginkgo/subscription","commits_url":"https://api.github.com/repos/fritzgoebel/ginkgo/commits{/sha}","git_commits_url":"https://api.github.com/repos/fritzgoebel/ginkgo/git/commits{/sha}","comments_url":"https://api.github.com/repos/fritzgoebel/ginkgo/comments{/number}","issue_comment_url":"https://api.github.com/repos/fritzgoebel/ginkgo/issues/comments{/number}","contents_url":"https://api.github.com/repos/fritzgoebel/ginkgo/contents/{+path}","compare_url":"https://api.github.com/repos/fritzgoebel/ginkgo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fritzgoebel/ginkgo/merges","archive_url":"https://api.github.com/repos/fritzgoebel/ginkgo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fritzgoebel/ginkgo/downloads","issues_url":"https://api.github.com/repos/fritzgoebel/ginkgo/issues{/number}","pulls_url":"https://api.github.com/repos/fritzgoebel/ginkgo/pulls{/number}","milestones_url":"https://api.github.com/repos/fritzgoebel/ginkgo/milestones{/number}","notifications_url":"https://api.github.com/repos/fritzgoebel/ginkgo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fritzgoebel/ginkgo/labels{/name}","releases_url":"https://api.github.com/repos/fritzgoebel/ginkgo/releases{/id}","deployments_url":"https://api.github.com/repos/fritzgoebel/ginkgo/deployments","created_at":"2019-01-14T13:32:09Z","updated_at":"2019-02-13T09:39:32Z","pushed_at":"2019-02-13T11:31:28Z","git_url":"git://github.com/fritzgoebel/ginkgo.git","ssh_url":"git@github.com:fritzgoebel/ginkgo.git","clone_url":"https://github.com/fritzgoebel/ginkgo.git","svn_url":"https://github.com/fritzgoebel/ginkgo","homepage":null,"size":6040,"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":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"ginkgo-project:develop","ref":"develop","sha":"d6675c2fd401a91b249acad3a2a0eea3922dc38a","user":{"login":"ginkgo-project","id":35341738,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM1MzQxNzM4","avatar_url":"https://avatars2.githubusercontent.com/u/35341738?v=4","gravatar_id":"","url":"https://api.github.com/users/ginkgo-project","html_url":"https://github.com/ginkgo-project","followers_url":"https://api.github.com/users/ginkgo-project/followers","following_url":"https://api.github.com/users/ginkgo-project/following{/other_user}","gists_url":"https://api.github.com/users/ginkgo-project/gists{/gist_id}","starred_url":"https://api.github.com/users/ginkgo-project/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ginkgo-project/subscriptions","organizations_url":"https://api.github.com/users/ginkgo-project/orgs","repos_url":"https://api.github.com/users/ginkgo-project/repos","events_url":"https://api.github.com/users/ginkgo-project/events{/privacy}","received_events_url":"https://api.github.com/users/ginkgo-project/received_events","type":"Organization","site_admin":false},"repo":{"id":117122510,"node_id":"MDEwOlJlcG9zaXRvcnkxMTcxMjI1MTA=","name":"ginkgo","full_name":"ginkgo-project/ginkgo","private":false,"owner":{"login":"ginkgo-project","id":35341738,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM1MzQxNzM4","avatar_url":"https://avatars2.githubusercontent.com/u/35341738?v=4","gravatar_id":"","url":"https://api.github.com/users/ginkgo-project","html_url":"https://github.com/ginkgo-project","followers_url":"https://api.github.com/users/ginkgo-project/followers","following_url":"https://api.github.com/users/ginkgo-project/following{/other_user}","gists_url":"https://api.github.com/users/ginkgo-project/gists{/gist_id}","starred_url":"https://api.github.com/users/ginkgo-project/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ginkgo-project/subscriptions","organizations_url":"https://api.github.com/users/ginkgo-project/orgs","repos_url":"https://api.github.com/users/ginkgo-project/repos","events_url":"https://api.github.com/users/ginkgo-project/events{/privacy}","received_events_url":"https://api.github.com/users/ginkgo-project/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/ginkgo-project/ginkgo","description":"Numerical linear algebra software package","fork":false,"url":"https://api.github.com/repos/ginkgo-project/ginkgo","forks_url":"https://api.github.com/repos/ginkgo-project/ginkgo/forks","keys_url":"https://api.github.com/repos/ginkgo-project/ginkgo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ginkgo-project/ginkgo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ginkgo-project/ginkgo/teams","hooks_url":"https://api.github.com/repos/ginkgo-project/ginkgo/hooks","issue_events_url":"https://api.github.com/repos/ginkgo-project/ginkgo/issues/events{/number}","events_url":"https://api.github.com/repos/ginkgo-project/ginkgo/events","assignees_url":"https://api.github.com/repos/ginkgo-project/ginkgo/assignees{/user}","branches_url":"https://api.github.com/repos/ginkgo-project/ginkgo/branches{/branch}","tags_url":"https://api.github.com/repos/ginkgo-project/ginkgo/tags","blobs_url":"https://api.github.com/repos/ginkgo-project/ginkgo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ginkgo-project/ginkgo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ginkgo-project/ginkgo/git/refs{/sha}","trees_url":"https://api.github.com/repos/ginkgo-project/ginkgo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ginkgo-project/ginkgo/statuses/{sha}","languages_url":"https://api.github.com/repos/ginkgo-project/ginkgo/languages","stargazers_url":"https://api.github.com/repos/ginkgo-project/ginkgo/stargazers","contributors_url":"https://api.github.com/repos/ginkgo-project/ginkgo/contributors","subscribers_url":"https://api.github.com/repos/ginkgo-project/ginkgo/subscribers","subscription_url":"https://api.github.com/repos/ginkgo-project/ginkgo/subscription","commits_url":"https://api.github.com/repos/ginkgo-project/ginkgo/commits{/sha}","git_commits_url":"https://api.github.com/repos/ginkgo-project/ginkgo/git/commits{/sha}","comments_url":"https://api.github.com/repos/ginkgo-project/ginkgo/comments{/number}","issue_comment_url":"https://api.github.com/repos/ginkgo-project/ginkgo/issues/comments{/number}","contents_url":"https://api.github.com/repos/ginkgo-project/ginkgo/contents/{+path}","compare_url":"https://api.github.com/repos/ginkgo-project/ginkgo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ginkgo-project/ginkgo/merges","archive_url":"https://api.github.com/repos/ginkgo-project/ginkgo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ginkgo-project/ginkgo/downloads","issues_url":"https://api.github.com/repos/ginkgo-project/ginkgo/issues{/number}","pulls_url":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls{/number}","milestones_url":"https://api.github.com/repos/ginkgo-project/ginkgo/milestones{/number}","notifications_url":"https://api.github.com/repos/ginkgo-project/ginkgo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ginkgo-project/ginkgo/labels{/name}","releases_url":"https://api.github.com/repos/ginkgo-project/ginkgo/releases{/id}","deployments_url":"https://api.github.com/repos/ginkgo-project/ginkgo/deployments","created_at":"2018-01-11T16:14:21Z","updated_at":"2019-02-13T14:46:03Z","pushed_at":"2019-02-13T14:46:36Z","git_url":"git://github.com/ginkgo-project/ginkgo.git","ssh_url":"git@github.com:ginkgo-project/ginkgo.git","clone_url":"https://github.com/ginkgo-project/ginkgo.git","svn_url":"https://github.com/ginkgo-project/ginkgo","homepage":null,"size":6126,"stargazers_count":19,"watchers_count":19,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":10,"mirror_url":null,"archived":false,"open_issues_count":56,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":10,"open_issues":56,"watchers":19,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/198"},"html":{"href":"https://github.com/ginkgo-project/ginkgo/pull/198"},"issue":{"href":"https://api.github.com/repos/ginkgo-project/ginkgo/issues/198"},"comments":{"href":"https://api.github.com/repos/ginkgo-project/ginkgo/issues/198/comments"},"review_comments":{"href":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/198/comments"},"review_comment":{"href":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ginkgo-project/ginkgo/pulls/198/commits"},"statuses":{"href":"https://api.github.com/repos/ginkgo-project/ginkgo/statuses/342e5b184d503b87ee5bf8589ff8279d74e1e9a5"}},"author_association":"CONTRIBUTOR"}}
other: {"actor":{"display_login":"thoasm"}}