{"action":"created","comment":{"url":"https://api.github.com/repos/kylelutz/compute/pulls/comments/27346319","id":27346319,"diff_hunk":"@@ -0,0 +1,267 @@\n+// Added By: Muhammad Junaid Muzammil <mjunaidmuzammil@gmail.com>\n+// Copyright 2010-2012, D. E. Shaw Research.\n+// All rights reserved.\n+\n+// Redistribution and use in source and binary forms, with or without\n+// modification, are permitted provided that the following conditions are\n+// met:\n+\n+// * Redistributions of source code must retain the above copyright\n+//   notice, this list of conditions, and the following disclaimer.\n+\n+// * Redistributions in binary form must reproduce the above copyright\n+//   notice, this list of conditions, and the following disclaimer in the\n+//   documentation and/or other materials provided with the distribution.\n+\n+// * Neither the name of D. E. Shaw Research nor the names of its\n+//   contributors may be used to endorse or promote products derived from\n+//   this software without specific prior written permission.\n+\n+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+\n+#ifndef BOOST_COMPUTE_RANDOM_THREEFRY_HPP\n+#define BOOST_COMPUTE_RANDOM_THREEFRY_HPP\n+\n+#include <boost/compute/types.hpp>\n+#include <boost/compute/buffer.hpp>\n+#include <boost/compute/kernel.hpp>\n+#include <boost/compute/context.hpp>\n+#include <boost/compute/program.hpp>\n+#include <boost/compute/command_queue.hpp>\n+#include <boost/compute/algorithm/transform.hpp>\n+#include <boost/compute/detail/iterator_range_size.hpp>\n+#include <boost/compute/utility/program_cache.hpp>\n+#include <boost/compute/iterator/discard_iterator.hpp>\n+\n+namespace boost {\n+namespace compute {\n+\n+/// \\class threefry_rng_engine\n+/// \\brief Threefry pseudorandom number generator.\n+template<class T = uint_>\n+class threefry_engine\n+{\n+public:\n+    static const size_t threads = 1024;\n+    typedef T result_type;\n+\n+    /// Creates a new threefry_engine and seeds it with \\p value.\n+    explicit threefry_engine(command_queue &queue)\n+        : m_context(queue.get_context())\n+    {\n+        // setup program\n+        load_program();\n+    }\n+\n+    /// Creates a new threefry_engine object as a copy of \\p other.\n+    threefry_engine(const threefry_engine<T> &other)\n+        : m_context(other.m_context),\n+          m_program(other.m_program)\n+    {\n+    }\n+\n+    /// Copies \\p other to \\c *this.\n+    threefry_engine<T>& operator=(const threefry_engine<T> &other)\n+    {\n+        if(this != &other){\n+            m_context = other.m_context;\n+            m_program = other.m_program;\n+        }\n+\n+        return *this;\n+    }\n+\n+    /// Destroys the threefry_engine object.\n+    ~threefry_engine()\n+    {\n+    }\n+\n+private:\n+    /// \\internal_\n+    void load_program()\n+    {\n+        boost::shared_ptr<program_cache> cache =\n+            program_cache::get_global_cache(m_context);\n+        std::string cache_key =\n+            std::string(\"threefry_engine_32x2\");\n+\n+        const char source[] =\n+            \"#define THREEFRY2x32_DEFAULT_ROUNDS 20\\n\"\n+            \"#define SKEIN_KS_PARITY_32 0x1BD11BDA\\n\"\n+\n+            \"enum r123_enum_threefry32x2 {\\n\"\n+            \"    R_32x2_0_0=13,\\n\"\n+            \"    R_32x2_1_0=15,\\n\"\n+            \"    R_32x2_2_0=26,\\n\"\n+            \"    R_32x2_3_0= 6,\\n\"\n+            \"    R_32x2_4_0=17,\\n\"\n+            \"    R_32x2_5_0=29,\\n\"\n+            \"    R_32x2_6_0=16,\\n\"\n+            \"    R_32x2_7_0=24\\n\"\n+            \"};\\n\"\n+\n+            \"static uint RotL_32(uint x, uint N)\\n\"\n+            \"{\\n\"\n+            \"    return (x << (N & 31)) | (x >> ((32-N) & 31));\\n\"\n+            \"}\\n\"\n+                \n+            \"struct r123array2x32 {\\n\"\n+            \"    uint v[2];\\n\"\n+            \"};\\n\"\n+            \"typedef struct r123array2x32 threefry2x32_ctr_t;\\n\"\n+            \"typedef struct r123array2x32 threefry2x32_key_t;\\n\"\n+\n+            \"threefry2x32_ctr_t threefry2x32_R(unsigned int Nrounds, threefry2x32_ctr_t in, threefry2x32_key_t k)\\n\"\n+            \"{\\n\"\n+            \"    threefry2x32_ctr_t X;\\n\"\n+            \"    uint ks[3];\\n\"\n+            \"    uint  i; \\n\"\n+            \"    ks[2] =  SKEIN_KS_PARITY_32;\\n\"\n+            \"    for (i=0;i < 2; i++) {\\n\"\n+            \"        ks[i] = k.v[i];\\n\"\n+            \"        X.v[i]  = in.v[i];\\n\"\n+            \"        ks[2] ^= k.v[i];\\n\"\n+            \"    }\\n\"\n+            \"    X.v[0] += ks[0]; X.v[1] += ks[1];\\n\"\n+            \"    if(Nrounds>0){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_0_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>1){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_1_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>2){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_2_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>3){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_3_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>3){\\n\"\n+            \"        X.v[0] += ks[1]; X.v[1] += ks[2];\\n\"\n+            \"        X.v[1] += 1;\\n\"\n+            \"    }\\n\"\n+            \"    if(Nrounds>4){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_4_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>5){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_5_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>6){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_6_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>7){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_7_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>7){\\n\"\n+            \"        X.v[0] += ks[2]; X.v[1] += ks[0];\\n\"\n+            \"        X.v[1] += 2;\\n\"\n+            \"    }\\n\"\n+            \"    if(Nrounds>8){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_0_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>9){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_1_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>10){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_2_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>11){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_3_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>11){\\n\"\n+            \"        X.v[0] += ks[0]; X.v[1] += ks[1];\\n\"\n+            \"        X.v[1] += 3;\\n\"\n+            \"    }\\n\"\n+            \"    if(Nrounds>12){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_4_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>13){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_5_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>14){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_6_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>15){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_7_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>15){\\n\"\n+            \"        X.v[0] += ks[1]; X.v[1] += ks[2];\\n\"\n+            \"        X.v[1] += 4;\\n\"\n+            \"    }\\n\"\n+            \"    if(Nrounds>16){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_0_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>17){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_1_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>18){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_2_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>19){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_3_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>19){\\n\"\n+            \"        X.v[0] += ks[2]; X.v[1] += ks[0];\\n\"\n+            \"        X.v[1] += 5;\\n\"\n+            \"    }\\n\"\n+            \"    if(Nrounds>20){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_4_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>21){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_5_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>22){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_6_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>23){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_7_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>23){\\n\"\n+            \"        X.v[0] += ks[0]; X.v[1] += ks[1];\\n\"\n+            \"        X.v[1] += 6;\\n\"\n+            \"    }\\n\"\n+            \"    if(Nrounds>24){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_0_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>25){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_1_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>26){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_2_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>27){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_3_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>27){\\n\"\n+            \"        X.v[0] += ks[1]; X.v[1] += ks[2];\\n\"\n+            \"        X.v[1] += 7;\\n\"\n+            \"    }\\n\"\n+            \"    if(Nrounds>28){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_4_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>29){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_5_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>30){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_6_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>31){  X.v[0] += X.v[1]; X.v[1] = RotL_32(X.v[1],R_32x2_7_0); X.v[1] ^= X.v[0]; }\\n\"\n+            \"    if(Nrounds>31){\\n\"\n+            \"        X.v[0] += ks[2]; X.v[1] += ks[0];\\n\"\n+            \"        X.v[1] += 8;\\n\"\n+            \"    }\\n\"\n+            \"    return X;\\n\"\n+            \"}\\n\"\n+\n+            \"__kernel void generate_rng(__global uint *ctr, __global uint *key, const uint offset) {\\n\"\n+            \"    threefry2x32_ctr_t in;\\n\"\n+            \"    threefry2x32_key_t k;\\n\"\n+            \"    const uint i = get_global_id(0);\\n\"\n+            \"    in.v[0] = ctr[2 * (offset + i)];\\n\"\n+            \"    in.v[1] = ctr[2 * (offset + i) + 1];\\n\"\n+            \"    k.v[0] = key[2 * (offset + i)];\\n\"\n+            \"    k.v[1] = key[2 * (offset + i) + 1];\\n\"\n+            \"    in = threefry2x32_R(20, in, k);\\n\"\n+            \"    ctr[2 * (offset + i)] = in.v[0];\\n\"\n+            \"    ctr[2 * (offset + i) + 1] = in.v[1];\\n\"\n+            \"}\\n\";\n+\n+        m_program = cache->get_or_build(cache_key, std::string(), source, m_context);\n+    }\n+\n+public:\n+\n+\n+    /// Generates Threefry random numbers using both the counter and key values, and then stores\n+    /// them to the range [\\p first_ctr, \\p last_ctr).\n+    template<class OutputIterator>\n+    void generate(command_queue &queue, OutputIterator first_ctr, OutputIterator last_ctr, OutputIterator first_key, OutputIterator last_key) {","path":"include/boost/compute/random/threefry_engine.hpp","position":226,"original_position":226,"commit_id":"1c75d5752d8d41b49724f1c134886d608fe54cae","original_commit_id":"1c75d5752d8d41b49724f1c134886d608fe54cae","user":{"login":"kylelutz","id":45812,"avatar_url":"https://avatars.githubusercontent.com/u/45812?v=3","gravatar_id":"","url":"https://api.github.com/users/kylelutz","html_url":"https://github.com/kylelutz","followers_url":"https://api.github.com/users/kylelutz/followers","following_url":"https://api.github.com/users/kylelutz/following{/other_user}","gists_url":"https://api.github.com/users/kylelutz/gists{/gist_id}","starred_url":"https://api.github.com/users/kylelutz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kylelutz/subscriptions","organizations_url":"https://api.github.com/users/kylelutz/orgs","repos_url":"https://api.github.com/users/kylelutz/repos","events_url":"https://api.github.com/users/kylelutz/events{/privacy}","received_events_url":"https://api.github.com/users/kylelutz/received_events","type":"User","site_admin":false},"body":"So can you explain the difference between the counter and key values? As a user simply wanting to generate random numbers, do I need to set up the counter values myself? The other random number engines use a generate function which just takes a single output range like this:\r\n```\r\ntemplate<class OutputIterator>\r\nvoid generate(OutputIterator first, OutputIterator last, command_queue &queue)\r\n```\r\nIs it possible to implement the same interface for `threefry_engine`?","created_at":"2015-03-28T16:42:56Z","updated_at":"2015-03-28T16:42:56Z","html_url":"https://github.com/kylelutz/compute/pull/442#discussion_r27346319","pull_request_url":"https://api.github.com/repos/kylelutz/compute/pulls/442","_links":{"self":{"href":"https://api.github.com/repos/kylelutz/compute/pulls/comments/27346319"},"html":{"href":"https://github.com/kylelutz/compute/pull/442#discussion_r27346319"},"pull_request":{"href":"https://api.github.com/repos/kylelutz/compute/pulls/442"}}},"pull_request":{"url":"https://api.github.com/repos/kylelutz/compute/pulls/442","id":31687488,"html_url":"https://github.com/kylelutz/compute/pull/442","diff_url":"https://github.com/kylelutz/compute/pull/442.diff","patch_url":"https://github.com/kylelutz/compute/pull/442.patch","issue_url":"https://api.github.com/repos/kylelutz/compute/issues/442","number":442,"state":"open","locked":false,"title":"Basic Threefry support Added","user":{"login":"junmuz","id":4795269,"avatar_url":"https://avatars.githubusercontent.com/u/4795269?v=3","gravatar_id":"","url":"https://api.github.com/users/junmuz","html_url":"https://github.com/junmuz","followers_url":"https://api.github.com/users/junmuz/followers","following_url":"https://api.github.com/users/junmuz/following{/other_user}","gists_url":"https://api.github.com/users/junmuz/gists{/gist_id}","starred_url":"https://api.github.com/users/junmuz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/junmuz/subscriptions","organizations_url":"https://api.github.com/users/junmuz/orgs","repos_url":"https://api.github.com/users/junmuz/repos","events_url":"https://api.github.com/users/junmuz/events{/privacy}","received_events_url":"https://api.github.com/users/junmuz/received_events","type":"User","site_admin":false},"body":"In these commits, basic Threefry RNG support is added. ","created_at":"2015-03-22T13:09:45Z","updated_at":"2015-03-28T16:42:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ad05d330b7e5afce7b4f99dd5215361c97e760c4","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/kylelutz/compute/pulls/442/commits","review_comments_url":"https://api.github.com/repos/kylelutz/compute/pulls/442/comments","review_comment_url":"https://api.github.com/repos/kylelutz/compute/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kylelutz/compute/issues/442/comments","statuses_url":"https://api.github.com/repos/kylelutz/compute/statuses/1c75d5752d8d41b49724f1c134886d608fe54cae","head":{"label":"junmuz:master","ref":"master","sha":"1c75d5752d8d41b49724f1c134886d608fe54cae","user":{"login":"junmuz","id":4795269,"avatar_url":"https://avatars.githubusercontent.com/u/4795269?v=3","gravatar_id":"","url":"https://api.github.com/users/junmuz","html_url":"https://github.com/junmuz","followers_url":"https://api.github.com/users/junmuz/followers","following_url":"https://api.github.com/users/junmuz/following{/other_user}","gists_url":"https://api.github.com/users/junmuz/gists{/gist_id}","starred_url":"https://api.github.com/users/junmuz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/junmuz/subscriptions","organizations_url":"https://api.github.com/users/junmuz/orgs","repos_url":"https://api.github.com/users/junmuz/repos","events_url":"https://api.github.com/users/junmuz/events{/privacy}","received_events_url":"https://api.github.com/users/junmuz/received_events","type":"User","site_admin":false},"repo":{"id":18888568,"name":"compute","full_name":"junmuz/compute","owner":{"login":"junmuz","id":4795269,"avatar_url":"https://avatars.githubusercontent.com/u/4795269?v=3","gravatar_id":"","url":"https://api.github.com/users/junmuz","html_url":"https://github.com/junmuz","followers_url":"https://api.github.com/users/junmuz/followers","following_url":"https://api.github.com/users/junmuz/following{/other_user}","gists_url":"https://api.github.com/users/junmuz/gists{/gist_id}","starred_url":"https://api.github.com/users/junmuz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/junmuz/subscriptions","organizations_url":"https://api.github.com/users/junmuz/orgs","repos_url":"https://api.github.com/users/junmuz/repos","events_url":"https://api.github.com/users/junmuz/events{/privacy}","received_events_url":"https://api.github.com/users/junmuz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/junmuz/compute","description":"A C++ GPU Computing Library for OpenCL","fork":true,"url":"https://api.github.com/repos/junmuz/compute","forks_url":"https://api.github.com/repos/junmuz/compute/forks","keys_url":"https://api.github.com/repos/junmuz/compute/keys{/key_id}","collaborators_url":"https://api.github.com/repos/junmuz/compute/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/junmuz/compute/teams","hooks_url":"https://api.github.com/repos/junmuz/compute/hooks","issue_events_url":"https://api.github.com/repos/junmuz/compute/issues/events{/number}","events_url":"https://api.github.com/repos/junmuz/compute/events","assignees_url":"https://api.github.com/repos/junmuz/compute/assignees{/user}","branches_url":"https://api.github.com/repos/junmuz/compute/branches{/branch}","tags_url":"https://api.github.com/repos/junmuz/compute/tags","blobs_url":"https://api.github.com/repos/junmuz/compute/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/junmuz/compute/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/junmuz/compute/git/refs{/sha}","trees_url":"https://api.github.com/repos/junmuz/compute/git/trees{/sha}","statuses_url":"https://api.github.com/repos/junmuz/compute/statuses/{sha}","languages_url":"https://api.github.com/repos/junmuz/compute/languages","stargazers_url":"https://api.github.com/repos/junmuz/compute/stargazers","contributors_url":"https://api.github.com/repos/junmuz/compute/contributors","subscribers_url":"https://api.github.com/repos/junmuz/compute/subscribers","subscription_url":"https://api.github.com/repos/junmuz/compute/subscription","commits_url":"https://api.github.com/repos/junmuz/compute/commits{/sha}","git_commits_url":"https://api.github.com/repos/junmuz/compute/git/commits{/sha}","comments_url":"https://api.github.com/repos/junmuz/compute/comments{/number}","issue_comment_url":"https://api.github.com/repos/junmuz/compute/issues/comments{/number}","contents_url":"https://api.github.com/repos/junmuz/compute/contents/{+path}","compare_url":"https://api.github.com/repos/junmuz/compute/compare/{base}...{head}","merges_url":"https://api.github.com/repos/junmuz/compute/merges","archive_url":"https://api.github.com/repos/junmuz/compute/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/junmuz/compute/downloads","issues_url":"https://api.github.com/repos/junmuz/compute/issues{/number}","pulls_url":"https://api.github.com/repos/junmuz/compute/pulls{/number}","milestones_url":"https://api.github.com/repos/junmuz/compute/milestones{/number}","notifications_url":"https://api.github.com/repos/junmuz/compute/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/junmuz/compute/labels{/name}","releases_url":"https://api.github.com/repos/junmuz/compute/releases{/id}","created_at":"2014-04-17T18:15:11Z","updated_at":"2015-03-28T13:07:30Z","pushed_at":"2015-03-28T13:07:30Z","git_url":"git://github.com/junmuz/compute.git","ssh_url":"git@github.com:junmuz/compute.git","clone_url":"https://github.com/junmuz/compute.git","svn_url":"https://github.com/junmuz/compute","homepage":"http://kylelutz.github.io/compute/","size":4825,"stargazers_count":1,"watchers_count":1,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"kylelutz:develop","ref":"develop","sha":"415e7a0a21b7fc2cb5a6aaa7ea14a4f32e884631","user":{"login":"kylelutz","id":45812,"avatar_url":"https://avatars.githubusercontent.com/u/45812?v=3","gravatar_id":"","url":"https://api.github.com/users/kylelutz","html_url":"https://github.com/kylelutz","followers_url":"https://api.github.com/users/kylelutz/followers","following_url":"https://api.github.com/users/kylelutz/following{/other_user}","gists_url":"https://api.github.com/users/kylelutz/gists{/gist_id}","starred_url":"https://api.github.com/users/kylelutz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kylelutz/subscriptions","organizations_url":"https://api.github.com/users/kylelutz/orgs","repos_url":"https://api.github.com/users/kylelutz/repos","events_url":"https://api.github.com/users/kylelutz/events{/privacy}","received_events_url":"https://api.github.com/users/kylelutz/received_events","type":"User","site_admin":false},"repo":{"id":8526347,"name":"compute","full_name":"kylelutz/compute","owner":{"login":"kylelutz","id":45812,"avatar_url":"https://avatars.githubusercontent.com/u/45812?v=3","gravatar_id":"","url":"https://api.github.com/users/kylelutz","html_url":"https://github.com/kylelutz","followers_url":"https://api.github.com/users/kylelutz/followers","following_url":"https://api.github.com/users/kylelutz/following{/other_user}","gists_url":"https://api.github.com/users/kylelutz/gists{/gist_id}","starred_url":"https://api.github.com/users/kylelutz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kylelutz/subscriptions","organizations_url":"https://api.github.com/users/kylelutz/orgs","repos_url":"https://api.github.com/users/kylelutz/repos","events_url":"https://api.github.com/users/kylelutz/events{/privacy}","received_events_url":"https://api.github.com/users/kylelutz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kylelutz/compute","description":"A C++ GPU Computing Library for OpenCL","fork":false,"url":"https://api.github.com/repos/kylelutz/compute","forks_url":"https://api.github.com/repos/kylelutz/compute/forks","keys_url":"https://api.github.com/repos/kylelutz/compute/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kylelutz/compute/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kylelutz/compute/teams","hooks_url":"https://api.github.com/repos/kylelutz/compute/hooks","issue_events_url":"https://api.github.com/repos/kylelutz/compute/issues/events{/number}","events_url":"https://api.github.com/repos/kylelutz/compute/events","assignees_url":"https://api.github.com/repos/kylelutz/compute/assignees{/user}","branches_url":"https://api.github.com/repos/kylelutz/compute/branches{/branch}","tags_url":"https://api.github.com/repos/kylelutz/compute/tags","blobs_url":"https://api.github.com/repos/kylelutz/compute/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kylelutz/compute/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kylelutz/compute/git/refs{/sha}","trees_url":"https://api.github.com/repos/kylelutz/compute/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kylelutz/compute/statuses/{sha}","languages_url":"https://api.github.com/repos/kylelutz/compute/languages","stargazers_url":"https://api.github.com/repos/kylelutz/compute/stargazers","contributors_url":"https://api.github.com/repos/kylelutz/compute/contributors","subscribers_url":"https://api.github.com/repos/kylelutz/compute/subscribers","subscription_url":"https://api.github.com/repos/kylelutz/compute/subscription","commits_url":"https://api.github.com/repos/kylelutz/compute/commits{/sha}","git_commits_url":"https://api.github.com/repos/kylelutz/compute/git/commits{/sha}","comments_url":"https://api.github.com/repos/kylelutz/compute/comments{/number}","issue_comment_url":"https://api.github.com/repos/kylelutz/compute/issues/comments{/number}","contents_url":"https://api.github.com/repos/kylelutz/compute/contents/{+path}","compare_url":"https://api.github.com/repos/kylelutz/compute/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kylelutz/compute/merges","archive_url":"https://api.github.com/repos/kylelutz/compute/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kylelutz/compute/downloads","issues_url":"https://api.github.com/repos/kylelutz/compute/issues{/number}","pulls_url":"https://api.github.com/repos/kylelutz/compute/pulls{/number}","milestones_url":"https://api.github.com/repos/kylelutz/compute/milestones{/number}","notifications_url":"https://api.github.com/repos/kylelutz/compute/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kylelutz/compute/labels{/name}","releases_url":"https://api.github.com/repos/kylelutz/compute/releases{/id}","created_at":"2013-03-02T20:15:58Z","updated_at":"2015-03-26T20:40:07Z","pushed_at":"2015-03-28T13:07:30Z","git_url":"git://github.com/kylelutz/compute.git","ssh_url":"git@github.com:kylelutz/compute.git","clone_url":"https://github.com/kylelutz/compute.git","svn_url":"https://github.com/kylelutz/compute","homepage":"http://kylelutz.github.io/compute/","size":12025,"stargazers_count":360,"watchers_count":360,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":72,"mirror_url":null,"open_issues_count":85,"forks":72,"open_issues":85,"watchers":360,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kylelutz/compute/pulls/442"},"html":{"href":"https://github.com/kylelutz/compute/pull/442"},"issue":{"href":"https://api.github.com/repos/kylelutz/compute/issues/442"},"comments":{"href":"https://api.github.com/repos/kylelutz/compute/issues/442/comments"},"review_comments":{"href":"https://api.github.com/repos/kylelutz/compute/pulls/442/comments"},"review_comment":{"href":"https://api.github.com/repos/kylelutz/compute/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kylelutz/compute/pulls/442/commits"},"statuses":{"href":"https://api.github.com/repos/kylelutz/compute/statuses/1c75d5752d8d41b49724f1c134886d608fe54cae"}}}}