{"action":"created","comment":{"url":"https://api.github.com/repos/geomstats/geomstats/pulls/comments/205960663","pull_request_review_id":141334471,"id":205960663,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNTk2MDY2Mw==","diff_hunk":"@@ -557,94 +557,352 @@ def matrix_from_quaternion(self, quaternion):\n         assert gs.ndim(rot_mat) == 3\n         return rot_mat\n \n-    def quaternion_from_yaw_pitch_roll(self, yaw_pitch_roll):\n+    def matrix_from_tait_bryan_angles_extrinsic_xyz(self, tait_bryan_angles):\n+        assert self.n == 3, ('The Tait-Bryan angles representation'\n+                             ' does not exist'\n+                             ' for rotations in %d dimensions.' % self.n)\n+        tait_bryan_angles = gs.to_ndarray(tait_bryan_angles, to_ndim=2)\n+        n_tait_bryan_angles, _ = tait_bryan_angles.shape\n+\n+        rot_mat = gs.zeros((n_tait_bryan_angles,) + (self.n,) * 2)\n+        angle_1 = tait_bryan_angles[:, 0]\n+        angle_2 = tait_bryan_angles[:, 1]\n+        angle_3 = tait_bryan_angles[:, 2]\n+\n+        for i in range(n_tait_bryan_angles):\n+            cos_angle_1 = gs.cos(angle_1[i])\n+            sin_angle_1 = gs.sin(angle_1[i])\n+            cos_angle_2 = gs.cos(angle_2[i])\n+            sin_angle_2 = gs.sin(angle_2[i])\n+            cos_angle_3 = gs.cos(angle_3[i])\n+            sin_angle_3 = gs.sin(angle_3[i])\n+\n+            column_1 = [[cos_angle_1 * cos_angle_2],\n+                        [cos_angle_2 * sin_angle_1],\n+                        [- sin_angle_2]]\n+            column_2 = [[(cos_angle_1 * sin_angle_2 * sin_angle_3\n+                          - cos_angle_3 * sin_angle_1)],\n+                        [(cos_angle_1 * cos_angle_3\n+                          + sin_angle_1 * sin_angle_2 * sin_angle_3)],\n+                        [+ cos_angle_2 * sin_angle_3]]\n+            column_3 = [[(sin_angle_1 * sin_angle_3\n+                          + cos_angle_1 * cos_angle_3 * sin_angle_2)],\n+                        [(cos_angle_3 * sin_angle_1 * sin_angle_2\n+                          - cos_angle_1 * sin_angle_3)],\n+                        [cos_angle_2 * cos_angle_3]]\n+\n+            rot_mat[i] = gs.hstack((column_1, column_2, column_3))\n+        return rot_mat\n+\n+    def matrix_from_tait_bryan_angles_extrinsic_zyx(self, tait_bryan_angles):\n+        assert self.n == 3, ('The Tait-Bryan angles representation'\n+                             ' does not exist'\n+                             ' for rotations in %d dimensions.' % self.n)\n+        tait_bryan_angles = gs.to_ndarray(tait_bryan_angles, to_ndim=2)\n+        n_tait_bryan_angles, _ = tait_bryan_angles.shape\n+\n+        rot_mat = gs.zeros((n_tait_bryan_angles,) + (self.n,) * 2)\n+        angle_1 = tait_bryan_angles[:, 0]\n+        angle_2 = tait_bryan_angles[:, 1]\n+        angle_3 = tait_bryan_angles[:, 2]\n+\n+        for i in range(n_tait_bryan_angles):\n+            cos_angle_1 = gs.cos(angle_1[i])\n+            sin_angle_1 = gs.sin(angle_1[i])\n+            cos_angle_2 = gs.cos(angle_2[i])\n+            sin_angle_2 = gs.sin(angle_2[i])\n+            cos_angle_3 = gs.cos(angle_3[i])\n+            sin_angle_3 = gs.sin(angle_3[i])\n+\n+            column_1 = [[cos_angle_2 * cos_angle_3],\n+                        [(cos_angle_1 * sin_angle_3\n+                          + cos_angle_3 * sin_angle_1 * sin_angle_2)],\n+                        [(sin_angle_1 * sin_angle_3\n+                          - cos_angle_1 * cos_angle_3 * sin_angle_2)]]\n+\n+            column_2 = [[- cos_angle_2 * sin_angle_3],\n+                        [(cos_angle_1 * cos_angle_3\n+                          - sin_angle_1 * sin_angle_2 * sin_angle_3)],\n+                        [(cos_angle_3 * sin_angle_1\n+                          + cos_angle_1 * sin_angle_2 * sin_angle_3)]]\n+\n+            column_3 = [[sin_angle_2],\n+                        [- cos_angle_2 * sin_angle_1],\n+                        [cos_angle_1 * cos_angle_2]]\n+            rot_mat[i] = gs.hstack((column_1, column_2, column_3))\n+        return rot_mat\n+\n+    def matrix_from_tait_bryan_angles(self, tait_bryan_angles,\n+                                      extrinsic_or_intrinsic='extrinsic',\n+                                      order='zyx'):\n         \"\"\"\n-        Convert a rotation given by the yaw, pitch, roll\n-        into a unit quaternion.\n+        Convert a rotation given in terms of the tait bryan angles,\n+        [angle_1, angle_2, angle_3] in extrinsic (fixed) or\n+        intrinsic (moving) coordinate frame into a rotation matrix.\n+\n+        If the order is zyx, into the rotation matrix rot_mat:\n+        rot_mat = X(angle_1).Y(angle_2).Z(angle_3)\n+        where:\n+        - X(angle_1) is a rotation of angle angle_1 around axis x.\n+        - Y(angle_2) is a rotation of angle angle_2 around axis y.\n+        - Z(angle_3) is a rotation of angle angle_3 around axis z.\n+\n+        Exchanging 'extrinsic' and 'intrinsic' amounts to\n+        exchanging the order.\n         \"\"\"\n-        assert self.n == 3, ('The quaternion representation'\n-                             ' and the yaw-pitch-roll representation'\n-                             ' do not exist'\n+        assert self.n == 3, ('The Tait-Bryan angles representation'\n+                             ' does not exist'\n                              ' for rotations in %d dimensions.' % self.n)\n-        yaw_pitch_roll = gs.to_ndarray(yaw_pitch_roll, to_ndim=2)\n-        n_yaw_pitch_rolls, _ = yaw_pitch_roll.shape\n+        tait_bryan_angles = gs.to_ndarray(tait_bryan_angles, to_ndim=2)\n+\n+        condition_1 = ((extrinsic_or_intrinsic == 'extrinsic'\n+                        and order == 'zyx')\n+                       or (extrinsic_or_intrinsic == 'intrinsic'\n+                           and order == 'xyz'))\n+\n+        condition_2 = ((extrinsic_or_intrinsic == 'extrinsic'\n+                        and order == 'xyz')\n+                       or (extrinsic_or_intrinsic == 'intrinsic'\n+                           and order == 'zyx'))\n+        if condition_1:\n+            rot_mat = self.matrix_from_tait_bryan_angles_extrinsic_zyx(\n+                tait_bryan_angles)\n+        elif condition_2:\n+            rot_mat = self.matrix_from_tait_bryan_angles_extrinsic_xyz(\n+                tait_bryan_angles)\n \n-        yaw = yaw_pitch_roll[:, 0]\n-        pitch = yaw_pitch_roll[:, 1]\n-        roll = yaw_pitch_roll[:, 2]\n+        else:\n+            raise ValueError('extrinsic_or_intrinsic should be'\n+                             ' \\'extrinsic\\' or \\'intrinsic\\''\n+                             ' and order should be \\'xyz\\' or \\'zyx\\'.')\n \n-        cos_half_yaw = gs.cos(yaw / 2.)\n-        sin_half_yaw = gs.sin(yaw / 2.)\n-        cos_half_pitch = gs.cos(pitch / 2.)\n-        sin_half_pitch = gs.sin(pitch / 2.)\n-        cos_half_roll = gs.cos(roll / 2.)\n-        sin_half_roll = gs.sin(roll / 2.)\n+        return rot_mat\n \n-        quaternion = gs.zeros((n_yaw_pitch_rolls, 4))\n+    def tait_bryan_angles_from_matrix(self, rot_mat,\n+                                      extrinsic_or_intrinsic='extrinsic',\n+                                      order='zyx'):\n+        \"\"\"\n+        Convert a rotation matrix rot_mat into the tait bryan angles,\n+        [angle_1, angle_2, angle_3] in extrinsic (fixed) coordinate frame,\n+        for the order zyx, i.e.:\n+        rot_mat = X(angle_1).Y(angle_2).Z(angle_3)\n+        where:\n+        - X(angle_1) is a rotation of angle angle_1 around axis x.\n+        - Y(angle_2) is a rotation of angle angle_2 around axis y.\n+        - Z(angle_3) is a rotation of angle angle_3 around axis z.\n+        \"\"\"\n+        rot_mat = gs.to_ndarray(rot_mat, to_ndim=3)\n+        quaternion = self.quaternion_from_matrix(rot_mat)\n+        tait_bryan_angles = self.tait_bryan_angles_from_quaternion(\n+            quaternion,\n+            extrinsic_or_intrinsic=extrinsic_or_intrinsic,\n+            order=order)\n \n-        cos_half_angle = (cos_half_yaw * cos_half_pitch * cos_half_roll\n-                          + sin_half_yaw * sin_half_pitch * sin_half_roll)\n+        return tait_bryan_angles\n \n-        quaternion[:, 0] = cos_half_angle\n+    def quaternion_from_tait_bryan_angles_intrinsic_xyz(\n+            self, tait_bryan_angles):\n+        assert self.n == 3, ('The quaternion representation'\n+                             ' and the Tait-Bryan angles representation'\n+                             ' do not exist'\n+                             ' for rotations in %d dimensions.' % self.n)\n+        tait_bryan_angles = gs.to_ndarray(tait_bryan_angles, to_ndim=2)\n+        n_tait_bryan_angles, _ = tait_bryan_angles.shape\n+        quaternion = gs.zeros((n_tait_bryan_angles, 4))\n+\n+        angle_1 = tait_bryan_angles[:, 0]","path":"geomstats/special_orthogonal_group.py","position":178,"original_position":178,"commit_id":"954df7dfe1d93a58e28503267557ca5ab36860ed","original_commit_id":"954df7dfe1d93a58e28503267557ca5ab36860ed","user":{"login":"johmathe","id":467643,"node_id":"MDQ6VXNlcjQ2NzY0Mw==","avatar_url":"https://avatars2.githubusercontent.com/u/467643?v=4","gravatar_id":"","url":"https://api.github.com/users/johmathe","html_url":"https://github.com/johmathe","followers_url":"https://api.github.com/users/johmathe/followers","following_url":"https://api.github.com/users/johmathe/following{/other_user}","gists_url":"https://api.github.com/users/johmathe/gists{/gist_id}","starred_url":"https://api.github.com/users/johmathe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/johmathe/subscriptions","organizations_url":"https://api.github.com/users/johmathe/orgs","repos_url":"https://api.github.com/users/johmathe/repos","events_url":"https://api.github.com/users/johmathe/events{/privacy}","received_events_url":"https://api.github.com/users/johmathe/received_events","type":"User","site_admin":false},"body":"nit: is there a way to make this maybe nicer by keeping the angle array and using linear algebra in the subsequent operations?","created_at":"2018-07-29T04:51:50Z","updated_at":"2018-07-29T04:56:19Z","html_url":"https://github.com/geomstats/geomstats/pull/116#discussion_r205960663","pull_request_url":"https://api.github.com/repos/geomstats/geomstats/pulls/116","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/geomstats/geomstats/pulls/comments/205960663"},"html":{"href":"https://github.com/geomstats/geomstats/pull/116#discussion_r205960663"},"pull_request":{"href":"https://api.github.com/repos/geomstats/geomstats/pulls/116"}}},"pull_request":{"url":"https://api.github.com/repos/geomstats/geomstats/pulls/116","id":204314666,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA0MzE0NjY2","html_url":"https://github.com/geomstats/geomstats/pull/116","diff_url":"https://github.com/geomstats/geomstats/pull/116.diff","patch_url":"https://github.com/geomstats/geomstats/pull/116.patch","issue_url":"https://api.github.com/repos/geomstats/geomstats/issues/116","number":116,"state":"open","locked":false,"title":"Nina tait bryan","user":{"login":"ninamiolane","id":8267869,"node_id":"MDQ6VXNlcjgyNjc4Njk=","avatar_url":"https://avatars3.githubusercontent.com/u/8267869?v=4","gravatar_id":"","url":"https://api.github.com/users/ninamiolane","html_url":"https://github.com/ninamiolane","followers_url":"https://api.github.com/users/ninamiolane/followers","following_url":"https://api.github.com/users/ninamiolane/following{/other_user}","gists_url":"https://api.github.com/users/ninamiolane/gists{/gist_id}","starred_url":"https://api.github.com/users/ninamiolane/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ninamiolane/subscriptions","organizations_url":"https://api.github.com/users/ninamiolane/orgs","repos_url":"https://api.github.com/users/ninamiolane/repos","events_url":"https://api.github.com/users/ninamiolane/events{/privacy}","received_events_url":"https://api.github.com/users/ninamiolane/received_events","type":"User","site_admin":false},"body":"This CR adds conversion functions for Euler angles with different conventions:\r\n- Tait Bryan convention,\r\n- extrinsic and intrinsic conventions,\r\n- xyz order and zyx order conventions.\r\n\r\nThis CR also renames yaw pitch roll with Tait Bryan appelations.\r\n\r\nSome unit tests fail and are commented.","created_at":"2018-07-27T02:35:41Z","updated_at":"2018-07-29T04:56:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9e931c7e088efd3ac6a3ac1894011b8b00894bb9","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/geomstats/geomstats/pulls/116/commits","review_comments_url":"https://api.github.com/repos/geomstats/geomstats/pulls/116/comments","review_comment_url":"https://api.github.com/repos/geomstats/geomstats/pulls/comments{/number}","comments_url":"https://api.github.com/repos/geomstats/geomstats/issues/116/comments","statuses_url":"https://api.github.com/repos/geomstats/geomstats/statuses/954df7dfe1d93a58e28503267557ca5ab36860ed","head":{"label":"geomstats:nina-tait-bryan","ref":"nina-tait-bryan","sha":"954df7dfe1d93a58e28503267557ca5ab36860ed","user":{"login":"geomstats","id":39272386,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MjcyMzg2","avatar_url":"https://avatars0.githubusercontent.com/u/39272386?v=4","gravatar_id":"","url":"https://api.github.com/users/geomstats","html_url":"https://github.com/geomstats","followers_url":"https://api.github.com/users/geomstats/followers","following_url":"https://api.github.com/users/geomstats/following{/other_user}","gists_url":"https://api.github.com/users/geomstats/gists{/gist_id}","starred_url":"https://api.github.com/users/geomstats/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geomstats/subscriptions","organizations_url":"https://api.github.com/users/geomstats/orgs","repos_url":"https://api.github.com/users/geomstats/repos","events_url":"https://api.github.com/users/geomstats/events{/privacy}","received_events_url":"https://api.github.com/users/geomstats/received_events","type":"Organization","site_admin":false},"repo":{"id":108200238,"node_id":"MDEwOlJlcG9zaXRvcnkxMDgyMDAyMzg=","name":"geomstats","full_name":"geomstats/geomstats","owner":{"login":"geomstats","id":39272386,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MjcyMzg2","avatar_url":"https://avatars0.githubusercontent.com/u/39272386?v=4","gravatar_id":"","url":"https://api.github.com/users/geomstats","html_url":"https://github.com/geomstats","followers_url":"https://api.github.com/users/geomstats/followers","following_url":"https://api.github.com/users/geomstats/following{/other_user}","gists_url":"https://api.github.com/users/geomstats/gists{/gist_id}","starred_url":"https://api.github.com/users/geomstats/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geomstats/subscriptions","organizations_url":"https://api.github.com/users/geomstats/orgs","repos_url":"https://api.github.com/users/geomstats/repos","events_url":"https://api.github.com/users/geomstats/events{/privacy}","received_events_url":"https://api.github.com/users/geomstats/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/geomstats/geomstats","description":"Computations and statistics on manifolds with geometric structures.","fork":false,"url":"https://api.github.com/repos/geomstats/geomstats","forks_url":"https://api.github.com/repos/geomstats/geomstats/forks","keys_url":"https://api.github.com/repos/geomstats/geomstats/keys{/key_id}","collaborators_url":"https://api.github.com/repos/geomstats/geomstats/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/geomstats/geomstats/teams","hooks_url":"https://api.github.com/repos/geomstats/geomstats/hooks","issue_events_url":"https://api.github.com/repos/geomstats/geomstats/issues/events{/number}","events_url":"https://api.github.com/repos/geomstats/geomstats/events","assignees_url":"https://api.github.com/repos/geomstats/geomstats/assignees{/user}","branches_url":"https://api.github.com/repos/geomstats/geomstats/branches{/branch}","tags_url":"https://api.github.com/repos/geomstats/geomstats/tags","blobs_url":"https://api.github.com/repos/geomstats/geomstats/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/geomstats/geomstats/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/geomstats/geomstats/git/refs{/sha}","trees_url":"https://api.github.com/repos/geomstats/geomstats/git/trees{/sha}","statuses_url":"https://api.github.com/repos/geomstats/geomstats/statuses/{sha}","languages_url":"https://api.github.com/repos/geomstats/geomstats/languages","stargazers_url":"https://api.github.com/repos/geomstats/geomstats/stargazers","contributors_url":"https://api.github.com/repos/geomstats/geomstats/contributors","subscribers_url":"https://api.github.com/repos/geomstats/geomstats/subscribers","subscription_url":"https://api.github.com/repos/geomstats/geomstats/subscription","commits_url":"https://api.github.com/repos/geomstats/geomstats/commits{/sha}","git_commits_url":"https://api.github.com/repos/geomstats/geomstats/git/commits{/sha}","comments_url":"https://api.github.com/repos/geomstats/geomstats/comments{/number}","issue_comment_url":"https://api.github.com/repos/geomstats/geomstats/issues/comments{/number}","contents_url":"https://api.github.com/repos/geomstats/geomstats/contents/{+path}","compare_url":"https://api.github.com/repos/geomstats/geomstats/compare/{base}...{head}","merges_url":"https://api.github.com/repos/geomstats/geomstats/merges","archive_url":"https://api.github.com/repos/geomstats/geomstats/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/geomstats/geomstats/downloads","issues_url":"https://api.github.com/repos/geomstats/geomstats/issues{/number}","pulls_url":"https://api.github.com/repos/geomstats/geomstats/pulls{/number}","milestones_url":"https://api.github.com/repos/geomstats/geomstats/milestones{/number}","notifications_url":"https://api.github.com/repos/geomstats/geomstats/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/geomstats/geomstats/labels{/name}","releases_url":"https://api.github.com/repos/geomstats/geomstats/releases{/id}","deployments_url":"https://api.github.com/repos/geomstats/geomstats/deployments","created_at":"2017-10-25T00:44:57Z","updated_at":"2018-07-26T21:13:43Z","pushed_at":"2018-07-28T02:26:26Z","git_url":"git://github.com/geomstats/geomstats.git","ssh_url":"git@github.com:geomstats/geomstats.git","clone_url":"https://github.com/geomstats/geomstats.git","svn_url":"https://github.com/geomstats/geomstats","homepage":"http://geomstats.ai","size":2826,"stargazers_count":84,"watchers_count":84,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":15,"mirror_url":null,"archived":false,"open_issues_count":9,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":15,"open_issues":9,"watchers":84,"default_branch":"master"}},"base":{"label":"geomstats:master","ref":"master","sha":"9e6be02c3aaa2eeb47f41d5367dd5725a267420b","user":{"login":"geomstats","id":39272386,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MjcyMzg2","avatar_url":"https://avatars0.githubusercontent.com/u/39272386?v=4","gravatar_id":"","url":"https://api.github.com/users/geomstats","html_url":"https://github.com/geomstats","followers_url":"https://api.github.com/users/geomstats/followers","following_url":"https://api.github.com/users/geomstats/following{/other_user}","gists_url":"https://api.github.com/users/geomstats/gists{/gist_id}","starred_url":"https://api.github.com/users/geomstats/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geomstats/subscriptions","organizations_url":"https://api.github.com/users/geomstats/orgs","repos_url":"https://api.github.com/users/geomstats/repos","events_url":"https://api.github.com/users/geomstats/events{/privacy}","received_events_url":"https://api.github.com/users/geomstats/received_events","type":"Organization","site_admin":false},"repo":{"id":108200238,"node_id":"MDEwOlJlcG9zaXRvcnkxMDgyMDAyMzg=","name":"geomstats","full_name":"geomstats/geomstats","owner":{"login":"geomstats","id":39272386,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MjcyMzg2","avatar_url":"https://avatars0.githubusercontent.com/u/39272386?v=4","gravatar_id":"","url":"https://api.github.com/users/geomstats","html_url":"https://github.com/geomstats","followers_url":"https://api.github.com/users/geomstats/followers","following_url":"https://api.github.com/users/geomstats/following{/other_user}","gists_url":"https://api.github.com/users/geomstats/gists{/gist_id}","starred_url":"https://api.github.com/users/geomstats/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geomstats/subscriptions","organizations_url":"https://api.github.com/users/geomstats/orgs","repos_url":"https://api.github.com/users/geomstats/repos","events_url":"https://api.github.com/users/geomstats/events{/privacy}","received_events_url":"https://api.github.com/users/geomstats/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/geomstats/geomstats","description":"Computations and statistics on manifolds with geometric structures.","fork":false,"url":"https://api.github.com/repos/geomstats/geomstats","forks_url":"https://api.github.com/repos/geomstats/geomstats/forks","keys_url":"https://api.github.com/repos/geomstats/geomstats/keys{/key_id}","collaborators_url":"https://api.github.com/repos/geomstats/geomstats/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/geomstats/geomstats/teams","hooks_url":"https://api.github.com/repos/geomstats/geomstats/hooks","issue_events_url":"https://api.github.com/repos/geomstats/geomstats/issues/events{/number}","events_url":"https://api.github.com/repos/geomstats/geomstats/events","assignees_url":"https://api.github.com/repos/geomstats/geomstats/assignees{/user}","branches_url":"https://api.github.com/repos/geomstats/geomstats/branches{/branch}","tags_url":"https://api.github.com/repos/geomstats/geomstats/tags","blobs_url":"https://api.github.com/repos/geomstats/geomstats/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/geomstats/geomstats/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/geomstats/geomstats/git/refs{/sha}","trees_url":"https://api.github.com/repos/geomstats/geomstats/git/trees{/sha}","statuses_url":"https://api.github.com/repos/geomstats/geomstats/statuses/{sha}","languages_url":"https://api.github.com/repos/geomstats/geomstats/languages","stargazers_url":"https://api.github.com/repos/geomstats/geomstats/stargazers","contributors_url":"https://api.github.com/repos/geomstats/geomstats/contributors","subscribers_url":"https://api.github.com/repos/geomstats/geomstats/subscribers","subscription_url":"https://api.github.com/repos/geomstats/geomstats/subscription","commits_url":"https://api.github.com/repos/geomstats/geomstats/commits{/sha}","git_commits_url":"https://api.github.com/repos/geomstats/geomstats/git/commits{/sha}","comments_url":"https://api.github.com/repos/geomstats/geomstats/comments{/number}","issue_comment_url":"https://api.github.com/repos/geomstats/geomstats/issues/comments{/number}","contents_url":"https://api.github.com/repos/geomstats/geomstats/contents/{+path}","compare_url":"https://api.github.com/repos/geomstats/geomstats/compare/{base}...{head}","merges_url":"https://api.github.com/repos/geomstats/geomstats/merges","archive_url":"https://api.github.com/repos/geomstats/geomstats/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/geomstats/geomstats/downloads","issues_url":"https://api.github.com/repos/geomstats/geomstats/issues{/number}","pulls_url":"https://api.github.com/repos/geomstats/geomstats/pulls{/number}","milestones_url":"https://api.github.com/repos/geomstats/geomstats/milestones{/number}","notifications_url":"https://api.github.com/repos/geomstats/geomstats/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/geomstats/geomstats/labels{/name}","releases_url":"https://api.github.com/repos/geomstats/geomstats/releases{/id}","deployments_url":"https://api.github.com/repos/geomstats/geomstats/deployments","created_at":"2017-10-25T00:44:57Z","updated_at":"2018-07-26T21:13:43Z","pushed_at":"2018-07-28T02:26:26Z","git_url":"git://github.com/geomstats/geomstats.git","ssh_url":"git@github.com:geomstats/geomstats.git","clone_url":"https://github.com/geomstats/geomstats.git","svn_url":"https://github.com/geomstats/geomstats","homepage":"http://geomstats.ai","size":2826,"stargazers_count":84,"watchers_count":84,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":15,"mirror_url":null,"archived":false,"open_issues_count":9,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":15,"open_issues":9,"watchers":84,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/geomstats/geomstats/pulls/116"},"html":{"href":"https://github.com/geomstats/geomstats/pull/116"},"issue":{"href":"https://api.github.com/repos/geomstats/geomstats/issues/116"},"comments":{"href":"https://api.github.com/repos/geomstats/geomstats/issues/116/comments"},"review_comments":{"href":"https://api.github.com/repos/geomstats/geomstats/pulls/116/comments"},"review_comment":{"href":"https://api.github.com/repos/geomstats/geomstats/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/geomstats/geomstats/pulls/116/commits"},"statuses":{"href":"https://api.github.com/repos/geomstats/geomstats/statuses/954df7dfe1d93a58e28503267557ca5ab36860ed"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"johmathe"}}