{"action":"created","comment":{"url":"https://api.github.com/repos/nilearn/nilearn/pulls/comments/34773941","id":34773941,"diff_hunk":"@@ -0,0 +1,533 @@\n+\"\"\"\n+Regression with spatial priors like TV-L1 and Smooth LASSO.\n+\n+\"\"\"\n+# Author: DOHMATOB Elvis Dopgima,\n+#         Gael Varoquaux,\n+#         Alexandre Gramfort,\n+#         Gaspar Pizarro,\n+#         Virgile Fritsch,\n+#         Bertrand Thirion,\n+#         and others.\n+# License: simplified BSD\n+\n+from math import sqrt\n+import numpy as np\n+from .objective_functions import (spectral_norm_squared,\n+                                  gradient_id,\n+                                  logistic_loss_lipschitz_constant,\n+                                  squared_loss, squared_loss_grad, _unmask,\n+                                  logistic_loss_grad,\n+                                  logistic as logistic_loss)\n+from .objective_functions import gradient, div\n+from .proximal_operators import (_prox_l1, _prox_l1_with_intercept,\n+                                 _prox_tvl1, _prox_tvl1_with_intercept)\n+from .fista import mfista\n+\n+\n+def squared_loss_and_spatial_grad(X, y, w, mask, grad_weight):\n+    \"\"\"\n+    Computes the differentiable loss function (squared_loss + grad_weight\n+    * gradient) for Smooth-Lasso regularization\n+\n+    Parameters\n+    ----------\n+    X : ndarray, shape (n_samples, n_features)\n+        Design matrix.\n+\n+    y : ndarray, shape (n_samples,)\n+        Target / response vector.\n+\n+    w : ndarray shape (n_features,)\n+        Unmasked, ravelized weights map.\n+\n+    grad_weight: float\n+        l1_ratio * alpha\n+\n+    Returns\n+    -------\n+    float\n+\n+    \"\"\"\n+    data_section = np.dot(X, w) - y\n+    grad_buffer = np.zeros(mask.shape)\n+    grad_buffer[mask] = w\n+    grad_mask = np.tile(mask, [mask.ndim] + [1] * mask.ndim)\n+    grad_section = gradient(grad_buffer)[grad_mask]\n+    return 0.5 * (np.dot(data_section, data_section)\n+                  + grad_weight * np.dot(grad_section, grad_section))\n+\n+\n+def squared_loss_and_spatial_grad_derivative(X, y, w, mask, grad_weight):\n+    \"\"\"\n+    Computes the gradient of squared_loss_and_spatial_grad\n+\n+    Parameters\n+    ----------\n+    X : ndarray, shape (n_samples, n_features)\n+        Design matrix.\n+\n+    y : ndarray, shape (n_samples,)\n+        Target / response vector.\n+\n+    w : ndarray shape (n_features,)\n+        Unmasked, ravelized weights map.\n+\n+    grad_weight: float\n+        l1_ratio * alpha\n+\n+    Returns\n+    -------\n+    ndarray, shape (n_features,)\n+    \"\"\"\n+    data_section = np.dot(X, w) - y\n+    image_buffer = np.zeros(mask.shape)\n+    image_buffer[mask] = w\n+    return (np.dot(X.T, data_section)\n+            - grad_weight * div(gradient(image_buffer))[mask])\n+\n+\n+def smooth_lasso_data_function(X, w, mask, grad_weight):\n+    \"\"\"\n+    Computes [X;grad_weight*grad]w. This function is made for the Lasso-like\n+    interpretation of the Smooth Lasso\n+\n+    Parameters\n+    ----------\n+    X : ndarray, shape (n_samples, n_features)\n+        Design matrix.\n+\n+    y : ndarray, shape (n_samples,)\n+        Target / response vector.\n+\n+    w : ndarray shape (n_features,)\n+        Unmasked, ravelized weights map.\n+\n+    grad_weight: float\n+        l1_ratio * alpha\n+\n+    Returns\n+    -------\n+    float\n+\n+    \"\"\"\n+    data_buffer = np.zeros(mask.shape)\n+    data_buffer[mask] = w\n+    w_g = grad_weight * gradient(data_buffer)\n+    out = np.ndarray(X.shape[0] + mask.ndim * X.shape[1])\n+    out[:X.shape[0]] = X.dot(w)\n+    out[X.shape[0]:] = np.concatenate(\n+        tuple([w_g[i][mask] for i in range(mask.ndim)]))\n+    return out\n+\n+\n+def smooth_lasso_adjoint_data_function(X, w, adjoint_mask, grad_weight):\n+    \"\"\"\n+    Computes the adjoint of the smooth_lasso_data_function, that is\n+    [X.T;grad_weight*div]w. This function is made for the Lasso-like\n+    interpretation of the Smooth Lasso\n+\n+    Parameters\n+    ----------\n+    X : ndarray, shape (n_samples, n_features)\n+        Design matrix.\n+\n+    y : ndarray, shape (n_samples,)\n+        Target / response vector.\n+\n+    w : ndarray shape (n_features,)\n+        Unmasked, ravelized weights map.\n+\n+    grad_weight: float\n+        l1_ratio * alpha\n+\n+    Returns\n+    -------\n+    float\n+\n+    \"\"\"\n+    n_samples, _ = X.shape\n+    out = X.T.dot(w[:n_samples])\n+    div_buffer = np.zeros(adjoint_mask.shape)\n+    div_buffer[adjoint_mask] = w[n_samples:]\n+    out -= grad_weight * div(div_buffer)[adjoint_mask[0]]\n+    return out\n+\n+\n+def squared_loss_derivative_lipschitz_constant(X, mask, grad_weight,\n+                                               n_iterations=100):\n+    \"\"\"\n+    Computes the lipschitz constant of the gradient of the smooth part\n+    of the smooth lasso regression problem (squared_loss + grad_weight*grad)\n+    via power method\n+\n+    \"\"\"\n+    rng = np.random.RandomState(42)\n+    a = rng.randn(X.shape[1])\n+    a /= sqrt(np.dot(a, a))\n+    adjoint_mask = np.tile(mask, [mask.ndim] + [1] * mask.ndim)\n+\n+    # Since we are putting the coefficient into the matrix, which\n+    # is squared in the data loss function, it must be the\n+    # square root of the desired weight\n+    actual_grad_weight = sqrt(grad_weight)\n+    for _ in range(n_iterations):\n+        a = smooth_lasso_adjoint_data_function(\n+            X, smooth_lasso_data_function(X, a, mask, actual_grad_weight),\n+            adjoint_mask, actual_grad_weight)\n+        a /= sqrt(np.dot(a, a))\n+\n+    lipschitz_constant = np.dot(smooth_lasso_adjoint_data_function(\n+        X, smooth_lasso_data_function(X, a, mask, actual_grad_weight),\n+        adjoint_mask, actual_grad_weight), a) / np.dot(a, a)\n+\n+    return lipschitz_constant\n+\n+\n+def logistic_derivative_lipschitz_constant(X, mask, grad_weight,\n+                                           n_iterations=100):\n+    \"\"\"\n+    Computes the lipschitz constant of the gradient of the smooth part\n+    of the smooth lasso classification problem (logistic_loss +\n+    grad_weight*grad) via analytical formula on the logistic loss +\n+    power method on the smooth part\n+    \"\"\"\n+    # L. constant for the data term (logistic)\n+    # data_constant = sp.linalg.norm(X, 2) ** 2\n+    data_constant = logistic_loss_lipschitz_constant(X)\n+\n+    rng = np.random.RandomState(42)\n+    a = rng.randn(X.shape[1])\n+    a /= sqrt(np.dot(a, a))\n+    grad_buffer = np.zeros(mask.shape)\n+    for _ in range(n_iterations):\n+        grad_buffer[mask] = a\n+        a = - div(gradient(grad_buffer))[mask] / sqrt(np.dot(a, a))\n+\n+    grad_buffer[mask] = a\n+    grad_constant = (- np.dot(div(gradient(grad_buffer))[mask], a)\n+                     / np.dot(a, a))\n+\n+    return data_constant + grad_weight * grad_constant\n+\n+\n+def logistic_data_loss_and_spatial_grad(X, y, w, mask, grad_weight):\n+    \"\"\"Compute the smooth part of the smooth lasso objective, with\n+    logistic loss\"\"\"\n+    grad_buffer = np.zeros(mask.shape)\n+    grad_buffer[mask] = w[:-1]\n+    grad_mask = np.array([mask for _ in range(mask.ndim)])\n+    grad_section = gradient(grad_buffer)[grad_mask]\n+    return (logistic_loss(X, y, w)\n+            + 0.5 * grad_weight * np.dot(grad_section, grad_section))\n+\n+\n+def logistic_data_loss_and_spatial_grad_derivative(X, y, w, mask, grad_weight):\n+    \"\"\"Compute the derivative of logistic_loss_and_spatial_grad\"\"\"\n+    image_buffer = np.zeros(mask.shape)\n+    image_buffer[mask] = w[:-1]\n+    data_section = logistic_loss_grad(X, y, w)\n+    data_section[:-1] = data_section[:-1]\\\n+        - grad_weight * div(gradient(image_buffer))[mask]\n+    return data_section\n+\n+\n+def smooth_lasso_squared_loss(X, y, alpha, l1_ratio, mask, init=None,\n+                              max_iter=1000, tol=1e-4, callback=None,\n+                              lipschitz_constant=None, verbose=0):\n+    \"\"\"Computes a solution for the Smooth Lasso regression problem, as in the\n+    SmoothLassoRegressor estimator, with no data preprocessing.\n+\n+    This function invokes the mfista backend (from fista.py) to solve the\n+    underlying optimization problem.\n+\n+    Returns\n+    -------\n+    w : ndarray, shape (n_features,)\n+        Solution vector.\n+\n+    solver_info : float\n+        Solver information, for warm start.\n+\n+    objective : array of floats\n+        Objective function (fval) computed on every iteration.\n+\n+    \"\"\"\n+\n+    n_samples, n_features = X.shape\n+\n+    # misc\n+    model_size = n_features\n+    l1_weight = alpha * l1_ratio\n+    grad_weight = alpha * (1. - l1_ratio)\n+\n+    if lipschitz_constant is None:\n+        lipschitz_constant = squared_loss_derivative_lipschitz_constant(\n+            X, mask, grad_weight)\n+\n+        # it's always a good idea to use somethx a bit bigger\n+        lipschitz_constant *= 1.05\n+\n+    # mooth part of energy, and gradient of\n+    def f1(w):\n+        return squared_loss_and_spatial_grad(X, y, w, mask, grad_weight)\n+\n+    def f1_grad(w):\n+        return squared_loss_and_spatial_grad_derivative(X, y, w, mask,\n+                                                        grad_weight)\n+\n+    # prox of nonsmooth path of energy (account for the intercept)\n+    def f2(w):\n+        return np.sum(np.abs(w)) * l1_weight\n+\n+    def f2_prox(w, l, *args, **kwargs):\n+        return _prox_l1(w, l * l1_weight), dict(converged=True)\n+\n+    # total energy (smooth + nonsmooth)\n+    def total_energy(w):\n+        return f1(w) + f2(w)\n+\n+    return mfista(\n+        f1_grad, f2_prox, total_energy, lipschitz_constant,\n+        model_size, dgap_factor=(.1 + l1_ratio) ** 2, callback=callback,\n+        tol=tol, max_iter=max_iter, verbose=verbose, init=init)\n+\n+\n+def smooth_lasso_logistic(X, y, alpha, l1_ratio, mask, init=None,\n+                          max_iter=1000, tol=1e-4, callback=None, verbose=0,\n+                          lipschitz_constant=None):\n+    \"\"\"Computes a solution for the Smooth Lasso classification problem, with\n+    response vector in {-1, 1}^n_samples.\n+\n+    This function invokes the mfista backend (from fista.py) to solver the","path":"nilearn/decoding/space_net_solvers.py","position":302,"original_position":302,"commit_id":"f59ed9196ee7d15e9984d6b8aa056abb5d7ee215","original_commit_id":"4e7e25e87ea36b6065b37eb04f4fd5a773e70a73","user":{"login":"bthirion","id":234454,"avatar_url":"https://avatars.githubusercontent.com/u/234454?v=3","gravatar_id":"","url":"https://api.github.com/users/bthirion","html_url":"https://github.com/bthirion","followers_url":"https://api.github.com/users/bthirion/followers","following_url":"https://api.github.com/users/bthirion/following{/other_user}","gists_url":"https://api.github.com/users/bthirion/gists{/gist_id}","starred_url":"https://api.github.com/users/bthirion/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bthirion/subscriptions","organizations_url":"https://api.github.com/users/bthirion/orgs","repos_url":"https://api.github.com/users/bthirion/repos","events_url":"https://api.github.com/users/bthirion/events{/privacy}","received_events_url":"https://api.github.com/users/bthirion/received_events","type":"User","site_admin":false},"body":"to solve","created_at":"2015-07-16T10:21:26Z","updated_at":"2015-07-16T10:21:26Z","html_url":"https://github.com/nilearn/nilearn/pull/657#discussion_r34773941","pull_request_url":"https://api.github.com/repos/nilearn/nilearn/pulls/657","_links":{"self":{"href":"https://api.github.com/repos/nilearn/nilearn/pulls/comments/34773941"},"html":{"href":"https://github.com/nilearn/nilearn/pull/657#discussion_r34773941"},"pull_request":{"href":"https://api.github.com/repos/nilearn/nilearn/pulls/657"}}},"pull_request":{"url":"https://api.github.com/repos/nilearn/nilearn/pulls/657","id":39890490,"html_url":"https://github.com/nilearn/nilearn/pull/657","diff_url":"https://github.com/nilearn/nilearn/pull/657.diff","patch_url":"https://github.com/nilearn/nilearn/pull/657.patch","issue_url":"https://api.github.com/repos/nilearn/nilearn/issues/657","number":657,"state":"open","locked":false,"title":"SpaceNet (all batteries loaded...). This PR succeeds PR #219 (aka unicorn factory)","user":{"login":"dohmatob","id":634068,"avatar_url":"https://avatars.githubusercontent.com/u/634068?v=3","gravatar_id":"","url":"https://api.github.com/users/dohmatob","html_url":"https://github.com/dohmatob","followers_url":"https://api.github.com/users/dohmatob/followers","following_url":"https://api.github.com/users/dohmatob/following{/other_user}","gists_url":"https://api.github.com/users/dohmatob/gists{/gist_id}","starred_url":"https://api.github.com/users/dohmatob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dohmatob/subscriptions","organizations_url":"https://api.github.com/users/dohmatob/orgs","repos_url":"https://api.github.com/users/dohmatob/repos","events_url":"https://api.github.com/users/dohmatob/events{/privacy}","received_events_url":"https://api.github.com/users/dohmatob/received_events","type":"User","site_admin":false},"body":"This PR succeeds PR #219 (aka unicorn factory). All discussions should be done here henceforth. #219 is now classified, and should be referred to solely for histological purposes.","created_at":"2015-07-14T07:56:20Z","updated_at":"2015-07-16T10:21:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4bfbf9cc94eac76664642af99b0ddfb7bf32e37a","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/nilearn/nilearn/pulls/657/commits","review_comments_url":"https://api.github.com/repos/nilearn/nilearn/pulls/657/comments","review_comment_url":"https://api.github.com/repos/nilearn/nilearn/pulls/comments{/number}","comments_url":"https://api.github.com/repos/nilearn/nilearn/issues/657/comments","statuses_url":"https://api.github.com/repos/nilearn/nilearn/statuses/f59ed9196ee7d15e9984d6b8aa056abb5d7ee215","head":{"label":"dohmatob:sparse-models","ref":"sparse-models","sha":"f59ed9196ee7d15e9984d6b8aa056abb5d7ee215","user":{"login":"dohmatob","id":634068,"avatar_url":"https://avatars.githubusercontent.com/u/634068?v=3","gravatar_id":"","url":"https://api.github.com/users/dohmatob","html_url":"https://github.com/dohmatob","followers_url":"https://api.github.com/users/dohmatob/followers","following_url":"https://api.github.com/users/dohmatob/following{/other_user}","gists_url":"https://api.github.com/users/dohmatob/gists{/gist_id}","starred_url":"https://api.github.com/users/dohmatob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dohmatob/subscriptions","organizations_url":"https://api.github.com/users/dohmatob/orgs","repos_url":"https://api.github.com/users/dohmatob/repos","events_url":"https://api.github.com/users/dohmatob/events{/privacy}","received_events_url":"https://api.github.com/users/dohmatob/received_events","type":"User","site_admin":false},"repo":{"id":10718029,"name":"nilearn","full_name":"dohmatob/nilearn","owner":{"login":"dohmatob","id":634068,"avatar_url":"https://avatars.githubusercontent.com/u/634068?v=3","gravatar_id":"","url":"https://api.github.com/users/dohmatob","html_url":"https://github.com/dohmatob","followers_url":"https://api.github.com/users/dohmatob/followers","following_url":"https://api.github.com/users/dohmatob/following{/other_user}","gists_url":"https://api.github.com/users/dohmatob/gists{/gist_id}","starred_url":"https://api.github.com/users/dohmatob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dohmatob/subscriptions","organizations_url":"https://api.github.com/users/dohmatob/orgs","repos_url":"https://api.github.com/users/dohmatob/repos","events_url":"https://api.github.com/users/dohmatob/events{/privacy}","received_events_url":"https://api.github.com/users/dohmatob/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dohmatob/nilearn","description":"NeuroImaging with the Scikit-learn: fMRI inverse inference tutorial","fork":true,"url":"https://api.github.com/repos/dohmatob/nilearn","forks_url":"https://api.github.com/repos/dohmatob/nilearn/forks","keys_url":"https://api.github.com/repos/dohmatob/nilearn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dohmatob/nilearn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dohmatob/nilearn/teams","hooks_url":"https://api.github.com/repos/dohmatob/nilearn/hooks","issue_events_url":"https://api.github.com/repos/dohmatob/nilearn/issues/events{/number}","events_url":"https://api.github.com/repos/dohmatob/nilearn/events","assignees_url":"https://api.github.com/repos/dohmatob/nilearn/assignees{/user}","branches_url":"https://api.github.com/repos/dohmatob/nilearn/branches{/branch}","tags_url":"https://api.github.com/repos/dohmatob/nilearn/tags","blobs_url":"https://api.github.com/repos/dohmatob/nilearn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dohmatob/nilearn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dohmatob/nilearn/git/refs{/sha}","trees_url":"https://api.github.com/repos/dohmatob/nilearn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dohmatob/nilearn/statuses/{sha}","languages_url":"https://api.github.com/repos/dohmatob/nilearn/languages","stargazers_url":"https://api.github.com/repos/dohmatob/nilearn/stargazers","contributors_url":"https://api.github.com/repos/dohmatob/nilearn/contributors","subscribers_url":"https://api.github.com/repos/dohmatob/nilearn/subscribers","subscription_url":"https://api.github.com/repos/dohmatob/nilearn/subscription","commits_url":"https://api.github.com/repos/dohmatob/nilearn/commits{/sha}","git_commits_url":"https://api.github.com/repos/dohmatob/nilearn/git/commits{/sha}","comments_url":"https://api.github.com/repos/dohmatob/nilearn/comments{/number}","issue_comment_url":"https://api.github.com/repos/dohmatob/nilearn/issues/comments{/number}","contents_url":"https://api.github.com/repos/dohmatob/nilearn/contents/{+path}","compare_url":"https://api.github.com/repos/dohmatob/nilearn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dohmatob/nilearn/merges","archive_url":"https://api.github.com/repos/dohmatob/nilearn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dohmatob/nilearn/downloads","issues_url":"https://api.github.com/repos/dohmatob/nilearn/issues{/number}","pulls_url":"https://api.github.com/repos/dohmatob/nilearn/pulls{/number}","milestones_url":"https://api.github.com/repos/dohmatob/nilearn/milestones{/number}","notifications_url":"https://api.github.com/repos/dohmatob/nilearn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dohmatob/nilearn/labels{/name}","releases_url":"https://api.github.com/repos/dohmatob/nilearn/releases{/id}","created_at":"2013-06-16T09:21:03Z","updated_at":"2015-05-18T08:46:19Z","pushed_at":"2015-07-16T09:16:28Z","git_url":"git://github.com/dohmatob/nilearn.git","ssh_url":"git@github.com:dohmatob/nilearn.git","clone_url":"https://github.com/dohmatob/nilearn.git","svn_url":"https://github.com/dohmatob/nilearn","homepage":"http://nilearn.github.com/","size":8957,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"nilearn:master","ref":"master","sha":"0b26e3bb07c7cb2e44487aa0c141e6fad89d820f","user":{"login":"nilearn","id":4646912,"avatar_url":"https://avatars.githubusercontent.com/u/4646912?v=3","gravatar_id":"","url":"https://api.github.com/users/nilearn","html_url":"https://github.com/nilearn","followers_url":"https://api.github.com/users/nilearn/followers","following_url":"https://api.github.com/users/nilearn/following{/other_user}","gists_url":"https://api.github.com/users/nilearn/gists{/gist_id}","starred_url":"https://api.github.com/users/nilearn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nilearn/subscriptions","organizations_url":"https://api.github.com/users/nilearn/orgs","repos_url":"https://api.github.com/users/nilearn/repos","events_url":"https://api.github.com/users/nilearn/events{/privacy}","received_events_url":"https://api.github.com/users/nilearn/received_events","type":"Organization","site_admin":false},"repo":{"id":1235740,"name":"nilearn","full_name":"nilearn/nilearn","owner":{"login":"nilearn","id":4646912,"avatar_url":"https://avatars.githubusercontent.com/u/4646912?v=3","gravatar_id":"","url":"https://api.github.com/users/nilearn","html_url":"https://github.com/nilearn","followers_url":"https://api.github.com/users/nilearn/followers","following_url":"https://api.github.com/users/nilearn/following{/other_user}","gists_url":"https://api.github.com/users/nilearn/gists{/gist_id}","starred_url":"https://api.github.com/users/nilearn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nilearn/subscriptions","organizations_url":"https://api.github.com/users/nilearn/orgs","repos_url":"https://api.github.com/users/nilearn/repos","events_url":"https://api.github.com/users/nilearn/events{/privacy}","received_events_url":"https://api.github.com/users/nilearn/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nilearn/nilearn","description":"Machine learning for NeuroImaging in Python","fork":false,"url":"https://api.github.com/repos/nilearn/nilearn","forks_url":"https://api.github.com/repos/nilearn/nilearn/forks","keys_url":"https://api.github.com/repos/nilearn/nilearn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nilearn/nilearn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nilearn/nilearn/teams","hooks_url":"https://api.github.com/repos/nilearn/nilearn/hooks","issue_events_url":"https://api.github.com/repos/nilearn/nilearn/issues/events{/number}","events_url":"https://api.github.com/repos/nilearn/nilearn/events","assignees_url":"https://api.github.com/repos/nilearn/nilearn/assignees{/user}","branches_url":"https://api.github.com/repos/nilearn/nilearn/branches{/branch}","tags_url":"https://api.github.com/repos/nilearn/nilearn/tags","blobs_url":"https://api.github.com/repos/nilearn/nilearn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nilearn/nilearn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nilearn/nilearn/git/refs{/sha}","trees_url":"https://api.github.com/repos/nilearn/nilearn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nilearn/nilearn/statuses/{sha}","languages_url":"https://api.github.com/repos/nilearn/nilearn/languages","stargazers_url":"https://api.github.com/repos/nilearn/nilearn/stargazers","contributors_url":"https://api.github.com/repos/nilearn/nilearn/contributors","subscribers_url":"https://api.github.com/repos/nilearn/nilearn/subscribers","subscription_url":"https://api.github.com/repos/nilearn/nilearn/subscription","commits_url":"https://api.github.com/repos/nilearn/nilearn/commits{/sha}","git_commits_url":"https://api.github.com/repos/nilearn/nilearn/git/commits{/sha}","comments_url":"https://api.github.com/repos/nilearn/nilearn/comments{/number}","issue_comment_url":"https://api.github.com/repos/nilearn/nilearn/issues/comments{/number}","contents_url":"https://api.github.com/repos/nilearn/nilearn/contents/{+path}","compare_url":"https://api.github.com/repos/nilearn/nilearn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nilearn/nilearn/merges","archive_url":"https://api.github.com/repos/nilearn/nilearn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nilearn/nilearn/downloads","issues_url":"https://api.github.com/repos/nilearn/nilearn/issues{/number}","pulls_url":"https://api.github.com/repos/nilearn/nilearn/pulls{/number}","milestones_url":"https://api.github.com/repos/nilearn/nilearn/milestones{/number}","notifications_url":"https://api.github.com/repos/nilearn/nilearn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nilearn/nilearn/labels{/name}","releases_url":"https://api.github.com/repos/nilearn/nilearn/releases{/id}","created_at":"2011-01-09T19:02:23Z","updated_at":"2015-07-14T23:48:39Z","pushed_at":"2015-07-16T10:20:12Z","git_url":"git://github.com/nilearn/nilearn.git","ssh_url":"git@github.com:nilearn/nilearn.git","clone_url":"https://github.com/nilearn/nilearn.git","svn_url":"https://github.com/nilearn/nilearn","homepage":"http://nilearn.github.io","size":15111,"stargazers_count":101,"watchers_count":101,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":71,"mirror_url":null,"open_issues_count":85,"forks":71,"open_issues":85,"watchers":101,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/nilearn/nilearn/pulls/657"},"html":{"href":"https://github.com/nilearn/nilearn/pull/657"},"issue":{"href":"https://api.github.com/repos/nilearn/nilearn/issues/657"},"comments":{"href":"https://api.github.com/repos/nilearn/nilearn/issues/657/comments"},"review_comments":{"href":"https://api.github.com/repos/nilearn/nilearn/pulls/657/comments"},"review_comment":{"href":"https://api.github.com/repos/nilearn/nilearn/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/nilearn/nilearn/pulls/657/commits"},"statuses":{"href":"https://api.github.com/repos/nilearn/nilearn/statuses/f59ed9196ee7d15e9984d6b8aa056abb5d7ee215"}}}}