30 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
32 array<array<array<double, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
33 array<array<string, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
34 map<string, string> &alignments)
41 array<array<double, SOL_N_LAYERS>, SOL_MAX_QUERY_LENGTH> initial_col;
42 array<array<double, SOL_N_LAYERS>, SOL_MAX_REFERENCE_LENGTH> initial_row;
44 double init_penal = penalties.log_lambda;
46 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
48 init_penal += penalties.log_1_m_mu;
49 initial_col[i][0] = -1000000;
50 initial_col[i][1] = init_penal;
51 initial_col[i][2] = -1000000;
53 init_penal = penalties.log_lambda;
54 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
56 init_penal += penalties.log_1_m_mu;
57 initial_row[j][0] = -1000000;
58 initial_row[j][1] = init_penal;
59 initial_row[j][2] = -1000000;
63 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
65 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
67 for (
int k = 0; k < SOL_N_LAYERS; k++)
69 score_mat[k][i][j] = 0;
75 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
77 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
84 for (
int i = 0; i < query.length(); i++)
87 for (
int j = 0; j < reference.length(); j++)
91 double main_diag, main_up, main_left;
92 double ins_diag, del_diag;
97 main_up = initial_row[0][1];
98 main_left = initial_col[0][1];
100 ins_left = initial_col[0][0];
103 del_up = initial_row[0][2];
106 else if (i == 0 && j > 0)
108 main_diag = initial_row[j - 1][1];
109 main_up = initial_row[j][1];
110 main_left = score_mat[1][i][j - 1];
112 ins_left = score_mat[0][0][j - 1];
113 ins_diag = initial_row[j - 1][0];
115 del_up = initial_row[j][2];
116 del_diag = initial_row[j - 1][2];
118 else if (i > 0 && j == 0)
120 main_diag = initial_col[i - 1][1];
121 main_up = score_mat[1][i - 1][j];
122 main_left = initial_col[i][1];
124 ins_left = initial_col[i][0];
125 ins_diag = initial_col[i - 1][0];
127 del_up = score_mat[2][i - 1][j];
128 del_diag = initial_col[i - 1][2];
132 main_diag = score_mat[1][i - 1][j - 1];
133 main_up = score_mat[1][i - 1][j];
134 main_left = score_mat[1][i][j - 1];
136 ins_left = score_mat[0][i][j - 1];
137 ins_diag = score_mat[0][i-1][j-1];
139 del_up = score_mat[2][i - 1][j];
140 del_diag = score_mat[2][i-1][j-1];
143 double del_write, ins_write, main_write;
144 double ins_open, ins_extend, del_open, del_extend;
145 ins_open = main_left + penalties.log_lambda;
146 ins_extend = ins_left + penalties.log_1_m_mu;
147 del_open = main_up + penalties.log_lambda;
148 del_extend = del_up + penalties.log_1_m_mu;
150 bool ins_open_b = ins_extend < ins_open;
151 bool del_open_b = del_extend < del_open;
155 double main_match = penalties.log_1_m_2_lambda + main_diag;
156 double main_ins = penalties.log_mu + ins_diag;
157 double main_del = penalties.log_mu + del_diag;
159 double main_max = main_match;
160 main_max = main_max > main_ins ? main_max : main_ins;
161 main_max = main_max > main_del ? main_max : main_del;
164 score_mat[0][i][j] = ins_write;
165 score_mat[1][i][j] = main_write;
166 score_mat[2][i][j] = del_write;
169 if (main_max == main_ins)
171 tb_mat[i][j] = ins_open_b ?
"L " :
"LE";
173 else if (main_max == main_del)
175 tb_mat[i][j] = del_open_b ?
"U " :
"UE";
177 else if (main_max == main_match)
183 cout <<
"ERROR: Invalid traceback matrix value" << endl;
189 int i = query.length() - 1;
190 int j = reference.length() - 1;
191 string aligned_query =
"";
192 string aligned_reference =
"";
193 while (i >= 0 && j >= 0)
195 if (tb_mat[i][j] ==
"D ")
197 aligned_query = query[i] + aligned_query;
198 aligned_reference = reference[j] + aligned_reference;
202 else if (tb_mat[i][j] ==
"U ")
204 aligned_query = query[i] + aligned_query;
205 aligned_reference =
"_" + aligned_reference;
208 else if (tb_mat[i][j] ==
"UE")
210 aligned_query = query[i] + aligned_query;
211 aligned_reference =
"_" + aligned_reference;
214 else if (tb_mat[i][j] ==
"L ")
216 aligned_query =
"_" + aligned_query;
217 aligned_reference = reference[j] + aligned_reference;
220 else if (tb_mat[i][j] ==
"LE")
222 aligned_query =
"_" + aligned_query;
223 aligned_reference = reference[j] + aligned_reference;
228 cout <<
"ERROR: Invalid traceback matrix value" << endl;
236 aligned_query = query[i] + aligned_query;
237 aligned_reference =
"_" + aligned_reference;
242 aligned_query =
"_" + aligned_query;
243 aligned_reference = reference[j] + aligned_reference;
247 alignments[
"query"] = aligned_query;
248 alignments[
"reference"] = aligned_reference;
void viterbi_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< double, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH >, SOL_N_LAYERS > &score_mat, array< array< string, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH > &tb_mat, map< string, string > &alignments)
Viterbi itself is a global alignment, don't need to consider the case of making it local...
Definition: solution_viterbi.h:31
int base_to_num(char base)
Map a single base to a number. A: 0, C: 1, G: 2, T: 3, _: 4.
Contains helper functions to write the host side code of the kernel.