1 module parasail; 2 import std.meta:AliasSeq; 3 4 extern(C): 5 6 //Struct declarations 7 struct parasail_result_t { 8 int score; 9 int end_query; 10 int end_ref; 11 int flag; 12 void *extra; 13 } 14 struct parasail_matrix_t; 15 struct parasail_cigar_t{ 16 uint *seq; 17 int len; 18 int beg_query; 19 int beg_ref; 20 } 21 //Matrix functions 22 parasail_matrix_t* parasail_matrix_lookup(char * matrix); 23 parasail_matrix_t* parasail_matrix_create( 24 const char *alphabet, const int match, const int mismatch); 25 void parasail_matrix_free(parasail_matrix_t* matrix); 26 27 28 alias ALIGNMENT_TYPES = AliasSeq!("nw","sg","sg_qb","sg_qe","sg_qx","sg_db","sg_de","sg_dx","sg_qb_de","sg_qe_db","sw"); 29 alias OPTIONS = AliasSeq!("_stats","_table","_rowcol","_scan"); 30 alias VEC_TYPES = AliasSeq!("_striped","_scan","_diag"); 31 alias VEC_BITS = AliasSeq!("_8","_16","_32","_64","_sat"); 32 alias VEC_OPTIONS = AliasSeq!("_sse2_128","_sse41_128","_avx2_256","_altivec_128","_neon_128"); 33 34 enum FUNC_SIG="(const char * s1,const int s1Len,"~ 35 "const char *s2,const int s2Len,"~ 36 "const int open,const int gap,"~ 37 "const parasail_matrix_t* matrix);\n"; 38 39 enum FUNC_PRE="parasail_result_t* parasail_"; 40 //Meta-programming to generate all alignment functions 41 //Non-vectorized, reference implementations. 42 //parasail_ {nw,sg,sg_qb,sg_qe,sg_qx,sg_db,sg_de,sg_dx,sg_qb_de,sg_qe_db,sw} [_stats] [{_table,_rowcol}] [_scan] 43 string generateNonVecFuns(){ 44 string funcs; 45 foreach (aln; ALIGNMENT_TYPES) 46 { 47 funcs~=FUNC_PRE~aln~FUNC_SIG; 48 } 49 foreach (aln; ALIGNMENT_TYPES) 50 { 51 funcs~=FUNC_PRE~aln~OPTIONS[0]~FUNC_SIG; 52 funcs~=FUNC_PRE~aln~OPTIONS[1]~FUNC_SIG; 53 funcs~=FUNC_PRE~aln~OPTIONS[2]~FUNC_SIG; 54 funcs~=FUNC_PRE~aln~OPTIONS[3]~FUNC_SIG; 55 56 funcs~=FUNC_PRE~aln~OPTIONS[0]~OPTIONS[1]~FUNC_SIG; 57 funcs~=FUNC_PRE~aln~OPTIONS[0]~OPTIONS[2]~FUNC_SIG; 58 funcs~=FUNC_PRE~aln~OPTIONS[0]~OPTIONS[3]~FUNC_SIG; 59 60 funcs~=FUNC_PRE~aln~OPTIONS[0]~OPTIONS[1]~OPTIONS[3]~FUNC_SIG; 61 funcs~=FUNC_PRE~aln~OPTIONS[0]~OPTIONS[2]~OPTIONS[3]~FUNC_SIG; 62 63 funcs~=FUNC_PRE~aln~OPTIONS[1]~OPTIONS[3]~FUNC_SIG; 64 funcs~=FUNC_PRE~aln~OPTIONS[2]~OPTIONS[3]~FUNC_SIG; 65 } 66 return funcs; 67 } 68 mixin(generateNonVecFuns); 69 70 //Non-vectorized, traceback-capable reference implementations. 71 //parasail_ {nw,sg,sg_qb,sg_qe,sg_qx,sg_db,sg_de,sg_dx,sg_qb_de,sg_qe_db,sw} _trace [_scan] 72 string generateNonVecTraceFuns(){ 73 string funcs; 74 foreach (aln; ALIGNMENT_TYPES) 75 { 76 funcs~=FUNC_PRE~aln~"_trace"~FUNC_SIG; 77 } 78 foreach (aln; ALIGNMENT_TYPES) 79 { 80 funcs~=FUNC_PRE~aln~"_trace"~"_scan"~FUNC_SIG; 81 } 82 return funcs; 83 } 84 mixin(generateNonVecTraceFuns); 85 86 //Vectorized. 87 //parasail_ {nw,sg,sg_qb,sg_qe,sg_qx,sg_db,sg_de,sg_dx,sg_qb_de,sg_qe_db,sw} [_stats] [{_table,_rowcol}] {_striped,_scan,_diag} [{_sse2_128,_sse41_128,_avx2_256,_altivec_128,_neon_128}] {_8,_16,_32,_64,_sat} 88 string generateVecFuns(){ 89 string funcs; 90 foreach (aln; ALIGNMENT_TYPES) 91 { 92 foreach (type; VEC_TYPES) 93 { 94 foreach (bit; VEC_BITS) 95 { 96 funcs~=FUNC_PRE~aln~type~bit~FUNC_SIG; 97 } 98 } 99 } 100 foreach (aln; ALIGNMENT_TYPES) 101 { 102 foreach (type; VEC_TYPES) 103 { 104 foreach (bit; VEC_BITS) 105 { 106 foreach (vec; VEC_OPTIONS) 107 { 108 funcs~=FUNC_PRE~aln~type~vec~bit~FUNC_SIG; 109 funcs~=FUNC_PRE~aln~OPTIONS[0]~type~vec~bit~FUNC_SIG; 110 funcs~=FUNC_PRE~aln~OPTIONS[1]~type~vec~bit~FUNC_SIG; 111 funcs~=FUNC_PRE~aln~OPTIONS[2]~type~vec~bit~FUNC_SIG; 112 113 funcs~=FUNC_PRE~aln~OPTIONS[0]~OPTIONS[1]~type~vec~bit~FUNC_SIG; 114 funcs~=FUNC_PRE~aln~OPTIONS[0]~OPTIONS[2]~type~vec~bit~FUNC_SIG; 115 } 116 } 117 } 118 } 119 return funcs; 120 } 121 mixin(generateVecFuns); 122 123 //Vectorized, traceback-capable. 124 //parasail_ {nw,sg,sg_qb,sg_qe,sg_qx,sg_db,sg_de,sg_dx,sg_qb_de,sg_qe_db,sw} _trace {_striped,_scan,_diag} [{_sse2_128,_sse41_128,_avx2_256,_altivec_128,_neon_128}] {_8,_16,_32,_64,_sat} 125 string generateVecTraceFuns(){ 126 string funcs; 127 foreach (aln; ALIGNMENT_TYPES) 128 { 129 foreach (type; VEC_TYPES) 130 { 131 foreach (bit; VEC_BITS) 132 { 133 funcs~=FUNC_PRE~aln~"_trace"~type~bit~FUNC_SIG; 134 } 135 } 136 } 137 foreach (aln; ALIGNMENT_TYPES) 138 { 139 foreach (type; VEC_TYPES) 140 { 141 foreach (bit; VEC_BITS) 142 { 143 foreach (vec; VEC_OPTIONS) 144 { 145 funcs~=FUNC_PRE~aln~"_trace"~type~vec~bit~FUNC_SIG; 146 } 147 } 148 } 149 } 150 return funcs; 151 } 152 mixin(generateVecTraceFuns); 153 154 mixin(FUNC_PRE~"_nw_banded"~FUNC_SIG); 155 156 void parasail_result_free(parasail_result_t *result); 157 158 //Cigar Functions 159 void parasail_cigar_free(parasail_cigar_t *cigar); 160 char parasail_cigar_decode_op(uint cigar_int); 161 uint parasail_cigar_decode_len(uint cigar_int); 162 char* parasail_cigar_decode(parasail_cigar_t *cigar); 163 parasail_cigar_t* parasail_result_get_cigar( 164 parasail_result_t *result, 165 const char *seqA, int lena, 166 const char *seqB, int lenb, 167 const parasail_matrix_t *matrix); 168 169 int parasail_result_get_score(parasail_result_t *result); 170 int parasail_result_get_end_query(parasail_result_t *result); 171 int parasail_result_get_end_ref(parasail_result_t *result); 172 int parasail_result_get_matches(parasail_result_t *result); 173 int parasail_result_get_similar(parasail_result_t *result); 174 int parasail_result_get_length(parasail_result_t *result); 175 int* parasail_result_get_score_table(parasail_result_t *result); 176 int* parasail_result_get_matches_table(parasail_result_t *result); 177 int* parasail_result_get_similar_table(parasail_result_t *result); 178 int* parasail_result_get_length_table(parasail_result_t *result); 179 int* parasail_result_get_score_row(parasail_result_t *result); 180 int* parasail_result_get_matches_row(parasail_result_t *result); 181 int* parasail_result_get_similar_row(parasail_result_t *result); 182 int* parasail_result_get_length_row(parasail_result_t *result); 183 int* parasail_result_get_score_col(parasail_result_t *result); 184 int* parasail_result_get_matches_col(parasail_result_t *result); 185 int* parasail_result_get_similar_col(parasail_result_t *result); 186 int* parasail_result_get_length_col(parasail_result_t *result); 187 int* parasail_result_get_trace_table(parasail_result_t *result); 188 int* parasail_result_get_trace_ins_table(parasail_result_t *result); 189 int* parasail_result_get_trace_del_table(parasail_result_t *result); 190 191 int parasail_result_is_nw(parasail_result_t *result); 192 int parasail_result_is_sg(parasail_result_t *result); 193 int parasail_result_is_sw(parasail_result_t *result); 194 int parasail_result_is_saturated(parasail_result_t *result); 195 int parasail_result_is_banded(parasail_result_t *result); 196 int parasail_result_is_scan(parasail_result_t *result); 197 int parasail_result_is_striped(parasail_result_t *result); 198 int parasail_result_is_diag(parasail_result_t *result); 199 int parasail_result_is_blocked(parasail_result_t *result); 200 int parasail_result_is_stats(parasail_result_t *result); 201 int parasail_result_is_stats_table(parasail_result_t *result); 202 int parasail_result_is_stats_rowcol(parasail_result_t *result); 203 int parasail_result_is_table(parasail_result_t *result); 204 int parasail_result_is_rowcol(parasail_result_t *result); 205 int parasail_result_is_trace(parasail_result_t *result);