mirror of
https://github.com/lh3/minimap2.git
synced 2026-09-15 13:07:55 +08:00
r1299: fix wrong subchain selection
This and the last bug were both reported by Jeremy Wang. Co-authored-by: gemini-cli <gemini-cli@users.noreply.github.com>
This commit is contained in:
27
hit.c
27
hit.c
@@ -256,19 +256,25 @@ void mm_select_sub(void *km, float pri_ratio, int min_diff, int best_n, int chec
|
|||||||
{
|
{
|
||||||
if (pri_ratio > 0.0f && *n_ > 0) {
|
if (pri_ratio > 0.0f && *n_ > 0) {
|
||||||
int i, k, n = *n_, n_2nd = 0;
|
int i, k, n = *n_, n_2nd = 0;
|
||||||
for (i = k = 0; i < n; ++i) {
|
uint8_t *keep = (uint8_t*)kmalloc(km, n);
|
||||||
|
for (i = 0; i < n; ++i) {
|
||||||
int p = r[i].parent;
|
int p = r[i].parent;
|
||||||
|
keep[i] = 0;
|
||||||
if (p == i || r[i].inv) { // primary or inversion
|
if (p == i || r[i].inv) { // primary or inversion
|
||||||
r[k++] = r[i];
|
keep[i] = 1;
|
||||||
} else if ((r[i].score >= r[p].score * pri_ratio || r[i].score + min_diff >= r[p].score) && n_2nd < best_n) {
|
} else if ((r[i].score >= r[p].score * pri_ratio || r[i].score + min_diff >= r[p].score) && n_2nd < best_n) {
|
||||||
if (!(r[i].qs == r[p].qs && r[i].qe == r[p].qe && r[i].rid == r[p].rid && r[i].rs == r[p].rs && r[i].re == r[p].re)) // not identical hits
|
if (!(r[i].qs == r[p].qs && r[i].qe == r[p].qe && r[i].rid == r[p].rid && r[i].rs == r[p].rs && r[i].re == r[p].re)) // not identical hits
|
||||||
r[k++] = r[i], ++n_2nd;
|
keep[i] = 1, ++n_2nd;
|
||||||
else if (r[i].p) free(r[i].p);
|
|
||||||
} else if (check_strand && n_2nd < best_n && r[i].score > min_strand_sc && r[i].rev != r[p].rev) {
|
} else if (check_strand && n_2nd < best_n && r[i].score > min_strand_sc && r[i].rev != r[p].rev) {
|
||||||
r[i].strand_retained = 1;
|
r[i].strand_retained = 1;
|
||||||
r[k++] = r[i], ++n_2nd;
|
keep[i] = 1, ++n_2nd;
|
||||||
} else if (r[i].p) free(r[i].p);
|
}
|
||||||
}
|
}
|
||||||
|
for (i = k = 0; i < n; ++i) {
|
||||||
|
if (keep[i]) r[k++] = r[i];
|
||||||
|
else if (r[i].p) free(r[i].p);
|
||||||
|
}
|
||||||
|
kfree(km, keep);
|
||||||
if (k != n) mm_sync_regs(km, k, r); // removing hits requires sync()
|
if (k != n) mm_sync_regs(km, k, r); // removing hits requires sync()
|
||||||
*n_ = k;
|
*n_ = k;
|
||||||
}
|
}
|
||||||
@@ -277,13 +283,18 @@ void mm_select_sub(void *km, float pri_ratio, int min_diff, int best_n, int chec
|
|||||||
int mm_filter_strand_retained(int n_regs, mm_reg1_t *r)
|
int mm_filter_strand_retained(int n_regs, mm_reg1_t *r)
|
||||||
{
|
{
|
||||||
int i, k;
|
int i, k;
|
||||||
for (i = k = 0; i < n_regs; ++i) {
|
uint8_t *keep = (uint8_t*)malloc(n_regs);
|
||||||
|
for (i = 0; i < n_regs; ++i) {
|
||||||
int p = r[i].parent;
|
int p = r[i].parent;
|
||||||
if (!r[i].strand_retained || r[i].div < r[p].div * 5.0f || r[i].div < 0.01f) {
|
keep[i] = (!r[i].strand_retained || r[i].div < r[p].div * 5.0f || r[i].div < 0.01f);
|
||||||
|
}
|
||||||
|
for (i = k = 0; i < n_regs; ++i) {
|
||||||
|
if (keep[i]) {
|
||||||
if (k < i) r[k++] = r[i];
|
if (k < i) r[k++] = r[i];
|
||||||
else ++k;
|
else ++k;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
free(keep);
|
||||||
return k;
|
return k;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#define MM_VERSION "2.30-r1298-dirty"
|
#define MM_VERSION "2.30-r1299-dirty"
|
||||||
|
|
||||||
#define MM_F_NO_DIAG (0x001LL) // no exact diagonal hit
|
#define MM_F_NO_DIAG (0x001LL) // no exact diagonal hit
|
||||||
#define MM_F_NO_DUAL (0x002LL) // skip pairs where query name is lexicographically larger than target name
|
#define MM_F_NO_DUAL (0x002LL) // skip pairs where query name is lexicographically larger than target name
|
||||||
|
|||||||
9
pe.c
9
pe.c
@@ -8,7 +8,8 @@ void mm_select_sub_multi(void *km, float pri_ratio, float pri1, float pri2, int
|
|||||||
if (pri_ratio > 0.0f && *n_ > 0) {
|
if (pri_ratio > 0.0f && *n_ > 0) {
|
||||||
int i, k, n = *n_, n_2nd = 0;
|
int i, k, n = *n_, n_2nd = 0;
|
||||||
int max_dist = n_segs == 2? qlens[0] + qlens[1] + max_gap_ref : 0;
|
int max_dist = n_segs == 2? qlens[0] + qlens[1] + max_gap_ref : 0;
|
||||||
for (i = k = 0; i < n; ++i) {
|
uint8_t *keep = (uint8_t*)kmalloc(km, n);
|
||||||
|
for (i = 0; i < n; ++i) {
|
||||||
int to_keep = 0;
|
int to_keep = 0;
|
||||||
if (r[i].parent == i) { // primary
|
if (r[i].parent == i) { // primary
|
||||||
to_keep = 1;
|
to_keep = 1;
|
||||||
@@ -34,9 +35,13 @@ void mm_select_sub_multi(void *km, float pri_ratio, float pri1, float pri2, int
|
|||||||
if (to_keep && r[i].parent != i) {
|
if (to_keep && r[i].parent != i) {
|
||||||
if (n_2nd++ >= best_n) to_keep = 0; // don't keep if there are too many secondary hits
|
if (n_2nd++ >= best_n) to_keep = 0; // don't keep if there are too many secondary hits
|
||||||
}
|
}
|
||||||
if (to_keep) r[k++] = r[i];
|
keep[i] = to_keep;
|
||||||
|
}
|
||||||
|
for (i = k = 0; i < n; ++i) {
|
||||||
|
if (keep[i]) r[k++] = r[i];
|
||||||
else if (r[i].p) free(r[i].p);
|
else if (r[i].p) free(r[i].p);
|
||||||
}
|
}
|
||||||
|
kfree(km, keep);
|
||||||
if (k != n) mm_sync_regs(km, k, r); // removing hits requires sync()
|
if (k != n) mm_sync_regs(km, k, r); // removing hits requires sync()
|
||||||
*n_ = k;
|
*n_ = k;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user