ded0bc8cff312a869e28594a47447df34d72c51a
[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      */
67     public ScilabBooleanSparse(int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos) {
68         this.rows = rows;
69         this.cols = cols;
70         this.nbItem = nbItem;
71         this.nbItemRow = nbItemRow;
72         this.colPos = colPos;
73     }
74
75     /**
76      * Constructor with a matrix of real data.
77      *
78      * @param data the data
79      */
80     public ScilabBooleanSparse(boolean[][] data) {
81         if (data.length != 0 && data[0].length != 0) {
82             rows = data.length;
83             cols = data[0].length;
84             nbItemRow = new int[rows];
85             List<Integer> listCol = new ArrayList<Integer>();
86
87             for (int i = 0; i < rows; i++) {
88                 for (int j = 0; j < cols; j++) {
89                     if (data[i][j]) {
90                         ++nbItem;
91                         ++nbItemRow[i];
92                         listCol.add(j);
93                     }
94                 }
95             }
96
97             colPos = new int[listCol.size()];
98             int i = 0;
99             for (Integer c : listCol) {
100                 colPos[i++] = c;
101             }
102         }
103     }
104
105     /**
106      * Constructor
107      *
108      * @param varName the variable name
109      * @param rows the number of rows
110      * @param cols the number of cols
111      * @param nbItem the number of true items
112      * @param nbItemRow contains the number of true in each rows
113      * @param colPos the column position of each true
114      */
115     public ScilabBooleanSparse(String varName, int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos) {
116         this(rows, cols, nbItem, nbItemRow, colPos);
117         this.varName = varName;
118     }
119
120     /**
121      * Return the type of Scilab
122      * @return the type of Scilab
123      * @since 5.4.0
124      */
125     @Override
126     public ScilabTypeEnum getType() {
127         return type;
128     }
129
130     /**
131      * Check the emptiness of the associated data.
132      * @return true, if the associated data array is empty.
133      */
134     @Override
135     public boolean isEmpty() {
136         return rows == 0 && cols == 0;
137     }
138
139     /**
140      * Get the real part of the data.
141      *
142      * @return the real part.
143      */
144     public int getNbNonNullItems() {
145         return nbItem;
146     }
147
148     /**
149      * Set the real part of the data.
150      *
151      * @param realPart the real part.
152      */
153     public void setNbNonNullItems(int nbItem) {
154         this.nbItem = nbItem;
155     }
156
157     /**
158      * Get the real part of the data.
159      *
160      * @return the real part.
161      */
162     public int[] getNbItemRow() {
163         return nbItemRow;
164     }
165
166     /**
167      * Set the real part of the data.
168      *
169      * @param realPart the real part.
170      */
171     public void setNbItemRow(int[] nbItemRow) {
172         this.nbItemRow = nbItemRow;
173     }
174
175     /**
176      * Get the real part of the data.
177      *
178      * @return the real part.
179      */
180     public int[] getColPos() {
181         return colPos;
182     }
183
184     /**
185      * Set the real part of the data.
186      *
187      * @param realPart the real part.
188      */
189     public void setColPos(int[] colPos) {
190         this.colPos = colPos;
191     }
192
193     /**
194      * {@inheritDoc}
195      */
196     public String getVarName() {
197         return varName;
198     }
199
200     /**
201      * {@inheritDoc}
202      */
203     public boolean isSwaped() {
204         return false;
205     }
206
207     /**
208      * Get the real part of the full sparse matrix
209      *
210      * @return the full real matrix
211      */
212     public boolean[][] getFullMatrix() {
213         int prev = 0;
214         int j = 0;
215         boolean[][] b = new boolean[rows][cols];
216         for (int i = 0; i < rows; i++) {
217             for (; j < prev + nbItemRow[i]; j++) {
218                 b[i][colPos[j]] = true;
219             }
220             prev += nbItemRow[i];
221         }
222
223         return b;
224     }
225
226     /**
227      * Get complex matrix as a serialized form
228      *
229      * @return the serialized matrix with complex values
230      */
231     // TODO Sly : faire qque chose ici...
232     public boolean[] getSerializedBooleanSparseMatrix() {
233         return new boolean[0];
234     }
235
236
237     /**
238      * @return the height of the data matrix
239      * @see org.scilab.modules.types.ScilabType#getHeight()
240      */
241     @Override
242     public int getHeight() {
243         return rows;
244     }
245
246     /**
247      * @return the width of the data matrix
248      * @see org.scilab.modules.types.ScilabType#getWidth()
249      */
250     @Override
251     public int getWidth() {
252         return cols;
253     }
254
255     /**
256      * @see org.scilab.modules.types.ScilabType#equals(Object)
257      */
258     @Override
259     public boolean equals(Object obj) {
260         if (obj instanceof ScilabBooleanSparse) {
261             ScilabBooleanSparse sciSparse = (ScilabBooleanSparse) obj;
262             return this.getNbNonNullItems() == sciSparse.getNbNonNullItems() &&
263                 Arrays.equals(this.getNbItemRow(), sciSparse.getNbItemRow()) &&
264                 Arrays.equals(this.getColPos(), sciSparse.getColPos());
265         } else {
266             return false;
267         }
268     }
269
270     /**
271      * Display the representation in the Scilab language of the type<br />
272      * Note that the representation can be copied/pasted straight into Scilab
273      *
274      * @return a Scilab-like String representation of the data.
275      * @see java.lang.Object#toString()
276      */
277     @Override
278     public String toString() {
279         StringBuilder result = new StringBuilder();
280
281         if (isEmpty()) {
282             result.append("[]");
283             return result.toString();
284         }
285
286         result.append("sparse([");
287         int j = 0;
288         int prev = 0;
289         for (int i = 0; i < rows; i++) {
290             for (; j < prev + nbItemRow[i]; j++) {
291                 result.append(Integer.toString(i + 1));
292                 result.append(", ");
293                 result.append(Integer.toString(colPos[j] + 1));
294                 if (j < nbItem - 1) {
295                     result.append(" ; ");
296                 }
297             }
298             prev += nbItemRow[i];
299         }
300
301         result.append("], [");
302         for (int i = 0; i < nbItem; i++) {
303             result.append("%t");
304             if (i < nbItem - 1) {
305                 result.append(", ");
306             }
307         }
308
309         result.append("], [");
310         result.append(Integer.toString(rows));
311         result.append(", ");
312         result.append(Integer.toString(cols));
313
314         result.append("])");
315
316         return result.toString();
317     }
318 }