001    /**
002     * Copyright 2009-2010 by The Broad Institute.
003     * 
004     
005     */
006    package org.broadinstitute.genee.matrix;
007    
008    /**
009     * 
010     * Fixed size abstract dataset.
011     * 
012     */
013    public abstract class FixedSizeAbstractDataset extends AbstractDataset {
014    
015        protected MetadataModel columnMetadata;
016    
017        protected int columns;
018    
019        protected MetadataModel rowMetadata;
020    
021        protected int rows;
022    
023        /**
024         * Creates a new dataset
025         * 
026         * @param name
027         *            the dataset name
028         * @param rows
029         *            the number of rows
030         * @param columns
031         *            the number of columns
032         */
033        protected FixedSizeAbstractDataset(String name, int rows, int columns) {
034            this.name = name;
035            this.rows = rows;
036            this.columns = columns;
037            rowMetadata = new DefaultMetadataModel(rows);
038            columnMetadata = new DefaultMetadataModel(columns);
039        }
040    
041        /**
042         * Inserts the specified series.
043         * 
044         * @param name
045         *            series name to be inserted
046         * @param values
047         *            array of values
048         * @param c
049         *            class of values
050         * @return the series index
051         */
052        public int addSeries(String name, Object[][] values, Class<?> c) {
053            seriesNames.add(name);
054            seriesClasses.add(c);
055            matrices.add(new ObjectMatrix(values));
056            return seriesNames.size();
057        }
058    
059        @Override
060        public int getColumnCount() {
061            return columns;
062        }
063    
064        @Override
065        public MetadataModel getColumnMetadata() {
066            return columnMetadata;
067        }
068    
069        @Override
070        public int getRowCount() {
071            return rows;
072        }
073    
074        @Override
075        public MetadataModel getRowMetadata() {
076            return rowMetadata;
077        }
078    
079        public void setColumnMetadata(MetadataModel metadata) {
080            if (metadata.getItemCount() != getColumnCount()) {
081                throw new IllegalArgumentException("Wrong number of items.");
082            }
083            this.columnMetadata = metadata;
084        }
085    
086        public void setRowMetadata(MetadataModel metadata) {
087            if (metadata.getItemCount() != getRowCount()) {
088                throw new IllegalArgumentException("Wrong number of items.");
089            }
090            this.rowMetadata = metadata;
091        }
092    
093        protected Matrix createMatrix() {
094            return new ObjectMatrix(getRowCount(), getColumnCount());
095        }
096    
097        static class ObjectMatrix implements Matrix {
098            private Object[][] matrix;
099    
100            public ObjectMatrix(Object[][] values) {
101                this.matrix = values;
102            }
103    
104            private ObjectMatrix(int rows, int columns) {
105                matrix = new Object[rows][columns];
106            }
107    
108            @Override
109            public Object get(int row, int column) {
110                return matrix[row][column];
111            }
112    
113            @Override
114            public void set(int row, int column, Object value) {
115                matrix[row][column] = value;
116            }
117        }
118    
119    }