{"action":"created","comment":{"url":"https://api.github.com/repos/apache/incubator-singa/pulls/comments/175651128","pull_request_review_id":105213498,"id":175651128,"diff_hunk":"@@ -0,0 +1,602 @@\n+import numpy as np\n+from collections import Counter\n+import random\n+import copy\n+from keras.datasets import mnist\n+import keras\n+\n+def affine_forward(x, w, b):\n+    N = x.shape[0]\n+    x_rs = np.reshape(x, (N, -1))\n+    out = x_rs.dot(w) + b\n+    cache = (x, w, b)\n+    return out, cache\n+\n+\n+def affine_backward(dout, cache):\n+    x, w, b = cache\n+    N = x.shape[0]\n+    x_rs = np.reshape(x, (N, -1))\n+    db = dout.sum(axis=0)\n+    dw = x_rs.T.dot(dout)\n+    dx = dout.dot(w.T)\n+    dx = dx.reshape(x.shape)\n+    return dx, dw, db\n+\n+def do_zero_padding(x, pad):\n+    new_x = np.zeros((x.shape[0], x.shape[1], x.shape[2] + pad, x.shape[3] + pad))\n+    for i in range(x.shape[0]):\n+        for j in range(x[i].shape[0]):\n+            new_x[i, j] = np.pad(x[i, j], int(pad / 2), 'constant')\n+    return new_x\n+\n+def conv_forward(x, w, b, conv_param):\n+    new_x = do_zero_padding(x, conv_param['pad'])\n+\n+    w_h = w.shape[2]\n+    w_w = w.shape[3]\n+    s = conv_param['stride']\n+    h_num = 1 + int((new_x[0, 0].shape[0] - w_h) / s)\n+    w_num = 1 + int((new_x[0, 0].shape[1] - w_w) / s)\n+    X_new = np.ndarray(shape=(new_x.shape[0], w_h * w_w * new_x.shape[1], h_num * w_num))\n+    for i in range(new_x.shape[0]):\n+        X = []\n+        for k in range(h_num):\n+            for l in range(w_num):\n+                x_vec = new_x[i, 0:new_x.shape[1], k*s:k*s + w_h, l*s:l*s + w_w].reshape(-1)\n+                X.append(x_vec)\n+        X_new[i] = np.asarray(X).T\n+\n+    W = np.array([])\n+    for i in range(w.shape[0]):\n+        w_vec = w[i].reshape(-1)\n+        if i == 0:\n+            W = w_vec\n+        else:\n+            W = np.vstack((W, w_vec))\n+    out = np.ndarray(shape=(x.shape[0], w.shape[0], h_num, w_num))\n+    B = b\n+    for i in range(X_new.shape[2] - 1):\n+        B = np.vstack((B, b))\n+    B = B.T\n+    for i in range(X_new.shape[0]):\n+        out[i] = (W.dot(X_new[i]) + B).reshape(w.shape[0], h_num, w_num)\n+\n+    cache = (x, w, b, conv_param)\n+    return out, cache\n+\n+\n+def conv_backward(dout, cache):\n+    x, w, b, conv_param = cache\n+    N, C, H, W = x.shape\n+    F, _, HH, WW = w.shape\n+    stride, pad = conv_param['stride'], conv_param['pad']\n+    H_out = 1 + int((H + pad - HH) / stride)\n+    W_out = 1 + int((W + pad - WW) / stride)\n+    t_pad = int(pad / 2)\n+\n+\n+    x_pad = np.pad(x, ((0,), (0,), (t_pad,), (t_pad,)), mode='constant', constant_values=0)\n+    dx = np.zeros(x.shape)\n+    dx_pad = np.zeros(x_pad.shape)\n+    dw = np.zeros(w.shape)\n+    db = np.zeros(b.shape)\n+\n+    db = np.sum(dout, axis=(0, 2, 3))\n+    for i in range(H_out):\n+        for j in range(W_out):\n+            x_pad_masked = x_pad[:, :, i * stride:i * stride + HH, j * stride:j * stride + WW]\n+            for k in range(F):  # compute dw\n+                dw[k, :, :, :] += np.sum(x_pad_masked * (dout[:, k, i, j])[:, None, None, None], axis=0)\n+            for n in range(N):  # compute dx_pad\n+                dx_pad[n, :, i * stride:i * stride + HH, j * stride:j * stride + WW] += np.sum((w[:, :, :, :] * (dout[n, :, i, j])[:, None, None, None]), axis=0)\n+    dx = dx_pad[:, :, t_pad:-t_pad, t_pad:-t_pad]\n+    return dx, dw, db\n+\n+\n+\n+class variable(object):\n+    def __init__(self, data, creator=None, requires_grad=True, grad_outlet=False):\n+        self.data = data\n+        if creator is None:\n+            creator = Leaf(self, requires_grad)\n+        self.creator = creator #function\n+        self.grad_outlet=grad_outlet\n+\n+    def add(self, other):\n+            return add()(self, other)[0]\n+\n+    def sub(self, other):\n+        return sub()(self, other)[0]\n+\n+    def mul(self, other):\n+        if isinstance(other, variable):\n+            return dot()(self, other)[0]\n+\n+    def dot(self,other):\n+        return dot()(self,other)\n+\n+    def __add__(self, other):\n+        return self.add(other)\n+\n+    __radd__ = __add__\n+\n+    def __sub__(self, other):\n+        return self.sub(other)\n+\n+    def __mul__(self, other):\n+        return self.mul(other)\n+\n+    __rmul__ = __mul__\n+\n+class operation(object):\n+\n+    def __init__(self,**operation_params):\n+        pass\n+\n+    def __call__(self, *input):\n+        return self._do_forward(*input)  #input: variables, output:tuple of varibales\n+\n+    def _do_forward(self, *input):\n+        unpacked_input = tuple(arg.data for arg in input) #input is Variables\n+        raw_output = self.forward(*unpacked_input)#data之间的运算\n+        if not isinstance(raw_output, tuple):\n+            raw_output = (raw_output,)\n+            #convert output to tuple type\n+        self.needs_input_grad = tuple(arg.creator.requires_grad for arg in input) #type:tuple\n+        self.requires_grad = any(self.needs_input_grad) #bool\n+        output = tuple(variable(tensor, self) for tensor in raw_output) #packaging: tensor:data self:create/function,many properties like requires_grad are recorded in function\n+        self.previous_functions = [(arg.creator, id(arg)) for arg in input] #list:[(creator_funciton class, input variables addresses)]\n+        self.output_ids = {id(var): i for i, var in enumerate(output)}#dict:{variables_addresses: index}\n+        return output\n+        #Variables上只记录data与creator(function,leaf)，其余更多forward信息记录在creator上。\n+    def _do_backward(self, grad_output):\n+        grad_input = self.backward(grad_output) #numpy array list\n+        if not isinstance(grad_input, tuple):\n+            grad_input = (grad_input,)#packaging\n+        return grad_input #type:tuple\n+\n+    def forward(self, *input):\n+        raise NotImplementedError\n+\n+    def backward(self, *grad_output):\n+        raise NotImplementedError\n+\n+\n+class Leaf(operation):\n+\n+    def __init__(self, variable, requires_grad):\n+        self.variable = variable\n+        #print(variable.data)\n+        self.output_ids = {id(variable): 0}\n+        self.previous_functions = []\n+        self.requires_grad = requires_grad\n+        self.init=np.zeros(shape=self.variable.data.shape)\n+        self.grads=copy.deepcopy(self.init)\n+\n+    def _do_forward(self, *input):\n+        raise NotImplementedError\n+\n+    def _do_backward(self, *grad_output):\n+        assert len(grad_output) == 1\n+        #print(type(self.grads),'aaa')\n+        self.grads += grad_output[0]\n+        '''if self.grads == None\n+            self.grads=grad_output[0]\n+        else:\n+            self.grads += grad_output[0]'''\n+        return tuple()\n+\n+class add(operation):\n+\n+    def forward(self, a, b):\n+        self.input=(a,b)\n+        return a+b\n+\n+    def backward(self, grad_output):\n+        if self.input[0].shape==self.input[1].shape:\n+            return grad_output, grad_output\n+        else:\n+            #return grad_output, np.dot(grad_output.T,np.ones(100))\n+            return grad_output, np.sum(grad_output, axis=0)\n+\n+class sub(operation):\n+\n+    def forward(self, a, b):\n+        if a.shape == b.shape:\n+            self.broadcast=False\n+        else:\n+            self.broadcast=True\n+        return a-b\n+\n+    def backward(self, grad_output):\n+        if self.broadcast == False:\n+            return grad_output, grad_output.__neg__()\n+        else:\n+            return grad_output,None\n+\n+class dot(operation):\n+\n+    def forward(self, a, b):\n+        self.input = (a, b)\n+        return np.dot(a,b)\n+\n+    def backward(self, grad_output):\n+        return np.dot(grad_output,self.input[1].T), np.dot(self.input[0].T,grad_output)\n+\n+class square(operation):\n+\n+    def forward(self, a):\n+        self.input = (a,)\n+        return np.square(a)\n+\n+    def backward(self, grad_output):\n+        return np.dot(grad_output,np.diag(self.input[0]))\n+\n+class average(operation):\n+    def forward(self, a):\n+        self.input = (a,)\n+        return np.average(a)\n+\n+    def backward(self, grad_output):\n+        n=len(self.input[0])\n+        out=np.ones(n)/n\n+        return grad_output*out\n+\n+class relu(operation):\n+    def forward(self, input):\n+        self.input=(input,)\n+        return np.maximum(input, 0.0)\n+\n+    def backward(self, grad_output):\n+        a=1. * (self.input[0] > 0)\n+        b=grad_output*a\n+        #print(b.shape,'1')\n+        return grad_output*a\n+\n+class softmax(operation):\n+    def forward(self, z):\n+        #e_x = np.exp(x)\n+        #v = (e_x.T / e_x.sum(axis=1)).T\n+        v=np.exp(z) / np.sum(np.exp(z), axis=1, keepdims=True)\n+        self.output=(v,)\n+        return v\n+\n+    def backward(self, grad_output):\n+        '''medium=np.zeros(shape=(100,10,10))\n+        for q in range(self.output[0].shape[0]):\n+            a=np.diag(self.output[0][q])\n+            medium[q]+=a'''\n+        out1 = np.einsum('ki,ki->ki',grad_output,self.output[0])\n+        medium = np.einsum('ki,kj->kij',self.output[0],self.output[0])\n+        out2=np.einsum('kij,kj->ki', medium , grad_output)\n+        return out1-out2\n+\n+class accuracy(operation):\n+    def forward(self, pred, target):\n+        y = np.argmax(pred, axis=1)\n+        t = np.argmax(target, axis=1)\n+        a = y == t\n+        return np.array(a, 'int').sum() / len(t)\n+    def backward(self, *grad_output):\n+        pass\n+def accuracy_np(y,t):\n+    y = np.argmax(y, axis=1)\n+    t = np.argmax(t, axis=1)\n+    a = y == t\n+    return np.array(a, 'int').sum() / len(t)\n+\n+class cross_entropy(operation):\n+    def forward(self, pred,target):\n+        out = - np.multiply(target, np.log(pred)).sum() / pred.shape[0]\n+        self.input=(pred,target)\n+        #self.output=(out,)\n+        return out\n+    def backward(self, grad_output):\n+        #print(self.input[1]/self.input[0], '223123')\n+        #a=-np.ones(self.input[0].shape)*(self.input[1]/self.input[0])/(self.input[0].shape[0])\n+        a = -(self.input[1] / self.input[0]) / (self.input[0].shape[0])\n+\n+        #print(grad_output*a)\n+        return grad_output*a\n+\n+class output(operation):\n+    def forward(self, z,T):\n+        Y=np.exp(z) / np.sum(np.exp(z), axis=1, keepdims=True)\n+        loss= - np.multiply(T, np.log(Y)).sum() / Y.shape[0]\n+        accu=accuracy_np(Y,T)\n+        print('accuracy:',accu)\n+        self.input=(Y,T)\n+        return loss\n+    def backward(self,grad_output):\n+        return grad_output*(self.input[0] - self.input[1]) / self.input[0].shape[0]\n+\n+class ExecutionEngine(object):\n+    def __init__(self):\n+        pass\n+\n+    def _compute_dependencies(self, function):\n+        dependencies = {}\n+        seen = {function}\n+        queue = [function]\n+        while len(queue) > 0:\n+            fn = queue.pop()\n+            for prev_fn, arg_id in fn.previous_functions:\n+\n+                if prev_fn not in dependencies:\n+                    dependencies[prev_fn] = [Counter() for _ in prev_fn.output_ids]\n+                    #print(dependencies[prev_fn])\n+                #output_idx=0\n+                output_idx = prev_fn.output_ids[arg_id]\n+                dependencies[prev_fn][output_idx][fn] += 1 #dependencies[prev_fn]:list of [Counter(),... ], output_idx:index,take out an Counter dict\n+                if prev_fn not in seen:\n+                    queue.append(prev_fn)\n+                    seen.add(prev_fn)\n+        return dependencies,seen  #记录了 某一个函数通过其第几个输出依赖于其后一个函数\n+\n+    def _free_backward_dependency(self, dependencies, prev_fn, fn, arg_id):\n+        deps = dependencies[prev_fn]\n+        output_idx = prev_fn.output_ids[arg_id]\n+        output_deps = deps[output_idx] #Counter()\n+        output_deps[fn] -= 1\n+        if output_deps[fn] == 0:\n+            del output_deps[fn]\n+        return output_idx#返回prev_fn的为arg_id输出的下标\n+\n+\n+    def _is_ready_for_backward(self, dependencies, function):\n+        for deps in dependencies[function]: #list\n+            if len(deps) > 0:\n+                return False\n+        return True\n+\n+    def run_backward(self, variable, grad):","path":"autograd_test1.py","position":353,"original_position":353,"commit_id":"0b0446155a4b7970a64a72381f4a6afe70c9024e","original_commit_id":"0b0446155a4b7970a64a72381f4a6afe70c9024e","user":{"login":"nudles","id":3797447,"avatar_url":"https://avatars0.githubusercontent.com/u/3797447?v=4","gravatar_id":"","url":"https://api.github.com/users/nudles","html_url":"https://github.com/nudles","followers_url":"https://api.github.com/users/nudles/followers","following_url":"https://api.github.com/users/nudles/following{/other_user}","gists_url":"https://api.github.com/users/nudles/gists{/gist_id}","starred_url":"https://api.github.com/users/nudles/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nudles/subscriptions","organizations_url":"https://api.github.com/users/nudles/orgs","repos_url":"https://api.github.com/users/nudles/repos","events_url":"https://api.github.com/users/nudles/events{/privacy}","received_events_url":"https://api.github.com/users/nudles/received_events","type":"User","site_admin":false},"body":"https://github.com/HIPS/autograd/blob/master/autograd/core.py#L17\r\n\r\nThe backward (and dependency sort) in autograd is very clear.\r\nwhat you need is just to count the available output tensors. if all output tensors are ready, then you can do backward.","created_at":"2018-03-20T04:08:50Z","updated_at":"2018-03-20T04:08:50Z","html_url":"https://github.com/apache/incubator-singa/pull/352#discussion_r175651128","pull_request_url":"https://api.github.com/repos/apache/incubator-singa/pulls/352","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apache/incubator-singa/pulls/comments/175651128"},"html":{"href":"https://github.com/apache/incubator-singa/pull/352#discussion_r175651128"},"pull_request":{"href":"https://api.github.com/repos/apache/incubator-singa/pulls/352"}}},"pull_request":{"url":"https://api.github.com/repos/apache/incubator-singa/pulls/352","id":176077371,"html_url":"https://github.com/apache/incubator-singa/pull/352","diff_url":"https://github.com/apache/incubator-singa/pull/352.diff","patch_url":"https://github.com/apache/incubator-singa/pull/352.patch","issue_url":"https://api.github.com/repos/apache/incubator-singa/issues/352","number":352,"state":"closed","locked":false,"title":"SINGA-342 Support autograd MLP Example","user":{"login":"xuewanqi","id":36396136,"avatar_url":"https://avatars2.githubusercontent.com/u/36396136?v=4","gravatar_id":"","url":"https://api.github.com/users/xuewanqi","html_url":"https://github.com/xuewanqi","followers_url":"https://api.github.com/users/xuewanqi/followers","following_url":"https://api.github.com/users/xuewanqi/following{/other_user}","gists_url":"https://api.github.com/users/xuewanqi/gists{/gist_id}","starred_url":"https://api.github.com/users/xuewanqi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xuewanqi/subscriptions","organizations_url":"https://api.github.com/users/xuewanqi/orgs","repos_url":"https://api.github.com/users/xuewanqi/repos","events_url":"https://api.github.com/users/xuewanqi/events{/privacy}","received_events_url":"https://api.github.com/users/xuewanqi/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-03-20T03:02:34Z","updated_at":"2018-03-20T04:08:50Z","closed_at":"2018-03-20T03:27:51Z","merged_at":null,"merge_commit_sha":"7b5cedb5701d9c2c64425971f4beeaf2c34969f4","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/incubator-singa/pulls/352/commits","review_comments_url":"https://api.github.com/repos/apache/incubator-singa/pulls/352/comments","review_comment_url":"https://api.github.com/repos/apache/incubator-singa/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/incubator-singa/issues/352/comments","statuses_url":"https://api.github.com/repos/apache/incubator-singa/statuses/0b0446155a4b7970a64a72381f4a6afe70c9024e","head":{"label":"xuewanqi:autograd_test1","ref":"autograd_test1","sha":"0b0446155a4b7970a64a72381f4a6afe70c9024e","user":{"login":"xuewanqi","id":36396136,"avatar_url":"https://avatars2.githubusercontent.com/u/36396136?v=4","gravatar_id":"","url":"https://api.github.com/users/xuewanqi","html_url":"https://github.com/xuewanqi","followers_url":"https://api.github.com/users/xuewanqi/followers","following_url":"https://api.github.com/users/xuewanqi/following{/other_user}","gists_url":"https://api.github.com/users/xuewanqi/gists{/gist_id}","starred_url":"https://api.github.com/users/xuewanqi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xuewanqi/subscriptions","organizations_url":"https://api.github.com/users/xuewanqi/orgs","repos_url":"https://api.github.com/users/xuewanqi/repos","events_url":"https://api.github.com/users/xuewanqi/events{/privacy}","received_events_url":"https://api.github.com/users/xuewanqi/received_events","type":"User","site_admin":false},"repo":{"id":121206718,"name":"incubator-singa","full_name":"xuewanqi/incubator-singa","owner":{"login":"xuewanqi","id":36396136,"avatar_url":"https://avatars2.githubusercontent.com/u/36396136?v=4","gravatar_id":"","url":"https://api.github.com/users/xuewanqi","html_url":"https://github.com/xuewanqi","followers_url":"https://api.github.com/users/xuewanqi/followers","following_url":"https://api.github.com/users/xuewanqi/following{/other_user}","gists_url":"https://api.github.com/users/xuewanqi/gists{/gist_id}","starred_url":"https://api.github.com/users/xuewanqi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xuewanqi/subscriptions","organizations_url":"https://api.github.com/users/xuewanqi/orgs","repos_url":"https://api.github.com/users/xuewanqi/repos","events_url":"https://api.github.com/users/xuewanqi/events{/privacy}","received_events_url":"https://api.github.com/users/xuewanqi/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/xuewanqi/incubator-singa","description":"Mirror of Apache Singa (Incubating)","fork":true,"url":"https://api.github.com/repos/xuewanqi/incubator-singa","forks_url":"https://api.github.com/repos/xuewanqi/incubator-singa/forks","keys_url":"https://api.github.com/repos/xuewanqi/incubator-singa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/xuewanqi/incubator-singa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/xuewanqi/incubator-singa/teams","hooks_url":"https://api.github.com/repos/xuewanqi/incubator-singa/hooks","issue_events_url":"https://api.github.com/repos/xuewanqi/incubator-singa/issues/events{/number}","events_url":"https://api.github.com/repos/xuewanqi/incubator-singa/events","assignees_url":"https://api.github.com/repos/xuewanqi/incubator-singa/assignees{/user}","branches_url":"https://api.github.com/repos/xuewanqi/incubator-singa/branches{/branch}","tags_url":"https://api.github.com/repos/xuewanqi/incubator-singa/tags","blobs_url":"https://api.github.com/repos/xuewanqi/incubator-singa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/xuewanqi/incubator-singa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/xuewanqi/incubator-singa/git/refs{/sha}","trees_url":"https://api.github.com/repos/xuewanqi/incubator-singa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/xuewanqi/incubator-singa/statuses/{sha}","languages_url":"https://api.github.com/repos/xuewanqi/incubator-singa/languages","stargazers_url":"https://api.github.com/repos/xuewanqi/incubator-singa/stargazers","contributors_url":"https://api.github.com/repos/xuewanqi/incubator-singa/contributors","subscribers_url":"https://api.github.com/repos/xuewanqi/incubator-singa/subscribers","subscription_url":"https://api.github.com/repos/xuewanqi/incubator-singa/subscription","commits_url":"https://api.github.com/repos/xuewanqi/incubator-singa/commits{/sha}","git_commits_url":"https://api.github.com/repos/xuewanqi/incubator-singa/git/commits{/sha}","comments_url":"https://api.github.com/repos/xuewanqi/incubator-singa/comments{/number}","issue_comment_url":"https://api.github.com/repos/xuewanqi/incubator-singa/issues/comments{/number}","contents_url":"https://api.github.com/repos/xuewanqi/incubator-singa/contents/{+path}","compare_url":"https://api.github.com/repos/xuewanqi/incubator-singa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/xuewanqi/incubator-singa/merges","archive_url":"https://api.github.com/repos/xuewanqi/incubator-singa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/xuewanqi/incubator-singa/downloads","issues_url":"https://api.github.com/repos/xuewanqi/incubator-singa/issues{/number}","pulls_url":"https://api.github.com/repos/xuewanqi/incubator-singa/pulls{/number}","milestones_url":"https://api.github.com/repos/xuewanqi/incubator-singa/milestones{/number}","notifications_url":"https://api.github.com/repos/xuewanqi/incubator-singa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/xuewanqi/incubator-singa/labels{/name}","releases_url":"https://api.github.com/repos/xuewanqi/incubator-singa/releases{/id}","deployments_url":"https://api.github.com/repos/xuewanqi/incubator-singa/deployments","created_at":"2018-02-12T06:01:26Z","updated_at":"2018-02-12T06:01:55Z","pushed_at":"2018-03-20T03:34:31Z","git_url":"git://github.com/xuewanqi/incubator-singa.git","ssh_url":"git@github.com:xuewanqi/incubator-singa.git","clone_url":"https://github.com/xuewanqi/incubator-singa.git","svn_url":"https://github.com/xuewanqi/incubator-singa","homepage":null,"size":14169,"stargazers_count":1,"watchers_count":1,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"b4ea650efb79584261e88e4ea8dd7b97fef7a758","user":{"login":"apache","id":47359,"avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":33294317,"name":"incubator-singa","full_name":"apache/incubator-singa","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/incubator-singa","description":"Mirror of Apache Singa (Incubating)","fork":false,"url":"https://api.github.com/repos/apache/incubator-singa","forks_url":"https://api.github.com/repos/apache/incubator-singa/forks","keys_url":"https://api.github.com/repos/apache/incubator-singa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/incubator-singa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/incubator-singa/teams","hooks_url":"https://api.github.com/repos/apache/incubator-singa/hooks","issue_events_url":"https://api.github.com/repos/apache/incubator-singa/issues/events{/number}","events_url":"https://api.github.com/repos/apache/incubator-singa/events","assignees_url":"https://api.github.com/repos/apache/incubator-singa/assignees{/user}","branches_url":"https://api.github.com/repos/apache/incubator-singa/branches{/branch}","tags_url":"https://api.github.com/repos/apache/incubator-singa/tags","blobs_url":"https://api.github.com/repos/apache/incubator-singa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/incubator-singa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/incubator-singa/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/incubator-singa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/incubator-singa/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/incubator-singa/languages","stargazers_url":"https://api.github.com/repos/apache/incubator-singa/stargazers","contributors_url":"https://api.github.com/repos/apache/incubator-singa/contributors","subscribers_url":"https://api.github.com/repos/apache/incubator-singa/subscribers","subscription_url":"https://api.github.com/repos/apache/incubator-singa/subscription","commits_url":"https://api.github.com/repos/apache/incubator-singa/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/incubator-singa/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/incubator-singa/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/incubator-singa/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/incubator-singa/contents/{+path}","compare_url":"https://api.github.com/repos/apache/incubator-singa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/incubator-singa/merges","archive_url":"https://api.github.com/repos/apache/incubator-singa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/incubator-singa/downloads","issues_url":"https://api.github.com/repos/apache/incubator-singa/issues{/number}","pulls_url":"https://api.github.com/repos/apache/incubator-singa/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/incubator-singa/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/incubator-singa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/incubator-singa/labels{/name}","releases_url":"https://api.github.com/repos/apache/incubator-singa/releases{/id}","deployments_url":"https://api.github.com/repos/apache/incubator-singa/deployments","created_at":"2015-04-02T07:00:05Z","updated_at":"2018-03-19T02:46:08Z","pushed_at":"2018-03-20T03:34:33Z","git_url":"git://github.com/apache/incubator-singa.git","ssh_url":"git@github.com:apache/incubator-singa.git","clone_url":"https://github.com/apache/incubator-singa.git","svn_url":"https://github.com/apache/incubator-singa","homepage":null,"size":14144,"stargazers_count":1320,"watchers_count":1320,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":310,"mirror_url":null,"archived":false,"open_issues_count":19,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":310,"open_issues":19,"watchers":1320,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/incubator-singa/pulls/352"},"html":{"href":"https://github.com/apache/incubator-singa/pull/352"},"issue":{"href":"https://api.github.com/repos/apache/incubator-singa/issues/352"},"comments":{"href":"https://api.github.com/repos/apache/incubator-singa/issues/352/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/incubator-singa/pulls/352/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/incubator-singa/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/incubator-singa/pulls/352/commits"},"statuses":{"href":"https://api.github.com/repos/apache/incubator-singa/statuses/0b0446155a4b7970a64a72381f4a6afe70c9024e"}},"author_association":"NONE"}}
{"actor":{"display_login":"nudles"}}