]> gerrit.simantics Code Review - simantics/python.git/blobdiff - org.simantics.pythonlink/src/org/simantics/pythonlink/NDArray.java
Initial commit of Python Integration feature.
[simantics/python.git] / org.simantics.pythonlink / src / org / simantics / pythonlink / NDArray.java
diff --git a/org.simantics.pythonlink/src/org/simantics/pythonlink/NDArray.java b/org.simantics.pythonlink/src/org/simantics/pythonlink/NDArray.java
new file mode 100644 (file)
index 0000000..69506e9
--- /dev/null
@@ -0,0 +1,93 @@
+package org.simantics.pythonlink;\r
+\r
+import java.util.Arrays;\r
+\r
+public class NDArray {\r
+    int[] dims;\r
+    double[] value;\r
+    \r
+    public NDArray(double[] value) {\r
+        this.value = value;\r
+        dims = new int[] { value.length };\r
+    }\r
+    \r
+    public NDArray(int m, int n, double[] value) {\r
+        if (n*m != value.length) throw new IllegalArgumentException("Invalid dimensions for data vector");\r
+        \r
+        this.value = value;\r
+        dims = new int[] { m, n };\r
+    }\r
+    \r
+    public NDArray(int[] dims, double[] value) {\r
+        int l = dims.length > 0 ? 1 : 0;\r
+        for (int d : dims) l *= d;\r
+        if (l != value.length) throw new IllegalArgumentException("Invalid dimensions for data vector");\r
+\r
+        this.dims = dims;\r
+        this.value = value;\r
+    }\r
+    \r
+    public int size() { return value.length; }\r
+    public int[] dims() { return dims; }\r
+    public double[] getValues() { return value; }\r
+    \r
+    public double getValue(int index) { return value[index]; }\r
+    public double getValue(int i, int j) {\r
+        if (dims.length != 2) throw new IllegalArgumentException("Invalid indices for array of dimension " + dims.length);\r
+        \r
+        return value[dims[1] * i + j];\r
+    }\r
+    public double getValue(int... is) {\r
+        if (dims.length != is.length) throw new IllegalArgumentException("Invalid indices for array of dimension " + dims.length);\r
+        \r
+        int index = 0;\r
+        for (int k = 0; k < dims.length; k++) {\r
+            index = dims[k] * index + is[k];\r
+        }\r
+        return value[index];\r
+    }\r
+    \r
+    @Override\r
+    public boolean equals( Object o ) {\r
+        return o instanceof NDArray &&\r
+               Arrays.equals(dims, ((NDArray)o).dims) &&\r
+               Arrays.equals(value, ((NDArray)o).value);\r
+    }\r
+    \r
+    @Override\r
+    public int hashCode() {\r
+        return Arrays.hashCode(dims) + 11 * Arrays.hashCode(value); \r
+    }\r
+    \r
+    @Override\r
+    public String toString() {\r
+        StringBuilder sb = new StringBuilder();\r
+        sb.append("ndarray(");\r
+        for (int i = 0; i < dims.length; i++) {\r
+            if (i > 0) sb.append('x');\r
+            sb.append(dims[i]);\r
+        }\r
+        sb.append(") ");\r
+        \r
+        if (dims.length > 0)\r
+            buildString(sb, 0, 0);\r
+        else\r
+            sb.append("[]");\r
+        return sb.toString();\r
+    }\r
+\r
+    private void buildString( StringBuilder sb, int d, int i ) {\r
+        if (d == dims.length) {\r
+            sb.append(value[i]);\r
+        }\r
+        else {\r
+            i *= dims[d];\r
+            sb.append('[');\r
+            for (int j = 0; j < dims[d]; j++) {\r
+                if (j > 0) sb.append(", ");\r
+                buildString(sb, d+1, i + j);\r
+            }\r
+            sb.append(']');\r
+        }\r
+    }\r
+}\r