Javasci: In sparse matrix, add a parameter to constructor to give the ability to...
[scilab.git] / scilab / modules / types / src / java / org / scilab / modules / types / ScilabBooleanSparse.java
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2011-2011 - DIGITEO - Calixte DENIZET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.types;
14
15 import java.util.ArrayList;
16 import java.util.Arrays;
17 import java.util.List;
18
19 /**
20  * This class provides a representation on the Scilab Boolean Sparse datatype<br>
21  * <br>
22  * This class is {@link java.io.Serializable} and any modification could
23  * impact load and store of data (Xcos files, Javasci saved data, etc...).<br>
24  * <br>
25  * //TODO Sly : ajouter de la doc
26  * @see org.scilab.modules.javasci.Scilab
27  */
28 public class ScilabBooleanSparse implements ScilabType {
29
30     private static final long serialVersionUID = 879625048944109684L;
31     private static final ScilabTypeEnum type = ScilabTypeEnum.sci_boolean_sparse;
32
33     private int rows;
34     private int cols;
35     private int nbItem;
36     private int[] nbItemRow;
37     private int[] colPos;
38     private String varName;
39
40     /**
41      * Default constructor
42      */
43     public ScilabBooleanSparse() { }
44
45     /**
46      * Constructor with a unique value.
47      * @param data the unique value
48      */
49     public ScilabBooleanSparse(boolean data) {
50         if (data) {
51             nbItem = 1;
52             rows = cols = 1;
53             nbItemRow = new int[]{1};
54             colPos = new int[]{0};
55         }
56     }
57
58     /**
59      * Constructor
60      *
61      * @param rows the number of rows
62      * @param cols the number of cols
63      * @param nbItem the number of true items
64      * @param nbItemRow contains the number of true in each rows
65      * @param colPos the column position of each true
66      * @param check if true the parameters validity is checked
67      */
68     public ScilabBooleanSparse(int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos, boolean check) throws ScilabSparseException {
69         this(rows, cols, nbItem, nbItemRow, colPos);
70         if (check) {
71             ScilabSparse.checkValidity(rows, cols, nbItem, nbItemRow, colPos);
72         }
73     }
74
75     /**
76      * Constructor
77      *
78      * @param rows the number of rows
79      * @param cols the number of cols
80      * @param nbItem the number of true items
81      * @param nbItemRow contains the number of true in each rows
82      * @param colPos the column position of each true
83      */
84     public ScilabBooleanSparse(int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos) {
85         this.rows = rows;
86         this.cols = cols;
87         this.nbItem = nbItem;
88         this.nbItemRow = nbItemRow;
89         this.colPos = colPos;
90     }
91
92     /**
93      * Constructor with a matrix of real data.
94      *
95      * @param data the data
96      */
97     public ScilabBooleanSparse(boolean[][] data) {
98         if (data.length != 0 && data[0].length != 0) {
99             rows = data.length;
100             cols = data[0].length;
101             nbItemRow = new int[rows];
102             List<Integer> listCol = new ArrayList<Integer>();
103
104             for (int i = 0; i < rows; i++) {
105                 for (int j = 0; j < cols; j++) {
106                     if (data[i][j]) {
107                         ++nbItem;
108                         ++nbItemRow[i];
109                         listCol.add(j);
110                     }
111                 }
112             }
113
114             colPos = new int[listCol.size()];
115             int i = 0;
116             for (Integer c : listCol) {
117                 colPos[i++] = c;
118             }
119         }
120     }
121
122     /**
123      * Constructor
124      *
125      * @param varName the variable name
126      * @param rows the number of rows
127      * @param cols the number of cols
128      * @param nbItem the number of true items
129      * @param nbItemRow contains the number of true in each rows
130      * @param colPos the column position of each true
131      */
132     public ScilabBooleanSparse(String varName, int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos) {
133         this(rows, cols, nbItem, nbItemRow, colPos);
134         this.varName = varName;
135     }
136
137     /**
138      * Return the type of Scilab
139      * @return the type of Scilab
140      * @since 5.4.0
141      */
142     @Override
143     public ScilabTypeEnum getType() {
144         return type;
145     }
146
147     /**
148      * Check the emptiness of the associated data.
149      * @return true, if the associated data array is empty.
150      */
151     @Override
152     public boolean isEmpty() {
153         return rows == 0 && cols == 0;
154     }
155
156     /**
157      * Get the real part of the data.
158      *
159      * @return the real part.
160      */
161     public int getNbNonNullItems() {
162         return nbItem;
163     }
164
165     /**
166      * Set the real part of the data.
167      *
168      * @param realPart the real part.
169      */
170     public void setNbNonNullItems(int nbItem) {
171         this.nbItem = nbItem;
172     }
173
174     /**
175      * Get the real part of the data.
176      *
177      * @return the real part.
178      */
179     public int[] getNbItemRow() {
180         return nbItemRow;
181     }
182
183     /**
184      * Set the real part of the data.
185      *
186      * @param realPart the real part.
187      */
188     public void setNbItemRow(int[] nbItemRow) {
189         this.nbItemRow = nbItemRow;
190     }
191
192     /**
193      * Get the real part of the data.
194      *
195      * @return the real part.
196      */
197     public int[] getColPos() {
198         return colPos;
199     }
200
201     /**
202      * Set the real part of the data.
203      *
204      * @param realPart the real part.
205      */
206     public void setColPos(int[] colPos) {
207         this.colPos = colPos;
208     }
209
210     /**
211      * {@inheritDoc}
212      */
213     public String getVarName() {
214         return varName;
215     }
216
217     /**
218      * {@inheritDoc}
219      */
220     public boolean isSwaped() {
221         return false;
222     }
223
224     /**
225      * Get the real part of the full sparse matrix
226      *
227      * @return the full real matrix
228      */
229     public boolean[][] getFullMatrix() {
230         int prev = 0;
231         int j = 0;
232         boolean[][] b = new boolean[rows][cols];
233         for (int i = 0; i < nbItemRow.length; i++) {
234             for (; j < prev + nbItemRow[i]; j++) {
235                 b[i][colPos[j]] = true;
236             }
237             prev += nbItemRow[i];
238         }
239
240         return b;
241     }
242
243     /**
244      * Get complex matrix as a serialized form
245      *
246      * @return the serialized matrix with complex values
247      */
248     // TODO Sly : faire qque chose ici...
249     public boolean[] getSerializedBooleanSparseMatrix() {
250         return new boolean[0];
251     }
252
253
254     /**
255      * @return the height of the data matrix
256      * @see org.scilab.modules.types.ScilabType#getHeight()
257      */
258     @Override
259     public int getHeight() {
260         return rows;
261     }
262
263     /**
264      * @return the width of the data matrix
265      * @see org.scilab.modules.types.ScilabType#getWidth()
266      */
267     @Override
268     public int getWidth() {
269         return cols;
270     }
271
272     /**
273      * @see org.scilab.modules.types.ScilabType#equals(Object)
274      */
275     @Override
276     public boolean equals(Object obj) {
277         if (obj instanceof ScilabBooleanSparse) {
278             ScilabBooleanSparse sciSparse = (ScilabBooleanSparse) obj;
279             return this.getNbNonNullItems() == sciSparse.getNbNonNullItems() &&
280                 ScilabSparse.compareNbItemRow(this.getNbItemRow(), sciSparse.getNbItemRow()) &&
281                 Arrays.equals(this.getColPos(), sciSparse.getColPos());
282         } else {
283             return false;
284         }
285     }
286
287     /**
288      * Display the representation in the Scilab language of the type<br />
289      * Note that the representation can be copied/pasted straight into Scilab
290      *
291      * @return a Scilab-like String representation of the data.
292      * @see java.lang.Object#toString()
293      */
294     @Override
295     public String toString() {
296         StringBuilder result = new StringBuilder();
297
298         if (isEmpty()) {
299             result.append("[]");
300             return result.toString();
301         }
302
303         result.append("sparse([");
304         int j = 0;
305         int prev = 0;
306         for (int i = 0; i < nbItemRow.length; i++) {
307             for (; j < prev + nbItemRow[i]; j++) {
308                 result.append(Integer.toString(i + 1));
309                 result.append(", ");
310                 result.append(Integer.toString(colPos[j] + 1));
311                 if (j < nbItem - 1) {
312                     result.append(" ; ");
313                 }
314             }
315             prev += nbItemRow[i];
316         }
317
318         result.append("], [");
319         for (int i = 0; i < nbItem; i++) {
320             result.append("%t");
321             if (i < nbItem - 1) {
322                 result.append(", ");
323             }
324         }
325
326         result.append("], [");
327         result.append(Integer.toString(rows));
328         result.append(", ");
329         result.append(Integer.toString(cols));
330
331         result.append("])");
332
333         return result.toString();
334     }
335 }