{"action":"created","comment":{"url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/comments/149405182","pull_request_review_id":74778358,"id":149405182,"diff_hunk":"@@ -0,0 +1,321 @@\n+// Distributed under the MIT License.\n+// See LICENSE.txt for details.\n+\n+/// \\file\n+/// Defines actions ComputeBoundaryFlux and SendDataForFluxes\n+\n+#pragma once\n+\n+#include <boost/functional/hash.hpp>\n+#include <tuple>\n+#include <unordered_map>\n+#include <utility>\n+\n+#include \"DataStructures/DataBox.hpp\"\n+#include \"DataStructures/DataBox/Prefixes.hpp\"\n+#include \"DataStructures/Index.hpp\"\n+#include \"DataStructures/SliceIterator.hpp\"\n+#include \"DataStructures/Tensor/EagerMath/Magnitude.hpp\"\n+#include \"DataStructures/VariablesHelpers.hpp\"\n+#include \"Domain/Direction.hpp\"\n+#include \"Domain/Tags.hpp\"\n+#include \"Domain/Element.hpp\"\n+#include \"Domain/ElementId.hpp\"\n+#include \"Domain/ElementIndex.hpp\"\n+#include \"Domain/GridNormal.hpp\"\n+#include \"Domain/Neighbors.hpp\"\n+#include \"Domain/Orientation.hpp\"\n+#include \"Domain/Side.hpp\"\n+#include \"ErrorHandling/Assert.hpp\"\n+#include \"Numerical/DiscontinuousGalerkin/LiftFlux.hpp\"\n+#include \"Parallel/ConstGlobalCache.hpp\"\n+#include \"Time/Tags.hpp\"\n+#include \"Utilities/Gsl.hpp\"\n+#include \"Utilities/TaggedTuple.hpp\"\n+#include \"Utilities/TypeTraits.hpp\"\n+\n+namespace Actions {\n+/// \\ingroup ActionsGroup\n+/// \\ingroup DiscontinuousGalerkin\n+/// \\brief Receive boundary data from neighbors and compute boundary\n+/// portion of derivative.\n+///\n+/// \\note The data must be oriented by the sender, but this class\n+/// handles projection, etc.\n+///\n+/// Uses:\n+/// - ConstGlobalCache: Metavariables::numerical_flux\n+/// - DataBox: Tags::Element<volume_dim>, Tags::ElementMap<volume_dim>,\n+///   Tags::HistoryBoundaryVariables<Direction<volume_dim>,\n+///     db::item_type<variables_tag>>, Tags::Extents<volume_dim>, Tags::TimeId\n+///\n+/// DataBox changes:\n+/// - Adds: system::dt_variables_tag\n+/// - Removes: Tags::HistoryBoundaryVariables<Direction<volume_dim>,\n+///       system::variables_tag>\n+/// - Modifies: nothing\n+template <typename System>\n+struct ComputeBoundaryFlux {\n+  struct FluxesTag {\n+    using temporal_id = TimeId;\n+    using type =\n+        std::unordered_map<\n+            TimeId,\n+            std::unordered_map<\n+                std::pair<Direction<System::volume_dim>,\n+                          ElementId<System::volume_dim>>,\n+                db::item_type<typename System::variables_tag>,\n+                boost::hash<std::pair<Direction<System::volume_dim>,\n+                                      ElementId<System::volume_dim>>>>>;\n+  };\n+\n+  template <typename Flux, typename... Tags, typename... ArgumentTags>\n+  static auto apply_flux(const Flux& flux,\n+                         const tuples::TaggedTuple<Tags...>& self_data,\n+                         const tuples::TaggedTuple<Tags...>& neighbor_data,\n+                         tmpl::list<ArgumentTags...> /*meta*/) noexcept {\n+    return flux(tuples::get<ArgumentTags>(self_data)...,\n+                tuples::get<ArgumentTags>(neighbor_data)...);\n+  }\n+\n+  template <typename DbTags, typename... InboxTags, typename Metavariables,\n+            typename ArrayIndex, typename ActionList>\n+  static auto apply(db::DataBox<DbTags>& box,\n+                    tuples::TaggedTuple<InboxTags...>& inboxes,\n+                    const Parallel::ConstGlobalCache<Metavariables>& cache,\n+                    const ArrayIndex& /*array_index*/,\n+                    const ActionList /*meta*/) noexcept {\n+    static_assert(cpp17::is_same_v<System, typename Metavariables::system>,\n+                  \"Inconsistent systems\");\n+    constexpr const size_t volume_dim = System::volume_dim;\n+    using variables_tag = typename System::variables_tag;\n+    using dt_variables_tag = typename System::dt_variables_tag;\n+\n+    const auto& flux_computer =\n+        get<typename Metavariables::numerical_flux>(cache);\n+    const auto& extents = db::get<Tags::Extents<volume_dim>>(box);\n+    const auto& element_map = *db::get<Tags::ElementMap<volume_dim>>(box);\n+    const auto& local_data =\n+        db::get<Tags::HistoryBoundaryVariables<\n+                  Direction<volume_dim>, variables_tag>>(box);\n+\n+    auto dt_vars = db::item_type<dt_variables_tag>(extents.product(), 0.);\n+\n+    const auto& element = db::get<Tags::Element<volume_dim>>(box);\n+\n+    auto& inbox = tuples::get<FluxesTag>(inboxes);\n+    const auto& time_id = db::get<Tags::TimeId>(box);\n+    auto remote_data = std::move(inbox[time_id]);\n+    inbox.erase(time_id);\n+\n+    for (const auto& direction_neighbors : element.neighbors()) {\n+      const auto& direction = direction_neighbors.first;\n+      const size_t dimension = direction.dimension();\n+      const auto& neighbors_in_direction = direction_neighbors.second;\n+      ASSERT(neighbors_in_direction.size() == 1,\n+             \"Complex mortars unimplemented\");\n+      const auto& neighbor = *neighbors_in_direction.begin();\n+      const auto neighbor_data_it =\n+          remote_data.find(std::make_pair(direction, neighbor));\n+      ASSERT(remote_data.end() != neighbor_data_it,\n+             \"Attempting to access neighbor flux data that does not exist. \"\n+             \"The neighbor attempting to be accessed is: \"\n+             << neighbor << \" in direction \" << direction\n+             << \". The known keys are \" << keys_of(remote_data) << \".\");\n+      const auto& local_value = local_data.at(direction);\n+      const auto& neighbor_value = neighbor_data_it->second;\n+\n+      // This needs to be fixed for hp-adaptivity to handle\n+      // projections correctly\n+\n+      const auto grid_normal = unnormalized_grid_normal(\n+          extents.slice_away(dimension), element_map, direction);\n+      // Using this instead of auto prevents incomprehensible errors\n+      // if the return type of compute_flux is wrong.\n+      using FluxType = db::item_type<add_tag_prefix<\n+          Tags::Flux, variables_tag, tmpl::size_t<volume_dim>, Frame::Grid>>;\n+      const FluxType local_boundary_flux =\n+          System::compute_flux::apply(local_value);\n+      const FluxType neighbor_boundary_flux =\n+          System::compute_flux::apply(neighbor_value);\n+      using normal_flux_tag =\n+          add_tag_prefix<Tags::NormalDotFlux, variables_tag>;\n+      db::item_type<normal_flux_tag> local_normal_flux(\n+          local_boundary_flux.number_of_grid_points(), 0.);\n+      db::item_type<normal_flux_tag> neighbor_normal_flux(\n+          local_boundary_flux.number_of_grid_points(), 0.);\n+      tmpl::for_each<typename variables_tag::tags_list>([\n+        &local_normal_flux, &neighbor_normal_flux, &local_boundary_flux,\n+        &neighbor_boundary_flux, &grid_normal\n+      ](auto tag) noexcept {\n+        using Tag = tmpl::type_from<decltype(tag)>;\n+        using flux_tag = Tags::Flux<Tag, tmpl::size_t<2>, Frame::Grid>;\n+        using normal_flux_tag = Tags::NormalDotFlux<Tag>;\n+\n+        const auto& local_bf = get<flux_tag>(local_boundary_flux);\n+        auto& local_nf = get<normal_flux_tag>(local_normal_flux);\n+        const auto& neighbor_bf = get<flux_tag>(neighbor_boundary_flux);\n+        auto& neighbor_nf = get<normal_flux_tag>(neighbor_normal_flux);\n+        for (auto flux_it = local_bf.begin(); flux_it != local_bf.end();\n+             ++flux_it) {\n+          const auto flux_index =\n+              local_bf.get_tensor_index(flux_it);\n+          const size_t contract_index = flux_index[0];\n+          const auto other_indices =\n+              all_but_specified_element_of<0>(flux_index);\n+          local_nf.get(other_indices) +=\n+              grid_normal.get(contract_index) * local_bf.get(flux_index);\n+          neighbor_nf.get(other_indices) +=\n+              grid_normal.get(contract_index) * neighbor_bf.get(flux_index);\n+        }\n+      });\n+\n+      const tuples::TaggedTuple<variables_tag, normal_flux_tag> self_data(\n+          local_value, std::move(local_normal_flux));\n+      const tuples::TaggedTuple<variables_tag, normal_flux_tag> neighbor_data(\n+          neighbor_value, std::move(neighbor_normal_flux));\n+\n+      auto numerical_flux = apply_flux(\n+          flux_computer, self_data, neighbor_data,\n+          typename std::decay_t<decltype(flux_computer)>::argument_tags{});\n+\n+      DataVector magnitude_of_grid_normal = magnitude(grid_normal);","path":"src/Numerical/DiscontinuousGalerkin/Actions/FluxCommunication.hpp","position":181,"original_position":182,"commit_id":"455b2b15c2fa1188e7cbdf545de1af4bd4857d91","original_commit_id":"82c0537cdbaac5dbed53f8f66c7f05bfc9e6bc2a","user":{"login":"kidder","id":1264082,"avatar_url":"https://avatars3.githubusercontent.com/u/1264082?v=4","gravatar_id":"","url":"https://api.github.com/users/kidder","html_url":"https://github.com/kidder","followers_url":"https://api.github.com/users/kidder/followers","following_url":"https://api.github.com/users/kidder/following{/other_user}","gists_url":"https://api.github.com/users/kidder/gists{/gist_id}","starred_url":"https://api.github.com/users/kidder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kidder/subscriptions","organizations_url":"https://api.github.com/users/kidder/orgs","repos_url":"https://api.github.com/users/kidder/repos","events_url":"https://api.github.com/users/kidder/events{/privacy}","received_events_url":"https://api.github.com/users/kidder/received_events","type":"User","site_admin":false},"body":"This will need a metric for non-Euclidean systems","created_at":"2017-11-07T15:33:06Z","updated_at":"2017-11-07T15:51:28Z","html_url":"https://github.com/sxs-collaboration/spectre/pull/341#discussion_r149405182","pull_request_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/341","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/comments/149405182"},"html":{"href":"https://github.com/sxs-collaboration/spectre/pull/341#discussion_r149405182"},"pull_request":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/341"}}},"pull_request":{"url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/341","id":150980818,"html_url":"https://github.com/sxs-collaboration/spectre/pull/341","diff_url":"https://github.com/sxs-collaboration/spectre/pull/341.diff","patch_url":"https://github.com/sxs-collaboration/spectre/pull/341.patch","issue_url":"https://api.github.com/repos/sxs-collaboration/spectre/issues/341","number":341,"state":"open","locked":false,"title":"Flux actions","user":{"login":"wthrowe","id":867117,"avatar_url":"https://avatars1.githubusercontent.com/u/867117?v=4","gravatar_id":"","url":"https://api.github.com/users/wthrowe","html_url":"https://github.com/wthrowe","followers_url":"https://api.github.com/users/wthrowe/followers","following_url":"https://api.github.com/users/wthrowe/following{/other_user}","gists_url":"https://api.github.com/users/wthrowe/gists{/gist_id}","starred_url":"https://api.github.com/users/wthrowe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wthrowe/subscriptions","organizations_url":"https://api.github.com/users/wthrowe/orgs","repos_url":"https://api.github.com/users/wthrowe/repos","events_url":"https://api.github.com/users/wthrowe/events{/privacy}","received_events_url":"https://api.github.com/users/wthrowe/received_events","type":"User","site_admin":false},"body":"## Proposed changes\r\n\r\nAdd actions for communicating fluxes in DG\r\n\r\n### Types of changes:\r\n\r\n- [ ] Bugfix\r\n- [X] New feature\r\n\r\n### Component:\r\n\r\n- [X] Code\r\n- [ ] Documentation\r\n- [ ] Build system\r\n- [ ] Continuous integration\r\n\r\n### Code review checklist\r\n\r\n- [ ] Follows [code review guidelines](https://sxs-collaboration.github.io/spectre/code_review_guide.html)\r\n- [ ] Code has documentation and unit tests\r\n- [ ] Private member variables have a trailing underscore\r\n- [ ] Do not use [Hungarian notation](https://en.wikipedia.org/wiki/Hungarian_notation), e.g. `double* pd_blah` is bad\r\n- [ ] Header order:\r\n  1. hpp corresponding to cpp (only in cpp files)\r\n  2. Blank line (only in cpp files)\r\n  3. STL and externals (in alphabetical order)\r\n  4. Blank line\r\n  5. SpECTRE includes (in alphabetical order)\r\n- [ ] File lists in CMake are alphabetical\r\n- [ ] Correct `noexcept` specification for functions (if unsure, mark `noexcept`)\r\n- [ ] Mark objects `const` whenever possible\r\n- [ ] Almost always `auto`, except with expression templates, i.e. `DataVector`\r\n- [ ] All commits for performance changes provide quantitative evidence and the tests used to obtain said evidence.\r\n- [ ] Make sure error messages are helpful, e.g. \"The number of grid points in the matrix 'F' is not the same as the number of grid points in the determinant.\"\r\n\r\n\r\n### Further comments\r\n\r\nThis is very rough, and several interfaces (most notably System::compute_flux) are not used in the way we intend for the long term.","created_at":"2017-11-06T22:49:01Z","updated_at":"2017-11-07T15:51:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"125ded09ca3b45ab0207dd7a2279e3d7bb49b8d7","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/341/commits","review_comments_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/341/comments","review_comment_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/comments{/number}","comments_url":"https://api.github.com/repos/sxs-collaboration/spectre/issues/341/comments","statuses_url":"https://api.github.com/repos/sxs-collaboration/spectre/statuses/455b2b15c2fa1188e7cbdf545de1af4bd4857d91","head":{"label":"wthrowe:flux_actions","ref":"flux_actions","sha":"455b2b15c2fa1188e7cbdf545de1af4bd4857d91","user":{"login":"wthrowe","id":867117,"avatar_url":"https://avatars1.githubusercontent.com/u/867117?v=4","gravatar_id":"","url":"https://api.github.com/users/wthrowe","html_url":"https://github.com/wthrowe","followers_url":"https://api.github.com/users/wthrowe/followers","following_url":"https://api.github.com/users/wthrowe/following{/other_user}","gists_url":"https://api.github.com/users/wthrowe/gists{/gist_id}","starred_url":"https://api.github.com/users/wthrowe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wthrowe/subscriptions","organizations_url":"https://api.github.com/users/wthrowe/orgs","repos_url":"https://api.github.com/users/wthrowe/repos","events_url":"https://api.github.com/users/wthrowe/events{/privacy}","received_events_url":"https://api.github.com/users/wthrowe/received_events","type":"User","site_admin":false},"repo":{"id":96371688,"name":"spectre","full_name":"wthrowe/spectre","owner":{"login":"wthrowe","id":867117,"avatar_url":"https://avatars1.githubusercontent.com/u/867117?v=4","gravatar_id":"","url":"https://api.github.com/users/wthrowe","html_url":"https://github.com/wthrowe","followers_url":"https://api.github.com/users/wthrowe/followers","following_url":"https://api.github.com/users/wthrowe/following{/other_user}","gists_url":"https://api.github.com/users/wthrowe/gists{/gist_id}","starred_url":"https://api.github.com/users/wthrowe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wthrowe/subscriptions","organizations_url":"https://api.github.com/users/wthrowe/orgs","repos_url":"https://api.github.com/users/wthrowe/repos","events_url":"https://api.github.com/users/wthrowe/events{/privacy}","received_events_url":"https://api.github.com/users/wthrowe/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/wthrowe/spectre","description":null,"fork":true,"url":"https://api.github.com/repos/wthrowe/spectre","forks_url":"https://api.github.com/repos/wthrowe/spectre/forks","keys_url":"https://api.github.com/repos/wthrowe/spectre/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wthrowe/spectre/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wthrowe/spectre/teams","hooks_url":"https://api.github.com/repos/wthrowe/spectre/hooks","issue_events_url":"https://api.github.com/repos/wthrowe/spectre/issues/events{/number}","events_url":"https://api.github.com/repos/wthrowe/spectre/events","assignees_url":"https://api.github.com/repos/wthrowe/spectre/assignees{/user}","branches_url":"https://api.github.com/repos/wthrowe/spectre/branches{/branch}","tags_url":"https://api.github.com/repos/wthrowe/spectre/tags","blobs_url":"https://api.github.com/repos/wthrowe/spectre/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wthrowe/spectre/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wthrowe/spectre/git/refs{/sha}","trees_url":"https://api.github.com/repos/wthrowe/spectre/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wthrowe/spectre/statuses/{sha}","languages_url":"https://api.github.com/repos/wthrowe/spectre/languages","stargazers_url":"https://api.github.com/repos/wthrowe/spectre/stargazers","contributors_url":"https://api.github.com/repos/wthrowe/spectre/contributors","subscribers_url":"https://api.github.com/repos/wthrowe/spectre/subscribers","subscription_url":"https://api.github.com/repos/wthrowe/spectre/subscription","commits_url":"https://api.github.com/repos/wthrowe/spectre/commits{/sha}","git_commits_url":"https://api.github.com/repos/wthrowe/spectre/git/commits{/sha}","comments_url":"https://api.github.com/repos/wthrowe/spectre/comments{/number}","issue_comment_url":"https://api.github.com/repos/wthrowe/spectre/issues/comments{/number}","contents_url":"https://api.github.com/repos/wthrowe/spectre/contents/{+path}","compare_url":"https://api.github.com/repos/wthrowe/spectre/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wthrowe/spectre/merges","archive_url":"https://api.github.com/repos/wthrowe/spectre/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wthrowe/spectre/downloads","issues_url":"https://api.github.com/repos/wthrowe/spectre/issues{/number}","pulls_url":"https://api.github.com/repos/wthrowe/spectre/pulls{/number}","milestones_url":"https://api.github.com/repos/wthrowe/spectre/milestones{/number}","notifications_url":"https://api.github.com/repos/wthrowe/spectre/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wthrowe/spectre/labels{/name}","releases_url":"https://api.github.com/repos/wthrowe/spectre/releases{/id}","deployments_url":"https://api.github.com/repos/wthrowe/spectre/deployments","created_at":"2017-07-06T00:23:14Z","updated_at":"2017-07-06T00:23:15Z","pushed_at":"2017-11-06T23:47:34Z","git_url":"git://github.com/wthrowe/spectre.git","ssh_url":"git@github.com:wthrowe/spectre.git","clone_url":"https://github.com/wthrowe/spectre.git","svn_url":"https://github.com/wthrowe/spectre","homepage":null,"size":8231,"stargazers_count":0,"watchers_count":0,"language":"C++","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,"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"sxs-collaboration:develop","ref":"develop","sha":"1de1218b8253b7f50c567f50a17815644f22fea8","user":{"login":"sxs-collaboration","id":26882595,"avatar_url":"https://avatars2.githubusercontent.com/u/26882595?v=4","gravatar_id":"","url":"https://api.github.com/users/sxs-collaboration","html_url":"https://github.com/sxs-collaboration","followers_url":"https://api.github.com/users/sxs-collaboration/followers","following_url":"https://api.github.com/users/sxs-collaboration/following{/other_user}","gists_url":"https://api.github.com/users/sxs-collaboration/gists{/gist_id}","starred_url":"https://api.github.com/users/sxs-collaboration/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sxs-collaboration/subscriptions","organizations_url":"https://api.github.com/users/sxs-collaboration/orgs","repos_url":"https://api.github.com/users/sxs-collaboration/repos","events_url":"https://api.github.com/users/sxs-collaboration/events{/privacy}","received_events_url":"https://api.github.com/users/sxs-collaboration/received_events","type":"Organization","site_admin":false},"repo":{"id":87570510,"name":"spectre","full_name":"sxs-collaboration/spectre","owner":{"login":"sxs-collaboration","id":26882595,"avatar_url":"https://avatars2.githubusercontent.com/u/26882595?v=4","gravatar_id":"","url":"https://api.github.com/users/sxs-collaboration","html_url":"https://github.com/sxs-collaboration","followers_url":"https://api.github.com/users/sxs-collaboration/followers","following_url":"https://api.github.com/users/sxs-collaboration/following{/other_user}","gists_url":"https://api.github.com/users/sxs-collaboration/gists{/gist_id}","starred_url":"https://api.github.com/users/sxs-collaboration/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sxs-collaboration/subscriptions","organizations_url":"https://api.github.com/users/sxs-collaboration/orgs","repos_url":"https://api.github.com/users/sxs-collaboration/repos","events_url":"https://api.github.com/users/sxs-collaboration/events{/privacy}","received_events_url":"https://api.github.com/users/sxs-collaboration/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/sxs-collaboration/spectre","description":"SpECTRE is a code for multi-scale, multi-physics problems in astrophysics and gravitational physics.","fork":false,"url":"https://api.github.com/repos/sxs-collaboration/spectre","forks_url":"https://api.github.com/repos/sxs-collaboration/spectre/forks","keys_url":"https://api.github.com/repos/sxs-collaboration/spectre/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sxs-collaboration/spectre/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sxs-collaboration/spectre/teams","hooks_url":"https://api.github.com/repos/sxs-collaboration/spectre/hooks","issue_events_url":"https://api.github.com/repos/sxs-collaboration/spectre/issues/events{/number}","events_url":"https://api.github.com/repos/sxs-collaboration/spectre/events","assignees_url":"https://api.github.com/repos/sxs-collaboration/spectre/assignees{/user}","branches_url":"https://api.github.com/repos/sxs-collaboration/spectre/branches{/branch}","tags_url":"https://api.github.com/repos/sxs-collaboration/spectre/tags","blobs_url":"https://api.github.com/repos/sxs-collaboration/spectre/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sxs-collaboration/spectre/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sxs-collaboration/spectre/git/refs{/sha}","trees_url":"https://api.github.com/repos/sxs-collaboration/spectre/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sxs-collaboration/spectre/statuses/{sha}","languages_url":"https://api.github.com/repos/sxs-collaboration/spectre/languages","stargazers_url":"https://api.github.com/repos/sxs-collaboration/spectre/stargazers","contributors_url":"https://api.github.com/repos/sxs-collaboration/spectre/contributors","subscribers_url":"https://api.github.com/repos/sxs-collaboration/spectre/subscribers","subscription_url":"https://api.github.com/repos/sxs-collaboration/spectre/subscription","commits_url":"https://api.github.com/repos/sxs-collaboration/spectre/commits{/sha}","git_commits_url":"https://api.github.com/repos/sxs-collaboration/spectre/git/commits{/sha}","comments_url":"https://api.github.com/repos/sxs-collaboration/spectre/comments{/number}","issue_comment_url":"https://api.github.com/repos/sxs-collaboration/spectre/issues/comments{/number}","contents_url":"https://api.github.com/repos/sxs-collaboration/spectre/contents/{+path}","compare_url":"https://api.github.com/repos/sxs-collaboration/spectre/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sxs-collaboration/spectre/merges","archive_url":"https://api.github.com/repos/sxs-collaboration/spectre/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sxs-collaboration/spectre/downloads","issues_url":"https://api.github.com/repos/sxs-collaboration/spectre/issues{/number}","pulls_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls{/number}","milestones_url":"https://api.github.com/repos/sxs-collaboration/spectre/milestones{/number}","notifications_url":"https://api.github.com/repos/sxs-collaboration/spectre/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sxs-collaboration/spectre/labels{/name}","releases_url":"https://api.github.com/repos/sxs-collaboration/spectre/releases{/id}","deployments_url":"https://api.github.com/repos/sxs-collaboration/spectre/deployments","created_at":"2017-04-07T17:28:20Z","updated_at":"2017-11-01T15:21:16Z","pushed_at":"2017-11-07T06:18:36Z","git_url":"git://github.com/sxs-collaboration/spectre.git","ssh_url":"git@github.com:sxs-collaboration/spectre.git","clone_url":"https://github.com/sxs-collaboration/spectre.git","svn_url":"https://github.com/sxs-collaboration/spectre","homepage":"","size":4810,"stargazers_count":8,"watchers_count":8,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":9,"mirror_url":null,"archived":false,"open_issues_count":55,"forks":9,"open_issues":55,"watchers":8,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/341"},"html":{"href":"https://github.com/sxs-collaboration/spectre/pull/341"},"issue":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/issues/341"},"comments":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/issues/341/comments"},"review_comments":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/341/comments"},"review_comment":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/341/commits"},"statuses":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/statuses/455b2b15c2fa1188e7cbdf545de1af4bd4857d91"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"kidder"}}