{"action":"created","comment":{"url":"https://api.github.com/repos/wavelab/libwave/pulls/comments/123326248","pull_request_review_id":45518471,"id":123326248,"diff_hunk":"@@ -53,28 +65,133 @@ void BruteForceMatcher::checkConfiguration(\n         throw std::invalid_argument(\n           \"Norm type is not one of the acceptable values!\");\n     }\n+\n+    // Check the value of the ratio_test heuristic\n+    if (check_config.ratio_threshold < 0.0 ||\n+        check_config.ratio_threshold > 1.0) {\n+        throw std::invalid_argument(\n+          \"ratio_threshold is not an appropriate value!\");\n+    }\n+\n+    // Check the value of the threshold distance heuristic\n+    if (check_config.distance_threshold < 0) {\n+        throw std::invalid_argument(\"distance_threshold is a negative value!\");\n+    }\n+\n+    // Only acceptable values are 1, 2, 4, and 8\n+    if (check_config.fm_method < cv::FM_7POINT ||\n+        check_config.fm_method > cv::FM_RANSAC) {\n+        throw std::invalid_argument(\"fm_method is not an acceptable value!\");\n+    }\n+\n+    if (check_config.fm_method == 3 ||\n+        (check_config.fm_method > cv::FM_LMEDS &&\n+         check_config.fm_method < cv::FM_RANSAC)) {\n+        throw std::invalid_argument(\"fm_method is not an acceptable value!\");\n+    }\n+}\n+\n+std::vector<cv::DMatch> BruteForceMatcher::filterMatches(\n+  std::vector<cv::DMatch> &matches) const {\n+    std::vector<cv::DMatch> filt_matches;\n+    float min_distance;\n+\n+    // Sort matches by distance in increasing order\n+    std::sort(matches.begin(), matches.end());\n+\n+    min_distance = matches.begin()->distance;\n+\n+    // Keep any match that is less than the rejection heuristic times minimum\n+    // distance\n+    for (auto &match : matches) {\n+        if (match.distance <=\n+            this->current_config.distance_threshold * min_distance) {\n+            filt_matches.push_back(match);\n+        }\n+    }\n+\n+    return filt_matches;\n+}\n+\n+std::vector<cv::DMatch> BruteForceMatcher::filterMatches(\n+  std::vector<std::vector<cv::DMatch>> &matches) const {\n+    std::vector<cv::DMatch> filt_matches;\n+    float ratio;\n+\n+    for (auto &match : matches) {\n+        // Calculate ratio between two best matches. Accept if less than\n+        // ratio heuristic\n+        ratio = match[0].distance / match[1].distance;\n+        if (ratio <= this->current_config.ratio_threshold) {\n+            filt_matches.push_back(match[0]);\n+        }\n+    }\n+\n+    return filt_matches;\n+}\n+\n+std::vector<cv::DMatch> BruteForceMatcher::removeOutliers(\n+  const std::vector<cv::DMatch> &matches,\n+  const std::vector<cv::KeyPoint> &keypoints_1,\n+  const std::vector<cv::KeyPoint> &keypoints_2) const {\n+    std::vector<cv::DMatch> good_matches;\n+    std::vector<cv::Point2f> fp1, fp2;\n+\n+    // Take all good keypoints from matches, convert to cv::Point2f\n+    for (auto &match : matches) {\n+        fp1.push_back(keypoints_1.at(match.queryIdx).pt);\n+        fp2.push_back(keypoints_2.at(match.trainIdx).pt);\n+    }\n+\n+    // Find fundamental matrix\n+    std::vector<uchar> mask;\n+    cv::Mat fundamental_matrix;\n+\n+    fundamental_matrix =\n+      cv::findFundamentalMat(fp1, fp2, cv::FM_RANSAC, 3., 0.99, mask);\n+\n+    // Only retain the inliers matches\n+    for (size_t i = 0; i < mask.size(); i++) {\n+        if (mask.at(i) != 0) {\n+            good_matches.push_back(matches.at(i));\n+        }\n+    }\n+\n+    return good_matches;\n }\n \n std::vector<cv::DMatch> BruteForceMatcher::matchDescriptors(\n-  const cv::Mat &descriptors_1, const cv::Mat &descriptors_2) const {\n-    std::vector<cv::DMatch> matches;\n-\n-    /** Mask variable, currently unused.\n-     *\n-     *  The mask variable indicates which descriptors can be matched between the\n-     *  two sets. As per OpenCV docs \"queryDescriptors[i] can be matched with\n-     *  trainDescriptors[j] only if masks.at<uchar>(i,j) is non-zero.\n-     *\n-     *  In the libwave wrapper, queryDescriptors and trainDescriptors are\n-     *  referred to as descriptors_1 and descriptors_2.\n-     */\n-    cv::InputOutputArray mask = cv::noArray();\n-\n-    // Determine matches between sets of descriptors\n-    this->brute_force_matcher->match(\n-      descriptors_1, descriptors_2, matches, mask);\n-\n-    return matches;\n+  const cv::Mat &descriptors_1,\n+  const cv::Mat &descriptors_2,\n+  const std::vector<cv::KeyPoint> &keypoints_1,\n+  const std::vector<cv::KeyPoint> &keypoints_2,\n+  const cv::InputArray &mask) const {\n+    std::vector<cv::DMatch> good_matches;\n+    std::vector<cv::DMatch> filtered_matches;\n+\n+    if (current_config.use_knn) {\n+        std::vector<std::vector<cv::DMatch>> matches;\n+        int k = 2;","path":"wave_vision/src/matcher/brute_force_matcher.cpp","position":181,"original_position":181,"commit_id":"95a9fabdf5aac844b1194740a6bb8148c79da0dd","original_commit_id":"95a9fabdf5aac844b1194740a6bb8148c79da0dd","user":{"login":"navganti","id":19216792,"avatar_url":"https://avatars2.githubusercontent.com/u/19216792?v=3","gravatar_id":"","url":"https://api.github.com/users/navganti","html_url":"https://github.com/navganti","followers_url":"https://api.github.com/users/navganti/followers","following_url":"https://api.github.com/users/navganti/following{/other_user}","gists_url":"https://api.github.com/users/navganti/gists{/gist_id}","starred_url":"https://api.github.com/users/navganti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/navganti/subscriptions","organizations_url":"https://api.github.com/users/navganti/orgs","repos_url":"https://api.github.com/users/navganti/repos","events_url":"https://api.github.com/users/navganti/events{/privacy}","received_events_url":"https://api.github.com/users/navganti/received_events","type":"User","site_admin":false},"body":"Yes, so for the ratio test we only want to look at the two nearest neighbours. We don't care about anymore matches, and so this feature was hidden from the user. Is it okay if it's still a magic number? ","created_at":"2017-06-21T18:15:27Z","updated_at":"2017-06-21T18:15:27Z","html_url":"https://github.com/wavelab/libwave/pull/153#discussion_r123326248","pull_request_url":"https://api.github.com/repos/wavelab/libwave/pulls/153","_links":{"self":{"href":"https://api.github.com/repos/wavelab/libwave/pulls/comments/123326248"},"html":{"href":"https://github.com/wavelab/libwave/pull/153#discussion_r123326248"},"pull_request":{"href":"https://api.github.com/repos/wavelab/libwave/pulls/153"}}},"pull_request":{"url":"https://api.github.com/repos/wavelab/libwave/pulls/153","id":126609221,"html_url":"https://github.com/wavelab/libwave/pull/153","diff_url":"https://github.com/wavelab/libwave/pull/153.diff","patch_url":"https://github.com/wavelab/libwave/pull/153.patch","issue_url":"https://api.github.com/repos/wavelab/libwave/issues/153","number":153,"state":"open","locked":false,"title":"Outlier Rejection","user":{"login":"navganti","id":19216792,"avatar_url":"https://avatars2.githubusercontent.com/u/19216792?v=3","gravatar_id":"","url":"https://api.github.com/users/navganti","html_url":"https://github.com/navganti","followers_url":"https://api.github.com/users/navganti/followers","following_url":"https://api.github.com/users/navganti/following{/other_user}","gists_url":"https://api.github.com/users/navganti/gists{/gist_id}","starred_url":"https://api.github.com/users/navganti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/navganti/subscriptions","organizations_url":"https://api.github.com/users/navganti/orgs","repos_url":"https://api.github.com/users/navganti/repos","events_url":"https://api.github.com/users/navganti/events{/privacy}","received_events_url":"https://api.github.com/users/navganti/received_events","type":"User","site_admin":false},"body":"Resolves #145. Implementation of outlier rejection for detected features within the matching interface. \r\n\r\nIncludes options to use RANSAC, 7-Point, 8-Point, or least median squares to solve for the fundamental matrix, creating the epipolar constraints. \r\n\r\nAlso contains two separate methods as a first filter for matches, either using the ratio test (from  Dr. Lowe's SIFT paper), or a threshold based heuristic. All options are configurable via .yaml files.\r\n\r\n#### Pre-Merge Checklist:\r\n- [x] Code is documented in doxygen format\r\n- [x] Code has automated tests\r\n- [x] Zero compiler warnings\r\n- [x] Formatted with `clang-format`\r\n","created_at":"2017-06-20T19:18:06Z","updated_at":"2017-06-21T18:15:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6dc99bda91e63782fbfa9bfc1dc3db8714849766","assignee":{"login":"navganti","id":19216792,"avatar_url":"https://avatars2.githubusercontent.com/u/19216792?v=3","gravatar_id":"","url":"https://api.github.com/users/navganti","html_url":"https://github.com/navganti","followers_url":"https://api.github.com/users/navganti/followers","following_url":"https://api.github.com/users/navganti/following{/other_user}","gists_url":"https://api.github.com/users/navganti/gists{/gist_id}","starred_url":"https://api.github.com/users/navganti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/navganti/subscriptions","organizations_url":"https://api.github.com/users/navganti/orgs","repos_url":"https://api.github.com/users/navganti/repos","events_url":"https://api.github.com/users/navganti/events{/privacy}","received_events_url":"https://api.github.com/users/navganti/received_events","type":"User","site_admin":false},"assignees":[{"login":"navganti","id":19216792,"avatar_url":"https://avatars2.githubusercontent.com/u/19216792?v=3","gravatar_id":"","url":"https://api.github.com/users/navganti","html_url":"https://github.com/navganti","followers_url":"https://api.github.com/users/navganti/followers","following_url":"https://api.github.com/users/navganti/following{/other_user}","gists_url":"https://api.github.com/users/navganti/gists{/gist_id}","starred_url":"https://api.github.com/users/navganti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/navganti/subscriptions","organizations_url":"https://api.github.com/users/navganti/orgs","repos_url":"https://api.github.com/users/navganti/repos","events_url":"https://api.github.com/users/navganti/events{/privacy}","received_events_url":"https://api.github.com/users/navganti/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"chutsu","id":91460,"avatar_url":"https://avatars2.githubusercontent.com/u/91460?v=3","gravatar_id":"","url":"https://api.github.com/users/chutsu","html_url":"https://github.com/chutsu","followers_url":"https://api.github.com/users/chutsu/followers","following_url":"https://api.github.com/users/chutsu/following{/other_user}","gists_url":"https://api.github.com/users/chutsu/gists{/gist_id}","starred_url":"https://api.github.com/users/chutsu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chutsu/subscriptions","organizations_url":"https://api.github.com/users/chutsu/orgs","repos_url":"https://api.github.com/users/chutsu/repos","events_url":"https://api.github.com/users/chutsu/events{/privacy}","received_events_url":"https://api.github.com/users/chutsu/received_events","type":"User","site_admin":false},{"login":"leokoppel","id":3952195,"avatar_url":"https://avatars1.githubusercontent.com/u/3952195?v=3","gravatar_id":"","url":"https://api.github.com/users/leokoppel","html_url":"https://github.com/leokoppel","followers_url":"https://api.github.com/users/leokoppel/followers","following_url":"https://api.github.com/users/leokoppel/following{/other_user}","gists_url":"https://api.github.com/users/leokoppel/gists{/gist_id}","starred_url":"https://api.github.com/users/leokoppel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/leokoppel/subscriptions","organizations_url":"https://api.github.com/users/leokoppel/orgs","repos_url":"https://api.github.com/users/leokoppel/repos","events_url":"https://api.github.com/users/leokoppel/events{/privacy}","received_events_url":"https://api.github.com/users/leokoppel/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/wavelab/libwave/pulls/153/commits","review_comments_url":"https://api.github.com/repos/wavelab/libwave/pulls/153/comments","review_comment_url":"https://api.github.com/repos/wavelab/libwave/pulls/comments{/number}","comments_url":"https://api.github.com/repos/wavelab/libwave/issues/153/comments","statuses_url":"https://api.github.com/repos/wavelab/libwave/statuses/95a9fabdf5aac844b1194740a6bb8148c79da0dd","head":{"label":"wavelab:feature_145_outlier_rejection","ref":"feature_145_outlier_rejection","sha":"95a9fabdf5aac844b1194740a6bb8148c79da0dd","user":{"login":"wavelab","id":13383159,"avatar_url":"https://avatars3.githubusercontent.com/u/13383159?v=3","gravatar_id":"","url":"https://api.github.com/users/wavelab","html_url":"https://github.com/wavelab","followers_url":"https://api.github.com/users/wavelab/followers","following_url":"https://api.github.com/users/wavelab/following{/other_user}","gists_url":"https://api.github.com/users/wavelab/gists{/gist_id}","starred_url":"https://api.github.com/users/wavelab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wavelab/subscriptions","organizations_url":"https://api.github.com/users/wavelab/orgs","repos_url":"https://api.github.com/users/wavelab/repos","events_url":"https://api.github.com/users/wavelab/events{/privacy}","received_events_url":"https://api.github.com/users/wavelab/received_events","type":"Organization","site_admin":false},"repo":{"id":79469465,"name":"libwave","full_name":"wavelab/libwave","owner":{"login":"wavelab","id":13383159,"avatar_url":"https://avatars3.githubusercontent.com/u/13383159?v=3","gravatar_id":"","url":"https://api.github.com/users/wavelab","html_url":"https://github.com/wavelab","followers_url":"https://api.github.com/users/wavelab/followers","following_url":"https://api.github.com/users/wavelab/following{/other_user}","gists_url":"https://api.github.com/users/wavelab/gists{/gist_id}","starred_url":"https://api.github.com/users/wavelab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wavelab/subscriptions","organizations_url":"https://api.github.com/users/wavelab/orgs","repos_url":"https://api.github.com/users/wavelab/repos","events_url":"https://api.github.com/users/wavelab/events{/privacy}","received_events_url":"https://api.github.com/users/wavelab/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/wavelab/libwave","description":"Wavelab SLAM Library","fork":false,"url":"https://api.github.com/repos/wavelab/libwave","forks_url":"https://api.github.com/repos/wavelab/libwave/forks","keys_url":"https://api.github.com/repos/wavelab/libwave/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wavelab/libwave/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wavelab/libwave/teams","hooks_url":"https://api.github.com/repos/wavelab/libwave/hooks","issue_events_url":"https://api.github.com/repos/wavelab/libwave/issues/events{/number}","events_url":"https://api.github.com/repos/wavelab/libwave/events","assignees_url":"https://api.github.com/repos/wavelab/libwave/assignees{/user}","branches_url":"https://api.github.com/repos/wavelab/libwave/branches{/branch}","tags_url":"https://api.github.com/repos/wavelab/libwave/tags","blobs_url":"https://api.github.com/repos/wavelab/libwave/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wavelab/libwave/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wavelab/libwave/git/refs{/sha}","trees_url":"https://api.github.com/repos/wavelab/libwave/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wavelab/libwave/statuses/{sha}","languages_url":"https://api.github.com/repos/wavelab/libwave/languages","stargazers_url":"https://api.github.com/repos/wavelab/libwave/stargazers","contributors_url":"https://api.github.com/repos/wavelab/libwave/contributors","subscribers_url":"https://api.github.com/repos/wavelab/libwave/subscribers","subscription_url":"https://api.github.com/repos/wavelab/libwave/subscription","commits_url":"https://api.github.com/repos/wavelab/libwave/commits{/sha}","git_commits_url":"https://api.github.com/repos/wavelab/libwave/git/commits{/sha}","comments_url":"https://api.github.com/repos/wavelab/libwave/comments{/number}","issue_comment_url":"https://api.github.com/repos/wavelab/libwave/issues/comments{/number}","contents_url":"https://api.github.com/repos/wavelab/libwave/contents/{+path}","compare_url":"https://api.github.com/repos/wavelab/libwave/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wavelab/libwave/merges","archive_url":"https://api.github.com/repos/wavelab/libwave/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wavelab/libwave/downloads","issues_url":"https://api.github.com/repos/wavelab/libwave/issues{/number}","pulls_url":"https://api.github.com/repos/wavelab/libwave/pulls{/number}","milestones_url":"https://api.github.com/repos/wavelab/libwave/milestones{/number}","notifications_url":"https://api.github.com/repos/wavelab/libwave/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wavelab/libwave/labels{/name}","releases_url":"https://api.github.com/repos/wavelab/libwave/releases{/id}","deployments_url":"https://api.github.com/repos/wavelab/libwave/deployments","created_at":"2017-01-19T15:58:52Z","updated_at":"2017-06-07T22:02:12Z","pushed_at":"2017-06-21T18:13:03Z","git_url":"git://github.com/wavelab/libwave.git","ssh_url":"git@github.com:wavelab/libwave.git","clone_url":"https://github.com/wavelab/libwave.git","svn_url":"https://github.com/wavelab/libwave","homepage":"https://wavelab.github.io/libwave/","size":12784,"stargazers_count":5,"watchers_count":5,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":37,"forks":0,"open_issues":37,"watchers":5,"default_branch":"master"}},"base":{"label":"wavelab:master","ref":"master","sha":"e3d5b1853625f2976e0aef2d7041b5bac03066be","user":{"login":"wavelab","id":13383159,"avatar_url":"https://avatars3.githubusercontent.com/u/13383159?v=3","gravatar_id":"","url":"https://api.github.com/users/wavelab","html_url":"https://github.com/wavelab","followers_url":"https://api.github.com/users/wavelab/followers","following_url":"https://api.github.com/users/wavelab/following{/other_user}","gists_url":"https://api.github.com/users/wavelab/gists{/gist_id}","starred_url":"https://api.github.com/users/wavelab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wavelab/subscriptions","organizations_url":"https://api.github.com/users/wavelab/orgs","repos_url":"https://api.github.com/users/wavelab/repos","events_url":"https://api.github.com/users/wavelab/events{/privacy}","received_events_url":"https://api.github.com/users/wavelab/received_events","type":"Organization","site_admin":false},"repo":{"id":79469465,"name":"libwave","full_name":"wavelab/libwave","owner":{"login":"wavelab","id":13383159,"avatar_url":"https://avatars3.githubusercontent.com/u/13383159?v=3","gravatar_id":"","url":"https://api.github.com/users/wavelab","html_url":"https://github.com/wavelab","followers_url":"https://api.github.com/users/wavelab/followers","following_url":"https://api.github.com/users/wavelab/following{/other_user}","gists_url":"https://api.github.com/users/wavelab/gists{/gist_id}","starred_url":"https://api.github.com/users/wavelab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wavelab/subscriptions","organizations_url":"https://api.github.com/users/wavelab/orgs","repos_url":"https://api.github.com/users/wavelab/repos","events_url":"https://api.github.com/users/wavelab/events{/privacy}","received_events_url":"https://api.github.com/users/wavelab/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/wavelab/libwave","description":"Wavelab SLAM Library","fork":false,"url":"https://api.github.com/repos/wavelab/libwave","forks_url":"https://api.github.com/repos/wavelab/libwave/forks","keys_url":"https://api.github.com/repos/wavelab/libwave/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wavelab/libwave/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wavelab/libwave/teams","hooks_url":"https://api.github.com/repos/wavelab/libwave/hooks","issue_events_url":"https://api.github.com/repos/wavelab/libwave/issues/events{/number}","events_url":"https://api.github.com/repos/wavelab/libwave/events","assignees_url":"https://api.github.com/repos/wavelab/libwave/assignees{/user}","branches_url":"https://api.github.com/repos/wavelab/libwave/branches{/branch}","tags_url":"https://api.github.com/repos/wavelab/libwave/tags","blobs_url":"https://api.github.com/repos/wavelab/libwave/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wavelab/libwave/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wavelab/libwave/git/refs{/sha}","trees_url":"https://api.github.com/repos/wavelab/libwave/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wavelab/libwave/statuses/{sha}","languages_url":"https://api.github.com/repos/wavelab/libwave/languages","stargazers_url":"https://api.github.com/repos/wavelab/libwave/stargazers","contributors_url":"https://api.github.com/repos/wavelab/libwave/contributors","subscribers_url":"https://api.github.com/repos/wavelab/libwave/subscribers","subscription_url":"https://api.github.com/repos/wavelab/libwave/subscription","commits_url":"https://api.github.com/repos/wavelab/libwave/commits{/sha}","git_commits_url":"https://api.github.com/repos/wavelab/libwave/git/commits{/sha}","comments_url":"https://api.github.com/repos/wavelab/libwave/comments{/number}","issue_comment_url":"https://api.github.com/repos/wavelab/libwave/issues/comments{/number}","contents_url":"https://api.github.com/repos/wavelab/libwave/contents/{+path}","compare_url":"https://api.github.com/repos/wavelab/libwave/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wavelab/libwave/merges","archive_url":"https://api.github.com/repos/wavelab/libwave/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wavelab/libwave/downloads","issues_url":"https://api.github.com/repos/wavelab/libwave/issues{/number}","pulls_url":"https://api.github.com/repos/wavelab/libwave/pulls{/number}","milestones_url":"https://api.github.com/repos/wavelab/libwave/milestones{/number}","notifications_url":"https://api.github.com/repos/wavelab/libwave/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wavelab/libwave/labels{/name}","releases_url":"https://api.github.com/repos/wavelab/libwave/releases{/id}","deployments_url":"https://api.github.com/repos/wavelab/libwave/deployments","created_at":"2017-01-19T15:58:52Z","updated_at":"2017-06-07T22:02:12Z","pushed_at":"2017-06-21T18:13:03Z","git_url":"git://github.com/wavelab/libwave.git","ssh_url":"git@github.com:wavelab/libwave.git","clone_url":"https://github.com/wavelab/libwave.git","svn_url":"https://github.com/wavelab/libwave","homepage":"https://wavelab.github.io/libwave/","size":12784,"stargazers_count":5,"watchers_count":5,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":37,"forks":0,"open_issues":37,"watchers":5,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/wavelab/libwave/pulls/153"},"html":{"href":"https://github.com/wavelab/libwave/pull/153"},"issue":{"href":"https://api.github.com/repos/wavelab/libwave/issues/153"},"comments":{"href":"https://api.github.com/repos/wavelab/libwave/issues/153/comments"},"review_comments":{"href":"https://api.github.com/repos/wavelab/libwave/pulls/153/comments"},"review_comment":{"href":"https://api.github.com/repos/wavelab/libwave/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/wavelab/libwave/pulls/153/commits"},"statuses":{"href":"https://api.github.com/repos/wavelab/libwave/statuses/95a9fabdf5aac844b1194740a6bb8148c79da0dd"}}}}
{"actor":{"display_login":"navganti"}}