- if(u == v)
- continue;
-
- if(!reaches(env, u->lineage_start, v->lineage_end) && reaches(env, v->lineage_start, u->lineage_end)) {
- if(fuse_two_lineages(env, u, v))
- goto again;
+ if(u != v && u->lineage_start && v->lineage_start && u->lineage_end && v->lineage_end
+ && get_nodes_block(u->lineage_start) == get_nodes_block(v->lineage_start)) {
+ int uv = heights_reachable_in_block(env->heights, u->lineage_start, v->lineage_end);
+ int vu = heights_reachable_in_block(env->heights, v->lineage_start, u->lineage_end);
+
+ if(uv && !vu) {
+ if(fuse_two_lineages(env, u, v))
+ goto again;
+ }