{"action":"created","comment":{"url":"https://api.github.com/repos/mila-udem/myia/pulls/comments/228675781","pull_request_review_id":169012935,"id":228675781,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyODY3NTc4MQ==","diff_hunk":"@@ -0,0 +1,403 @@\n+\n+import pytest\n+import numpy as np\n+from types import FunctionType\n+\n+from myia.api import standard_debug_pipeline, Optimizer\n+from myia.composite import grad\n+from myia.debug.finite_diff import GradTester\n+from myia.grad import J as realJ\n+from myia.opt import lib as optlib, CSE\n+from myia.pipeline import pipeline_function\n+from myia.prim import ops as P, Primitive\n+from myia.prim.py_implementations import J, scalar_add, scalar_mul, typeof\n+from myia.prim.py_implementations import py_implementations as pyi\n+\n+from .common import f64\n+\n+\n+step_optgrad = Optimizer.partial(\n+    phases=dict(\n+        main=[\n+            optlib.simplify_always_true,\n+            optlib.simplify_always_false,\n+            optlib.inline_core,\n+            optlib.simplify_partial,\n+            optlib.elim_identity,\n+        ],\n+        grad=[\n+            optlib.expand_J,\n+        ],\n+        renormalize='renormalize',\n+        elimj=[\n+            optlib.elim_j,\n+            optlib.elim_jinv,\n+            optlib.elim_jct,\n+            optlib.elim_j_jinv,\n+            optlib.elim_jinv_j,\n+        ],\n+        cse=CSE.partial(report_changes=False),\n+    )\n+)\n+\n+\n+def test_GradTester():\n+\n+    def f(x, y):\n+        return x / y\n+\n+    def df(x, y, dz):\n+        return dz / y, -dz * x / (y * y)\n+\n+    arglist = (\n+        (7.3, 4.2),\n+        (np.array([[4.3, 2.0], [5.1, 7.7], [3.4, 8.2]]),\n+         np.array([[1.2, 5.0], [3.3, 2.7], [6.9, 7.2]])),\n+    )\n+\n+    for args in arglist:\n+        gtest = GradTester(\n+            fn=f,\n+            gfn=df,\n+            args=args,\n+            argnames=['x', 'y'],\n+            outnames=['out']\n+        )\n+\n+        gtest.assert_match()\n+\n+\n+def test_GradTester_outtup():\n+\n+    def f(x, y):\n+        return x * y, x / y\n+\n+    def df(x, y, dz):\n+        dz1, dz2 = dz\n+        return (dz1 * y + dz2 / y,\n+                dz1 * x + -dz2 * x / (y * y))\n+\n+    gtest = GradTester(\n+        fn=f,\n+        gfn=df,\n+        args=(7.3, 4.2),\n+        argnames=['x', 'y'],\n+        outnames=None\n+    )\n+\n+    gtest.assert_match()\n+\n+\n+prim_tests = {\n+    P.scalar_add: [(-7.1, 4.3)],\n+    P.scalar_sub: [(-7.1, 4.3)],\n+    P.scalar_mul: [(-7.1, 4.3)],\n+    P.scalar_div: [(-7.1, 4.3)],\n+    P.scalar_pow: [(7.1, 4.3), (5.3, -1.2)],\n+    P.scalar_uadd: [(-7.1,)],\n+    P.scalar_usub: [(-7.1,)],\n+    # P.scalar_gt: [(-7.1, 4.3)],\n+    # P.scalar_lt: [(-7.1, 4.3)],\n+    # P.scalar_ge: [(-7.1, 4.3)],\n+    # P.scalar_le: [(-7.1, 4.3)],\n+}\n+\n+\n+@pipeline_function\n+def grad_wrap(self, graph):\n+    if isinstance(graph, Primitive):\n+        jg = realJ(graph, self.resources)\n+        g = grad.make_gf(jg, jg.parameters,\n+                         dbg=jg.debug, sens_param=True, get_all=True)\n+    else:\n+        g = grad.make_gf(graph, graph.parameters,\n+                         dbg=graph.debug, sens_param=True, get_all=True,\n+                         apply_j=True)\n+    return g\n+\n+\n+def _grad_test(fn, obj, args, sens_type=f64):\n+    in_types = [{'type': typeof(arg)} for arg in args]\n+    sens_type = {'type': sens_type}\n+    steps = ['resolve', 'infer', 'specialize', 'prepare',\n+             'validate', 'export']\n+    if isinstance(obj, FunctionType):\n+        res = standard_debug_pipeline \\\n+            .select('parse', *steps) \\\n+            .insert_before('infer', wrap=grad_wrap) \\\n+            .insert_after('prepare', opt=step_optgrad) \\\n+            .run(input=obj, argspec=[*in_types, sens_type])\n+    else:\n+        res = standard_debug_pipeline \\\n+            .select(*steps) \\\n+            .insert_before(wrap=grad_wrap) \\\n+            .insert_after('prepare', opt=step_optgrad) \\\n+            .run(graph=obj, argspec=[*in_types, sens_type])\n+\n+    gtest = GradTester(\n+        fn=fn,\n+        gfn=res['output'],\n+        args=args,\n+        argnames=[f'in{i}' for i in range(len(args))],\n+        outnames=None\n+    )\n+    gtest.assert_match()\n+\n+\n+@pytest.mark.parametrize('prim,cases', prim_tests.items())\n+def test_prim_grads(prim, cases):\n+    for case in cases:\n+        _grad_test(pyi[prim], prim, case)\n+\n+\n+def grad_test(*tests):\n+    \"\"\"Decorate a function to parse and run it against pure Python.\n+\n+    Returns a unit test that will parse the function, and then for\n+    each `inputs` tuple in `tests` it will check that the pure Python,\n+    undecorated function returns that same output.\n+\n+    Arguments:\n+        tests: One or more inputs tuple.\n+\n+    \"\"\"\n+\n+    def decorate(fn):\n+        def test(args):\n+            if not isinstance(args, tuple):\n+                args = (args,)\n+\n+            _grad_test(fn, fn, args)\n+\n+        m = pytest.mark.parametrize('args', list(tests))(test)\n+        m.__orig__ = fn\n+        return m\n+    return decorate\n+\n+\n+@grad_test((13.0, 14.0))\n+def test_null(x, y):\n+    \"\"\"Test null gradient.\"\"\"\n+    return 10.0 + 28.0 / 43.0\n+\n+\n+@grad_test((1.0, 4.0), (5.0, -13.0))\n+def test_grad_add(x, y):\n+    return x + y\n+\n+\n+@grad_test((3.0, 4.0))\n+def test_grad_expr(x, y):\n+    return x**3.0 * y**4.0\n+\n+\n+@grad_test((3.0,))\n+def test_constant(x):\n+    \"\"\"Test the use of a literal in the expression.\"\"\"\n+    return 18.0 * x\n+\n+\n+@grad_test((3.0,))\n+def test_dup_args_in_call(x):\n+    \"\"\"The naive gradient update rule fails when a function's arguments\n+    contain the same variable more than once.\"\"\"\n+    return x * x\n+\n+\n+@grad_test((3.0,))\n+def test_quadruple_args_in_call(x):\n+    \"\"\"Test that duplicated arguments still cause no problem even if\n+    there are four of them.\"\"\"\n+    def g(a, b, c, d):\n+        return a * b * c * d\n+    return g(x, x, x, x)\n+\n+\n+@grad_test((3.0, 5.0))\n+def test_tuples(x, y):\n+    tup = x + y, x * y\n+    z = tup[0] + tup[1]\n+    return z\n+\n+\n+@grad_test((4.0, 5.0))\n+def test_hof(a, b):\n+    \"\"\"Test higher order functions.\"\"\"\n+    def f(g, x):\n+        return g(x) * g(x + 10.0)\n+\n+    def g(x):\n+        return x * b\n+\n+    return f(g, a) + f(g, b)\n+\n+\n+@pytest.mark.xfail(\n+    reason=\"I think the opts to eliminate j/jinv are messing this one up.\"","path":"tests/test_grad.py","position":null,"original_position":236,"commit_id":"d6ecfe83d8e0f8eb7c0e0c416ac57542744202ea","original_commit_id":"d9523f710b126324c1ccfc0d5fd34ba21e5d3135","user":{"login":"breuleux","id":599820,"node_id":"MDQ6VXNlcjU5OTgyMA==","avatar_url":"https://avatars3.githubusercontent.com/u/599820?v=4","gravatar_id":"","url":"https://api.github.com/users/breuleux","html_url":"https://github.com/breuleux","followers_url":"https://api.github.com/users/breuleux/followers","following_url":"https://api.github.com/users/breuleux/following{/other_user}","gists_url":"https://api.github.com/users/breuleux/gists{/gist_id}","starred_url":"https://api.github.com/users/breuleux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/breuleux/subscriptions","organizations_url":"https://api.github.com/users/breuleux/orgs","repos_url":"https://api.github.com/users/breuleux/repos","events_url":"https://api.github.com/users/breuleux/events{/privacy}","received_events_url":"https://api.github.com/users/breuleux/received_events","type":"User","site_admin":false},"body":"I disabled the opts and added support for J/Jinv in py_implementations.","created_at":"2018-10-26T21:55:55Z","updated_at":"2018-10-26T21:55:56Z","html_url":"https://github.com/mila-udem/myia/pull/135#discussion_r228675781","pull_request_url":"https://api.github.com/repos/mila-udem/myia/pulls/135","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/mila-udem/myia/pulls/comments/228675781"},"html":{"href":"https://github.com/mila-udem/myia/pull/135#discussion_r228675781"},"pull_request":{"href":"https://api.github.com/repos/mila-udem/myia/pulls/135"}},"in_reply_to_id":228640874},"pull_request":{"url":"https://api.github.com/repos/mila-udem/myia/pulls/135","id":226190054,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI2MTkwMDU0","html_url":"https://github.com/mila-udem/myia/pull/135","diff_url":"https://github.com/mila-udem/myia/pull/135.diff","patch_url":"https://github.com/mila-udem/myia/pull/135.patch","issue_url":"https://api.github.com/repos/mila-udem/myia/issues/135","number":135,"state":"open","locked":false,"title":"Gradient generation","user":{"login":"breuleux","id":599820,"node_id":"MDQ6VXNlcjU5OTgyMA==","avatar_url":"https://avatars3.githubusercontent.com/u/599820?v=4","gravatar_id":"","url":"https://api.github.com/users/breuleux","html_url":"https://github.com/breuleux","followers_url":"https://api.github.com/users/breuleux/followers","following_url":"https://api.github.com/users/breuleux/following{/other_user}","gists_url":"https://api.github.com/users/breuleux/gists{/gist_id}","starred_url":"https://api.github.com/users/breuleux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/breuleux/subscriptions","organizations_url":"https://api.github.com/users/breuleux/orgs","repos_url":"https://api.github.com/users/breuleux/repos","events_url":"https://api.github.com/users/breuleux/events{/privacy}","received_events_url":"https://api.github.com/users/breuleux/received_events","type":"User","site_admin":false},"body":"This adds gradients for various primitives, and gradient generation. The tests pass and there is 100% coverage, but it's worth mentioning the whole thing is slightly rushed. A few comments:\r\n\r\n* There are two xfails which should be fixed at some point.\r\n* Support for array operations has not been added yet.\r\n* The default pipeline doesn't support gradients yet. The one that does is in test_grad, but it's a bit wonky (likely responsible for one of the xfails).\r\n* The grad transform isn't very well documented.\r\n* J/Jinv won't work with the debug VM right now.\r\n","created_at":"2018-10-26T18:39:36Z","updated_at":"2018-10-26T21:55:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7a08f5ecb53450428a1e6f55041f5a540f05cf05","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/mila-udem/myia/pulls/135/commits","review_comments_url":"https://api.github.com/repos/mila-udem/myia/pulls/135/comments","review_comment_url":"https://api.github.com/repos/mila-udem/myia/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mila-udem/myia/issues/135/comments","statuses_url":"https://api.github.com/repos/mila-udem/myia/statuses/d6ecfe83d8e0f8eb7c0e0c416ac57542744202ea","head":{"label":"breuleux:gradgen","ref":"gradgen","sha":"d6ecfe83d8e0f8eb7c0e0c416ac57542744202ea","user":{"login":"breuleux","id":599820,"node_id":"MDQ6VXNlcjU5OTgyMA==","avatar_url":"https://avatars3.githubusercontent.com/u/599820?v=4","gravatar_id":"","url":"https://api.github.com/users/breuleux","html_url":"https://github.com/breuleux","followers_url":"https://api.github.com/users/breuleux/followers","following_url":"https://api.github.com/users/breuleux/following{/other_user}","gists_url":"https://api.github.com/users/breuleux/gists{/gist_id}","starred_url":"https://api.github.com/users/breuleux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/breuleux/subscriptions","organizations_url":"https://api.github.com/users/breuleux/orgs","repos_url":"https://api.github.com/users/breuleux/repos","events_url":"https://api.github.com/users/breuleux/events{/privacy}","received_events_url":"https://api.github.com/users/breuleux/received_events","type":"User","site_admin":false},"repo":{"id":120800538,"node_id":"MDEwOlJlcG9zaXRvcnkxMjA4MDA1Mzg=","name":"myia","full_name":"breuleux/myia","private":false,"owner":{"login":"breuleux","id":599820,"node_id":"MDQ6VXNlcjU5OTgyMA==","avatar_url":"https://avatars3.githubusercontent.com/u/599820?v=4","gravatar_id":"","url":"https://api.github.com/users/breuleux","html_url":"https://github.com/breuleux","followers_url":"https://api.github.com/users/breuleux/followers","following_url":"https://api.github.com/users/breuleux/following{/other_user}","gists_url":"https://api.github.com/users/breuleux/gists{/gist_id}","starred_url":"https://api.github.com/users/breuleux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/breuleux/subscriptions","organizations_url":"https://api.github.com/users/breuleux/orgs","repos_url":"https://api.github.com/users/breuleux/repos","events_url":"https://api.github.com/users/breuleux/events{/privacy}","received_events_url":"https://api.github.com/users/breuleux/received_events","type":"User","site_admin":false},"html_url":"https://github.com/breuleux/myia","description":"Myia prototyping","fork":true,"url":"https://api.github.com/repos/breuleux/myia","forks_url":"https://api.github.com/repos/breuleux/myia/forks","keys_url":"https://api.github.com/repos/breuleux/myia/keys{/key_id}","collaborators_url":"https://api.github.com/repos/breuleux/myia/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/breuleux/myia/teams","hooks_url":"https://api.github.com/repos/breuleux/myia/hooks","issue_events_url":"https://api.github.com/repos/breuleux/myia/issues/events{/number}","events_url":"https://api.github.com/repos/breuleux/myia/events","assignees_url":"https://api.github.com/repos/breuleux/myia/assignees{/user}","branches_url":"https://api.github.com/repos/breuleux/myia/branches{/branch}","tags_url":"https://api.github.com/repos/breuleux/myia/tags","blobs_url":"https://api.github.com/repos/breuleux/myia/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/breuleux/myia/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/breuleux/myia/git/refs{/sha}","trees_url":"https://api.github.com/repos/breuleux/myia/git/trees{/sha}","statuses_url":"https://api.github.com/repos/breuleux/myia/statuses/{sha}","languages_url":"https://api.github.com/repos/breuleux/myia/languages","stargazers_url":"https://api.github.com/repos/breuleux/myia/stargazers","contributors_url":"https://api.github.com/repos/breuleux/myia/contributors","subscribers_url":"https://api.github.com/repos/breuleux/myia/subscribers","subscription_url":"https://api.github.com/repos/breuleux/myia/subscription","commits_url":"https://api.github.com/repos/breuleux/myia/commits{/sha}","git_commits_url":"https://api.github.com/repos/breuleux/myia/git/commits{/sha}","comments_url":"https://api.github.com/repos/breuleux/myia/comments{/number}","issue_comment_url":"https://api.github.com/repos/breuleux/myia/issues/comments{/number}","contents_url":"https://api.github.com/repos/breuleux/myia/contents/{+path}","compare_url":"https://api.github.com/repos/breuleux/myia/compare/{base}...{head}","merges_url":"https://api.github.com/repos/breuleux/myia/merges","archive_url":"https://api.github.com/repos/breuleux/myia/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/breuleux/myia/downloads","issues_url":"https://api.github.com/repos/breuleux/myia/issues{/number}","pulls_url":"https://api.github.com/repos/breuleux/myia/pulls{/number}","milestones_url":"https://api.github.com/repos/breuleux/myia/milestones{/number}","notifications_url":"https://api.github.com/repos/breuleux/myia/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/breuleux/myia/labels{/name}","releases_url":"https://api.github.com/repos/breuleux/myia/releases{/id}","deployments_url":"https://api.github.com/repos/breuleux/myia/deployments","created_at":"2018-02-08T18:27:29Z","updated_at":"2018-07-24T18:38:10Z","pushed_at":"2018-10-26T21:55:19Z","git_url":"git://github.com/breuleux/myia.git","ssh_url":"git@github.com:breuleux/myia.git","clone_url":"https://github.com/breuleux/myia.git","svn_url":"https://github.com/breuleux/myia","homepage":null,"size":1123,"stargazers_count":0,"watchers_count":0,"language":"Python","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":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"gradient_transform"}},"base":{"label":"mila-udem:master","ref":"master","sha":"c741d3c8a6efb77a0b6feb885b5e2040abc69ecc","user":{"login":"mila-udem","id":11724251,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNzI0MjUx","avatar_url":"https://avatars0.githubusercontent.com/u/11724251?v=4","gravatar_id":"","url":"https://api.github.com/users/mila-udem","html_url":"https://github.com/mila-udem","followers_url":"https://api.github.com/users/mila-udem/followers","following_url":"https://api.github.com/users/mila-udem/following{/other_user}","gists_url":"https://api.github.com/users/mila-udem/gists{/gist_id}","starred_url":"https://api.github.com/users/mila-udem/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mila-udem/subscriptions","organizations_url":"https://api.github.com/users/mila-udem/orgs","repos_url":"https://api.github.com/users/mila-udem/repos","events_url":"https://api.github.com/users/mila-udem/events{/privacy}","received_events_url":"https://api.github.com/users/mila-udem/received_events","type":"Organization","site_admin":false},"repo":{"id":104973687,"node_id":"MDEwOlJlcG9zaXRvcnkxMDQ5NzM2ODc=","name":"myia","full_name":"mila-udem/myia","private":false,"owner":{"login":"mila-udem","id":11724251,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNzI0MjUx","avatar_url":"https://avatars0.githubusercontent.com/u/11724251?v=4","gravatar_id":"","url":"https://api.github.com/users/mila-udem","html_url":"https://github.com/mila-udem","followers_url":"https://api.github.com/users/mila-udem/followers","following_url":"https://api.github.com/users/mila-udem/following{/other_user}","gists_url":"https://api.github.com/users/mila-udem/gists{/gist_id}","starred_url":"https://api.github.com/users/mila-udem/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mila-udem/subscriptions","organizations_url":"https://api.github.com/users/mila-udem/orgs","repos_url":"https://api.github.com/users/mila-udem/repos","events_url":"https://api.github.com/users/mila-udem/events{/privacy}","received_events_url":"https://api.github.com/users/mila-udem/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/mila-udem/myia","description":"Myia prototyping","fork":false,"url":"https://api.github.com/repos/mila-udem/myia","forks_url":"https://api.github.com/repos/mila-udem/myia/forks","keys_url":"https://api.github.com/repos/mila-udem/myia/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mila-udem/myia/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mila-udem/myia/teams","hooks_url":"https://api.github.com/repos/mila-udem/myia/hooks","issue_events_url":"https://api.github.com/repos/mila-udem/myia/issues/events{/number}","events_url":"https://api.github.com/repos/mila-udem/myia/events","assignees_url":"https://api.github.com/repos/mila-udem/myia/assignees{/user}","branches_url":"https://api.github.com/repos/mila-udem/myia/branches{/branch}","tags_url":"https://api.github.com/repos/mila-udem/myia/tags","blobs_url":"https://api.github.com/repos/mila-udem/myia/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mila-udem/myia/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mila-udem/myia/git/refs{/sha}","trees_url":"https://api.github.com/repos/mila-udem/myia/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mila-udem/myia/statuses/{sha}","languages_url":"https://api.github.com/repos/mila-udem/myia/languages","stargazers_url":"https://api.github.com/repos/mila-udem/myia/stargazers","contributors_url":"https://api.github.com/repos/mila-udem/myia/contributors","subscribers_url":"https://api.github.com/repos/mila-udem/myia/subscribers","subscription_url":"https://api.github.com/repos/mila-udem/myia/subscription","commits_url":"https://api.github.com/repos/mila-udem/myia/commits{/sha}","git_commits_url":"https://api.github.com/repos/mila-udem/myia/git/commits{/sha}","comments_url":"https://api.github.com/repos/mila-udem/myia/comments{/number}","issue_comment_url":"https://api.github.com/repos/mila-udem/myia/issues/comments{/number}","contents_url":"https://api.github.com/repos/mila-udem/myia/contents/{+path}","compare_url":"https://api.github.com/repos/mila-udem/myia/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mila-udem/myia/merges","archive_url":"https://api.github.com/repos/mila-udem/myia/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mila-udem/myia/downloads","issues_url":"https://api.github.com/repos/mila-udem/myia/issues{/number}","pulls_url":"https://api.github.com/repos/mila-udem/myia/pulls{/number}","milestones_url":"https://api.github.com/repos/mila-udem/myia/milestones{/number}","notifications_url":"https://api.github.com/repos/mila-udem/myia/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mila-udem/myia/labels{/name}","releases_url":"https://api.github.com/repos/mila-udem/myia/releases{/id}","deployments_url":"https://api.github.com/repos/mila-udem/myia/deployments","created_at":"2017-09-27T04:56:56Z","updated_at":"2018-10-25T21:38:26Z","pushed_at":"2018-10-26T21:55:21Z","git_url":"git://github.com/mila-udem/myia.git","ssh_url":"git@github.com:mila-udem/myia.git","clone_url":"https://github.com/mila-udem/myia.git","svn_url":"https://github.com/mila-udem/myia","homepage":null,"size":1270,"stargazers_count":146,"watchers_count":146,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":22,"mirror_url":null,"archived":false,"open_issues_count":11,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":22,"open_issues":11,"watchers":146,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mila-udem/myia/pulls/135"},"html":{"href":"https://github.com/mila-udem/myia/pull/135"},"issue":{"href":"https://api.github.com/repos/mila-udem/myia/issues/135"},"comments":{"href":"https://api.github.com/repos/mila-udem/myia/issues/135/comments"},"review_comments":{"href":"https://api.github.com/repos/mila-udem/myia/pulls/135/comments"},"review_comment":{"href":"https://api.github.com/repos/mila-udem/myia/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mila-udem/myia/pulls/135/commits"},"statuses":{"href":"https://api.github.com/repos/mila-udem/myia/statuses/d6ecfe83d8e0f8eb7c0e0c416ac57542744202ea"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"breuleux"}}