4 * Copyright (c) 2008-2012 BGI-Shenzhen <soap at genomics dot org dot cn>.
6 * This file is part of SOAPdenovo.
8 * SOAPdenovo is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
13 * SOAPdenovo is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with SOAPdenovo. If not, see <http://www.gnu.org/licenses/>.
27 #define K_LOAD_FACTOR 0.75
30 #define MAX_KMER_COV 63
31 #define EDGE_BIT_SIZE 6 //6 bit for each edge
32 #define EDGE_XOR_MASK 0x3FU
33 #define LINKS_BITS 0x00FFFFFFU
35 #define get_kmer_seq(mer) ((mer).seq)
36 #define set_kmer_seq(mer, val) ((mer).seq = val)
38 #define get_kmer_left_cov(mer, idx) (((mer).l_links>>((idx)*EDGE_BIT_SIZE))&EDGE_XOR_MASK)
39 #define set_kmer_left_cov(mer, idx, val) ((mer).l_links = ((mer).l_links&(~(EDGE_XOR_MASK<<((idx)*EDGE_BIT_SIZE)))) | (((val)&EDGE_XOR_MASK)<<((idx)*EDGE_BIT_SIZE)) )
40 #define get_kmer_left_covs(mer) (get_kmer_left_cov(mer, 0) + get_kmer_left_cov(mer, 1) + get_kmer_left_cov(mer, 2) + get_kmer_left_cov(mer, 3))
42 #define get_kmer_right_cov(mer, idx) (((mer).r_links>>((idx)*EDGE_BIT_SIZE))&EDGE_XOR_MASK)
43 #define set_kmer_right_cov(mer, idx, val) ((mer).r_links = ((mer).r_links&(~(EDGE_XOR_MASK<<((idx)*EDGE_BIT_SIZE)))) | (((val)&EDGE_XOR_MASK)<<((idx)*EDGE_BIT_SIZE)) )
44 #define get_kmer_right_covs(mer) (get_kmer_right_cov(mer, 0) + get_kmer_right_cov(mer, 1) + get_kmer_right_cov(mer, 2) + get_kmer_right_cov(mer, 3))
47 #define is_kmer_entity_null(flags, idx) ((flags)[(idx)>>4]>>(((idx)&0x0f)<<1)&0x01)
48 #define is_kmer_entity_del(flags, idx) ((flags)[(idx)>>4]>>(((idx)&0x0f)<<1)&0x02)
49 #define set_kmer_entity_null(flags, idx) ((flags)[(idx)>>4] |= (0x01u<<(((idx)&0x0f)<<1)))
50 #define set_kmer_entity_del(flags, idx) ((flags)[(idx)>>4] |= (0x02u<<(((idx)&0x0f)<<1)))
51 #define clear_kmer_entity_null(flags, idx) ((flags)[(idx)>>4] &= ~(0x01u<<(((idx)&0x0f)<<1)))
52 #define clear_kmer_entity_del(flags, idx) ((flags)[(idx)>>4] &= ~(0x02u<<(((idx)&0x0f)<<1)))
53 #define exists_kmer_entity(flags, idx) (!((flags)[(idx)>>4]>>(((idx)&0x0f)<<1)&0x03))
56 typedef __uint128_t u128b
;
66 typedef struct kmer_st
69 ubyte4 l_links
; // sever as edgeID since make_edge
70 ubyte4 r_links
: 4 * EDGE_BIT_SIZE
;
79 typedef struct kmerSet_st
81 kmer_t
* array
; //kmer set
82 ubyte4
* flags
; //mark the element pos that exist in array
87 ubyte8 iter_ptr
; //iter in set
90 typedef struct kmer_pt
95 struct kmer_pt
* next
;
98 extern KmerSet
* init_kmerset ( ubyte8 init_size
, float load_factor
);
99 extern int search_kmerset ( KmerSet
* set
, Kmer seq
, kmer_t
** rs
);
100 extern int put_kmerset ( KmerSet
* set
, Kmer seq
, ubyte left
, ubyte right
, kmer_t
** kmer_p
);
101 extern byte8
count_kmerset ( KmerSet
* set
);
102 extern void free_Sets ( KmerSet
** KmerSets
, int num
);
103 extern void free_kmerset ( KmerSet
* set
);
104 extern void dislink2nextUncertain ( kmer_t
* node
, char ch
, boolean smaller
);
105 extern void dislink2prevUncertain ( kmer_t
* node
, char ch
, boolean smaller
);
107 extern int count_branch2prev ( kmer_t
* node
);
108 extern int count_branch2next ( kmer_t
* node
);
109 extern char firstCharInKmer ( Kmer kmer
);