Skip to content

Commit 077917c

Browse files
authored
Merge pull request #4715 from vgteam/cyclic-snarl-improvements
Duct tape and glue (temporary cyclic snarl improvements)
2 parents edd9e5a + 899d6e6 commit 077917c

File tree

5 files changed

+181
-75
lines changed

5 files changed

+181
-75
lines changed

src/minimizer_mapper_from_chains.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2641,7 +2641,8 @@ void MinimizerMapper::pick_mappings_from_alignments(Alignment& aln, const std::v
26412641
return chain_score_estimates.at(chain_number);
26422642
} else {
26432643
// Use base-level alignment score to rank alignments
2644-
return alignments.at(alignment_number).score();
2644+
// Tiebreak by identity (always > 0 and <= 1)
2645+
return alignments.at(alignment_number).score() + identity(alignments.at(alignment_number).path());
26452646
}
26462647
};
26472648

src/snarl_distance_index.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,8 @@ SnarlDistanceIndex::TemporaryDistanceIndex make_temporary_distance_index(
508508
//Go through each of the children in the chain, skipping nodes
509509
//The snarl may be trivial, in which case don't fill in the distances
510510
#ifdef debug_distance_indexing
511-
cerr << " Looking at child " << temp_index.structure_start_end_as_string(chain_child_index) << " current max prefi xum " << temp_chain_record.max_prefix_sum.back() << endl;
511+
cerr << " Looking at child " << temp_index.structure_start_end_as_string(chain_child_index)
512+
<< " current max prefix sum " << temp_chain_record.max_prefix_sum.back() << endl;
512513
#endif
513514

514515
if (chain_child_index.first == SnarlDistanceIndex::TEMP_SNARL){

src/unittest/zip_code_tree.cpp

Lines changed: 60 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,22 +1206,18 @@ namespace unittest {
12061206
REQUIRE(reverse_views[{1, true}][2].distance == 8);
12071207
REQUIRE(reverse_views[{1, true}][2].is_reversed == true);
12081208

1209-
// 3-1 can see the rest of its chain & the other chain
1209+
// 3-1 can see the rest of its chain
12101210
// Not rev since we're going L->R
12111211
REQUIRE(reverse_views.count({3, false}));
1212-
REQUIRE(reverse_views[{3, false}].size() == 2);
1212+
REQUIRE(reverse_views[{3, false}].size() == 1);
12131213
// Edge to 3-0
12141214
REQUIRE(reverse_views[{3, false}][0].seed == 2);
12151215
REQUIRE(reverse_views[{3, false}][0].distance == 1);
12161216
REQUIRE(reverse_views[{3, false}][0].is_reversed == false);
1217-
// Edge to 4+0
1218-
REQUIRE(reverse_views[{3, false}][1].seed == 1);
1219-
REQUIRE(reverse_views[{3, false}][1].distance == 3);
1220-
REQUIRE(reverse_views[{3, false}][1].is_reversed == false);
12211217

1222-
// 5+0 can see all other seeds once
1218+
// 5+0 can see the seeds on 3 & 1
12231219
REQUIRE(reverse_views.count({4, false}));
1224-
REQUIRE(reverse_views[{4, false}].size() == 4);
1220+
REQUIRE(reverse_views[{4, false}].size() == 3);
12251221
// Edge to 3-1 (not rev since going L->R)
12261222
REQUIRE(reverse_views[{4, false}][0].seed == 3);
12271223
REQUIRE(reverse_views[{4, false}][0].distance == 5);
@@ -1230,14 +1226,10 @@ namespace unittest {
12301226
REQUIRE(reverse_views[{4, false}][1].seed == 2);
12311227
REQUIRE(reverse_views[{4, false}][1].distance == 6);
12321228
REQUIRE(reverse_views[{4, false}][1].is_reversed == false);
1233-
// Edge to 4+0
1234-
REQUIRE(reverse_views[{4, false}][2].seed == 1);
1235-
REQUIRE(reverse_views[{4, false}][2].distance == 8);
1236-
REQUIRE(reverse_views[{4, false}][2].is_reversed == false);
12371229
// Edge to 1+0
1238-
REQUIRE(reverse_views[{4, false}][3].seed == 0);
1239-
REQUIRE(reverse_views[{4, false}][3].distance == 11);
1240-
REQUIRE(reverse_views[{4, false}][3].is_reversed == false);
1230+
REQUIRE(reverse_views[{4, false}][2].seed == 0);
1231+
REQUIRE(reverse_views[{4, false}][2].distance == 11);
1232+
REQUIRE(reverse_views[{4, false}][2].is_reversed == false);
12411233
} else {
12421234
cerr << "Not testing reverse views since I didn't bother writing it" << endl;
12431235
}
@@ -1829,17 +1821,6 @@ namespace unittest {
18291821
REQUIRE(dag_non_dag_count.first == 0);
18301822
REQUIRE(dag_non_dag_count.second == 2);
18311823
}
1832-
1833-
SECTION("Check iterator memorization") {
1834-
auto reverse_views = get_reverse_views(zip_forest);
1835-
// 5+0 should only see 3+1 once due to memorization
1836-
REQUIRE(reverse_views.count({5, false}));
1837-
size_t seen_3 = 0;
1838-
for (auto& view : reverse_views[{5, false}]) {
1839-
if (view.seed == 3) seen_3++;
1840-
}
1841-
REQUIRE(seen_3 == 1);
1842-
}
18431824
}
18441825
SECTION("Reverse both inversions") {
18451826
// [1+0 3 {1 inf 0 inf 3 inf inf 9 0 3 inf [4-0 3
@@ -2980,6 +2961,59 @@ namespace unittest {
29802961
REQUIRE(zip_forest.trees.size() == 2);
29812962
}
29822963
}
2964+
TEST_CASE("Distance index and zip codes disagree on child chain orientation", "[zip_tree]") {
2965+
VG graph;
2966+
2967+
Node* n1 = graph.create_node("AAAAAAAAAAAAA");
2968+
Node* n2 = graph.create_node("T");
2969+
Node* n3 = graph.create_node("ATA");
2970+
Node* n4 = graph.create_node("C");
2971+
Node* n5 = graph.create_node("G");
2972+
Node* n6 = graph.create_node("CC");
2973+
Node* n7 = graph.create_node("AAAAAAAAAAAA");
2974+
2975+
Edge* e1 = graph.create_edge(n1, n2);
2976+
Edge* e2 = graph.create_edge(n2, n2, false, true);
2977+
Edge* e3 = graph.create_edge(n2, n7);
2978+
Edge* e4 = graph.create_edge(n1, n6, false, true);
2979+
Edge* e5 = graph.create_edge(n3, n4);
2980+
Edge* e6 = graph.create_edge(n4, n5);
2981+
Edge* e7 = graph.create_edge(n5, n6);
2982+
Edge* e8 = graph.create_edge(n6, n7);
2983+
Edge* e9 = graph.create_edge(n3, n5);
2984+
Edge* e10 = graph.create_edge(n4, n6);
2985+
Edge* e11 = graph.create_edge(n3, n2, true, false);
2986+
2987+
IntegratedSnarlFinder snarl_finder(graph);
2988+
SnarlDistanceIndex distance_index;
2989+
fill_in_distance_index(&distance_index, &graph, &snarl_finder);
2990+
2991+
SECTION("Seeds in nested snarl chains") {
2992+
// [{1 inf 4 8 2 inf inf 1 5 2 inf [(2 0 0 1 1 1 1 [4+0][5+0])]}]
2993+
vector<pos_t> positions;
2994+
positions.emplace_back(4, false, 0);
2995+
positions.emplace_back(5, false, 0);
2996+
2997+
ZipCodeForest zip_forest = make_and_validate_forest(positions, distance_index);
2998+
REQUIRE(zip_forest.trees.size() == 1);
2999+
// Inter-chain edge in nested snarl is reachable
3000+
REQUIRE(zip_forest.trees[0].get_item_at_index(18).get_value() == 1);
3001+
}
3002+
SECTION("One seed on each node") {
3003+
// [7+0rev 0 {2 inf 1 2 2 inf inf 6 0 inf inf 1 2 inf
3004+
// inf 2 1 2 2 0 2 inf [3+0 3 (2 0 0 1 1 1 1 [4+0][5+0])
3005+
// 0 6+0][2+0]} 13 1+0rev]
3006+
vector<pos_t> positions;
3007+
positions.emplace_back(1, false, 0);
3008+
positions.emplace_back(2, false, 0);
3009+
positions.emplace_back(3, false, 0);
3010+
positions.emplace_back(4, false, 0);
3011+
positions.emplace_back(5, false, 0);
3012+
positions.emplace_back(6, false, 0);
3013+
positions.emplace_back(7, false, 0);
3014+
make_and_validate_forest(positions, distance_index);
3015+
}
3016+
}
29833017
TEST_CASE("Random graphs zip tree", "[zip_tree][zip_tree_random]") {
29843018
for (int i = 0; i < 10; i++) {
29853019
// For each random graph

0 commit comments

Comments
 (0)