RicardasSim icon

Needleman-Wunsch algorithm

RicardasSim | PRO | 07/13/19 09:51:14 AM UTC | 0 ⭐ | 782 👁️ | Never ⏰ | []
C |

2.36 KB

|

None

|

0 👍

/

0 👎

//-std=c99 -Wall -Wextra -Wpedantic -Wshadow
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
static inline int largestOfThree(int a, int b, int c)
{
    if(a>b)
    {
        if(a>c) return a;
        else return c;
    }
    else if(b>c) return b;
    else return c;
}
 
int main()
{
 
    char str1[]="ACCGTGTCA";
    char str2[]="GCCGTGTCGACC";
    
    int match = 1;
    int mismatch = -1;
    int gap = -2;
    
    unsigned int lenStr1 = strlen(str1);
    unsigned int lenStr2 = strlen(str2);
    
    int tbl[lenStr2+1][lenStr1+1];
    
    unsigned int i,z;
    
    int scoreLeft, scoreUp, scoreDiagonal;
    
    
    //initialize the table
    
    tbl[0][0] = 0;
    
    for(i=1;i<lenStr1+1;++i)
    {
       tbl[0][i] = tbl[0][i-1] + gap; 
    }
 
    for(i=1;i<lenStr2+1;++i)
    {
       tbl[i][0] = tbl[i-1][0] + gap; 
    }
    
    //scores
    
    for(z=1;z<lenStr2+1;++z)
    {
        for(i=1;i<lenStr1+1;++i)
        {
            
            scoreLeft = tbl[z][i-1] + gap;
            scoreUp = tbl[z-1][i] + gap;
            
            if(str1[i-1]==str2[z-1])
                scoreDiagonal = tbl[z-1][i-1] + match;
            else
                scoreDiagonal = tbl[z-1][i-1] + mismatch;
            
            tbl[z][i] = largestOfThree(scoreLeft, scoreUp, scoreDiagonal);
            
        }
    }
 
//TEST:
//>>>>>>>>>> print table >>>>>>>>>>
 
    printf("\t\t");
    
    for(i=0;i<lenStr1;++i)
    {
        printf("%c\t",str1[i]);
    }
    
    printf("\n");
 
    for(z=0;z<lenStr2+1;++z)
    {
        if (!z) printf("\t");
        else printf("%c\t",str2[z-1]);
 
        for(i=0;i<lenStr1+1;++i)
        {
            printf("%d\t",tbl[z][i]); 
        }
        printf("\n"); 
    }
 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
 
//TODO: find all paths
 
    
    return 0;
}
 
/*
output:
 
        A   C   C   G   T   G   T   C   A   
    0   -2  -4  -6  -8  -10 -12 -14 -16 -18 
G   -2  -1  -3  -5  -5  -7  -9  -11 -13 -15 
C   -4  -3  0   -2  -4  -6  -8  -10 -10 -12 
C   -6  -5  -2  1   -1  -3  -5  -7  -9  -11 
G   -8  -7  -4  -1  2   0   -2  -4  -6  -8  
T   -10 -9  -6  -3  0   3   1   -1  -3  -5  
G   -12 -11 -8  -5  -2  1   4   2   0   -2  
T   -14 -13 -10 -7  -4  -1  2   5   3   1   
C   -16 -15 -12 -9  -6  -3  0   3   6   4   
G   -18 -17 -14 -11 -8  -5  -2  1   4   5   
A   -20 -17 -16 -13 -10 -7  -4  -1  2   5   
C   -22 -19 -16 -15 -12 -9  -6  -3  0   3   
C   -24 -21 -18 -15 -14 -11 -8  -5  -2  1
 
*/

Comments