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);