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