Javasci: slightly simplify the way to create a sparse or a boolean sparse matrix 70/5670/4
Calixte DENIZET [Sun, 18 Dec 2011 22:27:08 +0000 (23:27 +0100)]
Change-Id: Idadeea61ddd8d889502a0c27a64c4e59d3be80d2

scilab/modules/javasci/tests/java/org/scilab/tests/modules/javasci/testReadWrite.java
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/tests/java/org/scilab/tests/modules/types/testEquals.java

index 954165b..38d5eaa 100644 (file)
@@ -112,6 +112,14 @@ public class testReadWrite {
 
                assert Arrays.deepEquals(aFromScilab.getFullRealPart(), aFromScilab2.getFullRealPart()) == true;
 
+               ScilabSparse mySparse = new ScilabSparse(100, 100, 5, new int[] { 1, 1, 1, 1, 1}, new int[]{ 1, 25, 50, 75, 99}, new double[] { 1.0, 2.0, 3.0, 4.0, 5.0});
+        // sci.put with a sparse is not yet functionnal
+//        assert sci.put("mySparse", mySparse) == true;
+//        String ref="mySparseRef = sparse([1, 2 ; 2, 26 ; 3, 51 ; 4, 76 ; 5, 100], [1.0 ; 2.0 ; 3.0 ; 4.0 ; 5.0], [100, 100]);";
+//        sci.exec("isEqual=(mySparseRef==mySparse)");
+//        ScilabBoolean isEqual = (ScilabBoolean)sci.get("isEqual");
+//        System.out.println("isequal " +isEqual);
+
         
     }
 
index ded0bc8..95a2c44 100644 (file)
@@ -213,7 +213,7 @@ public class ScilabBooleanSparse implements ScilabType {
         int prev = 0;
         int j = 0;
         boolean[][] b = new boolean[rows][cols];
-        for (int i = 0; i < rows; i++) {
+        for (int i = 0; i < nbItemRow.length; i++) {
             for (; j < prev + nbItemRow[i]; j++) {
                 b[i][colPos[j]] = true;
             }
@@ -260,7 +260,7 @@ public class ScilabBooleanSparse implements ScilabType {
         if (obj instanceof ScilabBooleanSparse) {
             ScilabBooleanSparse sciSparse = (ScilabBooleanSparse) obj;
             return this.getNbNonNullItems() == sciSparse.getNbNonNullItems() &&
-                Arrays.equals(this.getNbItemRow(), sciSparse.getNbItemRow()) &&
+                ScilabSparse.compareNbItemRow(this.getNbItemRow(), sciSparse.getNbItemRow()) &&
                 Arrays.equals(this.getColPos(), sciSparse.getColPos());
         } else {
             return false;
@@ -286,7 +286,7 @@ public class ScilabBooleanSparse implements ScilabType {
         result.append("sparse([");
         int j = 0;
         int prev = 0;
-        for (int i = 0; i < rows; i++) {
+        for (int i = 0; i < nbItemRow.length; i++) {
             for (; j < prev + nbItemRow[i]; j++) {
                 result.append(Integer.toString(i + 1));
                 result.append(", ");
index 3ec6542..fd65e8b 100644 (file)
@@ -350,7 +350,7 @@ public class ScilabSparse implements ScilabType {
         int prev = 0;
         int j = 0;
         double[][] d = new double[rows][cols];
-        for (int i = 0; i < rows; i++) {
+        for (int i = 0; i < nbItemRow.length; i++) {
             for (; j < prev + nbItemRow[i]; j++) {
                 d[i][colPos[j]] = realPart[j];
             }
@@ -369,7 +369,7 @@ public class ScilabSparse implements ScilabType {
         int prev = 0;
         int j = 0;
         double[][] d = new double[rows][cols];
-        for (int i = 0; i < rows; i++) {
+        for (int i = 0; i < nbItemRow.length; i++) {
             for (; j < prev + nbItemRow[i]; j++) {
                 d[i][colPos[j]] = imaginaryPart[j];
             }
@@ -389,7 +389,7 @@ public class ScilabSparse implements ScilabType {
         int prev = 0;
         int j = 0;
         double[][][] d = new double[2][rows][cols];
-        for (int i = 0; i < rows; i++) {
+        for (int i = 0; i < nbItemRow.length; i++) {
             for (; j < prev + nbItemRow[i]; j++) {
                 d[0][i][colPos[j]] = realPart[j];
                 d[1][i][colPos[j]] = imaginaryPart[j];
@@ -437,7 +437,7 @@ public class ScilabSparse implements ScilabType {
         if (obj instanceof ScilabSparse) {
             ScilabSparse sciSparse = (ScilabSparse) obj;
             if (this.getNbNonNullItems() == sciSparse.getNbNonNullItems() &&
-                Arrays.equals(this.getNbItemRow(), sciSparse.getNbItemRow()) &&
+                compareNbItemRow(this.getNbItemRow(), sciSparse.getNbItemRow()) &&
                 Arrays.equals(this.getColPos(), sciSparse.getColPos())) {
                 if (this.isReal() && sciSparse.isReal()) {
                     return Arrays.equals(this.getRealPart(), sciSparse.getRealPart());
@@ -454,6 +454,47 @@ public class ScilabSparse implements ScilabType {
     }
 
     /**
+     * Compare two arrays containing the number of items by row.
+     * For example {1, 2, 3, 4} is equal to {1, 2, 3, 4, 0, 0, 0, 0}/
+     * @param a an array
+     * @param b an other array
+     * @return true if the arrays are equal
+     */
+    static final boolean compareNbItemRow(final int[] a, final int[] b) {
+        if (Arrays.equals(a, b)) {
+            return true;
+        }
+
+        if (a.length == b.length) {
+            return false;
+        }
+
+        int[] c, d;
+        if (a.length < b.length) {
+            c = a;
+            d = b;
+        } else {
+            c = b;
+            d = a;
+        }
+
+        int i = 0;
+        for (; i < c.length; i++) {
+            if (c[i] != d[i]) {
+                return false;
+            }
+        }
+
+        for (; i < d.length; i++) {
+            if (d[i] != 0) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
      * Display the representation in the Scilab language of the type<br />
      * Note that the representation can be copied/pasted straight into Scilab
      *
@@ -472,7 +513,7 @@ public class ScilabSparse implements ScilabType {
         result.append("sparse([");
         int j = 0;
         int prev = 0;
-        for (int i = 0; i < rows; i++) {
+        for (int i = 0; i < nbItemRow.length; i++) {
             for (; j < prev + nbItemRow[i]; j++) {
                 result.append(Integer.toString(i + 1));
                 result.append(", ");
index 039c64c..939477c 100644 (file)
@@ -145,8 +145,8 @@ public class testEquals {
                assert cMatrix.toString().equals("sparse([1, 1 ; 1, 2 ; 2, 1 ; 2, 2], [42.0+420.0*%i ; 43.0+430.0*%i ; 21.0+210.0*%i ; 22.0+220.0*%i], [2, 2])");
 
                ScilabSparse mySparse = new ScilabSparse(100, 100, 5, new int[] { 1, 1, 1, 1, 1}, new int[]{ 1, 25, 50, 75, 99}, new double[] { 1.0, 2.0, 3.0, 4.0, 5.0});
-//fails for now
-//             System.out.println(mySparse);
+        String ref="sparse([1, 2 ; 2, 26 ; 3, 51 ; 4, 76 ; 5, 100], [1.0 ; 2.0 ; 3.0 ; 4.0 ; 5.0], [100, 100])";
+               assert mySparse.toString().equals(ref);
        }