This is an automated email from the git hooks/post-receive script. afif-guest pushed a commit to branch master in repository python-pbconsensuscore.
commit efb807b65485cab5caaeacf6d24e73373ec72c46 Author: Afif Elghraoui <[email protected]> Date: Tue Nov 24 22:44:13 2015 -0800 Imported Upstream version 1.0.1 --- CHANGELOG.md | 4 ++++ include/ConsensusCore/Version.hpp | 2 +- setup.py | 2 +- src/C++/Poa/PoaGraphImpl.cpp | 2 +- src/C++/Poa/PoaGraphImpl.hpp | 35 +++++++++++++++++++++++++++++++ src/C++/Poa/PoaGraphTraversals.cpp | 2 +- src/C++/Poa/RangeFinder.cpp | 2 +- src/C++/Quiver/MutationScorer.cpp | 27 ++++++++++++++++-------- src/Tests/TestPoaConsensus.cpp | 42 ++++++++++++++++++++++++++++++++++++++ 9 files changed, 104 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85afbe5..d959193 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +* Version 1.0.1 + - Fix for a serious memory leak occurring on alpha/beta mating failures. Thanks Nigel! + - Fix for nondeterministic POA consensus + * Version 1.0.0 - Minor build/deploy system tweaks. No API changes. diff --git a/include/ConsensusCore/Version.hpp b/include/ConsensusCore/Version.hpp index 316d02c..2c116ed 100644 --- a/include/ConsensusCore/Version.hpp +++ b/include/ConsensusCore/Version.hpp @@ -43,7 +43,7 @@ #define API_MAJOR 1 #define API_MINOR 0 -#define API_PATCH 0 +#define API_PATCH 1 namespace ConsensusCore { diff --git a/setup.py b/setup.py index ccaaeb9..9f91a40 100755 --- a/setup.py +++ b/setup.py @@ -94,7 +94,7 @@ if "install" in sys.argv and not "build" in sys.argv: sys.argv.insert(installPos, "build") setup(name="ConsensusCore", - version="1.0.0", + version="1.0.1", author="Pacific Biosciences", author_email="[email protected]", url="http://www.github.com/PacificBiosciences/ConsensusCore", diff --git a/src/C++/Poa/PoaGraphImpl.cpp b/src/C++/Poa/PoaGraphImpl.cpp index 188fd79..266b0b4 100644 --- a/src/C++/Poa/PoaGraphImpl.cpp +++ b/src/C++/Poa/PoaGraphImpl.cpp @@ -155,7 +155,7 @@ namespace detail { { vector<const AlignmentColumn*> predecessorColumns; const AlignmentColumn* predCol; - foreach (ED e, in_edges(v, g)) + foreach (ED e, inEdges(v, g)) { VD u = source(e, g); predCol = colMap.at(u); diff --git a/src/C++/Poa/PoaGraphImpl.hpp b/src/C++/Poa/PoaGraphImpl.hpp index 9aed30c..afa0a20 100644 --- a/src/C++/Poa/PoaGraphImpl.hpp +++ b/src/C++/Poa/PoaGraphImpl.hpp @@ -107,6 +107,41 @@ namespace detail { typedef property_map<BoostGraph, vertex_index_t>::type index_map_t; static const VD null_vertex = graph_traits<BoostGraph>::null_vertex(); + + struct EdgeComparator + { + EdgeComparator(const BoostGraph& g) : g_(g) {} + + // want lex. comparison... just using pair to get it.. + bool operator() (ED e1, ED e2) + { + std::pair<int, int> vt1, vt2; + vt1 = std::make_pair(get(vertex_index, g_, source(e1, g_)), + get(vertex_index, g_, target(e1, g_))); + vt2 = std::make_pair(get(vertex_index, g_, source(e2, g_)), + get(vertex_index, g_, target(e2, g_))); + return (vt1 < vt2); + } + + private: + const BoostGraph& g_; + }; + + inline std::vector<ED> inEdges(VD v, const BoostGraph& g) + { + // This is a sad workaround the nondeterministic order of iteration + // from BGL's in_edges. (see: http://stackoverflow.com/questions/30968690/) + + // Unfortunately, we can't just use the boost::sort range adapter + // because it requires an underlying random access iterator, which + // we can't get from the std::set container. + graph_traits<BoostGraph>::in_edge_iterator begin, end; + tie(begin, end) = in_edges(v, g); + std::vector<ED> tmp(begin, end); + std::sort(tmp.begin(), tmp.end(), EdgeComparator(g)); + return tmp; + } + struct AlignmentColumn : noncopyable { VD CurrentVertex; diff --git a/src/C++/Poa/PoaGraphTraversals.cpp b/src/C++/Poa/PoaGraphTraversals.cpp index e5862ce..dfce3f6 100644 --- a/src/C++/Poa/PoaGraphTraversals.cpp +++ b/src/C++/Poa/PoaGraphTraversals.cpp @@ -124,7 +124,7 @@ namespace detail { vInfo.Score = score; vInfo.ReachingScore = score; bestPrevVertex[v] = null_vertex; - foreach (ED e, in_edges(v, g_)) + foreach (ED e, inEdges(v, g_)) { VD sourceVertex = source(e, g_); float rsc = score + vertexInfoMap_[sourceVertex].ReachingScore; diff --git a/src/C++/Poa/RangeFinder.cpp b/src/C++/Poa/RangeFinder.cpp index c4f4d1b..1c300f4 100644 --- a/src/C++/Poa/RangeFinder.cpp +++ b/src/C++/Poa/RangeFinder.cpp @@ -123,7 +123,7 @@ namespace detail { fwdMarks[v] = directRange.get(); } else { std::vector<Interval> predRangesStepped; - foreach (ED e, in_edges(v, poaGraph.g_)) + foreach (ED e, inEdges(v, poaGraph.g_)) { VD pred = source(e, poaGraph.g_); Interval predRangeStepped = next(fwdMarks.at(pred), readLength); diff --git a/src/C++/Quiver/MutationScorer.cpp b/src/C++/Quiver/MutationScorer.cpp index 5a0606d..1f42fea 100644 --- a/src/C++/Quiver/MutationScorer.cpp +++ b/src/C++/Quiver/MutationScorer.cpp @@ -57,15 +57,24 @@ namespace ConsensusCore : evaluator_(new EvaluatorType(evaluator)), recursor_(new R(recursor)) { - // Allocate alpha and beta - alpha_ = new MatrixType(evaluator.ReadLength() + 1, - evaluator.TemplateLength() + 1); - beta_ = new MatrixType(evaluator.ReadLength() + 1, - evaluator.TemplateLength() + 1); - // Buffer where we extend into - extendBuffer_ = new MatrixType(evaluator.ReadLength() + 1, EXTEND_BUFFER_COLUMNS); - // Initial alpha and beta - numFlipFlops_ = recursor.FillAlphaBeta(*evaluator_, *alpha_, *beta_); + try { + // Allocate alpha and beta + alpha_ = new MatrixType(evaluator.ReadLength() + 1, + evaluator.TemplateLength() + 1); + beta_ = new MatrixType(evaluator.ReadLength() + 1, + evaluator.TemplateLength() + 1); + // Buffer where we extend into + extendBuffer_ = new MatrixType(evaluator.ReadLength() + 1, EXTEND_BUFFER_COLUMNS); + // Initial alpha and beta + numFlipFlops_ = recursor.FillAlphaBeta(*evaluator_, *alpha_, *beta_); + } + catch(AlphaBetaMismatchException e) { + delete alpha_; + delete beta_; + delete extendBuffer_; + delete recursor_; + throw; + } } template<typename R> diff --git a/src/Tests/TestPoaConsensus.cpp b/src/Tests/TestPoaConsensus.cpp index 7717c33..5ef7796 100644 --- a/src/Tests/TestPoaConsensus.cpp +++ b/src/Tests/TestPoaConsensus.cpp @@ -530,3 +530,45 @@ TEST(PoaConsensus, TestMutations) delete pc; } #endif + + +TEST(PoaConsensus, NondeterminismRegressionTest) +{ + // + // This is a regression test for a real-world case of + // nondeterminism found in the POA on a quiver job on Staph. + // + std::vector<std::string> reads; + reads += \ + "TATCAATCAACGAAATTCGCCAATTCCGTCATGAATGTCAATATCTAACTACACTTTAGAATACATTCTT" + "TGACATGCCTGGCCTATTGATATTTCAATAAAATCAGACTATAAAGACAACTTACAAATGATCCTATAAA" + "TTAAAGATCGAGAATCTAAAGAGTGAAATTAAAGCTAATTACTGCTTTAAAAATTTTACGTGCACACAAA" + "AATGAATTTATCCTCATTATATCGAAAATACCATGAAGTATAGTAAGCTAACTTGAATATGATCATTAAT" + "CGGCTATATGATTATTTTGATAATGCAATGAGCATCAATCTGAATTTATGACCTATCATTCGCGTTGCAT" + "TTATTGAAGTGAAAATTCATGTACGCTTTTTTATTTTATTAATATAATCCTTGATATTGGTTATATACCA" + "CGCTGTCACATAATTTTCAATAAATTTTTCTACTAAATGAAGTGTCTGTTATCTATCAC"; + reads += \ + "TATCAACAACGAAAATGCGCAGTTACGTCATGATTTATGTCAAATAATCTAAACGACACTTTCAGAAATA" + "AATACATTCGAGAAGATGAATGCCTGGCGCAAAGTGATTATTTCAATAAAATATTTGTACCTTGAAAGAC" + "AATTTACAAATGAATGCTATAAAATTTAAATGGATCCGGAGAATCTTTAAAGTACGTGAAATTAAAGGCT" + "AAGATTACTGCGAAAAATTTTCGTGCACAAGAAATGAATGTTCCAGATTAGTATCGGAAAATAAGCCATG" + "AAGAAGCTAGCATTAACTTGAATATGATCGATTTAATCGGCAGTATTGGTAATTATCTTGATAAGCAATT" + "GAGCATCAACTGAAATTGAATGACTCTACATGCCTCGCTGAGTATGCGATTTATTGAAAGTGAAATTCAG" + "TAAAGTTTATTGTTATGAATAAATGCGTACTTGGATGAATATCCCGACGGTAGTTCAAGTGTAAATGGAG" + "TGAGGGGGTTCTTTCTTATAGAATAGTTTTATACTACTGATAAGGTGTAACCTGAGTGAGTCGTGATTTT" + "AGAGTTACTTGCGAAC"; + + std::set<std::string> answers; + for (int run=0; run<1000; run++) + { + const PoaConsensus* pc = PoaConsensus::FindConsensus(reads, GLOBAL); +#if 0 + char fname[100]; + sprintf(fname, "/tmp/gr%03d.dot", run); + pc->WriteGraphVizFile(fname, (PoaGraph::VERBOSE_NODES | PoaGraph::COLOR_NODES)); +#endif + answers.insert(pc->Sequence); + delete pc; + } + ASSERT_EQ(1, answers.size()); +} -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/python-pbconsensuscore.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
