1 package org.djunits.value.vdouble.matrix;
2
3 import org.djunits.unit.AbsoluteLinearUnit;
4 import org.djunits.unit.Unit;
5 import org.djunits.value.MathFunctionsAbs;
6 import org.djunits.value.Mutable;
7 import org.djunits.value.StorageType;
8 import org.djunits.value.ValueException;
9 import org.djunits.value.ValueUtil;
10 import org.djunits.value.vdouble.DoubleFunction;
11 import org.djunits.value.vdouble.DoubleMathFunctions;
12 import org.djunits.value.vdouble.scalar.AbstractDoubleScalarAbs;
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 abstract class AbstractMutableDoubleMatrixAbs<AU extends AbsoluteLinearUnit<AU, RU>, RU extends Unit<RU>,
32 A extends AbstractDoubleMatrixAbs<AU, RU, A, R, MA, S>, R extends AbstractDoubleMatrixRel<RU, R, ?, ?>,
33 MA extends AbstractMutableDoubleMatrixAbs<AU, RU, A, R, MA, S>, S extends AbstractDoubleScalarAbs<AU, S, RU, ?>>
34 extends AbstractDoubleMatrixAbs<AU, RU, A, R, MA, S> implements Mutable, MathFunctionsAbs<MA>, DoubleMathFunctions<MA>
35 {
36
37 private static final long serialVersionUID = 20151006L;
38
39
40 private boolean copyOnWrite = false;
41
42
43
44
45
46
47
48
49 AbstractMutableDoubleMatrixAbs(final double[][] values, final AU unit, final StorageType storageType) throws ValueException
50 {
51 super(values, unit, storageType);
52 }
53
54
55
56
57
58
59
60 AbstractMutableDoubleMatrixAbs(final S[][] values, final StorageType storageType) throws ValueException
61 {
62 super(values, storageType);
63 }
64
65
66
67
68
69
70 AbstractMutableDoubleMatrixAbs(final DoubleMatrixData data, final AU unit)
71 {
72 super(data, unit);
73 }
74
75
76
77
78
79 private boolean isCopyOnWrite()
80 {
81 return this.copyOnWrite;
82 }
83
84
85
86
87
88 final void setCopyOnWrite(final boolean copyOnWrite)
89 {
90 this.copyOnWrite = copyOnWrite;
91 }
92
93
94 @Override
95 public final MA mutable()
96 {
97 setCopyOnWrite(true);
98 final MA result = instantiateMutableType(getData(), getUnit());
99 result.setCopyOnWrite(true);
100 return result;
101 }
102
103
104
105
106
107 public final A immutable()
108 {
109 setCopyOnWrite(true);
110 return instantiateTypeAbs(getData(), getUnit());
111 }
112
113
114
115
116
117
118
119
120
121 public final MA copy()
122 {
123 return mutable();
124 }
125
126
127
128
129
130
131
132 @SuppressWarnings("unchecked")
133 public final MA incrementBy(final R increment) throws ValueException
134 {
135 checkCopyOnWrite();
136 this.data.incrementBy(increment.getData());
137 return (MA) this;
138 }
139
140
141
142
143
144
145 public final MA incrementBy(final S increment)
146 {
147 return incrementBy(increment.si);
148 }
149
150
151
152
153
154
155 @SuppressWarnings("unchecked")
156 public final MA incrementBy(final double increment)
157 {
158 checkCopyOnWrite();
159 this.data.incrementBy(increment);
160 return (MA) this;
161 }
162
163
164
165
166
167
168
169 @SuppressWarnings("unchecked")
170 public final MA decrementBy(final R decrement) throws ValueException
171 {
172 checkCopyOnWrite();
173 this.data.decrementBy(decrement.getData());
174 return (MA) this;
175 }
176
177
178
179
180
181
182 public final MA decrementBy(final S decrement)
183 {
184 return decrementBy(decrement.si);
185 }
186
187
188
189
190
191
192 @SuppressWarnings("unchecked")
193 public final MA decrementBy(final double decrement)
194 {
195 checkCopyOnWrite();
196 this.data.decrementBy(decrement);
197 return (MA) this;
198 }
199
200
201 @SuppressWarnings("unchecked")
202 @Override
203 public final MA multiplyBy(final double factor)
204 {
205 checkCopyOnWrite();
206 this.data.multiplyBy(factor);
207 return (MA) this;
208 }
209
210
211 @Override
212 @SuppressWarnings({ "checkstyle:designforextension", "unchecked" })
213 public MA divideBy(final double factor)
214 {
215 this.data.divideBy(factor);
216 return (MA) this;
217 }
218
219
220
221
222
223
224
225 @SuppressWarnings("unchecked")
226 public final MA multiplyBy(final R factors) throws ValueException
227 {
228 checkCopyOnWrite();
229 this.data.multiplyBy(factors.getData());
230 return (MA) this;
231 }
232
233
234
235
236
237
238
239
240
241
242
243 public final void assign(final DoubleFunction doubleFunction)
244 {
245 checkCopyOnWrite();
246 if (this.data instanceof DoubleMatrixDataDense)
247 {
248 ((DoubleMatrixDataDense) this.data).assign(doubleFunction);
249 }
250 else
251 {
252 DoubleMatrixDataDense dvdd = ((DoubleMatrixDataSparse) this.data).toDense();
253 dvdd.assign(doubleFunction);
254 this.data = dvdd.toSparse();
255 }
256 }
257
258
259 @Override
260 @SuppressWarnings("unchecked")
261 public final MA ceil()
262 {
263 assign(DoubleMathFunctions.CEIL);
264 return (MA) this;
265 }
266
267
268 @Override
269 @SuppressWarnings("unchecked")
270 public final MA floor()
271 {
272 assign(DoubleMathFunctions.FLOOR);
273 return (MA) this;
274 }
275
276
277 @Override
278 @SuppressWarnings("unchecked")
279 public final MA rint()
280 {
281 assign(DoubleMathFunctions.RINT);
282 return (MA) this;
283 }
284
285
286 @Override
287 @SuppressWarnings("unchecked")
288 public final MA round()
289 {
290 assign(DoubleMathFunctions.ROUND);
291 return (MA) this;
292 }
293
294
295
296
297 protected final void checkCopyOnWrite()
298 {
299 if (isCopyOnWrite())
300 {
301 this.data = this.data.copy();
302 setCopyOnWrite(false);
303 }
304 }
305
306
307
308
309
310
311
312
313 public final void setSI(final int row, final int column, final double valueSI) throws ValueException
314 {
315 checkIndex(row, column);
316 checkCopyOnWrite();
317 this.data.setSI(row, column, valueSI);
318 }
319
320
321
322
323
324
325
326
327 public final void set(final int row, final int column, final S value) throws ValueException
328 {
329 setSI(row, column, value.getSI());
330 }
331
332
333
334
335
336
337
338
339
340 public final void setInUnit(final int row, final int column, final double value, final AU valueUnit) throws ValueException
341 {
342 setSI(row, column, ValueUtil.expressAsSIUnit(value, valueUnit));
343 }
344
345
346
347
348
349 public final void normalize() throws ValueException
350 {
351 double sum = zSum();
352 if (0 == sum)
353 {
354 throw new ValueException("zSum is 0; cannot normalize");
355 }
356 checkCopyOnWrite();
357 this.data.divideBy(sum);
358 }
359 }