File: AffineGap.java

package info (click to toggle)
libsecondstring-java 0.1~dfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 764 kB
  • sloc: java: 9,592; xml: 114; makefile: 6
file content (92 lines) | stat: -rw-r--r-- 2,587 bytes parent folder | download
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
87
88
89
90
91
92
package com.wcohen.ss;

import com.wcohen.ss.api.*;

/**
 * Affine-gap string distance, following Durban et al. 
 * Sec 2.3.
 */

public class AffineGap extends AbstractStringDistance
{
	private CharMatchScore charMatchScore;
	private double openGapScore;
	private double extendGapScore;
	private double lowerBound;
	
	public AffineGap() {
		this(CharMatchScore.DIST_21, 2, 1, -Double.MAX_VALUE );
	}
	public AffineGap(CharMatchScore charMatchScore,double openGapScore, double extendGapScore, double lowerBound) {
		this.charMatchScore = charMatchScore;
		this.openGapScore = openGapScore;
		this.extendGapScore = extendGapScore;
		this.lowerBound = lowerBound;
	}
	
	public double score(StringWrapper s,StringWrapper t) {
		MatrixTrio mat = new MatrixTrio( s, t );
		return score(s,t,mat);
	}
	
	private double score(StringWrapper s,StringWrapper t,MatrixTrio mat) {
		double best = -Double.MAX_VALUE;
		for (int i=0; i<=s.length(); i++) {
	    for (int j=0; j<=t.length(); j++) {
				best = Math.max( best, mat.get(i,j) );
	    }
		}
		return best;
	}
	
	public String explainScore(StringWrapper s,StringWrapper t) {
		MatrixTrio mat = new MatrixTrio( s, t );
		double d = score(s,t,mat);
		return mat.toString() + "\nScore = "+d;
	}
	
	// a set of three linked distance matrices
	protected class MatrixTrio extends MemoMatrix
	{
		protected MemoMatrix m;
		protected InsertSMatrix is;
		protected InsertTMatrix it;
		public MatrixTrio(StringWrapper s,StringWrapper t) {
			super(s,t);
			is = new InsertSMatrix(s,t);
			it = new InsertTMatrix(s,t);
			m = this;
		}
		public double compute(int i,int j) {
			if (i==0 || j==0) return 0;
			double matchScore = charMatchScore.matchScore( sAt(i), tAt(j) );
			return max4( lowerBound,
									 m.get(i-1,j-1) + matchScore,
									 is.get(i-1,j-1) + matchScore,
									 it.get(i=1,j-1) + matchScore );
		}
		protected class InsertSMatrix extends MemoMatrix {
			public InsertSMatrix(StringWrapper s,StringWrapper t) { super(s,t); }
			public double compute(int i,int j) {
				if (i==0 || j==0) return 0;
				return max3( lowerBound,
										 m.get(i-1,j) + openGapScore,
										 is.get(i-1,j) + extendGapScore );
			}
		}
		protected class InsertTMatrix extends MemoMatrix {
			public InsertTMatrix(StringWrapper s,StringWrapper t) { super(s,t); }
			public double compute(int i,int j) {
				if (i==0 || j==0) return 0;
				return max3( lowerBound,
										 m.get(i,j-1) + openGapScore,
										 it.get(i,j-1) + extendGapScore );
			}
		}
	}

	static public void main(String[] argv) {
		doMain(new AffineGap(), argv);
	}
}