1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.hipparchus.analysis.differentiation;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.Field;
21 import org.hipparchus.exception.MathIllegalArgumentException;
22 import org.hipparchus.exception.MathRuntimeException;
23 import org.hipparchus.util.FieldSinCos;
24 import org.hipparchus.util.FieldSinhCosh;
25 import org.hipparchus.util.MathArrays;
26 import org.hipparchus.util.MathUtils;
27
28 import java.util.Arrays;
29
30
31
32
33
34
35
36
37
38
39 public class FieldDerivativeStructure<T extends CalculusFieldElement<T>>
40 implements FieldDerivative<T, FieldDerivativeStructure<T>> {
41
42
43 private final FDSFactory<T> factory;
44
45
46 private final T[] data;
47
48
49
50
51
52 FieldDerivativeStructure(final FDSFactory<T> factory, final T[] data) {
53 this.factory = factory;
54 this.data = data.clone();
55 }
56
57
58
59
60
61 FieldDerivativeStructure(final FDSFactory<T> factory) {
62 this.factory = factory;
63 this.data = MathArrays.buildArray(factory.getValueField(), factory.getCompiler().getSize());
64 }
65
66
67 @Override
68 public FieldDerivativeStructure<T> newInstance(final double value) {
69 return factory.constant(value);
70 }
71
72
73 @Override
74 public FieldDerivativeStructure<T> newInstance(final T value) {
75 return factory.constant(value);
76 }
77
78
79 @Override
80 public FieldDerivativeStructure<T> withValue(final T value) {
81 final FieldDerivativeStructure<T> ds = factory.build();
82 System.arraycopy(data, 1, ds.data, 1, data.length - 1);
83 ds.data[0] = value;
84 return ds;
85 }
86
87
88
89
90 public FDSFactory<T> getFactory() {
91 return factory;
92 }
93
94
95 @Override
96 public int getFreeParameters() {
97 return getFactory().getCompiler().getFreeParameters();
98 }
99
100
101 @Override
102 public int getOrder() {
103 return getFactory().getCompiler().getOrder();
104 }
105
106
107
108
109
110
111
112
113
114
115
116
117 void setDerivativeComponent(final int index, final T value) {
118 data[index] = value;
119 }
120
121
122
123
124
125
126
127
128
129
130
131
132 T getDerivativeComponent(final int index) {
133 return data[index];
134 }
135
136
137 @Override
138 public FieldDerivativeStructure<T> getAddendum() {
139 final T[] addendum = data.clone();
140 addendum[0] = addendum[0].getField().getZero();
141 return new FieldDerivativeStructure<>(factory, addendum);
142 }
143
144
145
146
147
148 @Override
149 public T getValue() {
150 return data[0];
151 }
152
153
154 @Override
155 public T getPartialDerivative(final int ... orders)
156 throws MathIllegalArgumentException {
157 return data[factory.getCompiler().getPartialDerivativeIndex(orders)];
158 }
159
160
161
162
163
164 public T[] getAllDerivatives() {
165 return data.clone();
166 }
167
168
169
170 @Override
171 public FieldDerivativeStructure<T> add(final double a) {
172 final FieldDerivativeStructure<T> ds = factory.build();
173 System.arraycopy(data, 0, ds.data, 0, data.length);
174 ds.data[0] = ds.data[0].add(a);
175 return ds;
176 }
177
178
179
180
181
182 @Override
183 public FieldDerivativeStructure<T> add(final FieldDerivativeStructure<T> a)
184 throws MathIllegalArgumentException {
185 factory.checkCompatibility(a.factory);
186 final FieldDerivativeStructure<T> ds = factory.build();
187 factory.getCompiler().add(data, 0, a.data, 0, ds.data, 0);
188 return ds;
189 }
190
191
192
193 @Override
194 public FieldDerivativeStructure<T> subtract(final double a) {
195 final FieldDerivativeStructure<T> ds = factory.build();
196 System.arraycopy(data, 0, ds.data, 0, data.length);
197 ds.data[0] = ds.data[0].subtract(a);
198 return ds;
199 }
200
201
202
203
204
205 @Override
206 public FieldDerivativeStructure<T> subtract(final FieldDerivativeStructure<T> a)
207 throws MathIllegalArgumentException {
208 factory.checkCompatibility(a.factory);
209 final FieldDerivativeStructure<T> ds = factory.build();
210 factory.getCompiler().subtract(data, 0, a.data, 0, ds.data, 0);
211 return ds;
212 }
213
214
215
216
217
218 public FieldDerivativeStructure<T> multiply(final T a) {
219 final FieldDerivativeStructure<T> ds = factory.build();
220 for (int i = 0; i < ds.data.length; ++i) {
221 ds.data[i] = data[i].multiply(a);
222 }
223 return ds;
224 }
225
226
227
228 @Override
229 public FieldDerivativeStructure<T> multiply(final double a) {
230 final FieldDerivativeStructure<T> ds = factory.build();
231 for (int i = 0; i < ds.data.length; ++i) {
232 ds.data[i] = data[i].multiply(a);
233 }
234 return ds;
235 }
236
237
238
239
240
241 @Override
242 public FieldDerivativeStructure<T> multiply(final FieldDerivativeStructure<T> a)
243 throws MathIllegalArgumentException {
244 factory.checkCompatibility(a.factory);
245 final FieldDerivativeStructure<T> result = factory.build();
246 factory.getCompiler().multiply(data, 0, a.data, 0, result.data, 0);
247 return result;
248 }
249
250
251 @Override
252 public FieldDerivativeStructure<T> square() {
253 return multiply(this);
254 }
255
256
257
258
259
260 public FieldDerivativeStructure<T> divide(final T a) {
261 final FieldDerivativeStructure<T> ds = factory.build();
262 for (int i = 0; i < ds.data.length; ++i) {
263 ds.data[i] = data[i].divide(a);
264 }
265 return ds;
266 }
267
268
269
270 @Override
271 public FieldDerivativeStructure<T> divide(final double a) {
272 final FieldDerivativeStructure<T> ds = factory.build();
273 for (int i = 0; i < ds.data.length; ++i) {
274 ds.data[i] = data[i].divide(a);
275 }
276 return ds;
277 }
278
279
280
281
282
283 @Override
284 public FieldDerivativeStructure<T> divide(final FieldDerivativeStructure<T> a)
285 throws MathIllegalArgumentException {
286 factory.checkCompatibility(a.factory);
287 final FieldDerivativeStructure<T> result = factory.build();
288 factory.getCompiler().divide(data, 0, a.data, 0, result.data, 0);
289 return result;
290 }
291
292
293
294
295
296
297 public FieldDerivativeStructure<T> remainder(final T a) {
298 final FieldDerivativeStructure<T> ds = factory.build();
299 System.arraycopy(data, 0, ds.data, 0, data.length);
300 ds.data[0] = data[0].remainder(a);
301 return ds;
302 }
303
304
305 @Override
306 public FieldDerivativeStructure<T> remainder(final double a) {
307 final FieldDerivativeStructure<T> ds = factory.build();
308 System.arraycopy(data, 0, ds.data, 0, data.length);
309 ds.data[0] = data[0].remainder(a);
310 return ds;
311 }
312
313
314
315
316
317 @Override
318 public FieldDerivativeStructure<T> remainder(final FieldDerivativeStructure<T> a)
319 throws MathIllegalArgumentException {
320 factory.checkCompatibility(a.factory);
321 final FieldDerivativeStructure<T> result = factory.build();
322 factory.getCompiler().remainder(data, 0, a.data, 0, result.data, 0);
323 return result;
324 }
325
326
327 @Override
328 public FieldDerivativeStructure<T> negate() {
329 final FieldDerivativeStructure<T> ds = factory.build();
330 for (int i = 0; i < ds.data.length; ++i) {
331 ds.data[i] = data[i].negate();
332 }
333 return ds;
334 }
335
336
337
338 @Override
339 public FieldDerivativeStructure<T> abs() {
340 if (Double.doubleToLongBits(data[0].getReal()) < 0) {
341
342 return negate();
343 } else {
344 return this;
345 }
346 }
347
348
349
350
351
352
353
354
355 public FieldDerivativeStructure<T> copySign(final T sign) {
356 long m = Double.doubleToLongBits(data[0].getReal());
357 long s = Double.doubleToLongBits(sign.getReal());
358 if ((m >= 0 && s >= 0) || (m < 0 && s < 0)) {
359 return this;
360 }
361 return negate();
362 }
363
364
365
366 @Override
367 public FieldDerivativeStructure<T> copySign(final double sign) {
368 long m = Double.doubleToLongBits(data[0].getReal());
369 long s = Double.doubleToLongBits(sign);
370 if ((m >= 0 && s >= 0) || (m < 0 && s < 0)) {
371 return this;
372 }
373 return negate();
374 }
375
376
377
378 @Override
379 public FieldDerivativeStructure<T> copySign(final FieldDerivativeStructure<T> sign) {
380 long m = Double.doubleToLongBits(data[0].getReal());
381 long s = Double.doubleToLongBits(sign.data[0].getReal());
382 if ((m >= 0 && s >= 0) || (m < 0 && s < 0)) {
383 return this;
384 }
385 return negate();
386 }
387
388
389
390 @Override
391 public FieldDerivativeStructure<T> scalb(final int n) {
392 final FieldDerivativeStructure<T> ds = factory.build();
393 for (int i = 0; i < ds.data.length; ++i) {
394 ds.data[i] = data[i].scalb(n);
395 }
396 return ds;
397 }
398
399
400
401
402
403 @Override
404 public FieldDerivativeStructure<T> hypot(final FieldDerivativeStructure<T> y)
405 throws MathIllegalArgumentException {
406
407 factory.checkCompatibility(y.factory);
408
409 if (data[0].isInfinite() || y.data[0].isInfinite()) {
410 return factory.constant(Double.POSITIVE_INFINITY);
411 } else if (data[0].isNaN() || y.data[0].isNaN()) {
412 return factory.constant(Double.NaN);
413 } else {
414
415 final int expX = getExponent();
416 final int expY = y.getExponent();
417 if (expX > expY + 27) {
418
419 return abs();
420 } else if (expY > expX + 27) {
421
422 return y.abs();
423 } else {
424
425
426 final int middleExp = (expX + expY) / 2;
427
428
429 final FieldDerivativeStructure<T> scaledX = scalb(-middleExp);
430 final FieldDerivativeStructure<T> scaledY = y.scalb(-middleExp);
431
432
433 final FieldDerivativeStructure<T> scaledH =
434 scaledX.multiply(scaledX).add(scaledY.multiply(scaledY)).sqrt();
435
436
437 return scaledH.scalb(middleExp);
438
439 }
440
441 }
442 }
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461 public static <T extends CalculusFieldElement<T>> FieldDerivativeStructure<T>
462 hypot(final FieldDerivativeStructure<T> x, final FieldDerivativeStructure<T> y)
463 throws MathIllegalArgumentException {
464 return x.hypot(y);
465 }
466
467
468
469
470
471
472
473
474
475 @SafeVarargs
476 public final FieldDerivativeStructure<T> compose(final T ... f)
477 throws MathIllegalArgumentException {
478
479 MathUtils.checkDimension(f.length, getOrder() + 1);
480 final FieldDerivativeStructure<T> result = factory.build();
481 factory.getCompiler().compose(data, 0, f, result.data, 0);
482 return result;
483 }
484
485
486
487
488
489
490
491
492
493 public FieldDerivativeStructure<T> compose(final double ... f)
494 throws MathIllegalArgumentException {
495
496 MathUtils.checkDimension(f.length, getOrder() + 1);
497 final FieldDerivativeStructure<T> result = factory.build();
498 factory.getCompiler().compose(data, 0, f, result.data, 0);
499 return result;
500 }
501
502
503 @Override
504 public FieldDerivativeStructure<T> reciprocal() {
505 final FieldDerivativeStructure<T> result = factory.build();
506 factory.getCompiler().reciprocal(data, 0, result.data, 0);
507 return result;
508 }
509
510
511
512 @Override
513 public FieldDerivativeStructure<T> sqrt() {
514 final FieldDerivativeStructure<T> result = factory.build();
515 factory.getCompiler().sqrt(data, 0, result.data, 0);
516 return result;
517 }
518
519
520
521 @Override
522 public FieldDerivativeStructure<T> rootN(final int n) {
523 final FieldDerivativeStructure<T> result = factory.build();
524 factory.getCompiler().rootN(data, 0, n, result.data, 0);
525 return result;
526 }
527
528
529 @Override
530 public Field<FieldDerivativeStructure<T>> getField() {
531 return factory.getDerivativeField();
532 }
533
534
535
536
537
538
539
540 public static <T extends CalculusFieldElement<T>> FieldDerivativeStructure<T> pow(final double a, final FieldDerivativeStructure<T> x) {
541 final FieldDerivativeStructure<T> result = x.factory.build();
542 x.factory.getCompiler().pow(a, x.data, 0, result.data, 0);
543 return result;
544 }
545
546
547
548 @Override
549 public FieldDerivativeStructure<T> pow(final double p) {
550 final FieldDerivativeStructure<T> result = factory.build();
551 factory.getCompiler().pow(data, 0, p, result.data, 0);
552 return result;
553 }
554
555
556
557 @Override
558 public FieldDerivativeStructure<T> pow(final int n) {
559 final FieldDerivativeStructure<T> result = factory.build();
560 factory.getCompiler().pow(data, 0, n, result.data, 0);
561 return result;
562 }
563
564
565
566
567
568 @Override
569 public FieldDerivativeStructure<T> pow(final FieldDerivativeStructure<T> e)
570 throws MathIllegalArgumentException {
571 factory.checkCompatibility(e.factory);
572 final FieldDerivativeStructure<T> result = factory.build();
573 factory.getCompiler().pow(data, 0, e.data, 0, result.data, 0);
574 return result;
575 }
576
577
578
579 @Override
580 public FieldDerivativeStructure<T> exp() {
581 final FieldDerivativeStructure<T> result = factory.build();
582 factory.getCompiler().exp(data, 0, result.data, 0);
583 return result;
584 }
585
586
587
588 @Override
589 public FieldDerivativeStructure<T> expm1() {
590 final FieldDerivativeStructure<T> result = factory.build();
591 factory.getCompiler().expm1(data, 0, result.data, 0);
592 return result;
593 }
594
595
596
597 @Override
598 public FieldDerivativeStructure<T> log() {
599 final FieldDerivativeStructure<T> result = factory.build();
600 factory.getCompiler().log(data, 0, result.data, 0);
601 return result;
602 }
603
604
605
606 @Override
607 public FieldDerivativeStructure<T> log1p() {
608 final FieldDerivativeStructure<T> result = factory.build();
609 factory.getCompiler().log1p(data, 0, result.data, 0);
610 return result;
611 }
612
613
614
615
616 @Override
617 public FieldDerivativeStructure<T> log10() {
618 final FieldDerivativeStructure<T> result = factory.build();
619 factory.getCompiler().log10(data, 0, result.data, 0);
620 return result;
621 }
622
623
624
625 @Override
626 public FieldDerivativeStructure<T> cos() {
627 final FieldDerivativeStructure<T> result = factory.build();
628 factory.getCompiler().cos(data, 0, result.data, 0);
629 return result;
630 }
631
632
633
634 @Override
635 public FieldDerivativeStructure<T> sin() {
636 final FieldDerivativeStructure<T> result = factory.build();
637 factory.getCompiler().sin(data, 0, result.data, 0);
638 return result;
639 }
640
641
642
643 @Override
644 public FieldSinCos<FieldDerivativeStructure<T>> sinCos() {
645 final FieldDerivativeStructure<T> sin = factory.build();
646 final FieldDerivativeStructure<T> cos = factory.build();
647 factory.getCompiler().sinCos(data, 0, sin.data, 0, cos.data, 0);
648 return new FieldSinCos<>(sin, cos);
649 }
650
651
652
653 @Override
654 public FieldDerivativeStructure<T> tan() {
655 final FieldDerivativeStructure<T> result = factory.build();
656 factory.getCompiler().tan(data, 0, result.data, 0);
657 return result;
658 }
659
660
661
662 @Override
663 public FieldDerivativeStructure<T> acos() {
664 final FieldDerivativeStructure<T> result = factory.build();
665 factory.getCompiler().acos(data, 0, result.data, 0);
666 return result;
667 }
668
669
670
671 @Override
672 public FieldDerivativeStructure<T> asin() {
673 final FieldDerivativeStructure<T> result = factory.build();
674 factory.getCompiler().asin(data, 0, result.data, 0);
675 return result;
676 }
677
678
679
680 @Override
681 public FieldDerivativeStructure<T> atan() {
682 final FieldDerivativeStructure<T> result = factory.build();
683 factory.getCompiler().atan(data, 0, result.data, 0);
684 return result;
685 }
686
687
688
689 @Override
690 public FieldDerivativeStructure<T> atan2(final FieldDerivativeStructure<T> x)
691 throws MathIllegalArgumentException {
692 factory.checkCompatibility(x.factory);
693 final FieldDerivativeStructure<T> result = factory.build();
694 factory.getCompiler().atan2(data, 0, x.data, 0, result.data, 0);
695 return result;
696 }
697
698
699
700
701
702
703
704
705
706 public static <T extends CalculusFieldElement<T>> FieldDerivativeStructure<T> atan2(final FieldDerivativeStructure<T> y,
707 final FieldDerivativeStructure<T> x)
708 throws MathIllegalArgumentException {
709 return y.atan2(x);
710 }
711
712
713
714 @Override
715 public FieldDerivativeStructure<T> cosh() {
716 final FieldDerivativeStructure<T> result = factory.build();
717 factory.getCompiler().cosh(data, 0, result.data, 0);
718 return result;
719 }
720
721
722
723 @Override
724 public FieldDerivativeStructure<T> sinh() {
725 final FieldDerivativeStructure<T> result = factory.build();
726 factory.getCompiler().sinh(data, 0, result.data, 0);
727 return result;
728 }
729
730
731
732 @Override
733 public FieldSinhCosh<FieldDerivativeStructure<T>> sinhCosh() {
734 final FieldDerivativeStructure<T> sinh = factory.build();
735 final FieldDerivativeStructure<T> cosh = factory.build();
736 factory.getCompiler().sinhCosh(data, 0, sinh.data, 0, cosh.data, 0);
737 return new FieldSinhCosh<>(sinh, cosh);
738 }
739
740
741
742 @Override
743 public FieldDerivativeStructure<T> tanh() {
744 final FieldDerivativeStructure<T> result = factory.build();
745 factory.getCompiler().tanh(data, 0, result.data, 0);
746 return result;
747 }
748
749
750
751 @Override
752 public FieldDerivativeStructure<T> acosh() {
753 final FieldDerivativeStructure<T> result = factory.build();
754 factory.getCompiler().acosh(data, 0, result.data, 0);
755 return result;
756 }
757
758
759
760 @Override
761 public FieldDerivativeStructure<T> asinh() {
762 final FieldDerivativeStructure<T> result = factory.build();
763 factory.getCompiler().asinh(data, 0, result.data, 0);
764 return result;
765 }
766
767
768
769 @Override
770 public FieldDerivativeStructure<T> atanh() {
771 final FieldDerivativeStructure<T> result = factory.build();
772 factory.getCompiler().atanh(data, 0, result.data, 0);
773 return result;
774 }
775
776
777 @Override
778 public FieldDerivativeStructure<T> toDegrees() {
779 final FieldDerivativeStructure<T> ds = factory.build();
780 for (int i = 0; i < ds.data.length; ++i) {
781 ds.data[i] = data[i].toDegrees();
782 }
783 return ds;
784 }
785
786
787 @Override
788 public FieldDerivativeStructure<T> toRadians() {
789 final FieldDerivativeStructure<T> ds = factory.build();
790 for (int i = 0; i < ds.data.length; ++i) {
791 ds.data[i] = data[i].toRadians();
792 }
793 return ds;
794 }
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810 public FieldDerivativeStructure<T> integrate(final int varIndex, final int integrationOrder) {
811
812
813 if (integrationOrder > getOrder()) {
814 return factory.constant(0.);
815 } else if (integrationOrder == 0) {
816 return factory.build(data);
817 }
818
819
820 if (integrationOrder < 0) {
821 return differentiate(varIndex, -integrationOrder);
822 }
823
824 final T[] newData = MathArrays.buildArray(factory.getValueField(), data.length);
825 final DSCompiler dsCompiler = factory.getCompiler();
826 for (int i = 0; i < newData.length; i++) {
827 if (!data[i].isZero()) {
828 final int[] orders = dsCompiler.getPartialDerivativeOrders(i);
829 int sum = 0;
830 for (int order : orders) {
831 sum += order;
832 }
833 if (sum + integrationOrder <= getOrder()) {
834 final int saved = orders[varIndex];
835 orders[varIndex] += integrationOrder;
836 final int index = dsCompiler.getPartialDerivativeIndex(orders);
837 orders[varIndex] = saved;
838 newData[index] = data[i];
839 }
840 }
841 }
842
843 return factory.build(newData);
844 }
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860 public FieldDerivativeStructure<T> differentiate(final int varIndex, final int differentiationOrder) {
861
862
863 if (differentiationOrder > getOrder()) {
864 return factory.constant(0.);
865 } else if (differentiationOrder == 0) {
866 return factory.build(data);
867 }
868
869
870 if (differentiationOrder < 0) {
871 return integrate(varIndex, -differentiationOrder);
872 }
873
874 final T[] newData = MathArrays.buildArray(factory.getValueField(), data.length);
875 final DSCompiler dsCompiler = factory.getCompiler();
876 for (int i = 0; i < newData.length; i++) {
877 if (!data[i].isZero()) {
878 final int[] orders = dsCompiler.getPartialDerivativeOrders(i);
879 if (orders[varIndex] - differentiationOrder >= 0) {
880 final int saved = orders[varIndex];
881 orders[varIndex] -= differentiationOrder;
882 final int index = dsCompiler.getPartialDerivativeIndex(orders);
883 orders[varIndex] = saved;
884 newData[index] = data[i];
885 }
886 }
887 }
888
889 return factory.build(newData);
890 }
891
892
893
894
895
896
897 @SafeVarargs
898 public final T taylor(final T ... delta) throws MathRuntimeException {
899 return factory.getCompiler().taylor(data, 0, delta);
900 }
901
902
903
904
905
906
907 public T taylor(final double ... delta) throws MathRuntimeException {
908 return factory.getCompiler().taylor(data, 0, delta);
909 }
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946 public FieldDerivativeStructure<T> rebase(@SuppressWarnings("unchecked") final FieldDerivativeStructure<T>... p) {
947
948 MathUtils.checkDimension(getFreeParameters(), p.length);
949
950
951 if (p.length == 0) {
952 return this;
953 }
954
955 final int pSize = p[0].getFactory().getCompiler().getSize();
956 final T[] pData = MathArrays.buildArray(p[0].getFactory().getValueField(), p.length * pSize);
957 for (int i = 0; i < p.length; ++i) {
958 MathUtils.checkDimension(getOrder(), p[i].getOrder());
959 MathUtils.checkDimension(p[0].getFreeParameters(), p[i].getFreeParameters());
960 System.arraycopy(p[i].data, 0, pData, i * pSize, pSize);
961 }
962
963 final FieldDerivativeStructure<T> result = p[0].factory.build();
964 factory.getCompiler().rebase(data, 0, p[0].factory.getCompiler(), pData, result.data, 0);
965 return result;
966
967 }
968
969
970
971
972
973 @Override
974 public FieldDerivativeStructure<T> linearCombination(final FieldDerivativeStructure<T>[] a,
975 final FieldDerivativeStructure<T>[] b)
976 throws MathIllegalArgumentException {
977
978
979 final T[] aT = MathArrays.buildArray(factory.getValueField(), a.length);
980 for (int i = 0; i < a.length; ++i) {
981 aT[i] = a[i].getValue();
982 }
983 final T[] bT = MathArrays.buildArray(factory.getValueField(), b.length);
984 for (int i = 0; i < b.length; ++i) {
985 bT[i] = b[i].getValue();
986 }
987 final T accurateValue = aT[0].linearCombination(aT, bT);
988
989
990 FieldDerivativeStructure<T> simpleValue = a[0].getField().getZero();
991 for (int i = 0; i < a.length; ++i) {
992 simpleValue = simpleValue.add(a[i].multiply(b[i]));
993 }
994
995
996 final T[] all = simpleValue.getAllDerivatives();
997 all[0] = accurateValue;
998 return factory.build(all);
999
1000 }
1001
1002
1003
1004
1005
1006
1007
1008
1009 public FieldDerivativeStructure<T> linearCombination(final T[] a, final FieldDerivativeStructure<T>[] b)
1010 throws MathIllegalArgumentException {
1011
1012
1013 final T[] bT = MathArrays.buildArray(factory.getValueField(), b.length);
1014 for (int i = 0; i < b.length; ++i) {
1015 bT[i] = b[i].getValue();
1016 }
1017 final T accurateValue = bT[0].linearCombination(a, bT);
1018
1019
1020 FieldDerivativeStructure<T> simpleValue = b[0].getField().getZero();
1021 for (int i = 0; i < a.length; ++i) {
1022 simpleValue = simpleValue.add(b[i].multiply(a[i]));
1023 }
1024
1025
1026 final T[] all = simpleValue.getAllDerivatives();
1027 all[0] = accurateValue;
1028 return factory.build(all);
1029
1030 }
1031
1032
1033
1034
1035
1036 @Override
1037 public FieldDerivativeStructure<T> linearCombination(final double[] a, final FieldDerivativeStructure<T>[] b)
1038 throws MathIllegalArgumentException {
1039
1040
1041 final T[] bT = MathArrays.buildArray(factory.getValueField(), b.length);
1042 for (int i = 0; i < b.length; ++i) {
1043 bT[i] = b[i].getValue();
1044 }
1045 final T accurateValue = bT[0].linearCombination(a, bT);
1046
1047
1048 FieldDerivativeStructure<T> simpleValue = b[0].getField().getZero();
1049 for (int i = 0; i < a.length; ++i) {
1050 simpleValue = simpleValue.add(b[i].multiply(a[i]));
1051 }
1052
1053
1054 final T[] all = simpleValue.getAllDerivatives();
1055 all[0] = accurateValue;
1056 return factory.build(all);
1057
1058 }
1059
1060
1061
1062
1063
1064 @Override
1065 public FieldDerivativeStructure<T> linearCombination(final FieldDerivativeStructure<T> a1, final FieldDerivativeStructure<T> b1,
1066 final FieldDerivativeStructure<T> a2, final FieldDerivativeStructure<T> b2)
1067 throws MathIllegalArgumentException {
1068
1069
1070 final T accurateValue = a1.getValue().linearCombination(a1.getValue(), b1.getValue(),
1071 a2.getValue(), b2.getValue());
1072
1073
1074 final FieldDerivativeStructure<T> simpleValue = a1.multiply(b1).add(a2.multiply(b2));
1075
1076
1077 final T[] all = simpleValue.getAllDerivatives();
1078 all[0] = accurateValue;
1079 return factory.build(all);
1080
1081 }
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095 public FieldDerivativeStructure<T> linearCombination(final T a1, final FieldDerivativeStructure<T> b1,
1096 final T a2, final FieldDerivativeStructure<T> b2)
1097 throws MathIllegalArgumentException {
1098
1099 factory.checkCompatibility(b1.factory);
1100 factory.checkCompatibility(b2.factory);
1101
1102 final FieldDerivativeStructure<T> ds = factory.build();
1103 factory.getCompiler().linearCombination(a1, b1.data, 0,
1104 a2, b2.data, 0,
1105 ds.data, 0);
1106
1107 return ds;
1108
1109 }
1110
1111
1112
1113
1114
1115 @Override
1116 public FieldDerivativeStructure<T> linearCombination(final double a1, final FieldDerivativeStructure<T> b1,
1117 final double a2, final FieldDerivativeStructure<T> b2)
1118 throws MathIllegalArgumentException {
1119
1120 factory.checkCompatibility(b1.factory);
1121 factory.checkCompatibility(b2.factory);
1122
1123 final FieldDerivativeStructure<T> ds = factory.build();
1124 factory.getCompiler().linearCombination(a1, b1.data, 0,
1125 a2, b2.data, 0,
1126 ds.data, 0);
1127
1128 return ds;
1129
1130 }
1131
1132
1133
1134
1135
1136 @Override
1137 public FieldDerivativeStructure<T> linearCombination(final FieldDerivativeStructure<T> a1, final FieldDerivativeStructure<T> b1,
1138 final FieldDerivativeStructure<T> a2, final FieldDerivativeStructure<T> b2,
1139 final FieldDerivativeStructure<T> a3, final FieldDerivativeStructure<T> b3)
1140 throws MathIllegalArgumentException {
1141
1142
1143 final T accurateValue = a1.getValue().linearCombination(a1.getValue(), b1.getValue(),
1144 a2.getValue(), b2.getValue(),
1145 a3.getValue(), b3.getValue());
1146
1147
1148 final FieldDerivativeStructure<T> simpleValue = a1.multiply(b1).add(a2.multiply(b2)).add(a3.multiply(b3));
1149
1150
1151 final T[] all = simpleValue.getAllDerivatives();
1152 all[0] = accurateValue;
1153 return factory.build(all);
1154
1155 }
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171 public FieldDerivativeStructure<T> linearCombination(final T a1, final FieldDerivativeStructure<T> b1,
1172 final T a2, final FieldDerivativeStructure<T> b2,
1173 final T a3, final FieldDerivativeStructure<T> b3)
1174 throws MathIllegalArgumentException {
1175
1176 factory.checkCompatibility(b1.factory);
1177 factory.checkCompatibility(b2.factory);
1178 factory.checkCompatibility(b3.factory);
1179
1180 final FieldDerivativeStructure<T> ds = factory.build();
1181 factory.getCompiler().linearCombination(a1, b1.data, 0,
1182 a2, b2.data, 0,
1183 a3, b3.data, 0,
1184 ds.data, 0);
1185
1186 return ds;
1187
1188 }
1189
1190
1191
1192
1193
1194 @Override
1195 public FieldDerivativeStructure<T> linearCombination(final double a1, final FieldDerivativeStructure<T> b1,
1196 final double a2, final FieldDerivativeStructure<T> b2,
1197 final double a3, final FieldDerivativeStructure<T> b3)
1198 throws MathIllegalArgumentException {
1199
1200 factory.checkCompatibility(b1.factory);
1201 factory.checkCompatibility(b2.factory);
1202 factory.checkCompatibility(b3.factory);
1203
1204 final FieldDerivativeStructure<T> ds = factory.build();
1205 factory.getCompiler().linearCombination(a1, b1.data, 0,
1206 a2, b2.data, 0,
1207 a3, b3.data, 0,
1208 ds.data, 0);
1209
1210 return ds;
1211
1212 }
1213
1214
1215
1216
1217
1218 @Override
1219 public FieldDerivativeStructure<T> linearCombination(final FieldDerivativeStructure<T> a1, final FieldDerivativeStructure<T> b1,
1220 final FieldDerivativeStructure<T> a2, final FieldDerivativeStructure<T> b2,
1221 final FieldDerivativeStructure<T> a3, final FieldDerivativeStructure<T> b3,
1222 final FieldDerivativeStructure<T> a4, final FieldDerivativeStructure<T> b4)
1223 throws MathIllegalArgumentException {
1224
1225
1226 final T accurateValue = a1.getValue().linearCombination(a1.getValue(), b1.getValue(),
1227 a2.getValue(), b2.getValue(),
1228 a3.getValue(), b3.getValue(),
1229 a4.getValue(), b4.getValue());
1230
1231
1232 final FieldDerivativeStructure<T> simpleValue = a1.multiply(b1).add(a2.multiply(b2)).add(a3.multiply(b3)).add(a4.multiply(b4));
1233
1234
1235 final T[] all = simpleValue.getAllDerivatives();
1236 all[0] = accurateValue;
1237 return factory.build(all);
1238
1239 }
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258 public FieldDerivativeStructure<T> linearCombination(final T a1, final FieldDerivativeStructure<T> b1,
1259 final T a2, final FieldDerivativeStructure<T> b2,
1260 final T a3, final FieldDerivativeStructure<T> b3,
1261 final T a4, final FieldDerivativeStructure<T> b4)
1262 throws MathIllegalArgumentException {
1263
1264 factory.checkCompatibility(b1.factory);
1265 factory.checkCompatibility(b2.factory);
1266 factory.checkCompatibility(b3.factory);
1267 factory.checkCompatibility(b4.factory);
1268
1269 final FieldDerivativeStructure<T> ds = factory.build();
1270 factory.getCompiler().linearCombination(a1, b1.data, 0,
1271 a2, b2.data, 0,
1272 a3, b3.data, 0,
1273 a4, b4.data, 0,
1274 ds.data, 0);
1275
1276 return ds;
1277
1278 }
1279
1280
1281
1282
1283
1284 @Override
1285 public FieldDerivativeStructure<T> linearCombination(final double a1, final FieldDerivativeStructure<T> b1,
1286 final double a2, final FieldDerivativeStructure<T> b2,
1287 final double a3, final FieldDerivativeStructure<T> b3,
1288 final double a4, final FieldDerivativeStructure<T> b4)
1289 throws MathIllegalArgumentException {
1290
1291 factory.checkCompatibility(b1.factory);
1292 factory.checkCompatibility(b2.factory);
1293 factory.checkCompatibility(b3.factory);
1294 factory.checkCompatibility(b4.factory);
1295
1296 final FieldDerivativeStructure<T> ds = factory.build();
1297 factory.getCompiler().linearCombination(a1, b1.data, 0,
1298 a2, b2.data, 0,
1299 a3, b3.data, 0,
1300 a4, b4.data, 0,
1301 ds.data, 0);
1302
1303 return ds;
1304
1305 }
1306
1307
1308
1309 @Override
1310 public FieldDerivativeStructure<T> getPi() {
1311 return factory.getDerivativeField().getPi();
1312 }
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323 @Override
1324 public boolean equals(Object other) {
1325
1326 if (this == other) {
1327 return true;
1328 }
1329
1330 if (other instanceof FieldDerivativeStructure &&
1331 ((FieldDerivativeStructure<?>) other).getField().equals(getField())) {
1332 final FieldDerivativeStructure<T> rhs = (FieldDerivativeStructure<T>) other;
1333 return (getFreeParameters() == rhs.getFreeParameters()) &&
1334 (getOrder() == rhs.getOrder()) &&
1335 MathArrays.equals(data, rhs.data);
1336 }
1337
1338 return false;
1339
1340 }
1341
1342
1343
1344
1345
1346 @Override
1347 public int hashCode() {
1348 return 227 + 229 * getFreeParameters() + 233 * getOrder() + 239 * Arrays.hashCode(data);
1349 }
1350
1351 }