{"action":"created","comment":{"url":"https://api.github.com/repos/allenai/allennlp/pulls/comments/167351095","pull_request_review_id":95568790,"id":167351095,"diff_hunk":"@@ -11,82 +12,149 @@ def setUp(self):\n         test_filename = \"tests/fixtures/data/nlvr/sample_data.jsonl\"\n         data = [json.loads(line)[\"structured_rep\"] for line in open(test_filename).readlines()]\n         self.worlds = [NlvrWorld(rep) for rep in data]\n+        custom_rep = [[{\"y_loc\": 21, \"size\": 20, \"type\": \"triangle\", \"x_loc\": 27, \"color\":\n+                        \"Yellow\"},\n+                       {\"y_loc\": 45, \"size\": 10, \"type\": \"circle\", \"x_loc\": 47, \"color\":\n+                        \"Black\"}],\n+                      [{\"y_loc\": 56, \"size\": 30, \"type\": \"square\", \"x_loc\": 10, \"color\":\n+                        \"#0099ff\"},\n+                       {\"y_loc\": 26, \"size\": 30, \"type\": \"square\", \"x_loc\": 40, \"color\":\n+                        \"Yellow\"}],\n+                      [{\"y_loc\": 40, \"size\": 10, \"type\": \"triangle\", \"x_loc\": 12, \"color\":\n+                        \"#0099ff\"}]]\n+        self.custom_world = NlvrWorld(custom_rep)\n \n     def test_logical_form_with_assert_executes_correctly(self):\n         nlvr_world = self.worlds[0]\n         # Utterance is \"There is a circle closely touching a corner of a box.\" and label is \"True\".\n-        logical_form_true = \"(assert_greater_equals (count (touch_corner (circle (all_objects)))) 1)\"\n+        logical_form_true = \"(object_count_greater_equals (touch_corner (circle (all_objects))) 1)\"\n         # Should evaluate to True.\n         assert nlvr_world.execute(logical_form_true)\n-        logical_form_false = \"(assert_equals (count (touch_corner (circle (all_objects)))) 0)\"\n+        logical_form_false = \"(object_count_equals (touch_corner (circle (all_objects))) 0)\"\n         # Should evaluate to False.\n         assert not nlvr_world.execute(logical_form_false)\n \n-    def test_logical_form_with_filter_executes_correctly(self):\n+    def test_logical_form_with_box_filter_executes_correctly(self):\n         nlvr_world = self.worlds[2]\n         # Utterance is \"There is a box without a blue item.\" and label is \"False\".\n-        logical_form = \"(assert_greater_equals \\\n-                         (count (filter_equals all_boxes (lambda x (count (blue (object_in_box (var x))))) 0)) \\\n-                         1)\"\n+        logical_form = \"(box_exists (member_color_none_equals all_boxes color_blue))\"\n         # Should evaluate to False.\n         assert not nlvr_world.execute(logical_form)\n \n+    def test_logical_form_with_box_filter_within_object_filter_executes_correctly(self):\n+        nlvr_world = self.worlds[2]\n+        # Utterance is \"There are atleast three blue items in boxes with blue items\" and label\n+        # is \"True\".\n+        logical_form = \"(object_count_greater_equals \\\n+                            (object_in_box (member_color_any_equals all_boxes color_blue)) 3)\"\n+        # Should evaluate to True.\n+        assert nlvr_world.execute(logical_form)\n+\n     def test_logical_form_with_same_color_executes_correctly(self):\n         nlvr_world = self.worlds[1]\n-        # Utterance is \"There is exactly one tower with two blocks of the same color.\" and label is \"True\".\n-        logical_form = \"(assert_equals \\\n-                         (count \\\n-                          (filter_equals all_boxes (lambda x (count (same_color (object_in_box (var x))))) 2)) \\\n-                         1)\"\n+        # Utterance is \"There are exactly two blocks of the same color.\" and label is \"True\".\n+        logical_form = \"(object_count_equals (same_color all_objects) 2)\"\n         assert nlvr_world.execute(logical_form)\n \n     def test_logical_form_with_same_shape_executes_correctly(self):\n         nlvr_world = self.worlds[0]\n         # Utterance is \"There are less than three black objects of the same shape\" and label is \"False\".\n-        logical_form = \"(assert_lesser (count (same_shape (black (all_objects)))) 3)\"\n+        logical_form = \"(object_count_lesser (same_shape (black (all_objects))) 3)\"\n         assert not nlvr_world.execute(logical_form)\n \n     def test_logical_form_with_touch_wall_executes_correctly(self):\n         nlvr_world = self.worlds[0]\n         # Utterance is \"There are two black circles touching a wall\" and label is \"False\".\n-        logical_form = \"(assert_greater_equals (count (touch_wall (black (circle (all_objects))))) 2)\"\n+        logical_form = \"(object_count_greater_equals (touch_wall (black (circle (all_objects)))) 2)\"\n         assert not nlvr_world.execute(logical_form)\n \n     def test_logical_form_with_not_executes_correctly(self):\n         nlvr_world = self.worlds[2]\n         # Utterance is \"There are at most two medium triangles not touching a wall.\" and label is \"True\".\n-        logical_form = (\"(assert_lesser_equals (count (negate_filter (touch_wall) \\\n-                                                                     (medium (triangle (all_objects))))) 2)\")\n+        logical_form = (\"(object_count_lesser_equals ((negate_filter touch_wall) \\\n+                                                                     (medium (triangle (all_objects)))) 2)\")\n         assert nlvr_world.execute(logical_form)\n \n     def test_logical_form_with_color_comparison_executes_correctly(self):\n         nlvr_world = self.worlds[0]\n         # Utterance is \"The color of the circle touching the wall is black.\" and label is \"True\".\n-        logical_form = \"(assert_equals (color (circle (touch_wall (all_objects)))) color_black)\"\n+        logical_form = \"(object_color_all_equals (circle (touch_wall (all_objects))) color_black)\"\n         assert nlvr_world.execute(logical_form)\n \n     def test_logical_form_with_object_filter_returns_correct_action_sequence(self):\n         nlvr_world = self.worlds[0]\n-        logical_form = \"(assert_equals (color (circle (touch_wall (all_objects)))) color_black)\"\n+        logical_form = \"(object_color_all_equals (circle (touch_wall (all_objects))) color_black)\"\n         expression = nlvr_world.parse_logical_form(logical_form)\n         action_sequence = nlvr_world.get_action_sequence(expression)\n-        assert action_sequence == ['@START@ -> t', 't -> [<c,t>, c]', '<c,t> -> [<#1,<#1,t>>, c]',\n-                                   '<#1,<#1,t>> -> assert_equals', 'c -> [<o,c>, o]', '<o,c> -> color',\n-                                   'o -> [<o,o>, o]', '<o,o> -> circle', 'o -> [<o,o>, o]',\n-                                   '<o,o> -> touch_wall', 'o -> all_objects', 'c -> color_black']\n+        assert action_sequence == ['@START@ -> t', 't -> [<c,t>, c]', '<c,t> -> [<o,<c,t>>, o]',\n+                                   '<o,<c,t>> -> object_color_all_equals', 'o -> [<o,o>, o]',\n+                                   '<o,o> -> circle', 'o -> [<o,o>, o]', '<o,o> -> touch_wall',\n+                                   'o -> all_objects', 'c -> color_black']\n \n     def test_logical_form_with_box_filter_returns_correct_action_sequence(self):\n         nlvr_world = self.worlds[0]\n-        logical_form = (\"(assert_greater_equals \\\n-                          (count (filter_equals all_boxes (lambda x (count (blue (object_in_box (var (x)))))) 0)) \\\n-                          1)\")\n-        expression = nlvr_world.parse_logical_form(logical_form, remove_var_function=False)\n+        logical_form = \"(box_exists (member_color_none_equals all_boxes color_blue))\"\n+        expression = nlvr_world.parse_logical_form(logical_form)\n         action_sequence = nlvr_world.get_action_sequence(expression)\n-        assert action_sequence == ['@START@ -> t', 't -> [<e,t>, e]', '<e,t> -> [<e,<e,t>>, e]',\n-                                   '<e,<e,t>> -> assert_greater_equals', 'e -> [<#1,e>, b]', '<#1,e> -> count',\n-                                   'b -> [<e,b>, e]', '<e,b> -> [<<b,e>,<e,b>>, <b,e>]',\n-                                   '<<b,e>,<e,b>> -> [<b,<<b,#1>,<#1,b>>>, b]',\n-                                   '<b,<<b,#1>,<#1,b>>> -> filter_equals', 'b -> all_boxes',\n-                                   \"<b,e> -> ['lambda x', e]\", 'e -> [<#1,e>, o]', '<#1,e> -> count',\n-                                   'o -> [<o,o>, o]', '<o,o> -> blue', 'o -> [<b,o>, b]', '<b,o> -> object_in_box',\n-                                   'b -> [<#1,#1>, b]', '<#1,#1> -> var', 'b -> x', 'e -> 0', 'e -> 1']\n+        assert action_sequence == ['@START@ -> t', 't -> [<b,t>, b]', '<b,t> -> box_exists',\n+                                   'b -> [<c,b>, c]', '<c,b> -> [<b,<c,b>>, b]',\n+                                   '<b,<c,b>> -> member_color_none_equals', 'b -> all_boxes',\n+                                   'c -> color_blue']\n+\n+    def test_spatial_relations_return_objects_in_the_same_box(self):\n+        # \"above\", \"below\", \"top\", \"bottom\" are relations defined only for objects within the same\n+        # box. So they should not return objects from other boxes.\n+        world = self.custom_world\n+        # Asserting that the color of the objects above the yellow triangle is only black (it is not\n+        # yellow or blue, which are colors of objects from other boxes)\n+        assert world.execute(\"(object_color_all_equals (above (yellow (triangle all_objects)))\"\n+                             \" color_black)\")\n+        # Asserting that the only shape below the blue square is a square.\n+        assert world.execute(\"(object_shape_all_equals (below (blue (square all_objects)))\"\n+                             \" shape_square)\")\n+        # Asserting the shape of the object at the bottom in the box with a circle is triangle.\n+        assert world.execute(\"(object_shape_all_equals (bottom (object_in_box\"\n+                             \" (member_shape_any_equals all_boxes shape_circle))) shape_triangle)\")\n+\n+        # Asserting the shape of the object at the top of the box with all squares is a square (!).\n+        assert world.execute(\"(object_shape_all_equals (top (object_in_box\"\n+                             \" (member_shape_all_equals all_boxes shape_square))) shape_square)\")\n+\n+    def test_touch_object_executes_correctly(self):\n+        world = self.custom_world\n+        # Assert that there is a yellow square touching a blue square.\n+        assert world.execute(\"(object_exists\"\n+                             \" (yellow (square (touch_object (blue (square all_objects))))))\")\n+        # Assert that the triangle does not touch the circle (they are out of vertical range).\n+        assert world.execute(\"(object_shape_none_equals (touch_object (triangle all_objects))\"\n+                             \" shape_circle)\")\n+\n+    def test_spatial_relations_with_objects_from_different_boxes(self):\n+        # When the objects are from different boxes, top and bottom should return objects from\n+        # respective boxes.\n+        world = self.custom_world\n+        # There are triangles in two boxes, so top should return the top objects from both boxes.\n+        assert world.execute(\"(object_count_equals (top (object_in_box (member_shape_any_equals \"\n+                             \"all_boxes shape_triangle))) 2)\")\n+\n+    def test_count_with_all_equals_throws_execution_error(self):\n+        world = self.custom_world\n+        with self.assertRaises(ExecutionError):\n+            world.execute(\"(object_count_all_equals (top (object_in_box (member_shape_any_equals \"\n+                          \"all_boxes shape_triangle))) 2)\")\n+\n+    def test_shape_with_equals_throws_execution_error(self):\n+        world = self.custom_world\n+        with self.assertRaises(ExecutionError):","path":"tests/data/semparse/worlds/nlvr_world_test.py","position":148,"original_position":178,"commit_id":"05c2b048f9659aeeb637874c8a4d51ae798e73e1","original_commit_id":"05c2b048f9659aeeb637874c8a4d51ae798e73e1","user":{"login":"pdasigi","id":3508113,"avatar_url":"https://avatars2.githubusercontent.com/u/3508113?v=4","gravatar_id":"","url":"https://api.github.com/users/pdasigi","html_url":"https://github.com/pdasigi","followers_url":"https://api.github.com/users/pdasigi/followers","following_url":"https://api.github.com/users/pdasigi/following{/other_user}","gists_url":"https://api.github.com/users/pdasigi/gists{/gist_id}","starred_url":"https://api.github.com/users/pdasigi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pdasigi/subscriptions","organizations_url":"https://api.github.com/users/pdasigi/orgs","repos_url":"https://api.github.com/users/pdasigi/repos","events_url":"https://api.github.com/users/pdasigi/events{/privacy}","received_events_url":"https://api.github.com/users/pdasigi/received_events","type":"User","site_admin":false},"body":"Added a comment here too.","created_at":"2018-02-09T21:31:15Z","updated_at":"2018-02-09T21:31:15Z","html_url":"https://github.com/allenai/allennlp/pull/789#discussion_r167351095","pull_request_url":"https://api.github.com/repos/allenai/allennlp/pulls/789","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/allenai/allennlp/pulls/comments/167351095"},"html":{"href":"https://github.com/allenai/allennlp/pull/789#discussion_r167351095"},"pull_request":{"href":"https://api.github.com/repos/allenai/allennlp/pulls/789"}},"in_reply_to_id":167071664},"pull_request":{"url":"https://api.github.com/repos/allenai/allennlp/pulls/789","id":167573473,"html_url":"https://github.com/allenai/allennlp/pull/789","diff_url":"https://github.com/allenai/allennlp/pull/789.diff","patch_url":"https://github.com/allenai/allennlp/pull/789.patch","issue_url":"https://api.github.com/repos/allenai/allennlp/issues/789","number":789,"state":"open","locked":false,"title":"NLVR language fixes","user":{"login":"pdasigi","id":3508113,"avatar_url":"https://avatars2.githubusercontent.com/u/3508113?v=4","gravatar_id":"","url":"https://api.github.com/users/pdasigi","html_url":"https://github.com/pdasigi","followers_url":"https://api.github.com/users/pdasigi/followers","following_url":"https://api.github.com/users/pdasigi/following{/other_user}","gists_url":"https://api.github.com/users/pdasigi/gists{/gist_id}","starred_url":"https://api.github.com/users/pdasigi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pdasigi/subscriptions","organizations_url":"https://api.github.com/users/pdasigi/orgs","repos_url":"https://api.github.com/users/pdasigi/repos","events_url":"https://api.github.com/users/pdasigi/events{/privacy}","received_events_url":"https://api.github.com/users/pdasigi/received_events","type":"User","site_admin":false},"body":"This PR includes several changes to the NLVR language:\r\n1) I removed lambda functions from the language. This made the box filters less expressive, but the output space is more restricted. The reduced expressivity is not really a problem though. I tried to annotate a random set of 25 sentences, of which I could not annotate only 2 due to the lack of lambdas.\r\n2) I converted each function that had placeholder types into multiple functions where the types of the arguments are unique. This increased the number of terminals, but the grammar now disallows unintended argument types that placeholders earlier allowed.\r\n3) Related to the above change, I removed the attribute functions: \"count\", \"color\" and \"shape\", and pulled them into the assertion and filtering functions. This again increased the number of terminals, but the grammar now requires that the first argument of assertions and filters be sets of entities , and the last arguments be constants. Due to this change, the grammar disallows  trivial contradictions or tautologies like `(assert_greater 3 2)`, and ensures that one of the arguments is really a constant (earlier the decoder was also generating logical forms like `(assert_greater (count (object_in_box all_boxes)) (count (color (object_in_box all_boxes))))`).\r\n\r\nAfter these changes, the number of terminal productions went up from 56 to 101, but the number of non-terminals went down from 48 to 26, and the total number of productions remained unchanged at 121. The average branching factor (number of productions per non-terminal) went up from 2.5 to 4.6, and the maximum branching factor is unchanged at 23 (due to object filtering functions like `square`, `above`, `yellow` etc.). When trained on 1000 questions, all the logical forms produced by the decoder, both during training and validation were valid executable sequences.","created_at":"2018-02-07T01:12:20Z","updated_at":"2018-02-09T21:31:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4ce745d9c9976fc3419dba04ea1cc71e952f7a15","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/allenai/allennlp/pulls/789/commits","review_comments_url":"https://api.github.com/repos/allenai/allennlp/pulls/789/comments","review_comment_url":"https://api.github.com/repos/allenai/allennlp/pulls/comments{/number}","comments_url":"https://api.github.com/repos/allenai/allennlp/issues/789/comments","statuses_url":"https://api.github.com/repos/allenai/allennlp/statuses/05c2b048f9659aeeb637874c8a4d51ae798e73e1","head":{"label":"pdasigi:nlvr_language_fixes","ref":"nlvr_language_fixes","sha":"05c2b048f9659aeeb637874c8a4d51ae798e73e1","user":{"login":"pdasigi","id":3508113,"avatar_url":"https://avatars2.githubusercontent.com/u/3508113?v=4","gravatar_id":"","url":"https://api.github.com/users/pdasigi","html_url":"https://github.com/pdasigi","followers_url":"https://api.github.com/users/pdasigi/followers","following_url":"https://api.github.com/users/pdasigi/following{/other_user}","gists_url":"https://api.github.com/users/pdasigi/gists{/gist_id}","starred_url":"https://api.github.com/users/pdasigi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pdasigi/subscriptions","organizations_url":"https://api.github.com/users/pdasigi/orgs","repos_url":"https://api.github.com/users/pdasigi/repos","events_url":"https://api.github.com/users/pdasigi/events{/privacy}","received_events_url":"https://api.github.com/users/pdasigi/received_events","type":"User","site_admin":false},"repo":{"id":101232158,"name":"allennlp","full_name":"pdasigi/allennlp","owner":{"login":"pdasigi","id":3508113,"avatar_url":"https://avatars2.githubusercontent.com/u/3508113?v=4","gravatar_id":"","url":"https://api.github.com/users/pdasigi","html_url":"https://github.com/pdasigi","followers_url":"https://api.github.com/users/pdasigi/followers","following_url":"https://api.github.com/users/pdasigi/following{/other_user}","gists_url":"https://api.github.com/users/pdasigi/gists{/gist_id}","starred_url":"https://api.github.com/users/pdasigi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pdasigi/subscriptions","organizations_url":"https://api.github.com/users/pdasigi/orgs","repos_url":"https://api.github.com/users/pdasigi/repos","events_url":"https://api.github.com/users/pdasigi/events{/privacy}","received_events_url":"https://api.github.com/users/pdasigi/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pdasigi/allennlp","description":"An open-source NLP research library, built on PyTorch.","fork":true,"url":"https://api.github.com/repos/pdasigi/allennlp","forks_url":"https://api.github.com/repos/pdasigi/allennlp/forks","keys_url":"https://api.github.com/repos/pdasigi/allennlp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pdasigi/allennlp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pdasigi/allennlp/teams","hooks_url":"https://api.github.com/repos/pdasigi/allennlp/hooks","issue_events_url":"https://api.github.com/repos/pdasigi/allennlp/issues/events{/number}","events_url":"https://api.github.com/repos/pdasigi/allennlp/events","assignees_url":"https://api.github.com/repos/pdasigi/allennlp/assignees{/user}","branches_url":"https://api.github.com/repos/pdasigi/allennlp/branches{/branch}","tags_url":"https://api.github.com/repos/pdasigi/allennlp/tags","blobs_url":"https://api.github.com/repos/pdasigi/allennlp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pdasigi/allennlp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pdasigi/allennlp/git/refs{/sha}","trees_url":"https://api.github.com/repos/pdasigi/allennlp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pdasigi/allennlp/statuses/{sha}","languages_url":"https://api.github.com/repos/pdasigi/allennlp/languages","stargazers_url":"https://api.github.com/repos/pdasigi/allennlp/stargazers","contributors_url":"https://api.github.com/repos/pdasigi/allennlp/contributors","subscribers_url":"https://api.github.com/repos/pdasigi/allennlp/subscribers","subscription_url":"https://api.github.com/repos/pdasigi/allennlp/subscription","commits_url":"https://api.github.com/repos/pdasigi/allennlp/commits{/sha}","git_commits_url":"https://api.github.com/repos/pdasigi/allennlp/git/commits{/sha}","comments_url":"https://api.github.com/repos/pdasigi/allennlp/comments{/number}","issue_comment_url":"https://api.github.com/repos/pdasigi/allennlp/issues/comments{/number}","contents_url":"https://api.github.com/repos/pdasigi/allennlp/contents/{+path}","compare_url":"https://api.github.com/repos/pdasigi/allennlp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pdasigi/allennlp/merges","archive_url":"https://api.github.com/repos/pdasigi/allennlp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pdasigi/allennlp/downloads","issues_url":"https://api.github.com/repos/pdasigi/allennlp/issues{/number}","pulls_url":"https://api.github.com/repos/pdasigi/allennlp/pulls{/number}","milestones_url":"https://api.github.com/repos/pdasigi/allennlp/milestones{/number}","notifications_url":"https://api.github.com/repos/pdasigi/allennlp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pdasigi/allennlp/labels{/name}","releases_url":"https://api.github.com/repos/pdasigi/allennlp/releases{/id}","deployments_url":"https://api.github.com/repos/pdasigi/allennlp/deployments","created_at":"2017-08-23T23:05:48Z","updated_at":"2017-08-23T23:05:50Z","pushed_at":"2018-02-08T19:36:12Z","git_url":"git://github.com/pdasigi/allennlp.git","ssh_url":"git@github.com:pdasigi/allennlp.git","clone_url":"https://github.com/pdasigi/allennlp.git","svn_url":"https://github.com/pdasigi/allennlp","homepage":"http://www.allennlp.org/","size":9835,"stargazers_count":0,"watchers_count":0,"language":"Python","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":0,"default_branch":"master"}},"base":{"label":"allenai:wikitables","ref":"wikitables","sha":"c481c2e7815c00dddeb7befe99000acc04e457d5","user":{"login":"allenai","id":5667695,"avatar_url":"https://avatars3.githubusercontent.com/u/5667695?v=4","gravatar_id":"","url":"https://api.github.com/users/allenai","html_url":"https://github.com/allenai","followers_url":"https://api.github.com/users/allenai/followers","following_url":"https://api.github.com/users/allenai/following{/other_user}","gists_url":"https://api.github.com/users/allenai/gists{/gist_id}","starred_url":"https://api.github.com/users/allenai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/allenai/subscriptions","organizations_url":"https://api.github.com/users/allenai/orgs","repos_url":"https://api.github.com/users/allenai/repos","events_url":"https://api.github.com/users/allenai/events{/privacy}","received_events_url":"https://api.github.com/users/allenai/received_events","type":"Organization","site_admin":false},"repo":{"id":91356408,"name":"allennlp","full_name":"allenai/allennlp","owner":{"login":"allenai","id":5667695,"avatar_url":"https://avatars3.githubusercontent.com/u/5667695?v=4","gravatar_id":"","url":"https://api.github.com/users/allenai","html_url":"https://github.com/allenai","followers_url":"https://api.github.com/users/allenai/followers","following_url":"https://api.github.com/users/allenai/following{/other_user}","gists_url":"https://api.github.com/users/allenai/gists{/gist_id}","starred_url":"https://api.github.com/users/allenai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/allenai/subscriptions","organizations_url":"https://api.github.com/users/allenai/orgs","repos_url":"https://api.github.com/users/allenai/repos","events_url":"https://api.github.com/users/allenai/events{/privacy}","received_events_url":"https://api.github.com/users/allenai/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/allenai/allennlp","description":"An open-source NLP research library, built on PyTorch.","fork":false,"url":"https://api.github.com/repos/allenai/allennlp","forks_url":"https://api.github.com/repos/allenai/allennlp/forks","keys_url":"https://api.github.com/repos/allenai/allennlp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/allenai/allennlp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/allenai/allennlp/teams","hooks_url":"https://api.github.com/repos/allenai/allennlp/hooks","issue_events_url":"https://api.github.com/repos/allenai/allennlp/issues/events{/number}","events_url":"https://api.github.com/repos/allenai/allennlp/events","assignees_url":"https://api.github.com/repos/allenai/allennlp/assignees{/user}","branches_url":"https://api.github.com/repos/allenai/allennlp/branches{/branch}","tags_url":"https://api.github.com/repos/allenai/allennlp/tags","blobs_url":"https://api.github.com/repos/allenai/allennlp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/allenai/allennlp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/allenai/allennlp/git/refs{/sha}","trees_url":"https://api.github.com/repos/allenai/allennlp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/allenai/allennlp/statuses/{sha}","languages_url":"https://api.github.com/repos/allenai/allennlp/languages","stargazers_url":"https://api.github.com/repos/allenai/allennlp/stargazers","contributors_url":"https://api.github.com/repos/allenai/allennlp/contributors","subscribers_url":"https://api.github.com/repos/allenai/allennlp/subscribers","subscription_url":"https://api.github.com/repos/allenai/allennlp/subscription","commits_url":"https://api.github.com/repos/allenai/allennlp/commits{/sha}","git_commits_url":"https://api.github.com/repos/allenai/allennlp/git/commits{/sha}","comments_url":"https://api.github.com/repos/allenai/allennlp/comments{/number}","issue_comment_url":"https://api.github.com/repos/allenai/allennlp/issues/comments{/number}","contents_url":"https://api.github.com/repos/allenai/allennlp/contents/{+path}","compare_url":"https://api.github.com/repos/allenai/allennlp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/allenai/allennlp/merges","archive_url":"https://api.github.com/repos/allenai/allennlp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/allenai/allennlp/downloads","issues_url":"https://api.github.com/repos/allenai/allennlp/issues{/number}","pulls_url":"https://api.github.com/repos/allenai/allennlp/pulls{/number}","milestones_url":"https://api.github.com/repos/allenai/allennlp/milestones{/number}","notifications_url":"https://api.github.com/repos/allenai/allennlp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/allenai/allennlp/labels{/name}","releases_url":"https://api.github.com/repos/allenai/allennlp/releases{/id}","deployments_url":"https://api.github.com/repos/allenai/allennlp/deployments","created_at":"2017-05-15T15:52:41Z","updated_at":"2018-02-09T13:12:14Z","pushed_at":"2018-02-09T20:44:14Z","git_url":"git://github.com/allenai/allennlp.git","ssh_url":"git@github.com:allenai/allennlp.git","clone_url":"https://github.com/allenai/allennlp.git","svn_url":"https://github.com/allenai/allennlp","homepage":"http://www.allennlp.org/","size":8591,"stargazers_count":1442,"watchers_count":1442,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":177,"mirror_url":null,"archived":false,"open_issues_count":59,"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":177,"open_issues":59,"watchers":1442,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/allenai/allennlp/pulls/789"},"html":{"href":"https://github.com/allenai/allennlp/pull/789"},"issue":{"href":"https://api.github.com/repos/allenai/allennlp/issues/789"},"comments":{"href":"https://api.github.com/repos/allenai/allennlp/issues/789/comments"},"review_comments":{"href":"https://api.github.com/repos/allenai/allennlp/pulls/789/comments"},"review_comment":{"href":"https://api.github.com/repos/allenai/allennlp/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/allenai/allennlp/pulls/789/commits"},"statuses":{"href":"https://api.github.com/repos/allenai/allennlp/statuses/05c2b048f9659aeeb637874c8a4d51ae798e73e1"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"pdasigi"}}