From f4a8766283f60f558eb36d3ca2cf2fe0aefb53b9 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Thu, 14 Sep 2017 10:15:22 -0400 Subject: [PATCH] r362: fixed overestimated chaining score Caused by ilog2_32(0)=-1. This bug was fixed once and reoccurred as I was tuning the score function but forgot to apply the fix. --- chain.c | 7 ++++--- main.c | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/chain.c b/chain.c index 37c920a..c0385a2 100644 --- a/chain.c +++ b/chain.c @@ -45,20 +45,21 @@ int mm_chain_dp(int max_dist_x, int max_dist_y, int bw, int max_skip, int min_cn while (st < i && ri - a[st].x > max_dist_x) ++st; for (j = i - 1; j >= st; --j) { int64_t dr = ri - a[j].x; - int32_t dq = qi - (int32_t)a[j].y, dd, sc; + int32_t dq = qi - (int32_t)a[j].y, dd, sc, log_dd; if (dr == 0 || dq <= 0 || dq > max_dist_y) continue; dd = dr > dq? dr - dq : dq - dr; if (dd > bw) continue; max_f_past = max_f_past > f[j]? max_f_past : f[j]; min_d = dq < dr? dq : dr; sc = min_d > q_span? q_span : dq < dr? dq : dr; + log_dd = dd? ilog2_32(dd) : 0; if (is_cdna) { int c_log, c_lin; c_lin = (int)(dd * .01 * avg_qspan); - c_log = ilog2_32(dd); + c_log = log_dd; if (dr > dq) sc -= c_lin < c_log? c_lin : c_log; else sc -= c_lin + (c_log>>1); - } else sc -= (int)(dd * .01 * avg_qspan) + (ilog2_32(dd)>>1); + } else sc -= (int)(dd * .01 * avg_qspan) + (log_dd>>1); sc += f[j]; if (sc > max_f) { max_f = sc, max_j = j; diff --git a/main.c b/main.c index 1f0ac56..9738d1d 100644 --- a/main.c +++ b/main.c @@ -6,7 +6,7 @@ #include "mmpriv.h" #include "getopt.h" -#define MM_VERSION "2.1.1-r361-dirty" +#define MM_VERSION "2.1.1-r362-dirty" #ifdef __linux__ #include