@@ -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