1
1
#include "mmpriv.h"
2
2
#include "kalloc.h"
3
+ #include "ksort.h"
3
4
4
- mm_seed_t * mm_seed_collect_all (void * km , const mm_idx_t * mi , const mm128_v * mv )
5
+ mm_seed_t * mm_seed_collect_all (void * km , const mm_idx_t * mi , const mm128_v * mv , int32_t * n_m_ )
5
6
{
6
7
mm_seed_t * m ;
7
8
size_t i ;
9
+ int32_t k ;
8
10
m = (mm_seed_t * )kmalloc (km , mv -> n * sizeof (mm_seed_t ));
9
- for (i = 0 ; i < mv -> n ; ++ i ) {
11
+ for (i = k = 0 ; i < mv -> n ; ++ i ) {
10
12
const uint64_t * cr ;
11
- mm_seed_t * q = & m [ i ] ;
13
+ mm_seed_t * q ;
12
14
mm128_t * p = & mv -> a [i ];
13
15
uint32_t q_pos = (uint32_t )p -> y , q_span = p -> x & 0xff ;
14
16
int t ;
15
17
cr = mm_idx_get (mi , p -> x >>8 , & t );
18
+ if (t == 0 ) continue ;
19
+ q = & m [k ++ ];
16
20
q -> q_pos = q_pos , q -> q_span = q_span , q -> cr = cr , q -> n = t , q -> seg_id = p -> y >> 32 ;
17
21
q -> is_tandem = q -> flt = 0 ;
18
22
if (i > 0 && p -> x >>8 == mv -> a [i - 1 ].x >>8 ) q -> is_tandem = 1 ;
19
23
if (i < mv -> n - 1 && p -> x >>8 == mv -> a [i + 1 ].x >>8 ) q -> is_tandem = 1 ;
20
24
}
25
+ * n_m_ = k ;
21
26
return m ;
22
27
}
23
28
@@ -37,18 +42,19 @@ void mm_seed_select(int32_t n, mm_seed_t *a, int len, int max_occ, int max_max_o
37
42
for (i = 0 , last0 = -1 ; i <= n ; ++ i ) {
38
43
if (i == n || a [i ].n <= max_occ ) {
39
44
if (i - last0 > 1 ) {
40
- int32_t ps = last0 < 0 ? 0 : (uint32_t )a [last0 ].q_pos ;
41
- int32_t pe = i == n ? len : (uint32_t )a [i ].q_pos ;
45
+ int32_t ps = last0 < 0 ? 0 : (uint32_t )a [last0 ].q_pos >> 1 ;
46
+ int32_t pe = i == n ? len : (uint32_t )a [i ].q_pos >> 1 ;
42
47
int32_t j , k , st = last0 + 1 , en = i ;
43
48
int32_t max_high_occ = (int32_t )((double )(pe - ps ) / dist + .499 );
49
+ //fprintf(stderr, "Y\t%d\t%d\n", ps, pe);
44
50
if (max_high_occ > MAX_MAX_HIGH_OCC )
45
51
max_high_occ = MAX_MAX_HIGH_OCC ;
46
52
for (j = st , k = 0 ; j < en && k < max_high_occ ; ++ j , ++ k )
47
53
b [k ] = (uint64_t )a [j ].n <<32 | j ;
48
54
ks_heapmake_uint64_t (k , b ); // initialize the binomial heap
49
55
for (; j < en ; ++ j ) { // if there are more, choose top max_high_occ
50
- if (a [j ].n < (uint32_t ) b [0 ]) { // then update the heap
51
- b [0 ] = (b [ 0 ] & 0xFFFFFFFF00000000ULL ) | j ;
56
+ if (a [j ].n < (int32_t )( b [0 ]>> 32 ) ) { // then update the heap
57
+ b [0 ] = (uint64_t ) a [ j ]. n << 32 | j ;
52
58
ks_heapdown_uint64_t (0 , k , b );
53
59
}
54
60
}
@@ -65,21 +71,22 @@ void mm_seed_select(int32_t n, mm_seed_t *a, int len, int max_occ, int max_max_o
65
71
66
72
mm_seed_t * mm_collect_matches (void * km , int * _n_m , int qlen , int max_occ , int max_max_occ , int dist , const mm_idx_t * mi , const mm128_v * mv , int64_t * n_a , int * rep_len , int * n_mini_pos , uint64_t * * mini_pos )
67
73
{
68
- int rep_st = 0 , rep_en = 0 , n_m ;
74
+ int rep_st = 0 , rep_en = 0 , n_m , n_m0 ;
69
75
size_t i ;
70
76
mm_seed_t * m ;
71
77
* n_mini_pos = 0 ;
72
78
* mini_pos = (uint64_t * )kmalloc (km , mv -> n * sizeof (uint64_t ));
73
- m = mm_seed_collect_all (km , mi , mv );
79
+ m = mm_seed_collect_all (km , mi , mv , & n_m0 );
74
80
if (dist > 0 && max_max_occ > max_occ ) {
75
- mm_seed_select (mv -> n , m , qlen , max_occ , max_max_occ , dist );
81
+ mm_seed_select (n_m0 , m , qlen , max_occ , max_max_occ , dist );
76
82
} else {
77
- for (i = 0 ; i < mv -> n ; ++ i )
83
+ for (i = 0 ; i < n_m0 ; ++ i )
78
84
if (m [i ].n > max_occ )
79
85
m [i ].flt = 1 ;
80
86
}
81
- for (i = 0 , n_m = 0 , * rep_len = 0 , * n_a = 0 ; i < mv -> n ; ++ i ) {
87
+ for (i = 0 , n_m = 0 , * rep_len = 0 , * n_a = 0 ; i < n_m0 ; ++ i ) {
82
88
mm_seed_t * q = & m [i ];
89
+ //fprintf(stderr, "X\t%d\t%d\t%d\n", q->q_pos>>1, q->n, q->flt);
83
90
if (q -> flt ) {
84
91
int en = (q -> q_pos >> 1 ) + 1 , st = en - q -> q_span ;
85
92
if (st > rep_en ) {
0 commit comments