JAL-3205 added a delta parameter to Matrix.equals()
[jalview.git] / src / jalview / math / MatrixI.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.math;
22
23 import java.io.PrintStream;
24
25 /**
26  * An interface that describes a rectangular matrix of double values and
27  * operations on it
28  */
29 public interface MatrixI
30 {
31   /**
32    * Answers the number of columns
33    * 
34    * @return
35    */
36   int width();
37
38   /**
39    * Answers the number of rows
40    * 
41    * @return
42    */
43   int height();
44
45   /**
46    * Answers the value at row i, column j
47    * 
48    * @param i
49    * @param j
50    * @return
51    */
52   double getValue(int i, int j);
53
54   /**
55    * Sets the value at row i, colum j
56    * 
57    * @param i
58    * @param j
59    * @param d
60    */
61   void setValue(int i, int j, double d);
62
63   /**
64    * Answers a copy of the values in the i'th row
65    * 
66    * @return
67    */
68   double[] getRow(int i);
69
70   /**
71    * Answers a new matrix with a copy of the values in this one
72    * 
73    * @return
74    */
75   MatrixI copy();
76
77   /**
78    * Returns a new matrix which is the transpose of this one
79    * 
80    * @return
81    */
82   MatrixI transpose();
83
84   /**
85    * Returns a new matrix which is the result of premultiplying this matrix by
86    * the supplied argument. If this of size AxB (A rows and B columns), and the
87    * argument is CxA (C rows and A columns), the result is of size CxB.
88    * 
89    * @param in
90    * 
91    * @return
92    * @throws IllegalArgumentException
93    *           if the number of columns in the pre-multiplier is not equal to
94    *           the number of rows in the multiplicand (this)
95    */
96   MatrixI preMultiply(MatrixI m);
97
98   /**
99    * Returns a new matrix which is the result of postmultiplying this matrix by
100    * the supplied argument. If this of size AxB (A rows and B columns), and the
101    * argument is BxC (B rows and C columns), the result is of size AxC.
102    * <p>
103    * This method simply returns the result of in.preMultiply(this)
104    * 
105    * @param in
106    * 
107    * @return
108    * @throws IllegalArgumentException
109    *           if the number of rows in the post-multiplier is not equal to the
110    *           number of columns in the multiplicand (this)
111    * @see #preMultiply(Matrix)
112    */
113   MatrixI postMultiply(MatrixI m);
114
115   double[] getD();
116
117   double[] getE();
118
119   void setD(double[] v);
120
121   void setE(double[] v);
122
123   void print(PrintStream ps, String format);
124
125   void printD(PrintStream ps, String format);
126
127   void printE(PrintStream ps, String format);
128
129   void tqli() throws Exception;
130
131   void tred();
132
133   /**
134    * Reverses the range of the matrix values, so that the smallest values become
135    * the largest, and the largest become the smallest. This operation supports
136    * using a distance measure as a similarity measure, or vice versa.
137    * <p>
138    * If parameter <code>maxToZero</code> is true, then the maximum value becomes
139    * zero, i.e. all values are subtracted from the maximum. This is consistent
140    * with converting an identity similarity score to a distance score - the most
141    * similar (identity) corresponds to zero distance. However note that the
142    * operation is not reversible (unless the original minimum value is zero).
143    * For example a range of 10-40 would become 30-0, which would reverse a
144    * second time to 0-30. Also note that a general similarity measure (such as
145    * BLOSUM) may give different 'identity' scores for different sequences, so
146    * they cannot all convert to zero distance.
147    * <p>
148    * If parameter <code>maxToZero</code> is false, then the values are reflected
149    * about the average of {min, max} (effectively swapping min and max). This
150    * operation <em>is</em> reversible.
151    * 
152    * @param maxToZero
153    */
154   void reverseRange(boolean maxToZero);
155
156   /**
157    * Multiply all entries by the given value
158    * 
159    * @param d
160    */
161   void multiply(double d);
162
163   /**
164    * Answers true if the two matrices have the same dimensions, and corresponding values all differ by no
165    * more than delta (which should be a positive value), else false
166    * 
167    * @param m2
168    * @param delta
169    * @return
170    */
171   boolean equals(MatrixI m2, double delta);
172 }