swps3
DynProgr_scalar.c
Go to the documentation of this file.
1 
5 /*
6  * Copyright (c) 2007-2008 ETH Zürich, Institute of Computational Science
7  *
8  * Permission is hereby granted, free of charge, to any person
9  * obtaining a copy of this software and associated documentation
10  * files (the "Software"), to deal in the Software without
11  * restriction, including without limitation the rights to use,
12  * copy, modify, merge, publish, distribute, sublicense, and/or sell
13  * copies of the Software, and to permit persons to whom the
14  * Software is furnished to do so, subject to the following
15  * conditions:
16  *
17  * The above copyright notice and this permission notice shall be
18  * included in all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
22  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
24  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
25  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27  * OTHER DEALINGS IN THE SOFTWARE.
28  */
29 
30 #include <sys/types.h>
31 #include "swps3.h"
32 #include "debug.h"
33 #include "matrix.h"
34 
35 #define INFINITY (1.0/0.0)
36 EXPORT double swps3_alignScalar( const DMatrix matrix, const char *s1, int ls1, const char *s2, int ls2, Options *options)
37 {
38 static double coldel[MAX_SEQ_LENGTH], S[MAX_SEQ_LENGTH];
39 
40 int i, j, k;
41 const double DelFixed = options->gapOpen;
42 const double DelIncr = options->gapExt;
43 double *Score_s1;
44 double Tcd, t, MaxScore = 0, Sj, Sj1, Tj, Tj1, Trd;
45 
46 S[0] = coldel[0] = 0;
47 for( j=0; j < ls2; j++ ) {
48  coldel[j] = -INFINITY;
49  S[j] = 0;
50 }
51 
52 for( i=0; i < ls1; i++ ) {
53 
54  Tj1 = Sj1 = 0;
55  Trd = -INFINITY;
56 
57  /* setup Score_s1 */
58  k = s1[i];
59  Score_s1 = matrix+k*MATRIX_DIM;
60 
61  for( j=0; j < ls2; j++ ) {
62  Sj = S[j];
63  Tcd = coldel[j] + DelIncr;
64 
65  if( Tcd < ( t=Sj+DelFixed ) ) Tcd = t;
66  Tj = Sj1 + Score_s1[(int)s2[j]];
67 
68  Trd += DelIncr;
69  if( Trd < ( t=Tj1+DelFixed ) ) Trd = t;
70 
71  if( Tj < Tcd ) Tj = Tcd;
72  if( Tj < Trd ) Tj = Trd;
73  if( Tj < 0 ) Tj = 0;
74  if( Tj > MaxScore ) {
75  MaxScore = Tj;
76  if( MaxScore >= options->threshold ) { return( MaxScore ); }
77  }
78 
79  coldel[j] = Tcd;
80  S[j] = Tj1 = Tj;
81  Sj1 = Sj;
82  }
83 }
84 
85 return( MaxScore );
86 
87 }