16 namespace SolutionUtils
20 template <
int ALPHABET_SIZE>
21 float score_mult(
const std::array<int, ALPHABET_SIZE> &query,
const std::array<int, ALPHABET_SIZE> &reference,
22 const std::array<std::array<float, ALPHABET_SIZE>, ALPHABET_SIZE> &A)
25 for (
int i = 0; i < ALPHABET_SIZE; ++i)
27 for (
int j = 0; j < ALPHABET_SIZE; ++j)
29 score += query[i] * A[i][j] * reference[j];
37 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
39 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
40 array<array<char, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
41 std::vector<char> &alignments)
44 const int ALPHABET_SIZE = 5;
46 int query_len = query.size();
47 int reference_len = reference.size();
50 std::array<std::array<std::array<float, SOL_MAX_REFERENCE_LENGTH + 1>, SOL_MAX_QUERY_LENGTH + 1>, SOL_N_LAYERS> score_matrix;
54 score_matrix[0][0][0] = 0;
56 for (
int i = 0; i < query_len; ++i)
58 accumulate += penalties.linear_gap;
59 score_matrix[0][i][0] = accumulate;
62 for (
int j = 0; j < reference_len; ++j)
64 accumulate += penalties.linear_gap;
65 score_matrix[0][0][j] = accumulate;
69 for (
int i = 1; i <= query_len; ++i)
71 for (
int j = 1; j <= reference_len; ++j)
73 float intermidiate_score = SolutionUtils::Profile::score_mult<5>(query[i - 1], reference[j - 1], penalties.transition);
74 float matchScore = score_matrix[0][i - 1][j - 1] + intermidiate_score;
75 float deleteScore = score_matrix[0][i - 1][j] + intermidiate_score;
76 float insertScore = score_matrix[0][i][j - 1] + intermidiate_score;
77 score_matrix[0][i][j] = std::max(matchScore, std::max(deleteScore, insertScore));
79 if (score_matrix[0][i][j] == matchScore)
81 tb_mat[i - 1][j - 1] =
'D';
83 else if (score_matrix[0][i][j] == deleteScore)
85 tb_mat[i - 1][j - 1] =
'U';
89 tb_mat[i - 1][j - 1] =
'L';
95 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
97 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
99 score_mat[0][i][j] = score_matrix[0][i + 1][j + 1];
106 int i = query.size() - 1;
107 int j = reference.size() - 1;
109 while (i >= 0 && j >= 0)
111 if (tb_mat[i][j] ==
'D')
115 alignments.push_back(
'D');
117 else if (tb_mat[i][j] ==
'U')
120 alignments.push_back(
'U');
122 else if (tb_mat[i][j] ==
'L')
125 alignments.push_back(
'L');
129 std::cout <<
"ERROR: Invalid traceback matrix value" << std::endl;
138 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
140 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
141 array<array<char, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
142 map<string, string> &alignments)
149 array<float, SOL_MAX_QUERY_LENGTH> initial_col;
150 array<float, SOL_MAX_REFERENCE_LENGTH> initial_row;
153 float upper_left_value = 0;
154 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
156 upper_left_value += penalties.linear_gap;
157 initial_col[i] = upper_left_value;
161 upper_left_value = 0;
162 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
164 upper_left_value += penalties.linear_gap;
165 initial_row[j] = upper_left_value;
169 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
171 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
173 score_mat[0][i][j] = 0;
178 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
180 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
187 for (
int i = 0; i < query.length(); i++)
189 int scr_diag, scr_up, scr_left;
190 for (
int j = 0; j < reference.length(); j++)
192 if (i == 0 && j == 0)
195 scr_up = initial_row[j];
196 scr_left = initial_col[i];
198 else if (i == 0 && j > 0)
200 scr_diag = initial_row[j - 1];
201 scr_up = initial_row[j];
202 scr_left = score_mat[0][i][j - 1];
204 else if (i > 0 && j == 0)
206 scr_diag = initial_col[i - 1];
207 scr_up = score_mat[0][i - 1][j];
208 scr_left = initial_col[i];
212 scr_diag = score_mat[0][i - 1][j - 1];
213 scr_up = score_mat[0][i - 1][j];
214 scr_left = score_mat[0][i][j - 1];
217 float m_score = scr_diag + (query[i] == reference[j] ? penalties.match : penalties.mismatch);
218 float d_score = scr_up + penalties.linear_gap;
219 float i_score = scr_left + penalties.linear_gap;
221 float max_score = max(m_score, max(d_score, i_score));
222 score_mat[0][i][j] = max_score;
225 if (max_score == m_score)
229 else if (max_score == d_score)
241 int i = query.length() - 1;
242 int j = reference.length() - 1;
243 string aligned_query =
"";
244 string aligned_reference =
"";
246 while (i >= 0 && j >= 0)
248 if (tb_mat[i][j] ==
'D')
250 aligned_query = query[i] + aligned_query;
251 aligned_reference = reference[j] + aligned_reference;
255 else if (tb_mat[i][j] ==
'U')
257 aligned_query = query[i] + aligned_query;
258 aligned_reference =
"_" + aligned_reference;
261 else if (tb_mat[i][j] ==
'L')
263 aligned_query =
"_" + aligned_query;
264 aligned_reference = reference[j] + aligned_reference;
269 cout <<
"ERROR: Invalid traceback matrix value" << endl;
277 aligned_query = query[i] + aligned_query;
278 aligned_reference =
"_" + aligned_reference;
283 aligned_query =
"_" + aligned_query;
284 aligned_reference = reference[j] + aligned_reference;
288 alignments[
"query"] = aligned_query;
289 alignments[
"reference"] = aligned_reference;
293 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS,
int SOL_BANDWIDTH>
295 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
296 array<array<char, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
297 map<string, string> &alignments)
304 array<float, SOL_MAX_QUERY_LENGTH> initial_col;
305 array<float, SOL_MAX_REFERENCE_LENGTH> initial_row;
308 float upper_left_value = 0;
309 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
311 upper_left_value += penalties.linear_gap;
312 initial_col[i] = upper_left_value;
316 upper_left_value = 0;
317 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
319 upper_left_value += penalties.linear_gap;
320 initial_row[j] = upper_left_value;
324 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
326 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
328 score_mat[0][i][j] = 0;
333 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
335 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
341 int llim[SOL_MAX_QUERY_LENGTH], ulim[SOL_MAX_QUERY_LENGTH];
342 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
344 llim[i] = i - SOL_BANDWIDTH;
345 ulim[i] = i + SOL_BANDWIDTH - 1;
349 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++) {
350 cout << ulim[i] <<
" ";
356 for (
int i = 0; i < query.length(); i++)
358 int scr_diag, scr_up, scr_left;
359 for (
int j = 0; j < reference.length(); j++)
366 if (i == 0 && j == 0)
369 scr_up = initial_row[j];
370 scr_left = initial_col[i];
372 else if (i == 0 && j > 0)
374 scr_diag = initial_row[j - 1];
375 scr_up = initial_row[j];
376 scr_left = score_mat[0][i][j - 1];
378 else if (i > 0 && j == 0)
380 scr_diag = initial_col[i - 1];
381 scr_up = score_mat[0][i - 1][j];
382 scr_left = initial_col[i];
386 scr_diag = score_mat[0][i - 1][j - 1];
387 scr_up = score_mat[0][i - 1][j];
388 scr_left = score_mat[0][i][j - 1];
393 scr_left = -std::numeric_limits<float>::infinity();
397 scr_up = -std::numeric_limits<float>::infinity();
400 float m_score = scr_diag + (query[i] == reference[j] ? penalties.match : penalties.mismatch);
401 float d_score = scr_up + penalties.linear_gap;
402 float i_score = scr_left + penalties.linear_gap;
404 float max_score = m_score;
406 if (max_score < i_score)
411 if (max_score < d_score)
417 score_mat[0][i][j] = max_score;
423 int i = query.length() - 1;
424 int j = reference.length() - 1;
425 string aligned_query =
"";
426 string aligned_reference =
"";
428 while (i >= 0 && j >= 0)
430 if (tb_mat[i][j] ==
'D')
432 aligned_query = query[i] + aligned_query;
433 aligned_reference = reference[j] + aligned_reference;
437 else if (tb_mat[i][j] ==
'U')
439 aligned_query = query[i] + aligned_query;
440 aligned_reference =
"_" + aligned_reference;
443 else if (tb_mat[i][j] ==
'L')
445 aligned_query =
"_" + aligned_query;
446 aligned_reference = reference[j] + aligned_reference;
451 cout <<
"ERROR: Invalid traceback matrix value" << endl;
459 aligned_query = query[i] + aligned_query;
460 aligned_reference =
"_" + aligned_reference;
465 aligned_query =
"_" + aligned_query;
466 aligned_reference = reference[j] + aligned_reference;
470 alignments[
"query"] = aligned_query;
471 alignments[
"reference"] = aligned_reference;
474 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
476 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
477 array<array<string, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
478 map<string, string> &alignments)
480 const int N_LAYERS_GA = 3;
487 array<array<float, N_LAYERS_GA>, SOL_MAX_QUERY_LENGTH> initial_col;
488 array<array<float, N_LAYERS_GA>, SOL_MAX_REFERENCE_LENGTH> initial_row;
491 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
493 initial_col[i][0] = -std::numeric_limits<float>::infinity();
494 initial_col[i][1] = penalties.open + penalties.extend * (i + 1);
495 initial_col[i][2] = 0;
498 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
500 initial_row[j][0] = 0;
501 initial_row[j][1] = penalties.open + penalties.extend * (j + 1);
502 initial_row[j][2] = -std::numeric_limits<float>::infinity();
506 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
508 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
510 for (
int k = 0; k < N_LAYERS_GA; k++)
512 score_mat[k][i][j] = 0;
518 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
520 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
527 for (
int i = 0; i < query.length(); i++)
529 float del_scr, ins_scr;
530 float scr_diag, scr_up, scr_left;
531 for (
int j = 0; j < reference.length(); j++)
533 if (i == 0 && j == 0)
536 scr_up = initial_row[j][1];
537 scr_left = initial_col[i][1];
539 ins_scr = initial_col[i][0];
540 del_scr = initial_row[j][2];
542 else if (i == 0 && j > 0)
544 scr_diag = initial_row[j - 1][1];
545 scr_up = initial_row[j][1];
546 scr_left = score_mat[1][i][j - 1];
548 ins_scr = score_mat[0][i][j - 1];
549 del_scr = initial_row[j][2];
551 else if (i > 0 && j == 0)
553 scr_diag = initial_col[i - 1][1];
554 scr_up = score_mat[1][i - 1][j];
555 scr_left = initial_col[i][1];
557 ins_scr = initial_col[i][0];
558 del_scr = score_mat[2][i - 1][j];
562 scr_diag = score_mat[1][i - 1][j - 1];
563 scr_up = score_mat[1][i - 1][j];
564 scr_left = score_mat[1][i][j - 1];
566 ins_scr = score_mat[0][i][j - 1];
567 del_scr = score_mat[2][i - 1][j];
570 float insertion_open_score = scr_left + penalties.open + penalties.extend;
571 float insertion_extend_score = ins_scr + penalties.extend;
573 float deletion_open_score = scr_up + penalties.open + penalties.extend;
574 float deletion_extend_score = del_scr + penalties.extend;
576 float mm_score = scr_diag + (query[i] == reference[j] ? penalties.match : penalties.mismatch);
578 float insertion_score = insertion_open_score > insertion_extend_score ? insertion_open_score : insertion_extend_score;
579 float deletion_score = deletion_open_score > deletion_extend_score ? deletion_open_score : deletion_extend_score;
581 float final_score = insertion_score > deletion_score ? insertion_score : deletion_score;
582 final_score = final_score > mm_score ? final_score : mm_score;
584 score_mat[0][i][j] = insertion_score;
585 score_mat[1][i][j] = final_score;
586 score_mat[2][i][j] = deletion_score;
589 if (final_score == insertion_score)
591 tb_mat[i][j] = insertion_score == insertion_open_score ?
"L " :
"LE";
593 else if (final_score == deletion_score)
595 tb_mat[i][j] = deletion_score == deletion_open_score ?
"U " :
"UE";
597 else if (final_score == mm_score)
603 cout <<
"ERROR: Invalid traceback matrix value" << endl;
610 int i = query.length() - 1;
611 int j = reference.length() - 1;
612 string aligned_query =
"";
613 string aligned_reference =
"";
614 while (i >= 0 && j >= 0)
616 if (tb_mat[i][j] ==
"D ")
618 aligned_query = query[i] + aligned_query;
619 aligned_reference = reference[j] + aligned_reference;
623 else if (tb_mat[i][j] ==
"U ")
625 aligned_query = query[i] + aligned_query;
626 aligned_reference =
"_" + aligned_reference;
629 else if (tb_mat[i][j] ==
"UE")
631 aligned_query = query[i] + aligned_query;
632 aligned_reference =
"_" + aligned_reference;
635 else if (tb_mat[i][j] ==
"L ")
637 aligned_query =
"_" + aligned_query;
638 aligned_reference = reference[j] + aligned_reference;
641 else if (tb_mat[i][j] ==
"LE")
643 aligned_query =
"_" + aligned_query;
644 aligned_reference = reference[j] + aligned_reference;
649 cout <<
"ERROR: Invalid traceback matrix value" << endl;
657 aligned_query = query[i] + aligned_query;
658 aligned_reference =
"_" + aligned_reference;
663 aligned_query =
"_" + aligned_query;
664 aligned_reference = reference[j] + aligned_reference;
668 alignments[
"query"] = aligned_query;
669 alignments[
"reference"] = aligned_reference;
674 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
676 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
677 array<array<char, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
678 map<string, string> &alignments)
685 array<float, SOL_MAX_QUERY_LENGTH> initial_col;
686 array<float, SOL_MAX_REFERENCE_LENGTH> initial_row;
689 float upper_left_value = 0;
690 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
692 upper_left_value += 0;
693 initial_col[i] = upper_left_value;
697 upper_left_value = 0;
698 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
700 upper_left_value += 0;
701 initial_row[j] = upper_left_value;
705 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
707 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
709 score_mat[0][i][j] = 0;
714 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
716 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
722 float global_max_score = 0;
727 for (
int i = 0; i < query.length(); i++)
729 int scr_diag, scr_up, scr_left;
730 for (
int j = 0; j < reference.length(); j++)
732 if (i == 0 && j == 0)
735 scr_up = initial_row[j];
736 scr_left = initial_col[i];
738 else if (i == 0 && j > 0)
740 scr_diag = initial_row[j - 1];
741 scr_up = initial_row[j];
742 scr_left = score_mat[0][i][j - 1];
744 else if (i > 0 && j == 0)
746 scr_diag = initial_col[i - 1];
747 scr_up = score_mat[0][i - 1][j];
748 scr_left = initial_col[i];
752 scr_diag = score_mat[0][i - 1][j - 1];
753 scr_up = score_mat[0][i - 1][j];
754 scr_left = score_mat[0][i][j - 1];
757 float m_score = scr_diag + (query[i] == reference[j] ? penalties.match : penalties.mismatch);
758 float d_score = scr_up + penalties.linear_gap;
759 float i_score = scr_left + penalties.linear_gap;
761 float max_score = max(max(m_score, max(d_score, i_score)), (
float)0);
762 score_mat[0][i][j] = max_score;
764 if (max_score > global_max_score)
766 global_max_score = max_score;
772 if (max_score == i_score)
776 else if (max_score == m_score)
780 else if (max_score == d_score)
794 string aligned_query =
"";
795 string aligned_reference =
"";
797 while (i >= 0 && j >= 0)
799 if (tb_mat[i][j] ==
'D')
801 aligned_query = query[i] + aligned_query;
802 aligned_reference = reference[j] + aligned_reference;
806 else if (tb_mat[i][j] ==
'U')
808 aligned_query = query[i] + aligned_query;
809 aligned_reference =
"_" + aligned_reference;
812 else if (tb_mat[i][j] ==
'L')
814 aligned_query =
"_" + aligned_query;
815 aligned_reference = reference[j] + aligned_reference;
818 else if (tb_mat[i][j] ==
'*')
826 cout <<
"ERROR: Invalid traceback matrix value" << endl;
834 aligned_query = query[i] + aligned_query;
835 aligned_reference =
"_" + aligned_reference;
840 aligned_query =
"_" + aligned_query;
841 aligned_reference = reference[j] + aligned_reference;
845 alignments[
"query"] = aligned_query;
846 alignments[
"reference"] = aligned_reference;
849 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
851 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
852 array<array<string, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
853 map<string, string> &alignments)
855 const int N_LAYERS_GA = 3;
862 array<array<float, N_LAYERS_GA>, SOL_MAX_QUERY_LENGTH> initial_col;
863 array<array<float, N_LAYERS_GA>, SOL_MAX_REFERENCE_LENGTH> initial_row;
866 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
868 initial_col[i][0] = -std::numeric_limits<float>::infinity();
869 initial_col[i][1] = 0;
870 initial_col[i][2] = 0;
873 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
875 initial_row[j][0] = 0;
876 initial_row[j][1] = 0;
877 initial_row[j][2] = -std::numeric_limits<float>::infinity();
881 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
883 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
885 for (
int k = 0; k < N_LAYERS_GA; k++)
887 score_mat[k][i][j] = 0;
893 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
895 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
901 float maximum_score = -std::numeric_limits<float>::infinity();
906 for (
int i = 0; i < query.length(); i++)
908 float del_scr, ins_scr;
909 float scr_diag, scr_up, scr_left;
910 for (
int j = 0; j < reference.length(); j++)
912 if (i == 0 && j == 0)
915 scr_up = initial_row[j][1];
916 scr_left = initial_col[i][1];
918 ins_scr = initial_col[i][0];
919 del_scr = initial_row[j][2];
921 else if (i == 0 && j > 0)
923 scr_diag = initial_row[j - 1][1];
924 scr_up = initial_row[j][1];
925 scr_left = score_mat[1][i][j - 1];
927 ins_scr = score_mat[0][i][j - 1];
928 del_scr = initial_row[j][2];
930 else if (i > 0 && j == 0)
932 scr_diag = initial_col[i - 1][1];
933 scr_up = score_mat[1][i - 1][j];
934 scr_left = initial_col[i][1];
936 ins_scr = initial_col[i][0];
937 del_scr = score_mat[2][i - 1][j];
941 scr_diag = score_mat[1][i - 1][j - 1];
942 scr_up = score_mat[1][i - 1][j];
943 scr_left = score_mat[1][i][j - 1];
945 ins_scr = score_mat[0][i][j - 1];
946 del_scr = score_mat[2][i - 1][j];
949 float insertion_open_score = scr_left + penalties.open + penalties.extend;
950 float insertion_extend_score = ins_scr + penalties.extend;
952 float deletion_open_score = scr_up + penalties.open + penalties.extend;
953 float deletion_extend_score = del_scr + penalties.extend;
955 float mm_score = scr_diag + (query[i] == reference[j] ? penalties.match : penalties.mismatch);
957 float insertion_score = insertion_open_score > insertion_extend_score ? insertion_open_score : insertion_extend_score;
958 float deletion_score = deletion_open_score > deletion_extend_score ? deletion_open_score : deletion_extend_score;
962 float max_score = insertion_score > deletion_score ? insertion_score : deletion_score;
963 max_score = max_score > mm_score ? max_score : mm_score;
964 max_score = max_score >= 0 ? max_score : 0;
966 if (max_score > maximum_score)
968 maximum_score = max_score;
973 score_mat[0][i][j] = insertion_score;
974 score_mat[1][i][j] = max_score;
975 score_mat[2][i][j] = deletion_score;
978 if (max_score == insertion_score)
980 tb_mat[i][j] = insertion_score == insertion_open_score ?
"L " :
"LE";
982 else if (max_score == deletion_score)
984 tb_mat[i][j] = deletion_score == deletion_open_score ?
"U " :
"UE";
986 else if (max_score == mm_score)
990 else if (max_score == 0)
996 cout <<
"ERROR: Invalid traceback matrix value" << endl;
1005 string aligned_query =
"";
1006 string aligned_reference =
"";
1007 while (i >= 0 && j >= 0)
1009 if (tb_mat[i][j] ==
"D ")
1011 aligned_query = query[i] + aligned_query;
1012 aligned_reference = reference[j] + aligned_reference;
1016 else if (tb_mat[i][j] ==
"U ")
1018 aligned_query = query[i] + aligned_query;
1019 aligned_reference =
"_" + aligned_reference;
1022 else if (tb_mat[i][j] ==
"UE")
1024 aligned_query = query[i] + aligned_query;
1025 aligned_reference =
"_" + aligned_reference;
1028 else if (tb_mat[i][j] ==
"L ")
1030 aligned_query =
"_" + aligned_query;
1031 aligned_reference = reference[j] + aligned_reference;
1034 else if (tb_mat[i][j] ==
"LE")
1036 aligned_query =
"_" + aligned_query;
1037 aligned_reference = reference[j] + aligned_reference;
1040 else if (tb_mat[i][j] ==
"*")
1048 cout <<
"ERROR: Invalid traceback matrix value" << endl;
1056 aligned_query = query[i] + aligned_query;
1057 aligned_reference =
"_" + aligned_reference;
1062 aligned_query =
"_" + aligned_query;
1063 aligned_reference = reference[j] + aligned_reference;
1067 alignments[
"query"] = aligned_query;
1068 alignments[
"reference"] = aligned_reference;
1074 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
1076 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
1077 array<array<char, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
1078 map<string, string> &alignments)
1083 array<float, SOL_MAX_QUERY_LENGTH> initial_col;
1084 array<float, SOL_MAX_REFERENCE_LENGTH> initial_row;
1086 float upper_left_value = 0;
1088 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1091 initial_col[i] = upper_left_value;
1095 upper_left_value = 0;
1096 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1098 upper_left_value += penalties.linear_gap;
1099 initial_row[j] = upper_left_value;
1103 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1105 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1107 score_mat[0][i][j] = 0;
1112 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1114 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1121 for (
int i = 0; i < query.length(); i++)
1123 int scr_diag, scr_up, scr_left;
1124 for (
int j = 0; j < reference.length(); j++)
1126 if (i == 0 && j == 0)
1129 scr_up = initial_row[j];
1130 scr_left = initial_col[i];
1132 else if (i == 0 && j > 0)
1134 scr_diag = initial_row[j - 1];
1135 scr_up = initial_row[j];
1136 scr_left = score_mat[0][i][j - 1];
1138 else if (i > 0 && j == 0)
1140 scr_diag = initial_col[i - 1];
1141 scr_up = score_mat[0][i - 1][j];
1142 scr_left = initial_col[i];
1146 scr_diag = score_mat[0][i - 1][j - 1];
1147 scr_up = score_mat[0][i - 1][j];
1148 scr_left = score_mat[0][i][j - 1];
1151 float m_score = scr_diag + (query[i] == reference[j] ? penalties.match : penalties.mismatch);
1152 float d_score = scr_up + penalties.linear_gap;
1153 float i_score = scr_left + penalties.linear_gap;
1155 float max_score = max(m_score, max(d_score, i_score));
1156 score_mat[0][i][j] = max_score;
1159 if (max_score == m_score)
1163 else if (max_score == d_score)
1176 std::pair<int, int> maxPos;
1179 maxVal = score_mat[0][SOL_MAX_QUERY_LENGTH - 1][SOL_MAX_REFERENCE_LENGTH - 1];
1180 maxPos = {SOL_MAX_QUERY_LENGTH - 1, SOL_MAX_REFERENCE_LENGTH - 1};
1181 for (
int j = SOL_MAX_QUERY_LENGTH - 1; j >= 0; j--)
1183 if (score_mat[0][j][SOL_MAX_REFERENCE_LENGTH - 1] > maxVal)
1185 maxVal = score_mat[0][j][SOL_MAX_REFERENCE_LENGTH - 1];
1186 maxPos = {j, SOL_MAX_REFERENCE_LENGTH - 1};
1189 int i = maxPos.first;
1190 int j = maxPos.second;
1191 string aligned_query =
"";
1192 string aligned_reference =
"";
1194 while (i >= 0 && j >= 0)
1196 if (tb_mat[i][j] ==
'D')
1198 aligned_query = query[i] + aligned_query;
1199 aligned_reference = reference[j] + aligned_reference;
1203 else if (tb_mat[i][j] ==
'U')
1205 aligned_query = query[i] + aligned_query;
1206 aligned_reference =
"_" + aligned_reference;
1209 else if (tb_mat[i][j] ==
'L')
1211 aligned_query =
"_" + aligned_query;
1212 aligned_reference = reference[j] + aligned_reference;
1217 cout <<
"ERROR: Invalid traceback matrix value" << endl;
1225 aligned_query = query[i] + aligned_query;
1226 aligned_reference =
"_" + aligned_reference;
1231 aligned_query =
"_" + aligned_query;
1232 aligned_reference = reference[j] + aligned_reference;
1236 alignments[
"query"] = aligned_query;
1237 alignments[
"reference"] = aligned_reference;
1243 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
1245 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
1246 array<array<char, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
1247 map<string, string> &alignments)
1252 array<float, SOL_MAX_QUERY_LENGTH> initial_col;
1253 array<float, SOL_MAX_REFERENCE_LENGTH> initial_row;
1255 float upper_left_value = 0;
1257 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1259 upper_left_value += penalties.linear_gap;
1260 initial_col[i] = upper_left_value;
1264 upper_left_value = 0;
1265 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1267 initial_row[j] = upper_left_value;
1271 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1273 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1275 score_mat[0][i][j] = 0;
1280 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1282 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1289 for (
int i = 0; i < query.length(); i++)
1291 int scr_diag, scr_up, scr_left;
1292 for (
int j = 0; j < reference.length(); j++)
1294 if (i == 0 && j == 0)
1297 scr_up = initial_row[j];
1298 scr_left = initial_col[i];
1300 else if (i == 0 && j > 0)
1302 scr_diag = initial_row[j - 1];
1303 scr_up = initial_row[j];
1304 scr_left = score_mat[0][i][j - 1];
1306 else if (i > 0 && j == 0)
1308 scr_diag = initial_col[i - 1];
1309 scr_up = score_mat[0][i - 1][j];
1310 scr_left = initial_col[i];
1314 scr_diag = score_mat[0][i - 1][j - 1];
1315 scr_up = score_mat[0][i - 1][j];
1316 scr_left = score_mat[0][i][j - 1];
1319 float m_score = scr_diag + (query[i] == reference[j] ? penalties.match : penalties.mismatch);
1320 float d_score = scr_up + penalties.linear_gap;
1321 float i_score = scr_left + penalties.linear_gap;
1323 float max_score = max(m_score, max(d_score, i_score));
1324 score_mat[0][i][j] = max_score;
1327 if (max_score == m_score)
1331 else if (max_score == d_score)
1343 float maxVal = score_mat[0][query.size() - 1][0];
1344 std::pair<int, int> maxPos = {query.size() - 1, 0};
1347 for (
int i = 0; i < reference.size() - 1; i++)
1349 if (score_mat[0][query.size() - 1][i] > maxVal)
1351 maxVal = score_mat[0][query.size() - 1][i];
1352 maxPos = {query.size() - 1, i};
1356 string aligned_query =
"";
1357 string aligned_reference =
"";
1359 int i = maxPos.first;
1360 int j = maxPos.second;
1363 while (i >= 0 && j >= 0)
1365 if (tb_mat[i][j] ==
'D')
1367 aligned_query = query[i] + aligned_query;
1368 aligned_reference = reference[j] + aligned_reference;
1372 else if (tb_mat[i][j] ==
'U')
1374 aligned_query = query[i] + aligned_query;
1375 aligned_reference =
"_" + aligned_reference;
1378 else if (tb_mat[i][j] ==
'L')
1380 aligned_query =
"_" + aligned_query;
1381 aligned_reference = reference[j] + aligned_reference;
1386 cout <<
"ERROR: Invalid traceback matrix value" << tb_mat[i][j] << endl;
1394 aligned_query = query[i] + aligned_query;
1395 aligned_reference =
"_" + aligned_reference;
1400 aligned_query =
"_" + aligned_query;
1401 aligned_reference = reference[j] + aligned_reference;
1405 alignments[
"query"] = aligned_query;
1406 alignments[
"reference"] = aligned_reference;
1412 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
1414 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
1415 array<array<char, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
1416 map<string, string> &alignments)
1423 array<float, SOL_MAX_QUERY_LENGTH> initial_col;
1424 array<float, SOL_MAX_REFERENCE_LENGTH> initial_row;
1426 float upper_left_value = 0;
1428 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1431 initial_col[i] = upper_left_value;
1434 upper_left_value = 0;
1435 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1437 upper_left_value += penalties.linear_gap;
1438 initial_row[j] = upper_left_value;
1441 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1443 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1445 score_mat[0][i][j] = 0;
1450 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1452 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1459 for (
int i = 0; i < query.length(); i++)
1461 int scr_diag, scr_up, scr_left;
1462 for (
int j = 0; j < reference.length(); j++)
1464 if (i == 0 && j == 0)
1467 scr_up = initial_row[j];
1468 scr_left = initial_col[i];
1470 else if (i == 0 && j > 0)
1472 scr_diag = initial_row[j - 1];
1473 scr_up = initial_row[j];
1474 scr_left = score_mat[0][i][j - 1];
1476 else if (i > 0 && j == 0)
1478 scr_diag = initial_col[i - 1];
1479 scr_up = score_mat[0][i - 1][j];
1480 scr_left = initial_col[i];
1484 scr_diag = score_mat[0][i - 1][j - 1];
1485 scr_up = score_mat[0][i - 1][j];
1486 scr_left = score_mat[0][i][j - 1];
1489 float m_score = scr_diag + (query[i] == reference[j] ? penalties.match : penalties.mismatch);
1490 float d_score = scr_up + penalties.linear_gap;
1491 float i_score = scr_left + penalties.linear_gap;
1493 float max_score = max(m_score, max(d_score, i_score));
1494 score_mat[0][i][j] = max_score;
1497 if (max_score == m_score)
1501 else if (max_score == d_score)
1514 float maxVal = score_mat[0][SOL_MAX_QUERY_LENGTH - 1][0];
1515 std::pair<int, int> maxPos = {SOL_MAX_QUERY_LENGTH - 1, 0};
1518 for (
int i = 0; i < SOL_MAX_REFERENCE_LENGTH; i++)
1520 if (score_mat[0][SOL_MAX_QUERY_LENGTH - 1][i] > maxVal)
1522 maxVal = score_mat[0][SOL_MAX_QUERY_LENGTH - 1][i];
1523 maxPos = {SOL_MAX_QUERY_LENGTH - 1, i};
1526 int i = maxPos.first;
1527 int j = maxPos.second;
1528 string aligned_query =
"";
1529 string aligned_reference =
"";
1531 while (i >= 0 && j >= 0)
1533 if (tb_mat[i][j] ==
'D')
1535 aligned_query = query[i] + aligned_query;
1536 aligned_reference = reference[j] + aligned_reference;
1540 else if (tb_mat[i][j] ==
'U')
1542 aligned_query = query[i] + aligned_query;
1543 aligned_reference =
"_" + aligned_reference;
1546 else if (tb_mat[i][j] ==
'L')
1548 aligned_query =
"_" + aligned_query;
1549 aligned_reference = reference[j] + aligned_reference;
1554 cout <<
"ERROR: Invalid traceback matrix value" << endl;
1562 aligned_query = query[i] + aligned_query;
1563 aligned_reference =
"_" + aligned_reference;
1568 aligned_query =
"_" + aligned_query;
1569 aligned_reference = reference[j] + aligned_reference;
1573 alignments[
"query"] = aligned_query;
1574 alignments[
"reference"] = aligned_reference;
1580 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
1582 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
1583 array<array<char, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
1584 map<string, string> &alignments)
1588 array<float, SOL_MAX_QUERY_LENGTH> initial_col;
1589 array<float, SOL_MAX_REFERENCE_LENGTH> initial_row;
1591 float upper_left_value = 0;
1593 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1595 upper_left_value += penalties.linear_gap;
1596 initial_col[i] = upper_left_value;
1599 upper_left_value = 0;
1600 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1603 initial_row[j] = upper_left_value;
1606 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1608 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1610 score_mat[0][i][j] = 0;
1615 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1617 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1624 for (
int i = 0; i < query.length(); i++)
1626 int scr_diag, scr_up, scr_left;
1627 for (
int j = 0; j < reference.length(); j++)
1629 if (i == 0 && j == 0)
1632 scr_up = initial_row[j];
1633 scr_left = initial_col[i];
1635 else if (i == 0 && j > 0)
1637 scr_diag = initial_row[j - 1];
1638 scr_up = initial_row[j];
1639 scr_left = score_mat[0][i][j - 1];
1641 else if (i > 0 && j == 0)
1643 scr_diag = initial_col[i - 1];
1644 scr_up = score_mat[0][i - 1][j];
1645 scr_left = initial_col[i];
1649 scr_diag = score_mat[0][i - 1][j - 1];
1650 scr_up = score_mat[0][i - 1][j];
1651 scr_left = score_mat[0][i][j - 1];
1654 float m_score = scr_diag + (query[i] == reference[j] ? penalties.match : penalties.mismatch);
1655 float d_score = scr_up + penalties.linear_gap;
1656 float i_score = scr_left + penalties.linear_gap;
1658 float max_score = max(m_score, max(d_score, i_score));
1659 score_mat[0][i][j] = max_score;
1662 if (max_score == m_score)
1666 else if (max_score == d_score)
1679 float maxVal = score_mat[0][0][reference.length() - 1];
1680 std::pair<int, int> maxPos = {query.length() - 1, reference.length() - 1};
1683 for (
int i = 0; i < query.length(); i++)
1685 if (score_mat[0][i][reference.length() - 1] > maxVal)
1687 maxVal = score_mat[0][i][reference.length() - 1];
1688 maxPos = {i, reference.length() - 1};
1691 int i = maxPos.first;
1692 int j = maxPos.second;
1693 cout <<
"i is " << i << endl;
1694 cout <<
"j is " << j << endl;
1695 string aligned_query =
"";
1696 string aligned_reference =
"";
1698 while (i >= 0 && j >= 0)
1700 if (tb_mat[i][j] ==
'D')
1702 aligned_query = query[i] + aligned_query;
1703 aligned_reference = reference[j] + aligned_reference;
1707 else if (tb_mat[i][j] ==
'U')
1709 aligned_query = query[i] + aligned_query;
1710 aligned_reference =
"_" + aligned_reference;
1713 else if (tb_mat[i][j] ==
'L')
1715 aligned_query =
"_" + aligned_query;
1716 aligned_reference = reference[j] + aligned_reference;
1721 cout <<
"ERROR: Invalid traceback matrix value" << endl;
1729 aligned_query = query[i] + aligned_query;
1730 aligned_reference =
"_" + aligned_reference;
1735 aligned_query =
"_" + aligned_query;
1736 aligned_reference = reference[j] + aligned_reference;
1740 alignments[
"query"] = aligned_query;
1741 alignments[
"reference"] = aligned_reference;
1744 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
1746 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
1747 array<array<string, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
1748 map<string, string> &alignments)
1750 const int N_LAYERS_GA = 5;
1759 array<array<float, N_LAYERS_GA>, SOL_MAX_QUERY_LENGTH> initial_col;
1760 array<array<float, N_LAYERS_GA>, SOL_MAX_REFERENCE_LENGTH> initial_row;
1762 float maximum_score = -std::numeric_limits<float>::infinity();
1767 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1769 initial_col[i][0] = -std::numeric_limits<float>::infinity();
1770 initial_col[i][1] = 0;
1771 initial_col[i][2] = -std::numeric_limits<float>::infinity();
1772 initial_col[i][3] = -std::numeric_limits<float>::infinity();
1773 initial_col[i][4] = -std::numeric_limits<float>::infinity();
1776 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1778 initial_row[j][0] = -std::numeric_limits<float>::infinity();
1779 initial_row[j][1] = 0;
1780 initial_row[j][2] = -std::numeric_limits<float>::infinity();
1781 initial_row[j][3] = -std::numeric_limits<float>::infinity();
1782 initial_row[j][4] = -std::numeric_limits<float>::infinity();
1786 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1788 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1790 for (
int k = 0; k < N_LAYERS_GA; k++)
1792 score_mat[k][i][j] = 0;
1798 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
1800 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
1807 for (
int i = 0; i < query.length(); i++)
1809 float del_scr, ins_scr, long_del_scr, long_ins_scr;
1810 float scr_diag, scr_up, scr_left;
1811 for (
int j = 0; j < reference.length(); j++)
1813 if (i == 0 && j == 0)
1816 scr_up = initial_row[j][1];
1817 scr_left = initial_col[i][1];
1819 ins_scr = initial_col[i][0];
1820 del_scr = initial_row[j][2];
1821 long_ins_scr = initial_col[i][3];
1822 long_del_scr = initial_row[j][4];
1824 else if (i == 0 && j > 0)
1826 scr_diag = initial_row[j - 1][1];
1827 scr_up = initial_row[j][1];
1828 scr_left = score_mat[1][i][j - 1];
1830 ins_scr = score_mat[0][i][j - 1];
1831 del_scr = initial_row[j][2];
1832 long_ins_scr = score_mat[3][i][j - 1];
1833 long_del_scr = initial_row[j][4];
1835 else if (i > 0 && j == 0)
1837 scr_diag = initial_col[i - 1][1];
1838 scr_up = score_mat[1][i - 1][j];
1839 scr_left = initial_col[i][1];
1841 ins_scr = initial_col[i][0];
1842 del_scr = score_mat[2][i - 1][j];
1843 long_ins_scr = initial_col[i][3];
1844 long_del_scr = score_mat[4][i - 1][j];
1848 scr_diag = score_mat[1][i - 1][j - 1];
1849 scr_up = score_mat[1][i - 1][j];
1850 scr_left = score_mat[1][i][j - 1];
1852 ins_scr = score_mat[0][i][j - 1];
1853 del_scr = score_mat[2][i - 1][j];
1854 long_ins_scr = score_mat[3][i][j - 1];
1855 long_del_scr = score_mat[4][i - 1][j];
1858 float insertion_open_score = scr_left + penalties.open + penalties.extend;
1859 float insertion_extend_score = ins_scr + penalties.extend;
1861 float deletion_open_score = scr_up + penalties.open + penalties.extend;
1862 float deletion_extend_score = del_scr + penalties.extend;
1865 float long_insertion_open_score = scr_left + penalties.long_open + penalties.long_extend;
1866 float long_insertion_extend_score = long_ins_scr + penalties.long_extend;
1868 float long_deletion_open_score = scr_up + penalties.long_open + penalties.long_extend;
1869 float long_deletion_extend_score = long_del_scr + penalties.long_extend;
1871 float mm_score = scr_diag + (query[i] == reference[j] ? penalties.match : penalties.mismatch);
1873 float insertion_score = max(insertion_open_score, insertion_extend_score);
1874 float deletion_score = max(deletion_open_score, deletion_extend_score);
1876 float long_insertion_score = max(long_insertion_open_score, long_insertion_extend_score);
1877 float long_deletion_score = max(long_deletion_open_score, long_deletion_extend_score);
1879 float final_score = max(mm_score, max(max(insertion_score, deletion_score), max(long_insertion_score, long_deletion_score)));
1881 if (final_score > maximum_score)
1883 maximum_score = final_score;
1888 score_mat[0][i][j] = insertion_score;
1889 score_mat[1][i][j] = mm_score;
1890 score_mat[2][i][j] = deletion_score;
1891 score_mat[3][i][j] = long_insertion_score;
1892 score_mat[4][i][j] = long_deletion_score;
1926 string aligned_query =
"";
1927 string aligned_reference =
"";
1928 int matrix_type = 1;
1929 while (i > 0 && j > 0)
1931 switch (matrix_type)
1935 aligned_query =
"_" + aligned_query;
1936 aligned_reference = reference[j] + aligned_reference;
1937 if (score_mat[0][i][j] != score_mat[0][i][j - 1] + penalties.extend)
1945 if (score_mat[1][i][j] == score_mat[1][i - 1][j - 1] + penalties.mismatch)
1947 aligned_query = query[i] + aligned_query;
1948 aligned_reference = reference[j] + aligned_reference;
1952 else if (score_mat[1][i][j] == score_mat[4][i][j])
1954 aligned_query = query[i] + aligned_query;
1955 aligned_reference =
"_" + aligned_reference;
1959 else if (score_mat[1][i][j] == score_mat[2][i][j])
1961 aligned_query = query[i] + aligned_query;
1962 aligned_reference =
"_" + aligned_reference;
1966 else if (score_mat[1][i][j] == score_mat[3][i][j])
1968 aligned_query =
"_" + aligned_query;
1969 aligned_reference = reference[j] + aligned_reference;
1973 else if (score_mat[1][i][j] == score_mat[0][i][j])
1975 aligned_query =
"_" + aligned_query;
1976 aligned_reference = reference[j] + aligned_reference;
1980 else if (score_mat[1][i][j] == score_mat[1][i - 1][j - 1] + penalties.match)
1982 aligned_query = query[i] + aligned_query;
1983 aligned_reference = reference[j] + aligned_reference;
1989 cout <<
"ERROR: invalid traceback value" << endl;
1995 aligned_query = query[i] + aligned_query;
1996 aligned_reference =
"_" + aligned_reference;
1997 if (score_mat[2][i][j] != score_mat[2][i - 1][j] + penalties.extend)
2005 aligned_query =
"_" + aligned_query;
2006 aligned_reference = reference[j] + aligned_reference;
2007 if (score_mat[3][i][j] != score_mat[3][i][j - 1])
2015 aligned_query = query[i] + aligned_query;
2016 aligned_reference =
"_" + aligned_reference;
2017 if (score_mat[4][i][j] != score_mat[4][i - 1][j] + penalties.long_extend)
2065 aligned_query = query[i] + aligned_query;
2066 aligned_reference =
"_" + aligned_reference;
2071 aligned_query =
"_" + aligned_query;
2072 aligned_reference = reference[j] + aligned_reference;
2076 alignments[
"query"] = aligned_query;
2077 alignments[
"reference"] = aligned_reference;
2080 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
2081 void global_dtw_solution(std::vector<std::complex<float>> query, std::vector<std::complex<float>> reference, PENALTY_T &penalties,
2082 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
2083 array<array<string, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
2084 map<string, string> &alignments)
2091 array<array<float, SOL_N_LAYERS>, SOL_MAX_QUERY_LENGTH> initial_col;
2092 array<array<float, SOL_N_LAYERS>, SOL_MAX_REFERENCE_LENGTH> initial_row;
2094 score_mat[0][0][0] = 0;
2096 string alignment_str =
"";
2098 float linear_gp = 0;
2101 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
2104 initial_col[i][0] = std::numeric_limits<float>::infinity();
2107 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
2110 initial_row[j][0] = std::numeric_limits<float>::infinity();;
2114 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
2116 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
2118 for (
int k = 0; k < SOL_N_LAYERS; k++)
2120 score_mat[k][i][j] = 0;
2126 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
2128 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
2135 for (
int i = 0; i < query.size(); i++)
2137 float scr_diag, scr_up, scr_left;
2138 for (
int j = 0; j < reference.size(); j++)
2140 if (i == 0 && j == 0)
2143 scr_up = initial_row[j][0];
2144 scr_left = initial_col[i][0];
2146 else if (i == 0 && j > 0)
2148 scr_diag = initial_row[j - 1][0];
2149 scr_up = initial_row[j][0];
2150 scr_left = score_mat[0][i][j - 1];
2152 else if (i > 0 && j == 0)
2154 scr_diag = initial_col[i - 1][0];
2155 scr_up = score_mat[0][i - 1][j];
2156 scr_left = initial_col[i][0];
2160 scr_diag = score_mat[0][i - 1][j - 1];
2161 scr_up = score_mat[0][i - 1][j];
2162 scr_left = score_mat[0][i][j - 1];
2166 auto c2 = reference[j];
2167 float r1 = c1.real();
2168 float i1 = c1.imag();
2169 float r2 = c2.real();
2170 float i2 = c2.imag();
2171 float dist_img = (i1 - i2) * (i1 - i2);
2172 float dist_real = (r1 - r2) * (r1 - r2);
2173 float dist = dist_img + dist_real;
2176 float min_score = scr_up;
2177 tb_mat[i][j] =
"U ";
2178 if (scr_diag < min_score)
2180 tb_mat[i][j] =
"D ";
2181 min_score = scr_diag;
2183 if (scr_left < min_score)
2185 tb_mat[i][j] =
"L ";
2186 min_score = scr_left;
2188 score_mat[0][i][j] = dist + min_score;
2193 int i = query.size() - 1;
2194 int j = reference.size() - 1;
2198 while (i >= 0 && j >= 0)
2200 if (tb_mat[i][j] ==
"D ")
2204 alignment_str =
"D " + alignment_str;
2208 else if (tb_mat[i][j] ==
"U ")
2212 alignment_str =
"U " + alignment_str;
2215 else if (tb_mat[i][j] ==
"L ")
2219 alignment_str =
"L " + alignment_str;
2222 else if (tb_mat[i][j] ==
"*")
2224 alignment_str =
"* " + alignment_str;
2231 cout <<
"ERROR: Invalid traceback matrix value" << endl;
2252 alignments[
"traceback_pointers"] = alignment_str;
2255 template <
typename PENALTY_T,
int SOL_MAX_QUERY_LENGTH,
int SOL_MAX_REFERENCE_LENGTH,
int SOL_N_LAYERS>
2257 array<array<array<float, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH>, SOL_N_LAYERS> &score_mat,
2258 array<array<string, SOL_MAX_REFERENCE_LENGTH>, SOL_MAX_QUERY_LENGTH> &tb_mat,
2259 map<string, string> &alignments)
2261 const int N_LAYERS_GA = 5;
2270 array<array<float, N_LAYERS_GA>, SOL_MAX_QUERY_LENGTH> initial_col;
2271 array<array<float, N_LAYERS_GA>, SOL_MAX_REFERENCE_LENGTH> initial_row;
2286 float short_pen = penalties.open;
2287 float long_pen = penalties.long_open;
2288 for (
int j = 0; j < SOL_MAX_QUERY_LENGTH; j++)
2290 short_pen += penalties.extend;
2291 long_pen += penalties.long_extend;
2292 initial_col[j][0] = -std::numeric_limits<float>::infinity();
2293 initial_col[j][2] = -std::numeric_limits<float>::infinity();
2294 initial_col[j][3] = -std::numeric_limits<float>::infinity();
2295 initial_col[j][4] = -std::numeric_limits<float>::infinity();
2296 initial_col[j][1] = short_pen > long_pen ? short_pen : long_pen;
2298 short_pen = penalties.open;
2299 long_pen = penalties.long_open;
2300 for (
int i = 0; i < SOL_MAX_REFERENCE_LENGTH; i++)
2302 short_pen += penalties.extend;
2303 long_pen += penalties.long_extend;
2304 initial_row[i][0] = -std::numeric_limits<float>::infinity();
2305 initial_row[i][2] = -std::numeric_limits<float>::infinity();
2306 initial_row[i][3] = -std::numeric_limits<float>::infinity();
2307 initial_row[i][4] = -std::numeric_limits<float>::infinity();
2308 initial_row[i][1] = long_pen > short_pen ? long_pen : short_pen;
2312 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
2314 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
2316 for (
int k = 0; k < N_LAYERS_GA; k++)
2318 score_mat[k][i][j] = 0;
2324 for (
int i = 0; i < SOL_MAX_QUERY_LENGTH; i++)
2326 for (
int j = 0; j < SOL_MAX_REFERENCE_LENGTH; j++)
2333 for (
int i = 0; i < query.length(); i++)
2335 float del_scr, ins_scr, long_del_scr, long_ins_scr;
2336 float scr_diag, scr_up, scr_left;
2337 for (
int j = 0; j < reference.length(); j++)
2339 if (i == 0 && j == 0)
2342 scr_up = initial_row[j][1];
2343 scr_left = initial_col[i][1];
2345 ins_scr = initial_col[i][0];
2346 del_scr = initial_row[j][2];
2347 long_ins_scr = initial_col[i][3];
2348 long_del_scr = initial_row[j][4];
2350 else if (i == 0 && j > 0)
2352 scr_diag = initial_row[j - 1][1];
2353 scr_up = initial_row[j][1];
2354 scr_left = score_mat[1][i][j - 1];
2356 ins_scr = score_mat[0][i][j - 1];
2357 del_scr = initial_row[j][2];
2358 long_ins_scr = score_mat[3][i][j - 1];
2359 long_del_scr = initial_row[j][4];
2361 else if (i > 0 && j == 0)
2363 scr_diag = initial_col[i - 1][1];
2364 scr_up = score_mat[1][i - 1][j];
2365 scr_left = initial_col[i][1];
2367 ins_scr = initial_col[i][0];
2368 del_scr = score_mat[2][i - 1][j];
2369 long_ins_scr = initial_col[i][3];
2370 long_del_scr = score_mat[4][i - 1][j];
2374 scr_diag = score_mat[1][i - 1][j - 1];
2375 scr_up = score_mat[1][i - 1][j];
2376 scr_left = score_mat[1][i][j - 1];
2378 ins_scr = score_mat[0][i][j - 1];
2379 del_scr = score_mat[2][i - 1][j];
2380 long_ins_scr = score_mat[3][i][j - 1];
2381 long_del_scr = score_mat[4][i - 1][j];
2384 float insertion_open_score = scr_left + penalties.open + penalties.extend;
2385 float insertion_extend_score = ins_scr + penalties.extend;
2387 float deletion_open_score = scr_up + penalties.open + penalties.extend;
2388 float deletion_extend_score = del_scr + penalties.extend;
2391 float long_insertion_open_score = scr_left + penalties.long_open + penalties.long_extend;
2392 float long_insertion_extend_score = long_ins_scr + penalties.long_extend;
2394 float long_deletion_open_score = scr_up + penalties.long_open + penalties.long_extend;
2395 float long_deletion_extend_score = long_del_scr + penalties.long_extend;
2397 float mm_score = scr_diag + (query[i] == reference[j] ? penalties.match : penalties.mismatch);
2399 float insertion_score = max(insertion_open_score, insertion_extend_score);
2400 float deletion_score = max(deletion_open_score, deletion_extend_score);
2402 float long_insertion_score = long_insertion_open_score > long_insertion_extend_score ? long_insertion_open_score : long_insertion_extend_score;
2403 float long_deletion_score = long_deletion_open_score > long_deletion_extend_score ? long_deletion_open_score : long_deletion_extend_score;
2405 float final_score = mm_score;
2406 final_score = final_score > insertion_score ? final_score : insertion_score;
2407 final_score = final_score > deletion_score ? final_score : deletion_score;
2408 final_score = final_score > long_insertion_score ? final_score : long_insertion_score;
2409 final_score = final_score > long_deletion_score ? final_score : long_deletion_score;
2411 score_mat[0][i][j] = insertion_score;
2412 score_mat[1][i][j] = final_score;
2413 score_mat[2][i][j] = deletion_score;
2414 score_mat[3][i][j] = long_insertion_score;
2415 score_mat[4][i][j] = long_deletion_score;
2447 int i = query.length() - 1;
2448 int j = reference.length() - 1;
2449 string aligned_query =
"";
2450 string aligned_reference =
"";
2451 int matrix_type = 1;
2452 while (i > 0 && j > 0)
2454 switch (matrix_type)
2457 if (score_mat[1][i][j] == score_mat[1][i - 1][j - 1] + penalties.match)
2459 aligned_query = query[i] + aligned_query;
2460 aligned_reference = reference[j] + aligned_reference;
2464 else if (score_mat[1][i][j] == score_mat[3][i][j])
2466 aligned_query =
"_" + aligned_query;
2467 aligned_reference = reference[j] + aligned_reference;
2471 else if (score_mat[1][i][j] == score_mat[4][i][j])
2473 aligned_query = query[i] + aligned_query;
2474 aligned_reference =
"_" + aligned_reference;
2478 else if (score_mat[1][i][j] == score_mat[0][i][j])
2480 aligned_query =
"_" + aligned_query;
2481 aligned_reference = reference[j] + aligned_reference;
2485 else if (score_mat[1][i][j] == score_mat[2][i][j])
2487 aligned_query = query[i] + aligned_query;
2488 aligned_reference =
"_" + aligned_reference;
2492 else if (score_mat[1][i][j] == score_mat[1][i - 1][j - 1] + penalties.mismatch)
2494 aligned_query = query[i] + aligned_query;
2495 aligned_reference = reference[j] + aligned_reference;
2501 cout <<
"ERROR: invalid traceback value" << endl;
2506 aligned_query =
"_" + aligned_query;
2507 aligned_reference = reference[j] + aligned_reference;
2508 if (score_mat[3][i][j] != score_mat[3][i][j - 1])
2516 aligned_query = query[i] + aligned_query;
2517 aligned_reference =
"_" + aligned_reference;
2518 if (score_mat[4][i][j] != score_mat[4][i - 1][j] + penalties.long_extend)
2525 aligned_query =
"_" + aligned_query;
2526 aligned_reference = reference[j] + aligned_reference;
2527 if (score_mat[0][i][j] != score_mat[0][i][j - 1] + penalties.extend)
2535 aligned_query = query[i] + aligned_query;
2536 aligned_reference =
"_" + aligned_reference;
2537 if (score_mat[2][i][j] != score_mat[2][i - 1][j] + penalties.extend)
2585 aligned_query = query[i] + aligned_query;
2586 aligned_reference =
"_" + aligned_reference;
2591 aligned_query =
"_" + aligned_query;
2592 aligned_reference = reference[j] + aligned_reference;
2596 alignments[
"query"] = aligned_query;
2597 alignments[
"reference"] = aligned_reference;
2600 template <
typename T,
int M,
int N>
2601 void print_matrix(array<array<T, N>, M> &mat,
string name, std::set<std::tuple<int, int, int>> incorrect_coordinates,
int layer_k)
2604 cout << name << endl;
2605 for (
int i = 0; i < M; i++)
2607 for (
int j = 0; j < N; j++)
2609 std::tuple<int, int, int> search_tuple = std::make_tuple(layer_k, i, j);
2610 bool wrong_score = incorrect_coordinates.find(search_tuple) != incorrect_coordinates.end();
2611 if (wrong_score) std::cout <<
"\033[31m";
2613 cout << std::right << std::setw(width) << mat[i][j] <<
" ";
2615 if (wrong_score) std::cout <<
"\033[0m";
2621 template <
typename T,
int M,
int N>
2625 file << name << endl;
2626 for (
int i = 0; i < M; i++)
2628 for (
int j = 0; j < N; j++)
2630 file << std::right << std::setw(width) << mat[i][j] <<
" ";
2636 template <
typename T,
int M,
int N>
2637 void fprint_matrix(ofstream &file, array<array<T, N>, M> &mat,
string query,
string reference,
string name)
2640 file << name << endl;
2641 file << std::right << std::setw(width) <<
" ";
2642 file << std::right << std::setw(width) <<
" ";
2644 for (
int j = 0; j < N; j++)
2646 file <<
" " << std::right << std::setw(width) << j;
2649 file << std::right << std::setw(width) <<
" ";
2650 file << std::right << std::setw(width) <<
" ";
2651 for (
int j = 0; j < N; j++)
2653 file <<
" " << std::right << std::setw(width) << (j < reference.length() ? reference[j] :
' ');
2656 for (
int i = 0; i < M; i++)
2658 file << std::right << std::setw(width) << i <<
" ";
2659 file << std::right << std::setw(width) << (i < query.length() ? query[i] :
' ') <<
" ";
2660 for (
int j = 0; j < N; j++)
2662 file << std::right << std::setw(width) << mat[i][j] <<
" ";
2668 template <
typename T,
int N>
2671 cout << name << endl;
2672 for (
int i = 0; i < N; i++)
2674 cout << vec[i] <<
" ";
void profile_alignment_solution(std::vector< std::array< int, 5 >> query, std::vector< std::array< int, 5 >> reference, PENALTY_T &penalties, array< array< array< float, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH >, SOL_N_LAYERS > &score_mat, array< array< char, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH > &tb_mat, std::vector< char > &alignments)
Definition: solutions.h:38
void local_affine_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< float, 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)
Definition: solutions.h:850
void global_affine_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< float, 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)
Definition: solutions.h:475
float score_mult(const std::array< int, ALPHABET_SIZE > &query, const std::array< int, ALPHABET_SIZE > &reference, const std::array< std::array< float, ALPHABET_SIZE >, ALPHABET_SIZE > &A)
Definition: solutions.h:21
void global_two_piece_affine_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< float, 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)
Definition: solutions.h:2256
void overlap_linear_prefix_suffix_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< float, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH >, SOL_N_LAYERS > &score_mat, array< array< char, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH > &tb_mat, map< string, string > &alignments)
Definition: solutions.h:1413
void semi_global_linear_short_long_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< float, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH >, SOL_N_LAYERS > &score_mat, array< array< char, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH > &tb_mat, map< string, string > &alignments)
Definition: solutions.h:1244
void semi_global_linear_long_short_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< float, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH >, SOL_N_LAYERS > &score_mat, array< array< char, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH > &tb_mat, map< string, string > &alignments)
Definition: solutions.h:1075
void print_vector(array< T, N > &vec, string name)
Definition: solutions.h:2669
void local_linear_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< float, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH >, SOL_N_LAYERS > &score_mat, array< array< char, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH > &tb_mat, map< string, string > &alignments)
Definition: solutions.h:675
void fprint_matrix(ofstream &file, array< array< T, N >, M > &mat, string name)
Definition: solutions.h:2622
void global_dtw_solution(std::vector< std::complex< float >> query, std::vector< std::complex< float >> reference, PENALTY_T &penalties, array< array< array< float, 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)
Definition: solutions.h:2081
void local_two_piece_affine_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< float, 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)
Definition: solutions.h:1745
void fixed_banding_global_linear_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< float, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH >, SOL_N_LAYERS > &score_mat, array< array< char, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH > &tb_mat, map< string, string > &alignments)
Definition: solutions.h:294
void overlap_linear_suffix_prefix_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< float, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH >, SOL_N_LAYERS > &score_mat, array< array< char, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH > &tb_mat, map< string, string > &alignments)
Definition: solutions.h:1581
void global_linear_solution(std::string query, std::string reference, PENALTY_T &penalties, array< array< array< float, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH >, SOL_N_LAYERS > &score_mat, array< array< char, SOL_MAX_REFERENCE_LENGTH >, SOL_MAX_QUERY_LENGTH > &tb_mat, map< string, string > &alignments)
Definition: solutions.h:139
void print_matrix(array< array< T, N >, M > &mat, string name, std::set< std::tuple< int, int, int >> incorrect_coordinates, int layer_k)
Definition: solutions.h:2601