{"action":"created","comment":{"url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/comments/206928082","pull_request_review_id":142419076,"id":206928082,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNjkyODA4Mg==","diff_hunk":"@@ -0,0 +1,303 @@\n+// Distributed under the MIT License.\n+// See LICENSE.txt for details.\n+\n+#pragma once\n+\n+#include <cstddef>\n+#include <tuple>\n+\n+#include \"DataStructures/DataBox/DataBox.hpp\"\n+#include \"DataStructures/DataBox/Prefixes.hpp\"\n+#include \"DataStructures/DataVector.hpp\"\n+#include \"DataStructures/DenseVector.hpp\"\n+#include \"DataStructures/Variables.hpp\"\n+#include \"ErrorHandling/Assert.hpp\"\n+#include \"NumericalAlgorithms/LinearSolver/IterationId.hpp\"\n+#include \"NumericalAlgorithms/LinearSolver/Tags.hpp\"\n+#include \"Parallel/Printf.hpp\"\n+#include \"Parallel/Reduction.hpp\"\n+#include \"Utilities/Blas.hpp\"\n+#include \"Utilities/ContainerHelpers.hpp\"\n+#include \"Utilities/EqualWithinRoundoff.hpp\"\n+#include \"Utilities/MakeWithValue.hpp\"\n+#include \"Utilities/Requires.hpp\"\n+\n+namespace tuples {\n+template <typename...>\n+class TaggedTuple;\n+}  // namespace tuples\n+\n+namespace LinearSolver {\n+namespace Actions {\n+namespace {\n+template <typename>\n+struct InitializeResidualMagnitudeSquare;\n+template <typename>\n+struct UpdateFieldValues;\n+template <typename>\n+struct UpdateConjugateGradient;\n+}  // namespace\n+}  // namespace Actions\n+}  // namespace LinearSolver\n+\n+namespace LinearSolver {\n+\n+// The symbols in this file are chosen to coincide with the pseudocode notation\n+// in the [Blaze documentation](https://bitbucket.org/blaze-lib/blaze/wiki/\n+// Getting%20Started#!a-complex-example)\n+\n+namespace {\n+\n+// By virtue of the symmetric operator `A` we can define an inner product\n+// <p,q>=p.A(q).\n+template <typename Lhs, typename Rhs = Lhs>\n+struct InnerProduct {\n+  static double apply(const Lhs& lhs, const Rhs& rhs) noexcept {\n+      return dot(lhs, rhs);\n+  }\n+};\n+\n+template <typename LhsTagsList, typename RhsTagsList>\n+struct InnerProduct<Variables<LhsTagsList>, Variables<RhsTagsList>> {\n+  static double apply(const Variables<LhsTagsList>& lhs,\n+                      const Variables<RhsTagsList>& rhs) noexcept {\n+    const auto size = lhs.size();\n+    ASSERT(size == rhs.size(),\n+           \"The Variables must be of the same size to take an inner product\");\n+    return ddot_(size, lhs.data(), 1, rhs.data(), 1);\n+  }\n+};\n+\n+}  // namespace\n+\n+/*!\n+ * \\brief Initialize the tags used by the conjugate gradient linear solver.\n+ */\n+template <typename FieldTag>\n+struct ConjugateGradientTags {\n+  using simple_tags = db::AddSimpleTags<\n+      LinearSolver::Tags::IterationId,\n+      ::Tags::Next<LinearSolver::Tags::IterationId>,\n+      db::add_tag_prefix<LinearSolver::Tags::ConjugateGradient, FieldTag>,\n+      db::add_tag_prefix<LinearSolver::Tags::ConjugateGradientProjection,\n+                         FieldTag>,\n+      db::add_tag_prefix<LinearSolver::Tags::Residual, FieldTag>,\n+      db::add_tag_prefix<LinearSolver::Tags::ResidualMagnitudeSquare,\n+                         FieldTag>>;\n+\n+  using compute_tags = db::AddComputeTags<>;\n+\n+  template <typename TagsList, typename Metavariables, typename ArrayIndex,\n+            typename ParallelComponent>\n+  static auto initialize(\n+      db::DataBox<TagsList>&& box,\n+      const Parallel::ConstGlobalCache<Metavariables>& cache,\n+      const ArrayIndex& array_index, const ParallelComponent* const /*meta*/,\n+      const db::item_type<db::add_tag_prefix<::Tags::Source, FieldTag>>& b,\n+      const db::item_type<db::add_tag_prefix<\n+          LinearSolver::Tags::ConjugateGradientProjection, FieldTag>>&\n+          Ax) noexcept {\n+    LinearSolver::IterationId iteration_id{0};\n+    LinearSolver::IterationId next_iteration_id{1};\n+\n+    db::item_type<\n+        db::add_tag_prefix<LinearSolver::Tags::ConjugateGradient, FieldTag>>\n+        p = b - Ax;\n+    db::item_type<db::add_tag_prefix<LinearSolver::Tags::Residual, FieldTag>>\n+        r = b - Ax;\n+    auto Ap = make_with_value<db::item_type<db::add_tag_prefix<\n+        LinearSolver::Tags::ConjugateGradientProjection, FieldTag>>>(\n+        b, std::numeric_limits<double>::signaling_NaN());\n+\n+    // Perform global reduction to compute initial residual magnitude square\n+    Parallel::contribute_to_reduction<\n+        Actions::InitializeResidualMagnitudeSquare<FieldTag>>(\n+        InnerProduct<db::item_type<db::add_tag_prefix<\n+            LinearSolver::Tags::Residual, FieldTag>>>::apply(r, r),\n+        Parallel::get_parallel_component<ParallelComponent>(cache)[array_index],\n+        Parallel::get_parallel_component<ParallelComponent>(cache),\n+        CkReduction::sum_double);\n+\n+    return db::create_from<db::RemoveTags<>, simple_tags, compute_tags>(\n+        std::move(box), std::move(iteration_id), std::move(next_iteration_id),\n+        std::move(p), std::move(Ap), std::move(r),\n+        std::numeric_limits<double>::signaling_NaN());\n+  }\n+};\n+\n+namespace Actions {\n+\n+namespace {\n+\n+template <typename FieldTag>\n+struct InitializeResidualMagnitudeSquare {\n+  template <typename... DbTags, typename... InboxTags, typename Metavariables,\n+            typename ArrayIndex, typename ActionList,\n+            typename ParallelComponent,\n+            Requires<tmpl2::flat_any_v<cpp17::is_same_v<FieldTag, DbTags>...>> =\n+                nullptr>\n+  static auto apply(db::DataBox<tmpl::list<DbTags...>>& box,\n+                    tuples::TaggedTuple<InboxTags...>& /*inboxes*/,\n+                    Parallel::ConstGlobalCache<Metavariables>& /*cache*/,\n+                    const ArrayIndex& /*array_index*/,\n+                    const ActionList /*meta*/,\n+                    const ParallelComponent* const /*meta*/,\n+                    const double& rsnew) noexcept {\n+    db::mutate<db::add_tag_prefix<LinearSolver::Tags::ResidualMagnitudeSquare,\n+                                  FieldTag>>(\n+        make_not_null(&box), [rsnew](auto rsold) noexcept { *rsold = rsnew; });","path":"src/NumericalAlgorithms/LinearSolver/Actions/ConjugateGradient.hpp","position":148,"original_position":148,"commit_id":"f24ce51c5bead7be73c1319a9210b6e379f1f3bc","original_commit_id":"f24ce51c5bead7be73c1319a9210b6e379f1f3bc","user":{"login":"kidder","id":1264082,"node_id":"MDQ6VXNlcjEyNjQwODI=","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":"more descriptive names","created_at":"2018-08-01T15:33:37Z","updated_at":"2018-08-01T15:51:47Z","html_url":"https://github.com/sxs-collaboration/spectre/pull/792#discussion_r206928082","pull_request_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/792","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/comments/206928082"},"html":{"href":"https://github.com/sxs-collaboration/spectre/pull/792#discussion_r206928082"},"pull_request":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/792"}}},"pull_request":{"url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/792","id":197537599,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk3NTM3NTk5","html_url":"https://github.com/sxs-collaboration/spectre/pull/792","diff_url":"https://github.com/sxs-collaboration/spectre/pull/792.diff","patch_url":"https://github.com/sxs-collaboration/spectre/pull/792.patch","issue_url":"https://api.github.com/repos/sxs-collaboration/spectre/issues/792","number":792,"state":"open","locked":false,"title":"Add conjugate gradient linear solver","user":{"login":"nilsleiffischer","id":746230,"node_id":"MDQ6VXNlcjc0NjIzMA==","avatar_url":"https://avatars2.githubusercontent.com/u/746230?v=4","gravatar_id":"","url":"https://api.github.com/users/nilsleiffischer","html_url":"https://github.com/nilsleiffischer","followers_url":"https://api.github.com/users/nilsleiffischer/followers","following_url":"https://api.github.com/users/nilsleiffischer/following{/other_user}","gists_url":"https://api.github.com/users/nilsleiffischer/gists{/gist_id}","starred_url":"https://api.github.com/users/nilsleiffischer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nilsleiffischer/subscriptions","organizations_url":"https://api.github.com/users/nilsleiffischer/orgs","repos_url":"https://api.github.com/users/nilsleiffischer/repos","events_url":"https://api.github.com/users/nilsleiffischer/events{/privacy}","received_events_url":"https://api.github.com/users/nilsleiffischer/received_events","type":"User","site_admin":false},"body":"## Proposed changes\r\n\r\nThis PR adds a first simple linear solver based on our parallel infrastructure, to be used for elliptic systems. It implements the conjugate gradient algorithm with two global reductions (but no global synchronization points).\r\n\r\nPlease see `Test_ConjugateGradientAlgorithm.cpp` for documentation. There is also a `Test_DistributedConjugateGradientAlgorithm.cpp` that works with a `Variables` and on multiple elements.\r\n\r\n- [x] This PR depends on #696.\r\n\r\n### Types of changes:\r\n\r\n- [x] New feature\r\n\r\n### Component:\r\n\r\n- [x] Code\r\n\r\n### Code review checklist\r\n\r\n- [ ] The PR passes all checks, including unit tests, `clang-tidy` and `IWYU`. For instructions on how to perform the CI checks locally refer to the [Dev guide on the Travis CI](https://spectre-code.org/travis_guide.html).\r\n- [ ] The code is documented and the documentation renders correctly. Run `make doc` to generate the documentation locally into `BUILD_DIR/docs/html`. Then open `index.html`.\r\n- [ ] The code follows the stylistic and code quality guidelines listed in the [code review guide](https://spectre-code.org/code_review_guide.html).\r\n\r\n## Further comments\r\n\r\nFor reference, this is the example Matlab code for the conjugate gradient algorithm [from Wikipedia](https://en.wikipedia.org/wiki/Conjugate_gradient_method):\r\n\r\n```matlab\r\nfunction [x] = conjgrad(A, b, x)\r\n    r = b - A * x;\r\n    p = r;\r\n    rsold = r' * r;\r\n\r\n    for i = 1:length(b)\r\n        Ap = A * p;\r\n        alpha = rsold / (p' * Ap);\r\n        x = x + alpha * p;\r\n        r = r - alpha * Ap;\r\n        rsnew = r' * r;\r\n        if sqrt(rsnew) < 1e-10\r\n              break;\r\n        end\r\n        p = r + (rsnew / rsold) * p;\r\n        rsold = rsnew;\r\n    end\r\nend\r\n```","created_at":"2018-06-26T20:12:54Z","updated_at":"2018-08-01T15:51:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1a558d17a292031dab818553d430d77903cdaaca","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/792/commits","review_comments_url":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/792/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/792/comments","statuses_url":"https://api.github.com/repos/sxs-collaboration/spectre/statuses/f24ce51c5bead7be73c1319a9210b6e379f1f3bc","head":{"label":"nilsleiffischer:linsolv","ref":"linsolv","sha":"f24ce51c5bead7be73c1319a9210b6e379f1f3bc","user":{"login":"nilsleiffischer","id":746230,"node_id":"MDQ6VXNlcjc0NjIzMA==","avatar_url":"https://avatars2.githubusercontent.com/u/746230?v=4","gravatar_id":"","url":"https://api.github.com/users/nilsleiffischer","html_url":"https://github.com/nilsleiffischer","followers_url":"https://api.github.com/users/nilsleiffischer/followers","following_url":"https://api.github.com/users/nilsleiffischer/following{/other_user}","gists_url":"https://api.github.com/users/nilsleiffischer/gists{/gist_id}","starred_url":"https://api.github.com/users/nilsleiffischer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nilsleiffischer/subscriptions","organizations_url":"https://api.github.com/users/nilsleiffischer/orgs","repos_url":"https://api.github.com/users/nilsleiffischer/repos","events_url":"https://api.github.com/users/nilsleiffischer/events{/privacy}","received_events_url":"https://api.github.com/users/nilsleiffischer/received_events","type":"User","site_admin":false},"repo":{"id":119436274,"node_id":"MDEwOlJlcG9zaXRvcnkxMTk0MzYyNzQ=","name":"spectre","full_name":"nilsleiffischer/spectre","owner":{"login":"nilsleiffischer","id":746230,"node_id":"MDQ6VXNlcjc0NjIzMA==","avatar_url":"https://avatars2.githubusercontent.com/u/746230?v=4","gravatar_id":"","url":"https://api.github.com/users/nilsleiffischer","html_url":"https://github.com/nilsleiffischer","followers_url":"https://api.github.com/users/nilsleiffischer/followers","following_url":"https://api.github.com/users/nilsleiffischer/following{/other_user}","gists_url":"https://api.github.com/users/nilsleiffischer/gists{/gist_id}","starred_url":"https://api.github.com/users/nilsleiffischer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nilsleiffischer/subscriptions","organizations_url":"https://api.github.com/users/nilsleiffischer/orgs","repos_url":"https://api.github.com/users/nilsleiffischer/repos","events_url":"https://api.github.com/users/nilsleiffischer/events{/privacy}","received_events_url":"https://api.github.com/users/nilsleiffischer/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/nilsleiffischer/spectre","description":"SpECTRE is a code for multi-scale, multi-physics problems in astrophysics and gravitational physics.","fork":true,"url":"https://api.github.com/repos/nilsleiffischer/spectre","forks_url":"https://api.github.com/repos/nilsleiffischer/spectre/forks","keys_url":"https://api.github.com/repos/nilsleiffischer/spectre/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nilsleiffischer/spectre/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nilsleiffischer/spectre/teams","hooks_url":"https://api.github.com/repos/nilsleiffischer/spectre/hooks","issue_events_url":"https://api.github.com/repos/nilsleiffischer/spectre/issues/events{/number}","events_url":"https://api.github.com/repos/nilsleiffischer/spectre/events","assignees_url":"https://api.github.com/repos/nilsleiffischer/spectre/assignees{/user}","branches_url":"https://api.github.com/repos/nilsleiffischer/spectre/branches{/branch}","tags_url":"https://api.github.com/repos/nilsleiffischer/spectre/tags","blobs_url":"https://api.github.com/repos/nilsleiffischer/spectre/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nilsleiffischer/spectre/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nilsleiffischer/spectre/git/refs{/sha}","trees_url":"https://api.github.com/repos/nilsleiffischer/spectre/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nilsleiffischer/spectre/statuses/{sha}","languages_url":"https://api.github.com/repos/nilsleiffischer/spectre/languages","stargazers_url":"https://api.github.com/repos/nilsleiffischer/spectre/stargazers","contributors_url":"https://api.github.com/repos/nilsleiffischer/spectre/contributors","subscribers_url":"https://api.github.com/repos/nilsleiffischer/spectre/subscribers","subscription_url":"https://api.github.com/repos/nilsleiffischer/spectre/subscription","commits_url":"https://api.github.com/repos/nilsleiffischer/spectre/commits{/sha}","git_commits_url":"https://api.github.com/repos/nilsleiffischer/spectre/git/commits{/sha}","comments_url":"https://api.github.com/repos/nilsleiffischer/spectre/comments{/number}","issue_comment_url":"https://api.github.com/repos/nilsleiffischer/spectre/issues/comments{/number}","contents_url":"https://api.github.com/repos/nilsleiffischer/spectre/contents/{+path}","compare_url":"https://api.github.com/repos/nilsleiffischer/spectre/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nilsleiffischer/spectre/merges","archive_url":"https://api.github.com/repos/nilsleiffischer/spectre/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nilsleiffischer/spectre/downloads","issues_url":"https://api.github.com/repos/nilsleiffischer/spectre/issues{/number}","pulls_url":"https://api.github.com/repos/nilsleiffischer/spectre/pulls{/number}","milestones_url":"https://api.github.com/repos/nilsleiffischer/spectre/milestones{/number}","notifications_url":"https://api.github.com/repos/nilsleiffischer/spectre/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nilsleiffischer/spectre/labels{/name}","releases_url":"https://api.github.com/repos/nilsleiffischer/spectre/releases{/id}","deployments_url":"https://api.github.com/repos/nilsleiffischer/spectre/deployments","created_at":"2018-01-29T20:19:38Z","updated_at":"2018-07-28T10:45:56Z","pushed_at":"2018-07-28T10:45:49Z","git_url":"git://github.com/nilsleiffischer/spectre.git","ssh_url":"git@github.com:nilsleiffischer/spectre.git","clone_url":"https://github.com/nilsleiffischer/spectre.git","svn_url":"https://github.com/nilsleiffischer/spectre","homepage":"","size":9891,"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,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"sxs-collaboration:develop","ref":"develop","sha":"d38436e217a414aacb55d66d4cb9b34db7c6b262","user":{"login":"sxs-collaboration","id":26882595,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2ODgyNTk1","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,"node_id":"MDEwOlJlcG9zaXRvcnk4NzU3MDUxMA==","name":"spectre","full_name":"sxs-collaboration/spectre","owner":{"login":"sxs-collaboration","id":26882595,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2ODgyNTk1","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":"2018-07-31T00:44:58Z","pushed_at":"2018-08-01T15:30:16Z","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":12295,"stargazers_count":26,"watchers_count":26,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":26,"mirror_url":null,"archived":false,"open_issues_count":107,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":26,"open_issues":107,"watchers":26,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/792"},"html":{"href":"https://github.com/sxs-collaboration/spectre/pull/792"},"issue":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/issues/792"},"comments":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/issues/792/comments"},"review_comments":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/pulls/792/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/792/commits"},"statuses":{"href":"https://api.github.com/repos/sxs-collaboration/spectre/statuses/f24ce51c5bead7be73c1319a9210b6e379f1f3bc"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"kidder"}}