{"action":"created","comment":{"url":"https://api.github.com/repos/uber/pyro/pulls/comments/215108461","pull_request_review_id":152301268,"id":215108461,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNTEwODQ2MQ==","diff_hunk":"@@ -1,15 +1,126 @@\n import warnings\n+from collections import OrderedDict  # noqa: F401  # for docstrings\n+from functools import partial\n import torch\n from torch.nn.functional import softplus\n-import numpy as np\n+from torch.distributions import constraints\n+from torch.distributions.transforms import AffineTransform, SigmoidTransform\n \n import pyro\n import pyro.distributions as dist\n+from pyro.contrib.oed.util import rmv\n \n \n-def bayesian_linear_model(design, w_means=None, w_sqrtlambdas=None, obs_sd=None,\n+def known_covariance_linear_model(coef_mean, coef_sd, observation_sd,\n+                                  coef_label=\"w\", observation_label=\"y\"):\n+    model = partial(bayesian_linear_model,\n+                    w_means={coef_label: coef_mean},\n+                    w_sqrtlambdas={coef_label: 1./(observation_sd*coef_sd)},\n+                    obs_sd=observation_sd,\n+                    response_label=observation_label)\n+    # For testing, add these\n+    model.obs_sd = observation_sd\n+    model.w_sds = {coef_label: coef_sd}\n+    return model\n+\n+\n+def normal_guide(observation_sd, coef_shape, coef_label=\"w\"):\n+    return partial(normal_inv_gamma_family_guide,\n+                   obs_sd=observation_sd,\n+                   w_sizes={coef_label: coef_shape})\n+\n+\n+def group_linear_model(coef1_mean, coef1_sd, coef2_mean, coef2_sd, observation_sd,\n+                       coef1_label=\"w1\", coef2_label=\"w2\", observation_label=\"y\"):\n+    model = partial(\n+        bayesian_linear_model, w_means={coef1_label: coef1_mean, coef2_label: coef2_mean},\n+        w_sqrtlambdas={coef1_label: 1./(observation_sd*coef1_sd), coef2_label: 1./(observation_sd*coef2_sd)},\n+        obs_sd=observation_sd, response_label=observation_label)\n+    model.obs_sd = observation_sd\n+    model.w_sds = {coef1_label: coef1_sd, coef2_label: coef2_sd}\n+    return model\n+\n+\n+def group_normal_guide(observation_sd, coef1_shape, coef2_shape,\n+                       coef1_label=\"w1\", coef2_label=\"w2\"):\n+    return partial(\n+        normal_inv_gamma_family_guide, w_sizes={coef1_label: coef1_shape, coef2_label: coef2_shape},\n+        obs_sd=observation_sd)\n+\n+\n+def zero_mean_unit_obs_sd_lm(coef_sd, coef_label=\"w\"):\n+    model = known_covariance_linear_model(torch.tensor(0.), coef_sd, torch.tensor(1.), coef_label=coef_label)\n+    guide = normal_guide(torch.tensor(1.), coef_sd.shape, coef_label=coef_label)\n+    return model, guide\n+\n+\n+def normal_inverse_gamma_linear_model(coef_mean, coef_sqrtlambda, alpha,\n+                                      beta, coef_label=\"w\",\n+                                      observation_label=\"y\"):\n+    return partial(bayesian_linear_model,\n+                   w_means={coef_label: coef_mean},\n+                   w_sqrtlambdas={coef_label: coef_sqrtlambda},\n+                   alpha_0=alpha, beta_0=beta,\n+                   response_label=observation_label)\n+\n+\n+def normal_inverse_gamma_guide(coef_shape, coef_label=\"w\", **kwargs):\n+    return partial(normal_inv_gamma_family_guide, obs_sd=None, w_sizes={coef_label: coef_shape}, **kwargs)\n+\n+\n+def logistic_regression_model(coef_mean, coef_sd, coef_label=\"w\", observation_label=\"y\"):\n+    return partial(bayesian_linear_model,\n+                   w_means={coef_label: coef_mean},\n+                   w_sqrtlambdas={coef_label: 1./coef_sd},\n+                   obs_sd=torch.tensor(1.),\n+                   response=\"bernoulli\",\n+                   response_label=observation_label)\n+\n+\n+def lmer_model(fixed_effects_sd, n_groups, random_effects_alpha, random_effects_beta,\n+               fixed_effects_label=\"w\", random_effects_label=\"u\", observation_label=\"y\",\n+               response=\"normal\"):\n+    return partial(bayesian_linear_model,\n+                   w_means={fixed_effects_label: torch.tensor(0.)},\n+                   w_sqrtlambdas={fixed_effects_label: 1./fixed_effects_sd},\n+                   obs_sd=torch.tensor(1.),\n+                   re_group_sizes={random_effects_label: n_groups},\n+                   re_alphas={random_effects_label: random_effects_alpha},\n+                   re_betas={random_effects_label: random_effects_beta},\n+                   response=response,\n+                   response_label=observation_label)\n+\n+\n+def sigmoid_model(coef1_mean, coef1_sd, coef2_mean, coef2_sd, observation_sd,\n+                  sigmoid_alpha, sigmoid_beta, sigmoid_design,\n+                  coef1_label=\"w1\", coef2_label=\"w2\", observation_label=\"y\",\n+                  sigmoid_label=\"k\"):\n+\n+    def model(design):\n+        batch_shape = design.shape[:-2]\n+        k_shape = batch_shape + (sigmoid_design.shape[-1],)\n+        k = pyro.sample(sigmoid_label,\n+                        dist.Gamma(sigmoid_alpha.expand(k_shape),\n+                                   sigmoid_beta.expand(k_shape)).independent(1))","path":"examples/contrib/oed/models/bayes_linear.py","position":106,"original_position":106,"commit_id":"0d90ec3aa257fbd318b063087598b9a5eec29229","original_commit_id":"0d90ec3aa257fbd318b063087598b9a5eec29229","user":{"login":"ae-foster","id":6099494,"node_id":"MDQ6VXNlcjYwOTk0OTQ=","avatar_url":"https://avatars3.githubusercontent.com/u/6099494?v=4","gravatar_id":"","url":"https://api.github.com/users/ae-foster","html_url":"https://github.com/ae-foster","followers_url":"https://api.github.com/users/ae-foster/followers","following_url":"https://api.github.com/users/ae-foster/following{/other_user}","gists_url":"https://api.github.com/users/ae-foster/gists{/gist_id}","starred_url":"https://api.github.com/users/ae-foster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ae-foster/subscriptions","organizations_url":"https://api.github.com/users/ae-foster/orgs","repos_url":"https://api.github.com/users/ae-foster/repos","events_url":"https://api.github.com/users/ae-foster/events{/privacy}","received_events_url":"https://api.github.com/users/ae-foster/received_events","type":"User","site_admin":false},"body":"In this sigmoid model, the random slope has a Gamma distribution. Could easily add a different one and use `bayesian_linear_model` to do the rest","created_at":"2018-09-05T00:51:16Z","updated_at":"2018-09-05T00:57:55Z","html_url":"https://github.com/uber/pyro/pull/1361#discussion_r215108461","pull_request_url":"https://api.github.com/repos/uber/pyro/pulls/1361","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/uber/pyro/pulls/comments/215108461"},"html":{"href":"https://github.com/uber/pyro/pull/1361#discussion_r215108461"},"pull_request":{"href":"https://api.github.com/repos/uber/pyro/pulls/1361"}}},"pull_request":{"url":"https://api.github.com/repos/uber/pyro/pulls/1361","id":213107375,"node_id":"MDExOlB1bGxSZXF1ZXN0MjEzMTA3Mzc1","html_url":"https://github.com/uber/pyro/pull/1361","diff_url":"https://github.com/uber/pyro/pull/1361.diff","patch_url":"https://github.com/uber/pyro/pull/1361.patch","issue_url":"https://api.github.com/repos/uber/pyro/issues/1361","number":1361,"state":"open","locked":false,"title":"Barber-Agakov, and OED refactoring","user":{"login":"ae-foster","id":6099494,"node_id":"MDQ6VXNlcjYwOTk0OTQ=","avatar_url":"https://avatars3.githubusercontent.com/u/6099494?v=4","gravatar_id":"","url":"https://api.github.com/users/ae-foster","html_url":"https://github.com/ae-foster","followers_url":"https://api.github.com/users/ae-foster/followers","following_url":"https://api.github.com/users/ae-foster/following{/other_user}","gists_url":"https://api.github.com/users/ae-foster/gists{/gist_id}","starred_url":"https://api.github.com/users/ae-foster/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ae-foster/subscriptions","organizations_url":"https://api.github.com/users/ae-foster/orgs","repos_url":"https://api.github.com/users/ae-foster/repos","events_url":"https://api.github.com/users/ae-foster/events{/privacy}","received_events_url":"https://api.github.com/users/ae-foster/received_events","type":"User","site_admin":false},"body":"New:\r\n - Barber-Agakov estimator of EIG\r\n - models and guides for sigmoid link function linear model\r\n\r\nRefactored:\r\n - consistent API for different EIG estimators\r\n - improved code re-use in guides\r\n - extended support of EIG estimators: include integrating out random effects, supporting lists of variable names as well as single names","created_at":"2018-09-04T21:21:03Z","updated_at":"2018-09-05T00:57:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"14a4f46727bba40cc9dca6eee347baab1b374566","assignee":null,"assignees":[],"requested_reviewers":[{"login":"eb8680","id":2032320,"node_id":"MDQ6VXNlcjIwMzIzMjA=","avatar_url":"https://avatars0.githubusercontent.com/u/2032320?v=4","gravatar_id":"","url":"https://api.github.com/users/eb8680","html_url":"https://github.com/eb8680","followers_url":"https://api.github.com/users/eb8680/followers","following_url":"https://api.github.com/users/eb8680/following{/other_user}","gists_url":"https://api.github.com/users/eb8680/gists{/gist_id}","starred_url":"https://api.github.com/users/eb8680/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eb8680/subscriptions","organizations_url":"https://api.github.com/users/eb8680/orgs","repos_url":"https://api.github.com/users/eb8680/repos","events_url":"https://api.github.com/users/eb8680/events{/privacy}","received_events_url":"https://api.github.com/users/eb8680/received_events","type":"User","site_admin":false},{"login":"martinjankowiak","id":22105218,"node_id":"MDQ6VXNlcjIyMTA1MjE4","avatar_url":"https://avatars1.githubusercontent.com/u/22105218?v=4","gravatar_id":"","url":"https://api.github.com/users/martinjankowiak","html_url":"https://github.com/martinjankowiak","followers_url":"https://api.github.com/users/martinjankowiak/followers","following_url":"https://api.github.com/users/martinjankowiak/following{/other_user}","gists_url":"https://api.github.com/users/martinjankowiak/gists{/gist_id}","starred_url":"https://api.github.com/users/martinjankowiak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/martinjankowiak/subscriptions","organizations_url":"https://api.github.com/users/martinjankowiak/orgs","repos_url":"https://api.github.com/users/martinjankowiak/repos","events_url":"https://api.github.com/users/martinjankowiak/events{/privacy}","received_events_url":"https://api.github.com/users/martinjankowiak/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":704871691,"node_id":"MDU6TGFiZWw3MDQ4NzE2OTE=","url":"https://api.github.com/repos/uber/pyro/labels/awaiting%20review","name":"awaiting review","color":"fbca04","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/uber/pyro/pulls/1361/commits","review_comments_url":"https://api.github.com/repos/uber/pyro/pulls/1361/comments","review_comment_url":"https://api.github.com/repos/uber/pyro/pulls/comments{/number}","comments_url":"https://api.github.com/repos/uber/pyro/issues/1361/comments","statuses_url":"https://api.github.com/repos/uber/pyro/statuses/0d90ec3aa257fbd318b063087598b9a5eec29229","head":{"label":"uber:barber-agakov","ref":"barber-agakov","sha":"0d90ec3aa257fbd318b063087598b9a5eec29229","user":{"login":"uber","id":538264,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUzODI2NA==","avatar_url":"https://avatars3.githubusercontent.com/u/538264?v=4","gravatar_id":"","url":"https://api.github.com/users/uber","html_url":"https://github.com/uber","followers_url":"https://api.github.com/users/uber/followers","following_url":"https://api.github.com/users/uber/following{/other_user}","gists_url":"https://api.github.com/users/uber/gists{/gist_id}","starred_url":"https://api.github.com/users/uber/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/uber/subscriptions","organizations_url":"https://api.github.com/users/uber/orgs","repos_url":"https://api.github.com/users/uber/repos","events_url":"https://api.github.com/users/uber/events{/privacy}","received_events_url":"https://api.github.com/users/uber/received_events","type":"Organization","site_admin":false},"repo":{"id":94506832,"node_id":"MDEwOlJlcG9zaXRvcnk5NDUwNjgzMg==","name":"pyro","full_name":"uber/pyro","owner":{"login":"uber","id":538264,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUzODI2NA==","avatar_url":"https://avatars3.githubusercontent.com/u/538264?v=4","gravatar_id":"","url":"https://api.github.com/users/uber","html_url":"https://github.com/uber","followers_url":"https://api.github.com/users/uber/followers","following_url":"https://api.github.com/users/uber/following{/other_user}","gists_url":"https://api.github.com/users/uber/gists{/gist_id}","starred_url":"https://api.github.com/users/uber/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/uber/subscriptions","organizations_url":"https://api.github.com/users/uber/orgs","repos_url":"https://api.github.com/users/uber/repos","events_url":"https://api.github.com/users/uber/events{/privacy}","received_events_url":"https://api.github.com/users/uber/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/uber/pyro","description":"Deep universal probabilistic programming with Python and PyTorch","fork":false,"url":"https://api.github.com/repos/uber/pyro","forks_url":"https://api.github.com/repos/uber/pyro/forks","keys_url":"https://api.github.com/repos/uber/pyro/keys{/key_id}","collaborators_url":"https://api.github.com/repos/uber/pyro/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/uber/pyro/teams","hooks_url":"https://api.github.com/repos/uber/pyro/hooks","issue_events_url":"https://api.github.com/repos/uber/pyro/issues/events{/number}","events_url":"https://api.github.com/repos/uber/pyro/events","assignees_url":"https://api.github.com/repos/uber/pyro/assignees{/user}","branches_url":"https://api.github.com/repos/uber/pyro/branches{/branch}","tags_url":"https://api.github.com/repos/uber/pyro/tags","blobs_url":"https://api.github.com/repos/uber/pyro/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/uber/pyro/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/uber/pyro/git/refs{/sha}","trees_url":"https://api.github.com/repos/uber/pyro/git/trees{/sha}","statuses_url":"https://api.github.com/repos/uber/pyro/statuses/{sha}","languages_url":"https://api.github.com/repos/uber/pyro/languages","stargazers_url":"https://api.github.com/repos/uber/pyro/stargazers","contributors_url":"https://api.github.com/repos/uber/pyro/contributors","subscribers_url":"https://api.github.com/repos/uber/pyro/subscribers","subscription_url":"https://api.github.com/repos/uber/pyro/subscription","commits_url":"https://api.github.com/repos/uber/pyro/commits{/sha}","git_commits_url":"https://api.github.com/repos/uber/pyro/git/commits{/sha}","comments_url":"https://api.github.com/repos/uber/pyro/comments{/number}","issue_comment_url":"https://api.github.com/repos/uber/pyro/issues/comments{/number}","contents_url":"https://api.github.com/repos/uber/pyro/contents/{+path}","compare_url":"https://api.github.com/repos/uber/pyro/compare/{base}...{head}","merges_url":"https://api.github.com/repos/uber/pyro/merges","archive_url":"https://api.github.com/repos/uber/pyro/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/uber/pyro/downloads","issues_url":"https://api.github.com/repos/uber/pyro/issues{/number}","pulls_url":"https://api.github.com/repos/uber/pyro/pulls{/number}","milestones_url":"https://api.github.com/repos/uber/pyro/milestones{/number}","notifications_url":"https://api.github.com/repos/uber/pyro/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/uber/pyro/labels{/name}","releases_url":"https://api.github.com/repos/uber/pyro/releases{/id}","deployments_url":"https://api.github.com/repos/uber/pyro/deployments","created_at":"2017-06-16T05:03:47Z","updated_at":"2018-09-05T00:51:56Z","pushed_at":"2018-09-04T23:21:19Z","git_url":"git://github.com/uber/pyro.git","ssh_url":"git@github.com:uber/pyro.git","clone_url":"https://github.com/uber/pyro.git","svn_url":"https://github.com/uber/pyro","homepage":"http://pyro.ai","size":64415,"stargazers_count":4093,"watchers_count":4093,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":421,"mirror_url":null,"archived":false,"open_issues_count":73,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":421,"open_issues":73,"watchers":4093,"default_branch":"dev"}},"base":{"label":"uber:dev","ref":"dev","sha":"8bd9a8a8625a12bdf831ce24aaacae645c72a2b2","user":{"login":"uber","id":538264,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUzODI2NA==","avatar_url":"https://avatars3.githubusercontent.com/u/538264?v=4","gravatar_id":"","url":"https://api.github.com/users/uber","html_url":"https://github.com/uber","followers_url":"https://api.github.com/users/uber/followers","following_url":"https://api.github.com/users/uber/following{/other_user}","gists_url":"https://api.github.com/users/uber/gists{/gist_id}","starred_url":"https://api.github.com/users/uber/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/uber/subscriptions","organizations_url":"https://api.github.com/users/uber/orgs","repos_url":"https://api.github.com/users/uber/repos","events_url":"https://api.github.com/users/uber/events{/privacy}","received_events_url":"https://api.github.com/users/uber/received_events","type":"Organization","site_admin":false},"repo":{"id":94506832,"node_id":"MDEwOlJlcG9zaXRvcnk5NDUwNjgzMg==","name":"pyro","full_name":"uber/pyro","owner":{"login":"uber","id":538264,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUzODI2NA==","avatar_url":"https://avatars3.githubusercontent.com/u/538264?v=4","gravatar_id":"","url":"https://api.github.com/users/uber","html_url":"https://github.com/uber","followers_url":"https://api.github.com/users/uber/followers","following_url":"https://api.github.com/users/uber/following{/other_user}","gists_url":"https://api.github.com/users/uber/gists{/gist_id}","starred_url":"https://api.github.com/users/uber/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/uber/subscriptions","organizations_url":"https://api.github.com/users/uber/orgs","repos_url":"https://api.github.com/users/uber/repos","events_url":"https://api.github.com/users/uber/events{/privacy}","received_events_url":"https://api.github.com/users/uber/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/uber/pyro","description":"Deep universal probabilistic programming with Python and PyTorch","fork":false,"url":"https://api.github.com/repos/uber/pyro","forks_url":"https://api.github.com/repos/uber/pyro/forks","keys_url":"https://api.github.com/repos/uber/pyro/keys{/key_id}","collaborators_url":"https://api.github.com/repos/uber/pyro/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/uber/pyro/teams","hooks_url":"https://api.github.com/repos/uber/pyro/hooks","issue_events_url":"https://api.github.com/repos/uber/pyro/issues/events{/number}","events_url":"https://api.github.com/repos/uber/pyro/events","assignees_url":"https://api.github.com/repos/uber/pyro/assignees{/user}","branches_url":"https://api.github.com/repos/uber/pyro/branches{/branch}","tags_url":"https://api.github.com/repos/uber/pyro/tags","blobs_url":"https://api.github.com/repos/uber/pyro/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/uber/pyro/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/uber/pyro/git/refs{/sha}","trees_url":"https://api.github.com/repos/uber/pyro/git/trees{/sha}","statuses_url":"https://api.github.com/repos/uber/pyro/statuses/{sha}","languages_url":"https://api.github.com/repos/uber/pyro/languages","stargazers_url":"https://api.github.com/repos/uber/pyro/stargazers","contributors_url":"https://api.github.com/repos/uber/pyro/contributors","subscribers_url":"https://api.github.com/repos/uber/pyro/subscribers","subscription_url":"https://api.github.com/repos/uber/pyro/subscription","commits_url":"https://api.github.com/repos/uber/pyro/commits{/sha}","git_commits_url":"https://api.github.com/repos/uber/pyro/git/commits{/sha}","comments_url":"https://api.github.com/repos/uber/pyro/comments{/number}","issue_comment_url":"https://api.github.com/repos/uber/pyro/issues/comments{/number}","contents_url":"https://api.github.com/repos/uber/pyro/contents/{+path}","compare_url":"https://api.github.com/repos/uber/pyro/compare/{base}...{head}","merges_url":"https://api.github.com/repos/uber/pyro/merges","archive_url":"https://api.github.com/repos/uber/pyro/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/uber/pyro/downloads","issues_url":"https://api.github.com/repos/uber/pyro/issues{/number}","pulls_url":"https://api.github.com/repos/uber/pyro/pulls{/number}","milestones_url":"https://api.github.com/repos/uber/pyro/milestones{/number}","notifications_url":"https://api.github.com/repos/uber/pyro/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/uber/pyro/labels{/name}","releases_url":"https://api.github.com/repos/uber/pyro/releases{/id}","deployments_url":"https://api.github.com/repos/uber/pyro/deployments","created_at":"2017-06-16T05:03:47Z","updated_at":"2018-09-05T00:51:56Z","pushed_at":"2018-09-04T23:21:19Z","git_url":"git://github.com/uber/pyro.git","ssh_url":"git@github.com:uber/pyro.git","clone_url":"https://github.com/uber/pyro.git","svn_url":"https://github.com/uber/pyro","homepage":"http://pyro.ai","size":64415,"stargazers_count":4093,"watchers_count":4093,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":421,"mirror_url":null,"archived":false,"open_issues_count":73,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":421,"open_issues":73,"watchers":4093,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/uber/pyro/pulls/1361"},"html":{"href":"https://github.com/uber/pyro/pull/1361"},"issue":{"href":"https://api.github.com/repos/uber/pyro/issues/1361"},"comments":{"href":"https://api.github.com/repos/uber/pyro/issues/1361/comments"},"review_comments":{"href":"https://api.github.com/repos/uber/pyro/pulls/1361/comments"},"review_comment":{"href":"https://api.github.com/repos/uber/pyro/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/uber/pyro/pulls/1361/commits"},"statuses":{"href":"https://api.github.com/repos/uber/pyro/statuses/0d90ec3aa257fbd318b063087598b9a5eec29229"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"ae-foster"}}