Javasci: In sparse matrix, add a parameter to constructor to give the ability to... 71/5671/2
Calixte DENIZET [Sun, 18 Dec 2011 23:17:09 +0000 (00:17 +0100)]
Change-Id: I07ae3279d9e1fda66f840b7202c7da716813960a

scilab/modules/javasci/TODO
scilab/modules/types/src/java/org/scilab/modules/types/ScilabBooleanSparse.java
scilab/modules/types/src/java/org/scilab/modules/types/ScilabSparse.java
scilab/modules/types/src/java/org/scilab/modules/types/ScilabSparseException.java [new file with mode: 0644]

index 6333b0f..8246ac2 100644 (file)
@@ -1,3 +1,5 @@
+* write test on http://codereview.scilab.org/#change,5671
+
 * check memory leaks
 
 * check what is the faster:
index 95a2c44..0eee56a 100644 (file)
@@ -63,6 +63,23 @@ public class ScilabBooleanSparse implements ScilabType {
      * @param nbItem the number of true items
      * @param nbItemRow contains the number of true in each rows
      * @param colPos the column position of each true
+     * @param check if true the parameters validity is checked
+     */
+    public ScilabBooleanSparse(int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos, boolean check) throws ScilabSparseException {
+        this(rows, cols, nbItem, nbItemRow, colPos);
+        if (check) {
+            ScilabSparse.checkValidity(rows, cols, nbItem, nbItemRow, colPos);
+        }
+    }
+
+    /**
+     * Constructor
+     *
+     * @param rows the number of rows
+     * @param cols the number of cols
+     * @param nbItem the number of true items
+     * @param nbItemRow contains the number of true in each rows
+     * @param colPos the column position of each true
      */
     public ScilabBooleanSparse(int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos) {
         this.rows = rows;
index fd65e8b..a3f3aad 100644 (file)
@@ -84,14 +84,63 @@ public class ScilabSparse implements ScilabType {
      * @param nbItemRow contains the number of true in each rows
      * @param colPos the column position of each non null item
      * @param data the non null data
+     * @param check if true the parameters validity is checked
      */
-    public ScilabSparse(int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos, double[] data) {
+    public ScilabSparse(int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos, double[] data, boolean check) throws ScilabSparseException {
+        this(rows, cols, nbItem, nbItemRow, colPos, data);
+        if (check) {
+            checkValidity(rows, cols, nbItem, nbItemRow, colPos);
+
+            if (realPart.length != nbItem) {
+                throw new ScilabSparseException("Invalid length for the array realPart: its length must be equal to the number of non-null items.");
+            }
+        }
+    }
+
+    /**
+     * Constructor
+     *
+     * @param rows the number of rows
+     * @param cols the number of cols
+     * @param nbItem the number of non null items
+     * @param nbItemRow contains the number of true in each rows
+     * @param colPos the column position of each non null item
+     * @param real the non null real data
+     */
+    public ScilabSparse(int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos, double[] real) {
         this.rows = rows;
         this.cols = cols;
         this.nbItem = nbItem;
         this.nbItemRow = nbItemRow;
         this.colPos = colPos;
-        this.realPart = data;
+        this.realPart = real;
+    }
+
+    /**
+     * Constructor
+     *
+     * @param rows the number of rows
+     * @param cols the number of cols
+     * @param nbItem the number of non null items
+     * @param nbItemRow contains the number of true in each rows
+     * @param colPos the column position of each non null item
+     * @param real the non null real data
+     * @param imag the non null imaginary data
+     * @param check if true the parameters validity is checked
+     */
+    public ScilabSparse(int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos, double[] real, double[] imag, boolean check) throws ScilabSparseException {
+        this(rows, cols, nbItem, nbItemRow, colPos, real, imag);
+        if (check) {
+            checkValidity(rows, cols, nbItem, nbItemRow, colPos);
+
+            if (realPart.length != nbItem) {
+                throw new ScilabSparseException("Invalid length for the array realPart: its length must be equal to the number of non-null items.");
+            }
+
+            if (imaginaryPart.length != nbItem) {
+                throw new ScilabSparseException("Invalid length for the array imaginaryPart: its length must be equal to the number of non-null items.");
+            }
+        }
     }
 
     /**
@@ -111,6 +160,47 @@ public class ScilabSparse implements ScilabType {
     }
 
     /**
+     * Constructor
+     *
+     * @param rows the number of rows
+     * @param cols the number of cols
+     * @param nbItem the number of non null items
+     * @param nbItemRow contains the number of true in each rows
+     * @param colPos the column position of each non null item
+     */
+    static final void checkValidity(int rows, int cols, int nbItem, int[] nbItemRow, int[] colPos) throws ScilabSparseException {
+        if (nbItem > rows * cols || nbItem < 0) {
+            throw new ScilabSparseException("Invalid number of items: between 0 and " + rows * cols + " expected.");
+        }
+
+        if (nbItemRow.length > rows) {
+            throw new ScilabSparseException("Invalid length for the array nbItemRow: a length between 0 and " + rows + " expected.");
+        }
+
+        int s = 0;
+        for (int i = 0; i < nbItemRow.length; i++) {
+            if (nbItemRow[i] > cols) {
+                throw new ScilabSparseException("Invalid number of non-null items in nbItemRow at position " + i + ".");
+            }
+            s += nbItemRow[i];
+        }
+
+        if (s != nbItem) {
+            throw new ScilabSparseException("Invalid array nbItemRow: the total sum is not equal to the number of non-null items.");
+        }
+
+        if (colPos.length != nbItem) {
+            throw new ScilabSparseException("Invalid length for the array colPos: its length must be equal to the number of non-null items.");
+        }
+
+        for (int i = 0; i < nbItem; i++) {
+            if (colPos[i] >= cols || colPos[i] < 0) {
+                throw new ScilabSparseException("Invalid column position at position " + i + ".");
+            }
+        }
+    }
+
+    /**
      * Constructor with a matrix of real data.
      *
      * @param data the data
diff --git a/scilab/modules/types/src/java/org/scilab/modules/types/ScilabSparseException.java b/scilab/modules/types/src/java/org/scilab/modules/types/ScilabSparseException.java
new file mode 100644 (file)
index 0000000..78a0ac2
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ *  Copyright (C) 2011-2011 - Scilab Enterprises - Calixte DENIZET
+ *
+ *  This file must be used under the terms of the CeCILL.
+ *  This source file is licensed as described in the file COPYING, which
+ *  you should have received as part of this distribution.  The terms
+ *  are also available at
+ *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+package org.scilab.modules.types;
+
+/**
+ * Exception which can occured when a Sparse matrix is created
+ */
+public class ScilabSparseException extends Exception {
+
+    /**
+     * Constructor
+     * @param msg the error message
+     */
+    public ScilabSparseException(String msg) {
+        super(msg);
+    }
+}