]> gerrit.simantics Code Review - simantics/python.git/blob - 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
1 package org.simantics.pythonlink;\r
2 \r
3 import java.util.Arrays;\r
4 \r
5 public class NDArray {\r
6     int[] dims;\r
7     double[] value;\r
8     \r
9     public NDArray(double[] value) {\r
10         this.value = value;\r
11         dims = new int[] { value.length };\r
12     }\r
13     \r
14     public NDArray(int m, int n, double[] value) {\r
15         if (n*m != value.length) throw new IllegalArgumentException("Invalid dimensions for data vector");\r
16         \r
17         this.value = value;\r
18         dims = new int[] { m, n };\r
19     }\r
20     \r
21     public NDArray(int[] dims, double[] value) {\r
22         int l = dims.length > 0 ? 1 : 0;\r
23         for (int d : dims) l *= d;\r
24         if (l != value.length) throw new IllegalArgumentException("Invalid dimensions for data vector");\r
25 \r
26         this.dims = dims;\r
27         this.value = value;\r
28     }\r
29     \r
30     public int size() { return value.length; }\r
31     public int[] dims() { return dims; }\r
32     public double[] getValues() { return value; }\r
33     \r
34     public double getValue(int index) { return value[index]; }\r
35     public double getValue(int i, int j) {\r
36         if (dims.length != 2) throw new IllegalArgumentException("Invalid indices for array of dimension " + dims.length);\r
37         \r
38         return value[dims[1] * i + j];\r
39     }\r
40     public double getValue(int... is) {\r
41         if (dims.length != is.length) throw new IllegalArgumentException("Invalid indices for array of dimension " + dims.length);\r
42         \r
43         int index = 0;\r
44         for (int k = 0; k < dims.length; k++) {\r
45             index = dims[k] * index + is[k];\r
46         }\r
47         return value[index];\r
48     }\r
49     \r
50     @Override\r
51     public boolean equals( Object o ) {\r
52         return o instanceof NDArray &&\r
53                Arrays.equals(dims, ((NDArray)o).dims) &&\r
54                Arrays.equals(value, ((NDArray)o).value);\r
55     }\r
56     \r
57     @Override\r
58     public int hashCode() {\r
59         return Arrays.hashCode(dims) + 11 * Arrays.hashCode(value); \r
60     }\r
61     \r
62     @Override\r
63     public String toString() {\r
64         StringBuilder sb = new StringBuilder();\r
65         sb.append("ndarray(");\r
66         for (int i = 0; i < dims.length; i++) {\r
67             if (i > 0) sb.append('x');\r
68             sb.append(dims[i]);\r
69         }\r
70         sb.append(") ");\r
71         \r
72         if (dims.length > 0)\r
73             buildString(sb, 0, 0);\r
74         else\r
75             sb.append("[]");\r
76         return sb.toString();\r
77     }\r
78 \r
79     private void buildString( StringBuilder sb, int d, int i ) {\r
80         if (d == dims.length) {\r
81             sb.append(value[i]);\r
82         }\r
83         else {\r
84             i *= dims[d];\r
85             sb.append('[');\r
86             for (int j = 0; j < dims[d]; j++) {\r
87                 if (j > 0) sb.append(", ");\r
88                 buildString(sb, d+1, i + j);\r
89             }\r
90             sb.append(']');\r
91         }\r
92     }\r
93 }\r