1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.math3.ml.neuralnet.oned;
19
20 import java.io.Serializable;
21 import java.io.ObjectInputStream;
22 import org.apache.commons.math3.ml.neuralnet.Network;
23 import org.apache.commons.math3.ml.neuralnet.FeatureInitializer;
24 import org.apache.commons.math3.exception.NumberIsTooSmallException;
25 import org.apache.commons.math3.exception.OutOfRangeException;
26
27
28
29
30
31
32
33 public class NeuronString implements Serializable {
34
35 private static final long serialVersionUID = 1L;
36
37 private final Network network;
38
39 private final int size;
40
41 private final boolean wrap;
42
43
44
45
46
47 private final long[] identifiers;
48
49
50
51
52
53
54
55
56
57
58 NeuronString(boolean wrap,
59 double[][] featuresList) {
60 size = featuresList.length;
61
62 if (size < 2) {
63 throw new NumberIsTooSmallException(size, 2, true);
64 }
65
66 this.wrap = wrap;
67
68 final int fLen = featuresList[0].length;
69 network = new Network(0, fLen);
70 identifiers = new long[size];
71
72
73 for (int i = 0; i < size; i++) {
74 identifiers[i] = network.createNeuron(featuresList[i]);
75 }
76
77
78 createLinks();
79 }
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 public NeuronString(int num,
101 boolean wrap,
102 FeatureInitializer[] featureInit) {
103 if (num < 2) {
104 throw new NumberIsTooSmallException(num, 2, true);
105 }
106
107 size = num;
108 this.wrap = wrap;
109 identifiers = new long[num];
110
111 final int fLen = featureInit.length;
112 network = new Network(0, fLen);
113
114
115 for (int i = 0; i < num; i++) {
116 final double[] features = new double[fLen];
117 for (int fIndex = 0; fIndex < fLen; fIndex++) {
118 features[fIndex] = featureInit[fIndex].value();
119 }
120 identifiers[i] = network.createNeuron(features);
121 }
122
123
124 createLinks();
125 }
126
127
128
129
130
131
132
133
134
135
136 public Network getNetwork() {
137 return network;
138 }
139
140
141
142
143
144
145 public int getSize() {
146 return size;
147 }
148
149
150
151
152
153
154
155
156
157 public double[] getFeatures(int i) {
158 if (i < 0 ||
159 i >= size) {
160 throw new OutOfRangeException(i, 0, size - 1);
161 }
162
163 return network.getNeuron(identifiers[i]).getFeatures();
164 }
165
166
167
168
169 private void createLinks() {
170 for (int i = 0; i < size - 1; i++) {
171 network.addLink(network.getNeuron(i), network.getNeuron(i + 1));
172 }
173 for (int i = size - 1; i > 0; i--) {
174 network.addLink(network.getNeuron(i), network.getNeuron(i - 1));
175 }
176 if (wrap) {
177 network.addLink(network.getNeuron(0), network.getNeuron(size - 1));
178 network.addLink(network.getNeuron(size - 1), network.getNeuron(0));
179 }
180 }
181
182
183
184
185
186
187 private void readObject(ObjectInputStream in) {
188 throw new IllegalStateException();
189 }
190
191
192
193
194
195
196 private Object writeReplace() {
197 final double[][] featuresList = new double[size][];
198 for (int i = 0; i < size; i++) {
199 featuresList[i] = getFeatures(i);
200 }
201
202 return new SerializationProxy(wrap,
203 featuresList);
204 }
205
206
207
208
209 private static class SerializationProxy implements Serializable {
210
211 private static final long serialVersionUID = 20130226L;
212
213 private final boolean wrap;
214
215 private final double[][] featuresList;
216
217
218
219
220
221
222 SerializationProxy(boolean wrap,
223 double[][] featuresList) {
224 this.wrap = wrap;
225 this.featuresList = featuresList;
226 }
227
228
229
230
231
232
233 private Object readResolve() {
234 return new NeuronString(wrap,
235 featuresList);
236 }
237 }
238 }