001    /* ===========================================================
002     * JFreeChart : a free chart library for the Java(tm) platform
003     * ===========================================================
004     *
005     * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors.
006     *
007     * Project Info:  http://www.jfree.org/jfreechart/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     *
027     * -----------------
028     * MatrixSeries.java
029     * -----------------
030     * (C) Copyright 2003-2007, by Barak Naveh and Contributors.
031     *
032     * Original Author:  Barak Naveh;;
033     * Contributor(s):   David Gilbert (for Object Refinery Limited);
034     *                   Zhitao Wang;
035     *
036     * $Id: MatrixSeries.java,v 1.5.2.3 2007/02/02 15:14:53 mungady Exp $
037     *
038     * Changes
039     * -------
040     * 10-Jul-2003 : Version 1 contributed by Barak Naveh (DG);
041     * 10-Feb-2004 : Fixed Checkstyle complaints (DG);
042     * 21-May-2004 : Fixed bug 940188 - problem in getItemColumn() and 
043     *               getItemRow() (DG);
044     * ------------- JFREECHART 1.0.x ---------------------------------------------
045     * 27-Nov-2006 : Fixed bug in equals() method (DG);
046     * 02-Feb-2007 : Removed author tags all over JFreeChart sources (DG);
047     *
048     */
049    
050    package org.jfree.data.xy;
051    
052    import java.io.Serializable;
053    
054    import org.jfree.data.general.Series;
055    
056    /**
057     * Represents a dense matrix M[i,j] where each Mij item of the matrix has a
058     * value (default is 0).
059     */
060    public class MatrixSeries extends Series implements Serializable {
061        
062        /** For serialization. */
063        private static final long serialVersionUID = 7934188527308315704L;    
064        
065        /** Series matrix values */
066        protected double[][] data;
067    
068        /**
069         * Constructs a new matrix series.
070         * <p>
071         * By default, all matrix items are initialzed to 0.
072         * </p>
073         *
074         * @param name  series name (<code>null</code> not permitted).
075         * @param rows  the number of rows.
076         * @param columns  the number of columns.
077         */
078        public MatrixSeries(String name, int rows, int columns) {
079            super(name);
080            this.data = new double[rows][columns];
081            zeroAll();
082        }
083    
084        /**
085         * Returns the number of columns in this matrix series.
086         *
087         * @return The number of columns in this matrix series.
088         */
089        public int getColumnsCount() {
090            return this.data[0].length;
091        }
092    
093    
094        /**
095         * Return the matrix item at the specified index.  Note that this method
096         * creates a new <code>Double</code> instance every time it is called.
097         *
098         * @param itemIndex item index.
099         *
100         * @return The matrix item at the specified index.
101         * 
102         * @see #get(int, int)
103         */
104        public Number getItem(int itemIndex) {
105            int i = getItemRow(itemIndex);
106            int j = getItemColumn(itemIndex);
107    
108            Number n = new Double(get(i, j));
109    
110            return n;
111        }
112    
113    
114        /**
115         * Returns the column of the specified item.
116         *
117         * @param itemIndex the index of the item.
118         *
119         * @return The column of the specified item.
120         */
121        public int getItemColumn(int itemIndex) {
122            //assert itemIndex >= 0 && itemIndex < getItemCount();
123            return itemIndex % getColumnsCount();
124        }
125    
126    
127        /**
128         * Returns the number of items in the series.
129         *
130         * @return The item count.
131         */
132        public int getItemCount() {
133            return getRowCount() * getColumnsCount();
134        }
135    
136    
137        /**
138         * Returns the row of the specified item.
139         *
140         * @param itemIndex the index of the item.
141         *
142         * @return The row of the specified item.
143         */
144        public int getItemRow(int itemIndex) {
145            //assert itemIndex >= 0 && itemIndex < getItemCount();
146            return itemIndex / getColumnsCount();
147        }
148    
149    
150        /**
151         * Returns the number of rows in this matrix series.
152         *
153         * @return The number of rows in this matrix series.
154         */
155        public int getRowCount() {
156            return this.data.length;
157        }
158    
159    
160        /**
161         * Returns the value of the specified item in this matrix series.
162         *
163         * @param i the row of the item.
164         * @param j the column of the item.
165         *
166         * @return The value of the specified item in this matrix series.
167         * 
168         * @see #getItem(int)
169         * @see #update(int, int, double)
170         */
171        public double get(int i, int j) {
172            return this.data[i][j];
173        }
174    
175    
176        /**
177         * Updates the value of the specified item in this matrix series.
178         *
179         * @param i the row of the item.
180         * @param j the column of the item.
181         * @param mij the new value for the item.
182         * 
183         * @see #get(int, int)
184         */
185        public void update(int i, int j, double mij) {
186            this.data[i][j] = mij;
187            fireSeriesChanged();
188        }
189    
190    
191        /**
192         * Sets all matrix values to zero and sends a 
193         * {@link org.jfree.data.general.SeriesChangeEvent} to all registered 
194         * listeners.
195         */
196        public void zeroAll() {
197            int rows = getRowCount();
198            int columns = getColumnsCount();
199    
200            for (int row = 0; row < rows; row++) {
201                for (int column = 0; column < columns; column++) {
202                    this.data[row][column] = 0.0;
203                }
204            }
205            fireSeriesChanged();
206        }
207        
208        /**
209         * Tests this object instance for equality with an arbitrary object.
210         * 
211         * @param obj  the object (<code>null</code> permitted).
212         * 
213         * @return A boolean.
214         */
215        public boolean equals(Object obj) {
216            if (obj == this) {
217                return true;   
218            }
219            if (!(obj instanceof MatrixSeries)) {
220                return false;
221            }
222            MatrixSeries that = (MatrixSeries) obj;
223            if (!(getRowCount() == that.getRowCount())) {
224                return false;
225            }
226            if (!(getColumnsCount() == that.getColumnsCount())) {
227                return false;   
228            }
229            for (int r = 0; r < getRowCount(); r++) {
230                for (int c = 0; c < getColumnsCount(); c++) {
231                    if (get(r, c) != that.get(r, c)) {
232                        return false;
233                    }
234                }
235            }
236            return super.equals(obj);
237        }
238        
239    }