{"action":"created","comment":{"url":"https://api.github.com/repos/matsengrp/linearham/pulls/comments/90791711","pull_request_review_id":11307239,"id":90791711,"diff_hunk":"@@ -6,216 +6,245 @@\n namespace linearham {\n \n \n-/// @brief A \"boring\" Smooshable constructor, which just sets up memory.\n-/// @param[in] left_flex\n-/// How many alternative start points should we allow on the left side?\n-/// @param[in] right_flex\n-/// How many alternative end points should we allow on the right side?\n-Smooshable::Smooshable(int left_flex, int right_flex) {\n-  marginal_.resize(left_flex + 1, right_flex + 1);\n-  viterbi_.resize(left_flex + 1, right_flex + 1);\n-};\n-\n-\n /// @brief Constructor for Smooshable starting from a marginal probability\n /// matrix.\n /// @param[in] marginal\n /// A marginal probability matrix.\n Smooshable::Smooshable(const Eigen::Ref<const Eigen::MatrixXd>& marginal) {\n   marginal_ = marginal;\n   scaler_count_ = ScaleMatrix(marginal_);\n-  viterbi_ = marginal_;\n };\n \n \n-// VDJSmooshable Constructor Functions\n+/// @brief Raise exception: there are no Viterbi paths in a Smooshable.\n+const Eigen::MatrixXi& Smooshable::viterbi_idx() const {\n+  throw std::logic_error(\"No Viterbi paths in a Smooshable.\");\n+}\n+\n+\n+/// @brief Empty function: there are no paths in a Smooshable.\n+///\n+/// We don't throw an exception as above because this is naturally\n+/// called in the recursive process of building a Viterbi path.\n+/// This call is the \"empty base case\".\n+void Smooshable::AuxViterbiPath(int, int, std::vector<int>&) const {};\n+\n \n+// SmooshablePtr Functions\n+\n+SmooshablePtr BuildSmooshablePtr(\n+    const Eigen::Ref<const Eigen::MatrixXd>& marginal) {\n+  return std::make_shared<Smooshable>(Smooshable(marginal));\n+}\n+\n+\n+// VDJSmooshable Constructor Functions\n \n /// @brief Creates a Smooshable object for a given V germline gene and read.\n /// @param[in] vgerm_obj\n /// An object of class VGermline.\n-/// @param[in] V_left_flexbounds\n-/// A 2-tuple of read positions providing the bounds of the V gene's left\n-/// flex region.\n-/// @param[in] V_right_flexbounds\n-/// A 2-tuple of read positions providing the bounds of the V gene's right\n-/// flex region.\n+/// @param[in] flexbounds\n+/// The VDJ flexbounds map from a Query object.\n /// @param[in] emission_indices\n /// A vector of indices corresponding to the observed bases of the read.\n-/// @param[in] V_relpos\n+/// @param[in] v_relpos\n /// The read position corresponding to the first base of the V germline gene.\n /// @return\n-/// A Smooshable object.\n-Smooshable VSmooshable(\n-    const VGermline& vgerm_obj, std::pair<int, int> V_left_flexbounds,\n-    std::pair<int, int> V_right_flexbounds,\n-    const Eigen::Ref<const Eigen::VectorXi>& emission_indices, int V_relpos) {\n-  // computing the germline match probability matrix and extracting the row\n-  // that corresponds to the first match starting position with a germline\n-  // state.\n-  int start_pos = std::max(V_relpos - V_left_flexbounds.first, 0);\n-  Eigen::MatrixXd germ_prob_row =\n-      vgerm_obj\n-          .GermlineProbMatrix(V_left_flexbounds, V_right_flexbounds,\n-                              emission_indices, V_relpos)\n-          .row(start_pos);\n+/// A SmooshablePtr.\n+SmooshablePtr VSmooshable(\n+    const VGermline& vgerm_obj,\n+    const std::map<std::string, std::pair<int, int>>& flexbounds,\n+    const Eigen::Ref<const Eigen::VectorXi>& emission_indices, int v_relpos) {\n+  // computing the germline match probability matrix\n+  Eigen::MatrixXd germ_prob_matrix = vgerm_obj.GermlineProbMatrix(\n+      flexbounds.at(\"v_l\"), flexbounds.at(\"v_r\"), emission_indices, v_relpos);\n+\n+  // multiplying in the associated landing-out probabilities\n+  MultiplyLandingGermProbMatrix(\n+      vgerm_obj.landing_out(), germ_prob_matrix, flexbounds.at(\"v_l\"),\n+      flexbounds.at(\"v_r\"), v_relpos, vgerm_obj.length(), false);\n+\n+  // extracting the row that corresponds to the first match starting\n+  // position with a germline state\n+  int start_pos = std::max(v_relpos - flexbounds.at(\"v_l\").first, 0);\n+  germ_prob_matrix = germ_prob_matrix.row(start_pos).eval();\n \n   // multiplying in the associated gene and padding probabilities\n-  germ_prob_row *= vgerm_obj.gene_prob();\n+  germ_prob_matrix *= vgerm_obj.gene_prob();\n   double npadding_prob = vgerm_obj.NPaddingProb(\n-      V_left_flexbounds, emission_indices, V_relpos, true);\n-  germ_prob_row *= npadding_prob;\n+      flexbounds.at(\"v_l\"), emission_indices, v_relpos, true);\n+  germ_prob_matrix *= npadding_prob;\n \n-  // storing Smooshable object\n-  Smooshable v_smooshable = Smooshable(germ_prob_row);\n-\n-  return v_smooshable;\n+  /// @todo do we want some move semantics here?\n+  return BuildSmooshablePtr(germ_prob_matrix);\n };\n \n \n /// @brief Creates Smooshable objects for a given D germline gene and read.\n /// @param[in] dgerm_obj\n /// An object of class DGermline.\n-/// @param[in] V_right_flexbounds\n-/// A 2-tuple of read positions providing the bounds of the V gene's right\n-/// flex region.\n-/// @param[in] D_left_flexbounds\n-/// A 2-tuple of read positions providing the bounds of the D gene's left\n-/// flex region.\n-/// @param[in] D_right_flexbounds\n-/// A 2-tuple of read positions providing the bounds of the D gene's right\n-/// flex region.\n+/// @param[in] flexbounds\n+/// The VDJ flexbounds map from a Query object.\n /// @param[in] emission_indices\n /// A vector of indices corresponding to the observed bases of the read.\n-/// @param[in] D_relpos\n+/// @param[in] d_relpos\n /// The read position corresponding to the first base of the D germline gene.\n /// @return\n-/// A 2-tuple containing the Smooshable objects.\n-std::pair<Smooshable, Smooshable> DSmooshables(\n-    const DGermline& dgerm_obj, std::pair<int, int> V_right_flexbounds,\n-    std::pair<int, int> D_left_flexbounds,\n-    std::pair<int, int> D_right_flexbounds,\n-    const Eigen::Ref<const Eigen::VectorXi>& emission_indices, int D_relpos) {\n+/// A 2-tuple containing a SmooshablePtrVect of size 1 (for the non-NTI case)\n+/// and a SmooshablePtrVect of size 2 (for the NTI case).\n+std::pair<SmooshablePtrVect, SmooshablePtrVect> DSmooshables(\n+    const DGermline& dgerm_obj,\n+    const std::map<std::string, std::pair<int, int>>& flexbounds,\n+    const Eigen::Ref<const Eigen::VectorXi>& emission_indices, int d_relpos) {\n   // computing the germline match probability matrix (assuming no left-NTIs)\n   Eigen::MatrixXd xgerm_prob_matrix = dgerm_obj.GermlineProbMatrix(\n-      V_right_flexbounds, D_right_flexbounds, emission_indices, D_relpos);\n+      flexbounds.at(\"v_r\"), flexbounds.at(\"d_r\"), emission_indices, d_relpos);\n \n-  // multiplying in the associated landing probabilities\n-  MultiplyLandingGermProbMatrix(dgerm_obj.landing(), xgerm_prob_matrix,\n-                                V_right_flexbounds, D_relpos);\n+  // multiplying in the associated landing-in probabilities (if necessary)\n+  if (d_relpos <= flexbounds.at(\"v_r\").second) {\n+    MultiplyLandingGermProbMatrix(\n+        dgerm_obj.landing_in(), xgerm_prob_matrix, flexbounds.at(\"v_r\"),\n+        flexbounds.at(\"d_r\"), d_relpos, dgerm_obj.length(), true);\n+  }\n \n   // computing the germline match probability matrix (assuming some left-NTIs)\n-  Eigen::MatrixXd ngerm_prob_matrix =\n-      dgerm_obj.NTIProbMatrix(V_right_flexbounds, D_left_flexbounds,\n-                              emission_indices, D_relpos) *\n-      dgerm_obj.GermlineProbMatrix(D_left_flexbounds, D_right_flexbounds,\n-                                   emission_indices, D_relpos);\n-\n-  // multiplying in the associated gene probability\n+  Eigen::MatrixXd nti_prob_matrix = dgerm_obj.NTIProbMatrix(\n+      flexbounds.at(\"v_r\"), flexbounds.at(\"d_l\"), emission_indices, d_relpos);\n+  Eigen::MatrixXd ngerm_prob_matrix = dgerm_obj.GermlineProbMatrix(\n+      flexbounds.at(\"d_l\"), flexbounds.at(\"d_r\"), emission_indices, d_relpos);\n+\n+  // multiplying in the associated landing-out and gene probabilities\n+  MultiplyLandingGermProbMatrix(\n+      dgerm_obj.landing_out(), xgerm_prob_matrix, flexbounds.at(\"v_r\"),\n+      flexbounds.at(\"d_r\"), d_relpos, dgerm_obj.length(), false);\n+  MultiplyLandingGermProbMatrix(\n+      dgerm_obj.landing_out(), ngerm_prob_matrix, flexbounds.at(\"d_l\"),\n+      flexbounds.at(\"d_r\"), d_relpos, dgerm_obj.length(), false);\n   xgerm_prob_matrix *= dgerm_obj.gene_prob();\n   ngerm_prob_matrix *= dgerm_obj.gene_prob();\n \n   // storing Smooshable objects\n-  Smooshable dx_smooshable = Smooshable(xgerm_prob_matrix);\n-  Smooshable dn_smooshable = Smooshable(ngerm_prob_matrix);\n-\n-  return std::make_pair(dx_smooshable, dn_smooshable);\n+  /// @todo do we want some move semantics here?\n+  SmooshablePtrVect dx_smooshable = {BuildSmooshablePtr(xgerm_prob_matrix)};\n+  SmooshablePtrVect dn_smooshables = {BuildSmooshablePtr(nti_prob_matrix),\n+                                      BuildSmooshablePtr(ngerm_prob_matrix)};\n+  return std::make_pair(dx_smooshable, dn_smooshables);\n };\n \n \n /// @brief Creates Smooshable objects for a given J germline gene and read.\n /// @param[in] jgerm_obj\n /// An object of class JGermline.\n-/// @param[in] D_right_flexbounds\n-/// A 2-tuple of read positions providing the bounds of the D gene's right\n-/// flex region.\n-/// @param[in] J_left_flexbounds\n-/// A 2-tuple of read positions providing the bounds of the J gene's left\n-/// flex region.\n-/// @param[in] J_right_flexbounds\n-/// A 2-tuple of read positions providing the bounds of the J gene's right\n-/// flex region.\n+/// @param[in] flexbounds\n+/// The VDJ flexbounds map from a Query object.\n /// @param[in] emission_indices\n /// A vector of indices corresponding to the observed bases of the read.\n-/// @param[in] J_relpos\n+/// @param[in] j_relpos\n /// The read position corresponding to the first base of the J germline gene.\n /// @return\n-/// A 2-tuple containing the Smooshable objects.\n-std::pair<Smooshable, Smooshable> JSmooshables(\n-    const JGermline& jgerm_obj, std::pair<int, int> D_right_flexbounds,\n-    std::pair<int, int> J_left_flexbounds,\n-    std::pair<int, int> J_right_flexbounds,\n-    const Eigen::Ref<const Eigen::VectorXi>& emission_indices, int J_relpos) {\n+/// A 2-tuple containing a SmooshablePtrVect of size 1 (for the non-NTI case)\n+/// and a SmooshablePtrVect of size 2 (for the NTI case).\n+std::pair<SmooshablePtrVect, SmooshablePtrVect> JSmooshables(\n+    const JGermline& jgerm_obj,\n+    const std::map<std::string, std::pair<int, int>>& flexbounds,\n+    const Eigen::Ref<const Eigen::VectorXi>& emission_indices, int j_relpos) {\n   // computing the germline match probability matrix (assuming no left-NTIs)\n-  // and extracting the column that corresponds to the last match ending\n-  // position with a germline state.\n-  int end_pos =\n-      std::min(J_right_flexbounds.second, J_relpos + jgerm_obj.length()) -\n-      J_right_flexbounds.first;\n-  Eigen::MatrixXd xgerm_prob_col =\n-      jgerm_obj\n-          .GermlineProbMatrix(D_right_flexbounds, J_right_flexbounds,\n-                              emission_indices, J_relpos)\n-          .col(end_pos);\n-\n-  // multiplying in the associated landing probabilities\n-  MultiplyLandingGermProbMatrix(jgerm_obj.landing(), xgerm_prob_col,\n-                                D_right_flexbounds, J_relpos);\n+  Eigen::MatrixXd xgerm_prob_matrix = jgerm_obj.GermlineProbMatrix(\n+      flexbounds.at(\"d_r\"), flexbounds.at(\"j_r\"), emission_indices, j_relpos);\n+\n+  // multiplying in the associated landing-in probabilities (if necessary)\n+  if (j_relpos <= flexbounds.at(\"d_r\").second) {\n+    MultiplyLandingGermProbMatrix(\n+        jgerm_obj.landing_in(), xgerm_prob_matrix, flexbounds.at(\"d_r\"),\n+        flexbounds.at(\"j_r\"), j_relpos, jgerm_obj.length(), true);\n+  }\n \n   // computing the germline match probability matrix (assuming some left-NTIs)\n-  // and extracting the same column as above.\n-  Eigen::MatrixXd ngerm_prob_col =\n-      jgerm_obj.NTIProbMatrix(D_right_flexbounds, J_left_flexbounds,\n-                              emission_indices, J_relpos) *\n-      jgerm_obj\n-          .GermlineProbMatrix(J_left_flexbounds, J_right_flexbounds,\n-                              emission_indices, J_relpos)\n-          .col(end_pos);\n+  Eigen::MatrixXd nti_prob_matrix = jgerm_obj.NTIProbMatrix(\n+      flexbounds.at(\"d_r\"), flexbounds.at(\"j_l\"), emission_indices, j_relpos);\n+  Eigen::MatrixXd ngerm_prob_matrix = jgerm_obj.GermlineProbMatrix(\n+      flexbounds.at(\"j_l\"), flexbounds.at(\"j_r\"), emission_indices, j_relpos);\n+\n+  // extracting the column that corresponds to the last match ending\n+  // position with a germline state\n+  int end_pos =\n+      std::min(flexbounds.at(\"j_r\").second, j_relpos + jgerm_obj.length()) -\n+      flexbounds.at(\"j_r\").first;\n+  xgerm_prob_matrix = xgerm_prob_matrix.col(end_pos).eval();\n+  ngerm_prob_matrix = ngerm_prob_matrix.col(end_pos).eval();\n \n   // multiplying in the associated gene and padding probabilities\n-  xgerm_prob_col *= jgerm_obj.gene_prob();\n-  ngerm_prob_col *= jgerm_obj.gene_prob();\n+  xgerm_prob_matrix *= jgerm_obj.gene_prob();\n+  ngerm_prob_matrix *= jgerm_obj.gene_prob();\n   double npadding_prob =\n-      jgerm_obj.NPaddingProb(J_right_flexbounds, emission_indices,\n-                             J_relpos + jgerm_obj.length(), false);\n-  xgerm_prob_col *= npadding_prob;\n-  ngerm_prob_col *= npadding_prob;\n+      jgerm_obj.NPaddingProb(flexbounds.at(\"j_r\"), emission_indices,\n+                             j_relpos + jgerm_obj.length(), false);\n+  xgerm_prob_matrix *= npadding_prob;\n+  ngerm_prob_matrix *= npadding_prob;\n \n   // storing Smooshable objects\n-  Smooshable jx_smooshable = Smooshable(xgerm_prob_col);\n-  Smooshable jn_smooshable = Smooshable(ngerm_prob_col);\n+  /// @todo do we want some move semantics here?\n+  SmooshablePtrVect jx_smooshable = {BuildSmooshablePtr(xgerm_prob_matrix)};\n+  SmooshablePtrVect jn_smooshables = {BuildSmooshablePtr(nti_prob_matrix),\n+                                      BuildSmooshablePtr(ngerm_prob_matrix)};\n \n-  return std::make_pair(jx_smooshable, jn_smooshable);\n+  return std::make_pair(jx_smooshable, jn_smooshables);\n };\n \n \n // Auxiliary Functions\n \n \n-/// @brief Multiplies a landing vector into a germline match probability\n-/// matrix.\n+/// @brief Multiplies a landing probability vector into a germline match\n+/// probability matrix.\n /// @param[in] landing\n-/// A vector of probabilities of landing somewhere to begin the germline\n+/// A vector of landing probabilities to either begin or end the germline\n /// match.\n /// @param[in,out] germ_prob_matrix","path":"src/Smooshable.cpp","position":320,"original_position":320,"commit_id":"2753e1e5c5446a60a358918a5148c7daae57ea8d","original_commit_id":"2753e1e5c5446a60a358918a5148c7daae57ea8d","user":{"login":"dunleavy005","id":18724296,"avatar_url":"https://avatars.githubusercontent.com/u/18724296?v=3","gravatar_id":"","url":"https://api.github.com/users/dunleavy005","html_url":"https://github.com/dunleavy005","followers_url":"https://api.github.com/users/dunleavy005/followers","following_url":"https://api.github.com/users/dunleavy005/following{/other_user}","gists_url":"https://api.github.com/users/dunleavy005/gists{/gist_id}","starred_url":"https://api.github.com/users/dunleavy005/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dunleavy005/subscriptions","organizations_url":"https://api.github.com/users/dunleavy005/orgs","repos_url":"https://api.github.com/users/dunleavy005/repos","events_url":"https://api.github.com/users/dunleavy005/events{/privacy}","received_events_url":"https://api.github.com/users/dunleavy005/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2016-12-05T00:45:21Z","updated_at":"2016-12-05T00:45:21Z","html_url":"https://github.com/matsengrp/linearham/pull/33#discussion_r90791711","pull_request_url":"https://api.github.com/repos/matsengrp/linearham/pulls/33","_links":{"self":{"href":"https://api.github.com/repos/matsengrp/linearham/pulls/comments/90791711"},"html":{"href":"https://github.com/matsengrp/linearham/pull/33#discussion_r90791711"},"pull_request":{"href":"https://api.github.com/repos/matsengrp/linearham/pulls/33"}}},"pull_request":{"url":"https://api.github.com/repos/matsengrp/linearham/pulls/33","id":96288858,"html_url":"https://github.com/matsengrp/linearham/pull/33","diff_url":"https://github.com/matsengrp/linearham/pull/33.diff","patch_url":"https://github.com/matsengrp/linearham/pull/33.patch","issue_url":"https://api.github.com/repos/matsengrp/linearham/issues/33","number":33,"state":"open","locked":false,"title":"Pile, Stack, Query, and GermlineGeneMap.","user":{"login":"matsen","id":112708,"avatar_url":"https://avatars.githubusercontent.com/u/112708?v=3","gravatar_id":"","url":"https://api.github.com/users/matsen","html_url":"https://github.com/matsen","followers_url":"https://api.github.com/users/matsen/followers","following_url":"https://api.github.com/users/matsen/following{/other_user}","gists_url":"https://api.github.com/users/matsen/gists{/gist_id}","starred_url":"https://api.github.com/users/matsen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matsen/subscriptions","organizations_url":"https://api.github.com/users/matsen/orgs","repos_url":"https://api.github.com/users/matsen/repos","events_url":"https://api.github.com/users/matsen/events{/privacy}","received_events_url":"https://api.github.com/users/matsen/received_events","type":"User","site_admin":false},"body":"Closes #24, #5, #13, #25, #26, #7.\r\n\r\n## Individual Commits\r\ntemplate for a Germline Gene map\r\n\r\nchanging data directory for testing purposes\r\n\r\nsome GermlineGene map tests\r\n\r\nImplementing a Query class for partis queries.\r\n\r\nCloses #24.\r\n\r\nremoving unnecessary YAML function\r\n\r\nfixed build error\r\n\r\nadded VDJ pointer cast member functions\r\n\r\nslight test changes\r\n\r\nslight Query const'ing\r\n\r\nadded alphabet map to Germline class\r\n\r\nfixed alphabet map function in Germline\r\n\r\nmore needed Query class changes\r\n\r\nchanged VDJSmooshable functions to adjust to Query design\r\n\r\nInitial implementation of new SmooshableChain.\r\n\r\nWhy are my matrices getting corrupted?\r\n\r\nCorruption fixed thanks to @bcclaywell .\r\n\r\nInitial implementation of SmooshableChain.\r\n\r\nNot compiling in clang.\r\n\r\nMoving to an operator[] for SmooshableStack.\r\n\r\nAdding a push_back to SmooshableStack.\r\n\r\nViterbi WIP.\r\n\r\nAdding \"Smooshish\" abstract base class.\r\n\r\nRemoving Smooshable constructor by size.\r\n\r\nMember variables private for Smooshable and Chain.\r\n\r\nGetting Viterbi paths with new SmooshableChain.\r\n\r\nChanging around signature of AuxViterbiPath.\r\n\r\nFinalViterbiLogProb; untested.\r\n\r\nExtending laziness by storing flexes.\r\n\r\nFactoring out the scaling in SmooshableChain.\r\n\r\nAdding an iterator to SmooshableStack.\r\n\r\nSmooshish now has the full set of methods.\r\n\r\n@bcclaywell: I have a situation where there are two classes that share\r\nmost of an interface: Smooshables implement a subset of the\r\nfunctionality of SmooshableChains. In this commit I made their abstract\r\nbase class require all of the functionality of the SmooshableChain. We\r\nwant to be able to store either in SmooshableStacks, which seems to\r\nimply that we would either need to do some dynamic casting, or something\r\nlike this.\r\n\r\nComments?\r\n\r\nFinalViterbiLogProb completion and test.\r\n\r\nAdding a SmooshableChain underflow test.\r\n\r\nSmooshableStack -> Pile; SmooshableChain -> Chain.\r\n\r\nSmooshVector chains multiple Smooshables on right.\r\n\r\nAuxViterbiPath documentation.\r\n\r\nDJSmooshable now maintain NTI information separate\r\n\r\nfixed tests + added new Pile Smoosher\r\n\r\nAdding `reserve` to Pile.\r\n\r\nUpdating variable names in tests.\r\n\r\nDocs tweaks in Chain.\r\n\r\nAdding in my ycm_extra_conf.\r\n\r\nextra Query assert\r\n\r\nPile Maker function + NO TESTS\r\n\r\nadded ConvertSeqToInts function declaration in header file\r\n\r\nA few comments and edits.\r\n\r\nadded comment to GermlineGeneMap function\r\n\r\nreshaping data directory\r\n\r\nmore data changes\r\n\r\nchanging example YAML names\r\n\r\nadded example partis CSV file\r\n\r\nbeginning of VDJ pile tests\r\n\r\nslight naming change\r\n\r\ntemporary tests\r\n\r\nnecessary changes to GermlineProbMatrix\r\n\r\ntightening assert's for main probability calculators\r\n\r\nanother assert change\r\n\r\nre-jiggering Smooshable computation - partially done\r\n\r\nmore re-jiggering of Smooshables\r\n\r\nadded proper VDJ pile tests\r\n\r\nmade more detailed Germline Smooshable tests\r\n\r\nA comment in Chain's SmooshVector.\r\n\r\ntest.cpp tidying.","created_at":"2016-12-02T14:28:47Z","updated_at":"2016-12-05T00:45:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e1323843e47f55a587240650ad03036617f3470d","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/matsengrp/linearham/pulls/33/commits","review_comments_url":"https://api.github.com/repos/matsengrp/linearham/pulls/33/comments","review_comment_url":"https://api.github.com/repos/matsengrp/linearham/pulls/comments{/number}","comments_url":"https://api.github.com/repos/matsengrp/linearham/issues/33/comments","statuses_url":"https://api.github.com/repos/matsengrp/linearham/statuses/2753e1e5c5446a60a358918a5148c7daae57ea8d","head":{"label":"matsengrp:25-gname-pr","ref":"25-gname-pr","sha":"2753e1e5c5446a60a358918a5148c7daae57ea8d","user":{"login":"matsengrp","id":8984478,"avatar_url":"https://avatars.githubusercontent.com/u/8984478?v=3","gravatar_id":"","url":"https://api.github.com/users/matsengrp","html_url":"https://github.com/matsengrp","followers_url":"https://api.github.com/users/matsengrp/followers","following_url":"https://api.github.com/users/matsengrp/following{/other_user}","gists_url":"https://api.github.com/users/matsengrp/gists{/gist_id}","starred_url":"https://api.github.com/users/matsengrp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matsengrp/subscriptions","organizations_url":"https://api.github.com/users/matsengrp/orgs","repos_url":"https://api.github.com/users/matsengrp/repos","events_url":"https://api.github.com/users/matsengrp/events{/privacy}","received_events_url":"https://api.github.com/users/matsengrp/received_events","type":"Organization","site_admin":false},"repo":{"id":58749702,"name":"linearham","full_name":"matsengrp/linearham","owner":{"login":"matsengrp","id":8984478,"avatar_url":"https://avatars.githubusercontent.com/u/8984478?v=3","gravatar_id":"","url":"https://api.github.com/users/matsengrp","html_url":"https://github.com/matsengrp","followers_url":"https://api.github.com/users/matsengrp/followers","following_url":"https://api.github.com/users/matsengrp/following{/other_user}","gists_url":"https://api.github.com/users/matsengrp/gists{/gist_id}","starred_url":"https://api.github.com/users/matsengrp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matsengrp/subscriptions","organizations_url":"https://api.github.com/users/matsengrp/orgs","repos_url":"https://api.github.com/users/matsengrp/repos","events_url":"https://api.github.com/users/matsengrp/events{/privacy}","received_events_url":"https://api.github.com/users/matsengrp/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/matsengrp/linearham","description":null,"fork":false,"url":"https://api.github.com/repos/matsengrp/linearham","forks_url":"https://api.github.com/repos/matsengrp/linearham/forks","keys_url":"https://api.github.com/repos/matsengrp/linearham/keys{/key_id}","collaborators_url":"https://api.github.com/repos/matsengrp/linearham/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/matsengrp/linearham/teams","hooks_url":"https://api.github.com/repos/matsengrp/linearham/hooks","issue_events_url":"https://api.github.com/repos/matsengrp/linearham/issues/events{/number}","events_url":"https://api.github.com/repos/matsengrp/linearham/events","assignees_url":"https://api.github.com/repos/matsengrp/linearham/assignees{/user}","branches_url":"https://api.github.com/repos/matsengrp/linearham/branches{/branch}","tags_url":"https://api.github.com/repos/matsengrp/linearham/tags","blobs_url":"https://api.github.com/repos/matsengrp/linearham/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/matsengrp/linearham/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/matsengrp/linearham/git/refs{/sha}","trees_url":"https://api.github.com/repos/matsengrp/linearham/git/trees{/sha}","statuses_url":"https://api.github.com/repos/matsengrp/linearham/statuses/{sha}","languages_url":"https://api.github.com/repos/matsengrp/linearham/languages","stargazers_url":"https://api.github.com/repos/matsengrp/linearham/stargazers","contributors_url":"https://api.github.com/repos/matsengrp/linearham/contributors","subscribers_url":"https://api.github.com/repos/matsengrp/linearham/subscribers","subscription_url":"https://api.github.com/repos/matsengrp/linearham/subscription","commits_url":"https://api.github.com/repos/matsengrp/linearham/commits{/sha}","git_commits_url":"https://api.github.com/repos/matsengrp/linearham/git/commits{/sha}","comments_url":"https://api.github.com/repos/matsengrp/linearham/comments{/number}","issue_comment_url":"https://api.github.com/repos/matsengrp/linearham/issues/comments{/number}","contents_url":"https://api.github.com/repos/matsengrp/linearham/contents/{+path}","compare_url":"https://api.github.com/repos/matsengrp/linearham/compare/{base}...{head}","merges_url":"https://api.github.com/repos/matsengrp/linearham/merges","archive_url":"https://api.github.com/repos/matsengrp/linearham/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/matsengrp/linearham/downloads","issues_url":"https://api.github.com/repos/matsengrp/linearham/issues{/number}","pulls_url":"https://api.github.com/repos/matsengrp/linearham/pulls{/number}","milestones_url":"https://api.github.com/repos/matsengrp/linearham/milestones{/number}","notifications_url":"https://api.github.com/repos/matsengrp/linearham/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/matsengrp/linearham/labels{/name}","releases_url":"https://api.github.com/repos/matsengrp/linearham/releases{/id}","deployments_url":"https://api.github.com/repos/matsengrp/linearham/deployments","created_at":"2016-05-13T15:00:59Z","updated_at":"2016-10-24T18:05:53Z","pushed_at":"2016-12-02T14:28:47Z","git_url":"git://github.com/matsengrp/linearham.git","ssh_url":"git@github.com:matsengrp/linearham.git","clone_url":"https://github.com/matsengrp/linearham.git","svn_url":"https://github.com/matsengrp/linearham","homepage":"http://matsengrp.github.io/linearham/","size":1069,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1,"mirror_url":null,"open_issues_count":20,"forks":1,"open_issues":20,"watchers":0,"default_branch":"master"}},"base":{"label":"matsengrp:master","ref":"master","sha":"af2afab7256e4f0914215b23b7c68e9c7e1cc586","user":{"login":"matsengrp","id":8984478,"avatar_url":"https://avatars.githubusercontent.com/u/8984478?v=3","gravatar_id":"","url":"https://api.github.com/users/matsengrp","html_url":"https://github.com/matsengrp","followers_url":"https://api.github.com/users/matsengrp/followers","following_url":"https://api.github.com/users/matsengrp/following{/other_user}","gists_url":"https://api.github.com/users/matsengrp/gists{/gist_id}","starred_url":"https://api.github.com/users/matsengrp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matsengrp/subscriptions","organizations_url":"https://api.github.com/users/matsengrp/orgs","repos_url":"https://api.github.com/users/matsengrp/repos","events_url":"https://api.github.com/users/matsengrp/events{/privacy}","received_events_url":"https://api.github.com/users/matsengrp/received_events","type":"Organization","site_admin":false},"repo":{"id":58749702,"name":"linearham","full_name":"matsengrp/linearham","owner":{"login":"matsengrp","id":8984478,"avatar_url":"https://avatars.githubusercontent.com/u/8984478?v=3","gravatar_id":"","url":"https://api.github.com/users/matsengrp","html_url":"https://github.com/matsengrp","followers_url":"https://api.github.com/users/matsengrp/followers","following_url":"https://api.github.com/users/matsengrp/following{/other_user}","gists_url":"https://api.github.com/users/matsengrp/gists{/gist_id}","starred_url":"https://api.github.com/users/matsengrp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matsengrp/subscriptions","organizations_url":"https://api.github.com/users/matsengrp/orgs","repos_url":"https://api.github.com/users/matsengrp/repos","events_url":"https://api.github.com/users/matsengrp/events{/privacy}","received_events_url":"https://api.github.com/users/matsengrp/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/matsengrp/linearham","description":null,"fork":false,"url":"https://api.github.com/repos/matsengrp/linearham","forks_url":"https://api.github.com/repos/matsengrp/linearham/forks","keys_url":"https://api.github.com/repos/matsengrp/linearham/keys{/key_id}","collaborators_url":"https://api.github.com/repos/matsengrp/linearham/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/matsengrp/linearham/teams","hooks_url":"https://api.github.com/repos/matsengrp/linearham/hooks","issue_events_url":"https://api.github.com/repos/matsengrp/linearham/issues/events{/number}","events_url":"https://api.github.com/repos/matsengrp/linearham/events","assignees_url":"https://api.github.com/repos/matsengrp/linearham/assignees{/user}","branches_url":"https://api.github.com/repos/matsengrp/linearham/branches{/branch}","tags_url":"https://api.github.com/repos/matsengrp/linearham/tags","blobs_url":"https://api.github.com/repos/matsengrp/linearham/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/matsengrp/linearham/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/matsengrp/linearham/git/refs{/sha}","trees_url":"https://api.github.com/repos/matsengrp/linearham/git/trees{/sha}","statuses_url":"https://api.github.com/repos/matsengrp/linearham/statuses/{sha}","languages_url":"https://api.github.com/repos/matsengrp/linearham/languages","stargazers_url":"https://api.github.com/repos/matsengrp/linearham/stargazers","contributors_url":"https://api.github.com/repos/matsengrp/linearham/contributors","subscribers_url":"https://api.github.com/repos/matsengrp/linearham/subscribers","subscription_url":"https://api.github.com/repos/matsengrp/linearham/subscription","commits_url":"https://api.github.com/repos/matsengrp/linearham/commits{/sha}","git_commits_url":"https://api.github.com/repos/matsengrp/linearham/git/commits{/sha}","comments_url":"https://api.github.com/repos/matsengrp/linearham/comments{/number}","issue_comment_url":"https://api.github.com/repos/matsengrp/linearham/issues/comments{/number}","contents_url":"https://api.github.com/repos/matsengrp/linearham/contents/{+path}","compare_url":"https://api.github.com/repos/matsengrp/linearham/compare/{base}...{head}","merges_url":"https://api.github.com/repos/matsengrp/linearham/merges","archive_url":"https://api.github.com/repos/matsengrp/linearham/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/matsengrp/linearham/downloads","issues_url":"https://api.github.com/repos/matsengrp/linearham/issues{/number}","pulls_url":"https://api.github.com/repos/matsengrp/linearham/pulls{/number}","milestones_url":"https://api.github.com/repos/matsengrp/linearham/milestones{/number}","notifications_url":"https://api.github.com/repos/matsengrp/linearham/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/matsengrp/linearham/labels{/name}","releases_url":"https://api.github.com/repos/matsengrp/linearham/releases{/id}","deployments_url":"https://api.github.com/repos/matsengrp/linearham/deployments","created_at":"2016-05-13T15:00:59Z","updated_at":"2016-10-24T18:05:53Z","pushed_at":"2016-12-02T14:28:47Z","git_url":"git://github.com/matsengrp/linearham.git","ssh_url":"git@github.com:matsengrp/linearham.git","clone_url":"https://github.com/matsengrp/linearham.git","svn_url":"https://github.com/matsengrp/linearham","homepage":"http://matsengrp.github.io/linearham/","size":1069,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1,"mirror_url":null,"open_issues_count":20,"forks":1,"open_issues":20,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/matsengrp/linearham/pulls/33"},"html":{"href":"https://github.com/matsengrp/linearham/pull/33"},"issue":{"href":"https://api.github.com/repos/matsengrp/linearham/issues/33"},"comments":{"href":"https://api.github.com/repos/matsengrp/linearham/issues/33/comments"},"review_comments":{"href":"https://api.github.com/repos/matsengrp/linearham/pulls/33/comments"},"review_comment":{"href":"https://api.github.com/repos/matsengrp/linearham/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/matsengrp/linearham/pulls/33/commits"},"statuses":{"href":"https://api.github.com/repos/matsengrp/linearham/statuses/2753e1e5c5446a60a358918a5148c7daae57ea8d"}}}}
{"actor":{"display_login":"dunleavy005"}}