-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsmith-waterman.c
86 lines (60 loc) · 1.24 KB
/
smith-waterman.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <string.h>
#include <stdlib.h>
#define SCORE 4
#define GAP 3
static inline int substitute(char a, char b) {
if(a == b) {
return(SCORE);
} else {
return (-SCORE);
}
}
unsigned int score(char* A, char* B, size_t len_a, size_t len_b, int* work) {
int i,j,k;
int free_matrix = 0;
size_t rank_a = len_a+1;
size_t rank_b = len_b+1;
int* matrix;
if (work == NULL) {
matrix = (int*)malloc(sizeof(int)*(rank_a)*(rank_b));
free_matrix = 1;
} else {
matrix = work;
}
int comp[3];
int max;
int max_max = 0;
int optimum;
if (len_a > len_b) {
optimum = len_a*SCORE;
} else {
optimum = len_b*SCORE;
}
for(i=0;i<rank_a;i++) {
matrix[i] = 0;
}
for(j=0;j<rank_b;j++) {
matrix[j*rank_a] = 0;
}
for(j=1;j<rank_b;j++) {
for(i=1;i<rank_a;i++) {
comp[0] = matrix[(j-1)*rank_a+(i-1)]+substitute(A[i],B[j]);
comp[1] = matrix[j*rank_a+(i-1)]-GAP;
comp[2] = matrix[(j-1)*rank_a+i]-GAP;
max = 0;
for(k=0;k<3;k++) {
if (max < comp[k]) {
max = comp[k];
}
}
matrix[j*rank_a+i] = max;
if(max_max < max) {
max_max = max;
}
}
}
if(free_matrix) {
free(matrix);
}
return(optimum-max_max);
}