{"action":"created","comment":{"url":"https://api.github.com/repos/rapidsai/cuml/pulls/comments/261475571","pull_request_review_id":209422608,"id":261475571,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2MTQ3NTU3MQ==","diff_hunk":"@@ -0,0 +1,99 @@\n+# cuML developer guide\n+This document summarizes rules and best practices for contributions to C++ component cuML of RAPIDS/cuml.\n+\n+# General\n+\n+# Thread safety\n+\n+# Coding style\n+\n+# Error handling\n+All calls to CUDA APIs should be done via the provided helper macros `CUDA_CHECK`, `CUBLAS_CHECK` and `CUSOLVER_CHECK`. Those macros take care of checking the return values of the used API calls and generate an exception in case the command was no successful. In case an exception needs to be avoided, e.g. when implementing a destructor, `CUDA_CHECK_NO_THROW`, `CUBLAS_CHECK_NO_THROW ` and `CUSOLVER_CHECK_NO_THROW ` (currently not available, see https://github.com/rapidsai/cuml/issues/229) should be used. Those macros will only log the error but do not throw an exception.\n+\n+# Logging\n+Add once https://github.com/rapidsai/cuml/issues/100 is addressed.\n+\n+# Device and Host memory allocations\n+To enable `libcuml.so` users to control how memory for temporary data is allocated device memory should only be allocated via the allocator provided:\n+```cpp\n+template<typename T>\n+void foo(ML::cumlHandle* handle, cudaStream_t stream, ... )\n+{\n+    T* temp_h = handle->getDeviceAllocator()->allocate(n*sizeof(T), stream);\n+    ...\n+    handle->getDeviceAllocator()->deallocate(temp_h, n*sizeof(T), stream);\n+}\n+```\n+the same rule applies to larger amounts of host heap memory:\n+```cpp\n+template<typename T>\n+void foo(ML::cumlHandle* handle, cudaStream_t stream, ... )\n+{\n+    T* temp_h = handle->getHostAllocator()->allocate(n*sizeof(T), stream);\n+    ...\n+    handle->getHostAllocator()->deallocate(temp_h, n*sizeof(T), stream);\n+}\n+```\n+Small host memory heap allocations, e.g. as internally done by STL containers, are fine, e.g. an `std::vector` managing only a handful of integers.\n+Both the Host and the Device Allocators might allow asynchronous stream ordered allocation and deallocation. This can provide significant performance benefits so a stream always needs to be specified when allocating or deallocating (see [Asynchronous operations and stream ordering](# Asynchronous operations and stream ordering)).\n+There are two simple container classes compatible with the `ML::cumlHandle` allocator interface `ML::device_buffer` available in ` cuML/src/common/device_buffer.hpp` and `ML::host_buffer` available in ` cuML/src/common/host_buffer.hpp`. These allow to follow the [RAII idiom](https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization) to avoid resources leaks and enable exception safe code. These containers also allow asynchronous allocation and deallocation using the `resize` and `release` member functions:\n+```cpp\n+template<typename T>\n+void foo( ML::cumlHandle* handle, .., cudaStream_t stream )\n+{\n+    ...\n+    ML::device_buffer<T> temp( handle->getDeviceAllocator(), stream, 0 )\n+    \n+    temp.resize(n, stream);\n+    kernelA<<<grid, block, 0, stream>>>(..., temp.data(), ...);\n+    kernelB<<<grid, block, 0, stream>>>(..., temp.data(), ...);\n+    temp.release(stream);\n+}\n+```\n+## Using thrust\n+To ensure that thrust algorithms allocate temporary memory via the provided device memory allocator the `ML::thrustAllocatorAdapter` available in `allocatorAdapter.hpp` should be used with the `thrust::cuda::par` execution policy:\n+```cpp\n+void foo( ML::cumlHandle* handle, .. )\n+{\n+    ML::thrustAllocatorAdapter alloc( handle->getDeviceAllocator(), handle->getStream() );\n+    auto execution_policy = thrust::cuda::par(alloc).on(handle->getStream());\n+    thrust::for_each(execution_policy, ... );\n+}\n+```\n+# Asynchronous operations and stream ordering\n+All ML algorithms should be as asynchronous as possible avoiding the use of the default stream (aka as NULL or `0` stream). If an implementation only requires a single CUDA Stream the stream from `ML::cumlHandle` should be used:\n+```cpp\n+void foo( ML::cumlHandle* handle, ...)\n+{\n+    cudaStream_t stream = handle->getStream();\n+}\n+```\n+In case multiple streams are needed, e.g. to manage a pipeline, the internal streams available in `ML::cumlHandle_impl` should be used (see [CUDA Resources](# CUDA Resources)). If multiple streams are used all operations still need to be ordered according to `ML::cumlHandle::getStream()`, i.e. before any operation in any of the internal CUDA streams is started all previous work in `ML::cumlHandle: getStream()` needs to have completed and any work enqueued in `ML::cumlHandle::getStream()` after an cuML function returns should not start before all work enqueued in the internal stream has complete. This can be ensured by introducing inter stream dependencies with CUDA events and `cudaStreamWaitEvent`. For convenience  the header `cumlHandle.hpp` provide the class `ML::detail::streamSyncer` which lets all `ML::cumlHandle_impl` internal CUDA streams wait on `ML::cumlHandle::getStream()` in its constructor and in its destructor and lets `ML::cumlHandle::getStream()` wait on all work enqueued in the `ML::cumlHandle_impl` internal CUDA streams. E.g. a usage like this:\n+```cpp\n+void cumlAlgo( ML::cumlHandle* handle, ...)\n+{\n+    ML::detail::streamSyncer _(handle);\n+}\n+```\n+ensures the stream ordering behavior described above.\n+\n+## Using thrust\n+To ensure that thrust algorithms are executed in the intended stream the `thrust::cuda::par` execution policy should be used (described in the section Device and Host memory allocations/Using thrust).\n+\n+# CUDA Resources\n+Implementations of ML algorithms should not create reusable resources themselves. Instead they should use the existing one in `ML::cumlHandle_impl `. This allows to avoid constant creating and recreation of reusable resources such as CUDA streams, CUDA events or library handles. Please file a feature request in case a resource handle is missing in `ML::cumlHandle_impl `.\n+The resources can be obtained like this\n+```cpp\n+void foo( ML::cumlHandle* handle, ...)\n+{\n+    cublasHandle_t cublasHandle = handle->getImpl()->getCublasHandle();","path":"cuML/DEVELOPER_GUIDE.md","position":98,"original_position":89,"commit_id":"e9e6c0565cca127522c3c9c00e758e202bcc2203","original_commit_id":"ecae1ba8f965428d32c8997d4ceb51a5f52d132f","user":{"login":"teju85","id":532947,"node_id":"MDQ6VXNlcjUzMjk0Nw==","avatar_url":"https://avatars2.githubusercontent.com/u/532947?v=4","gravatar_id":"","url":"https://api.github.com/users/teju85","html_url":"https://github.com/teju85","followers_url":"https://api.github.com/users/teju85/followers","following_url":"https://api.github.com/users/teju85/following{/other_user}","gists_url":"https://api.github.com/users/teju85/gists{/gist_id}","starred_url":"https://api.github.com/users/teju85/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/teju85/subscriptions","organizations_url":"https://api.github.com/users/teju85/orgs","repos_url":"https://api.github.com/users/teju85/repos","events_url":"https://api.github.com/users/teju85/events{/privacy}","received_events_url":"https://api.github.com/users/teju85/received_events","type":"User","site_admin":false},"body":"Sorry Jiri, if my previous comments confused you. I meant the following kind of usage pattern. In other words, should we allow developers to perform cublasSetStream on the internal cublas handle, explicitly, for example?\r\n```\r\ncublasHandle_t cublasHandle = handle->getImpl()->getCublasHandle();\r\ncudaStream_t someStreamPickedByMe;\r\ncublasSetStream(cublasHandle, someStreamPickedByMe);\r\n```","created_at":"2019-03-01T04:20:50Z","updated_at":"2019-03-01T04:21:01Z","html_url":"https://github.com/rapidsai/cuml/pull/247#discussion_r261475571","pull_request_url":"https://api.github.com/repos/rapidsai/cuml/pulls/247","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/rapidsai/cuml/pulls/comments/261475571"},"html":{"href":"https://github.com/rapidsai/cuml/pull/247#discussion_r261475571"},"pull_request":{"href":"https://api.github.com/repos/rapidsai/cuml/pulls/247"}},"in_reply_to_id":261154937},"pull_request":{"url":"https://api.github.com/repos/rapidsai/cuml/pulls/247","id":256668800,"node_id":"MDExOlB1bGxSZXF1ZXN0MjU2NjY4ODAw","html_url":"https://github.com/rapidsai/cuml/pull/247","diff_url":"https://github.com/rapidsai/cuml/pull/247.diff","patch_url":"https://github.com/rapidsai/cuml/pull/247.patch","issue_url":"https://api.github.com/repos/rapidsai/cuml/issues/247","number":247,"state":"open","locked":false,"title":"[REVIEW] Proposal for \"proper\" C/C++ API (issue #92)","user":{"login":"jirikraus","id":3633935,"node_id":"MDQ6VXNlcjM2MzM5MzU=","avatar_url":"https://avatars2.githubusercontent.com/u/3633935?v=4","gravatar_id":"","url":"https://api.github.com/users/jirikraus","html_url":"https://github.com/jirikraus","followers_url":"https://api.github.com/users/jirikraus/followers","following_url":"https://api.github.com/users/jirikraus/following{/other_user}","gists_url":"https://api.github.com/users/jirikraus/gists{/gist_id}","starred_url":"https://api.github.com/users/jirikraus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jirikraus/subscriptions","organizations_url":"https://api.github.com/users/jirikraus/orgs","repos_url":"https://api.github.com/users/jirikraus/repos","events_url":"https://api.github.com/users/jirikraus/events{/privacy}","received_events_url":"https://api.github.com/users/jirikraus/received_events","type":"User","site_admin":false},"body":"This is a proposal for a imporved C and C++ API. When reviewing this I suggest to start with `cuML/DEVELOPER_GUIDE.md` as that explains the used concepts.","created_at":"2019-02-27T12:54:50Z","updated_at":"2019-03-01T04:21:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"47fb889d429d54434cd140c0f8987196f28a4e37","assignee":null,"assignees":[],"requested_reviewers":[{"login":"oyilmaz-nvidia","id":35306097,"node_id":"MDQ6VXNlcjM1MzA2MDk3","avatar_url":"https://avatars2.githubusercontent.com/u/35306097?v=4","gravatar_id":"","url":"https://api.github.com/users/oyilmaz-nvidia","html_url":"https://github.com/oyilmaz-nvidia","followers_url":"https://api.github.com/users/oyilmaz-nvidia/followers","following_url":"https://api.github.com/users/oyilmaz-nvidia/following{/other_user}","gists_url":"https://api.github.com/users/oyilmaz-nvidia/gists{/gist_id}","starred_url":"https://api.github.com/users/oyilmaz-nvidia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oyilmaz-nvidia/subscriptions","organizations_url":"https://api.github.com/users/oyilmaz-nvidia/orgs","repos_url":"https://api.github.com/users/oyilmaz-nvidia/repos","events_url":"https://api.github.com/users/oyilmaz-nvidia/events{/privacy}","received_events_url":"https://api.github.com/users/oyilmaz-nvidia/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":1114226949,"node_id":"MDU6TGFiZWwxMTE0MjI2OTQ5","url":"https://api.github.com/repos/rapidsai/cuml/labels/2%20-%20In%20Progress","name":"2 - In Progress","color":"fef2c0","default":false},{"id":1114231987,"node_id":"MDU6TGFiZWwxMTE0MjMxOTg3","url":"https://api.github.com/repos/rapidsai/cuml/labels/proposal","name":"proposal","color":"2a2c89","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/rapidsai/cuml/pulls/247/commits","review_comments_url":"https://api.github.com/repos/rapidsai/cuml/pulls/247/comments","review_comment_url":"https://api.github.com/repos/rapidsai/cuml/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rapidsai/cuml/issues/247/comments","statuses_url":"https://api.github.com/repos/rapidsai/cuml/statuses/e9e6c0565cca127522c3c9c00e758e202bcc2203","head":{"label":"jirikraus:fea-ext-cuML-cpp-iface","ref":"fea-ext-cuML-cpp-iface","sha":"e9e6c0565cca127522c3c9c00e758e202bcc2203","user":{"login":"jirikraus","id":3633935,"node_id":"MDQ6VXNlcjM2MzM5MzU=","avatar_url":"https://avatars2.githubusercontent.com/u/3633935?v=4","gravatar_id":"","url":"https://api.github.com/users/jirikraus","html_url":"https://github.com/jirikraus","followers_url":"https://api.github.com/users/jirikraus/followers","following_url":"https://api.github.com/users/jirikraus/following{/other_user}","gists_url":"https://api.github.com/users/jirikraus/gists{/gist_id}","starred_url":"https://api.github.com/users/jirikraus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jirikraus/subscriptions","organizations_url":"https://api.github.com/users/jirikraus/orgs","repos_url":"https://api.github.com/users/jirikraus/repos","events_url":"https://api.github.com/users/jirikraus/events{/privacy}","received_events_url":"https://api.github.com/users/jirikraus/received_events","type":"User","site_admin":false},"repo":{"id":160532500,"node_id":"MDEwOlJlcG9zaXRvcnkxNjA1MzI1MDA=","name":"cuml","full_name":"jirikraus/cuml","private":false,"owner":{"login":"jirikraus","id":3633935,"node_id":"MDQ6VXNlcjM2MzM5MzU=","avatar_url":"https://avatars2.githubusercontent.com/u/3633935?v=4","gravatar_id":"","url":"https://api.github.com/users/jirikraus","html_url":"https://github.com/jirikraus","followers_url":"https://api.github.com/users/jirikraus/followers","following_url":"https://api.github.com/users/jirikraus/following{/other_user}","gists_url":"https://api.github.com/users/jirikraus/gists{/gist_id}","starred_url":"https://api.github.com/users/jirikraus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jirikraus/subscriptions","organizations_url":"https://api.github.com/users/jirikraus/orgs","repos_url":"https://api.github.com/users/jirikraus/repos","events_url":"https://api.github.com/users/jirikraus/events{/privacy}","received_events_url":"https://api.github.com/users/jirikraus/received_events","type":"User","site_admin":false},"html_url":"https://github.com/jirikraus/cuml","description":"cuML - RAPIDS Machine Learning Library ","fork":true,"url":"https://api.github.com/repos/jirikraus/cuml","forks_url":"https://api.github.com/repos/jirikraus/cuml/forks","keys_url":"https://api.github.com/repos/jirikraus/cuml/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jirikraus/cuml/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jirikraus/cuml/teams","hooks_url":"https://api.github.com/repos/jirikraus/cuml/hooks","issue_events_url":"https://api.github.com/repos/jirikraus/cuml/issues/events{/number}","events_url":"https://api.github.com/repos/jirikraus/cuml/events","assignees_url":"https://api.github.com/repos/jirikraus/cuml/assignees{/user}","branches_url":"https://api.github.com/repos/jirikraus/cuml/branches{/branch}","tags_url":"https://api.github.com/repos/jirikraus/cuml/tags","blobs_url":"https://api.github.com/repos/jirikraus/cuml/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jirikraus/cuml/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jirikraus/cuml/git/refs{/sha}","trees_url":"https://api.github.com/repos/jirikraus/cuml/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jirikraus/cuml/statuses/{sha}","languages_url":"https://api.github.com/repos/jirikraus/cuml/languages","stargazers_url":"https://api.github.com/repos/jirikraus/cuml/stargazers","contributors_url":"https://api.github.com/repos/jirikraus/cuml/contributors","subscribers_url":"https://api.github.com/repos/jirikraus/cuml/subscribers","subscription_url":"https://api.github.com/repos/jirikraus/cuml/subscription","commits_url":"https://api.github.com/repos/jirikraus/cuml/commits{/sha}","git_commits_url":"https://api.github.com/repos/jirikraus/cuml/git/commits{/sha}","comments_url":"https://api.github.com/repos/jirikraus/cuml/comments{/number}","issue_comment_url":"https://api.github.com/repos/jirikraus/cuml/issues/comments{/number}","contents_url":"https://api.github.com/repos/jirikraus/cuml/contents/{+path}","compare_url":"https://api.github.com/repos/jirikraus/cuml/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jirikraus/cuml/merges","archive_url":"https://api.github.com/repos/jirikraus/cuml/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jirikraus/cuml/downloads","issues_url":"https://api.github.com/repos/jirikraus/cuml/issues{/number}","pulls_url":"https://api.github.com/repos/jirikraus/cuml/pulls{/number}","milestones_url":"https://api.github.com/repos/jirikraus/cuml/milestones{/number}","notifications_url":"https://api.github.com/repos/jirikraus/cuml/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jirikraus/cuml/labels{/name}","releases_url":"https://api.github.com/repos/jirikraus/cuml/releases{/id}","deployments_url":"https://api.github.com/repos/jirikraus/cuml/deployments","created_at":"2018-12-05T14:43:58Z","updated_at":"2018-12-05T14:44:01Z","pushed_at":"2019-02-28T21:44:10Z","git_url":"git://github.com/jirikraus/cuml.git","ssh_url":"git@github.com:jirikraus/cuml.git","clone_url":"https://github.com/jirikraus/cuml.git","svn_url":"https://github.com/jirikraus/cuml","homepage":"","size":7412,"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":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"rapidsai:branch-0.6","ref":"branch-0.6","sha":"fc471965ed791444a2e8016013df0c4fbb6a7054","user":{"login":"rapidsai","id":43887749,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQzODg3NzQ5","avatar_url":"https://avatars2.githubusercontent.com/u/43887749?v=4","gravatar_id":"","url":"https://api.github.com/users/rapidsai","html_url":"https://github.com/rapidsai","followers_url":"https://api.github.com/users/rapidsai/followers","following_url":"https://api.github.com/users/rapidsai/following{/other_user}","gists_url":"https://api.github.com/users/rapidsai/gists{/gist_id}","starred_url":"https://api.github.com/users/rapidsai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapidsai/subscriptions","organizations_url":"https://api.github.com/users/rapidsai/orgs","repos_url":"https://api.github.com/users/rapidsai/repos","events_url":"https://api.github.com/users/rapidsai/events{/privacy}","received_events_url":"https://api.github.com/users/rapidsai/received_events","type":"Organization","site_admin":false},"repo":{"id":152616802,"node_id":"MDEwOlJlcG9zaXRvcnkxNTI2MTY4MDI=","name":"cuml","full_name":"rapidsai/cuml","private":false,"owner":{"login":"rapidsai","id":43887749,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQzODg3NzQ5","avatar_url":"https://avatars2.githubusercontent.com/u/43887749?v=4","gravatar_id":"","url":"https://api.github.com/users/rapidsai","html_url":"https://github.com/rapidsai","followers_url":"https://api.github.com/users/rapidsai/followers","following_url":"https://api.github.com/users/rapidsai/following{/other_user}","gists_url":"https://api.github.com/users/rapidsai/gists{/gist_id}","starred_url":"https://api.github.com/users/rapidsai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapidsai/subscriptions","organizations_url":"https://api.github.com/users/rapidsai/orgs","repos_url":"https://api.github.com/users/rapidsai/repos","events_url":"https://api.github.com/users/rapidsai/events{/privacy}","received_events_url":"https://api.github.com/users/rapidsai/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/rapidsai/cuml","description":"cuML - RAPIDS Machine Learning Library ","fork":false,"url":"https://api.github.com/repos/rapidsai/cuml","forks_url":"https://api.github.com/repos/rapidsai/cuml/forks","keys_url":"https://api.github.com/repos/rapidsai/cuml/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rapidsai/cuml/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rapidsai/cuml/teams","hooks_url":"https://api.github.com/repos/rapidsai/cuml/hooks","issue_events_url":"https://api.github.com/repos/rapidsai/cuml/issues/events{/number}","events_url":"https://api.github.com/repos/rapidsai/cuml/events","assignees_url":"https://api.github.com/repos/rapidsai/cuml/assignees{/user}","branches_url":"https://api.github.com/repos/rapidsai/cuml/branches{/branch}","tags_url":"https://api.github.com/repos/rapidsai/cuml/tags","blobs_url":"https://api.github.com/repos/rapidsai/cuml/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rapidsai/cuml/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rapidsai/cuml/git/refs{/sha}","trees_url":"https://api.github.com/repos/rapidsai/cuml/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rapidsai/cuml/statuses/{sha}","languages_url":"https://api.github.com/repos/rapidsai/cuml/languages","stargazers_url":"https://api.github.com/repos/rapidsai/cuml/stargazers","contributors_url":"https://api.github.com/repos/rapidsai/cuml/contributors","subscribers_url":"https://api.github.com/repos/rapidsai/cuml/subscribers","subscription_url":"https://api.github.com/repos/rapidsai/cuml/subscription","commits_url":"https://api.github.com/repos/rapidsai/cuml/commits{/sha}","git_commits_url":"https://api.github.com/repos/rapidsai/cuml/git/commits{/sha}","comments_url":"https://api.github.com/repos/rapidsai/cuml/comments{/number}","issue_comment_url":"https://api.github.com/repos/rapidsai/cuml/issues/comments{/number}","contents_url":"https://api.github.com/repos/rapidsai/cuml/contents/{+path}","compare_url":"https://api.github.com/repos/rapidsai/cuml/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rapidsai/cuml/merges","archive_url":"https://api.github.com/repos/rapidsai/cuml/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rapidsai/cuml/downloads","issues_url":"https://api.github.com/repos/rapidsai/cuml/issues{/number}","pulls_url":"https://api.github.com/repos/rapidsai/cuml/pulls{/number}","milestones_url":"https://api.github.com/repos/rapidsai/cuml/milestones{/number}","notifications_url":"https://api.github.com/repos/rapidsai/cuml/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rapidsai/cuml/labels{/name}","releases_url":"https://api.github.com/repos/rapidsai/cuml/releases{/id}","deployments_url":"https://api.github.com/repos/rapidsai/cuml/deployments","created_at":"2018-10-11T15:45:35Z","updated_at":"2019-02-28T14:23:19Z","pushed_at":"2019-03-01T03:36:51Z","git_url":"git://github.com/rapidsai/cuml.git","ssh_url":"git@github.com:rapidsai/cuml.git","clone_url":"https://github.com/rapidsai/cuml.git","svn_url":"https://github.com/rapidsai/cuml","homepage":"","size":7404,"stargazers_count":337,"watchers_count":337,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":59,"mirror_url":null,"archived":false,"open_issues_count":79,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":59,"open_issues":79,"watchers":337,"default_branch":"branch-0.6"}},"_links":{"self":{"href":"https://api.github.com/repos/rapidsai/cuml/pulls/247"},"html":{"href":"https://github.com/rapidsai/cuml/pull/247"},"issue":{"href":"https://api.github.com/repos/rapidsai/cuml/issues/247"},"comments":{"href":"https://api.github.com/repos/rapidsai/cuml/issues/247/comments"},"review_comments":{"href":"https://api.github.com/repos/rapidsai/cuml/pulls/247/comments"},"review_comment":{"href":"https://api.github.com/repos/rapidsai/cuml/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rapidsai/cuml/pulls/247/commits"},"statuses":{"href":"https://api.github.com/repos/rapidsai/cuml/statuses/e9e6c0565cca127522c3c9c00e758e202bcc2203"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"teju85"}}