--- /dev/null
+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