View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.hipparchus;
19  
20  import org.hipparchus.exception.MathIllegalArgumentException;
21  import org.hipparchus.exception.MathRuntimeException;
22  import org.hipparchus.exception.NullArgumentException;
23  import org.hipparchus.util.FastMath;
24  import org.junit.jupiter.api.Test;
25  
26  import static org.junit.jupiter.api.Assertions.assertEquals;
27  import static org.junit.jupiter.api.Assertions.assertFalse;
28  import static org.junit.jupiter.api.Assertions.assertTrue;
29  
30  class CalculusFieldElementTest {
31  
32      @Test
33      void testMultiplyInt() {
34          // GIVEN
35          final double value = 3.;
36          final int factor = 2;
37          final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
38          // WHEN
39          final TestCalculusFieldElement actualOperation = testElement.multiply(factor);
40          // THEN
41          final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(value * factor);
42          assertEquals(expectedOperation, actualOperation);
43      }
44  
45      @Test
46      void testAddDouble() {
47          // GIVEN
48          final double value1 = 1.;
49          final double value2 = 2.;
50          final TestCalculusFieldElement testElement1 = new TestCalculusFieldElement(value1);
51          // WHEN
52          final TestCalculusFieldElement actualOperation = testElement1.add(value2);
53          // THEN
54          final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(value1 + value2);
55          assertEquals(expectedOperation, actualOperation);
56      }
57  
58      @Test
59      void testSubtractDouble() {
60          // GIVEN
61          final double value1 = 1.;
62          final double value2 = 2.;
63          final TestCalculusFieldElement testElement1 = new TestCalculusFieldElement(value1);
64          // WHEN
65          final TestCalculusFieldElement actualOperation = testElement1.subtract(value2);
66          // THEN
67          final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(value1 - value2);
68          assertEquals(expectedOperation, actualOperation);
69      }
70  
71      @Test
72      void testMultiplyDouble() {
73          // GIVEN
74          final double value1 = 3.;
75          final double value2 = 2.;
76          final TestCalculusFieldElement testElement1 = new TestCalculusFieldElement(value1);
77          // WHEN
78          final TestCalculusFieldElement actualOperation = testElement1.multiply(value2);
79          // THEN
80          final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(value1 * value2);
81          assertEquals(expectedOperation, actualOperation);
82      }
83  
84      @Test
85      void testDivideDouble() {
86          // GIVEN
87          final double value1 = 3.;
88          final double value2 = 2.;
89          final TestCalculusFieldElement testElement1 = new TestCalculusFieldElement(value1);
90          // WHEN
91          final TestCalculusFieldElement actualOperation = testElement1.divide(value2);
92          // THEN
93          final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(value1 / value2);
94          assertEquals(expectedOperation, actualOperation);
95      }
96  
97      @Test
98      void testSubtract() {
99          // GIVEN
100         final double value1 = 1.;
101         final double value2 = 2.;
102         final TestCalculusFieldElement testElement1 = new TestCalculusFieldElement(value1);
103         final TestCalculusFieldElement testElement2 = new TestCalculusFieldElement(value2);
104         // WHEN
105         final TestCalculusFieldElement actualOperation = testElement1.subtract(testElement2);
106         // THEN
107         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(value1 - value2);
108         assertEquals(expectedOperation, actualOperation);
109     }
110 
111     @Test
112     void testDivide() {
113         // GIVEN
114         final double value1 = 3.;
115         final double value2 = 2.;
116         final TestCalculusFieldElement testElement1 = new TestCalculusFieldElement(value1);
117         final TestCalculusFieldElement testElement2 = new TestCalculusFieldElement(value2);
118         // WHEN
119         final TestCalculusFieldElement actualOperation = testElement1.divide(testElement2);
120         // THEN
121         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(value1 / value2);
122         assertEquals(expectedOperation, actualOperation);
123     }
124 
125     @Test
126     void testSquare() {
127         // GIVEN
128         final double value = 3.;
129         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
130         // WHEN
131         final TestCalculusFieldElement actualOperation = testElement.square();
132         // THEN
133         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(value * value);
134         assertEquals(expectedOperation, actualOperation);
135     }
136 
137     @Test
138     void testSqrt() {
139         // GIVEN
140         final double value = 3.;
141         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
142         // WHEN
143         final TestCalculusFieldElement actualOperation = testElement.sqrt();
144         // THEN
145         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.sqrt(value));
146         assertEquals(expectedOperation, actualOperation);
147     }
148 
149     @Test
150     void testCbrt() {
151         // GIVEN
152         final double value = 3.;
153         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
154         // WHEN
155         final TestCalculusFieldElement actualOperation = testElement.cbrt();
156         // THEN
157         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.cbrt(value));
158         assertEquals(expectedOperation, actualOperation);
159     }
160 
161     @Test
162     void testRootN() {
163         // GIVEN
164         final int n = 4;
165         final double value = 3.;
166         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
167         // WHEN
168         final TestCalculusFieldElement actualOperation = testElement.rootN(n);
169         // THEN
170         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.pow(value, 1. / n));
171         assertEquals(expectedOperation, actualOperation);
172     }
173 
174     @Test
175     void testPowInt() {
176         // GIVEN
177         final int exponent = 4;
178         final double value = 3.;
179         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
180         // WHEN
181         final TestCalculusFieldElement actualOperation = testElement.pow(exponent);
182         // THEN
183         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.pow(value, exponent));
184         assertEquals(expectedOperation, actualOperation);
185     }
186 
187     @Test
188     void testPowDouble() {
189         // GIVEN
190         final double exponent = 4.5;
191         final double value = 3.;
192         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
193         // WHEN
194         final TestCalculusFieldElement actualOperation = testElement.pow(exponent);
195         // THEN
196         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.pow(value, exponent));
197         assertEquals(expectedOperation, actualOperation);
198     }
199 
200     @Test
201     void testSin() {
202         // GIVEN
203         final double value = 3.;
204         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
205         // WHEN
206         final TestCalculusFieldElement actualOperation = testElement.sin();
207         // THEN
208         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.sin(value));
209         assertEquals(expectedOperation, actualOperation);
210     }
211 
212     @Test
213     void testCos() {
214         // GIVEN
215         final double value = 3.;
216         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
217         // WHEN
218         final TestCalculusFieldElement actualOperation = testElement.cos();
219         // THEN
220         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.cos(value));
221         assertEquals(expectedOperation, actualOperation);
222     }
223 
224     @Test
225     void testTan() {
226         // GIVEN
227         final double value = 3.;
228         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
229         // WHEN
230         final TestCalculusFieldElement actualOperation = testElement.tan();
231         // THEN
232         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.tan(value));
233         assertEquals(expectedOperation, actualOperation);
234     }
235 
236     @Test
237     void testSinh() {
238         // GIVEN
239         final double value = 3.;
240         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
241         // WHEN
242         final TestCalculusFieldElement actualOperation = testElement.sinh();
243         // THEN
244         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.sinh(value));
245         assertEquals(expectedOperation, actualOperation);
246     }
247 
248     @Test
249     void testCosh() {
250         // GIVEN
251         final double value = 3.;
252         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
253         // WHEN
254         final TestCalculusFieldElement actualOperation = testElement.cosh();
255         // THEN
256         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.cosh(value));
257         assertEquals(expectedOperation, actualOperation);
258     }
259 
260     @Test
261     void testTanh() {
262         // GIVEN
263         final double value = 3.;
264         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
265         // WHEN
266         final TestCalculusFieldElement actualOperation = testElement.tanh();
267         // THEN
268         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.tanh(value));
269         assertEquals(expectedOperation, actualOperation);
270     }
271 
272     @Test
273     void testSign() {
274         // GIVEN
275         final double value = 3.6;
276         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
277         // WHEN
278         final TestCalculusFieldElement actualOperation = testElement.sign();
279         // THEN
280         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.signum(value));
281         assertEquals(expectedOperation, actualOperation);
282     }
283 
284     @Test
285     void testUlp() {
286         // GIVEN
287         final double value = 3.6;
288         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
289         // WHEN
290         final TestCalculusFieldElement actualOperation = testElement.ulp();
291         // THEN
292         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.ulp(value));
293         assertEquals(expectedOperation, actualOperation);
294     }
295 
296     @Test
297     void testFloor() {
298         // GIVEN
299         final double value = 3.6;
300         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
301         // WHEN
302         final TestCalculusFieldElement actualOperation = testElement.floor();
303         // THEN
304         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.floor(value));
305         assertEquals(expectedOperation, actualOperation);
306     }
307 
308     @Test
309     void testCeil() {
310         // GIVEN
311         final double value = 3.6;
312         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
313         // WHEN
314         final TestCalculusFieldElement actualOperation = testElement.ceil();
315         // THEN
316         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.ceil(value));
317         assertEquals(expectedOperation, actualOperation);
318     }
319 
320     @Test
321     void testRint() {
322         // GIVEN
323         final double value = 3.6;
324         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
325         // WHEN
326         final TestCalculusFieldElement actualOperation = testElement.rint();
327         // THEN
328         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.rint(value));
329         assertEquals(expectedOperation, actualOperation);
330     }
331 
332     @Test
333     void testToDegrees() {
334         // GIVEN
335         final double value = 3.;
336         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
337         // WHEN
338         final TestCalculusFieldElement actualOperation = testElement.toDegrees();
339         // THEN
340         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.toDegrees(value));
341         assertEquals(expectedOperation, actualOperation);
342     }
343 
344     @Test
345     void testToRadians() {
346         // GIVEN
347         final double value = 3.;
348         final TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
349         // WHEN
350         final TestCalculusFieldElement actualOperation = testElement.toRadians();
351         // THEN
352         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(FastMath.toRadians(value));
353         assertEquals(expectedOperation, actualOperation);
354     }
355 
356     @Test
357     void testLinearCombinationDouble2() {
358         // GIVEN
359         final double value1 = 3.;
360         final double value2 = 2.;
361         final TestCalculusFieldElement testElement1 = new TestCalculusFieldElement(value1);
362         final TestCalculusFieldElement testElement2 = new TestCalculusFieldElement(value2);
363         final double coeff1 = -5.;
364         final double coeff2 = 4.;
365         // WHEN
366         final TestCalculusFieldElement actualOperation = testElement1.linearCombination(coeff1, testElement1,
367                 coeff2, testElement2);
368         // THEN
369         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(
370                 coeff1 * value1 + coeff2 * value2);
371         assertEquals(expectedOperation, actualOperation);
372     }
373 
374     @Test
375     void testLinearCombinationDouble3() {
376         // GIVEN
377         final double value1 = 3.;
378         final double value2 = 2.;
379         final double value3 = -1;
380         final TestCalculusFieldElement testElement1 = new TestCalculusFieldElement(value1);
381         final TestCalculusFieldElement testElement2 = new TestCalculusFieldElement(value2);
382         final TestCalculusFieldElement testElement3 = new TestCalculusFieldElement(value3);
383         final double coeff1 = -5.;
384         final double coeff2 = 4.;
385         final double coeff3 = 6.;
386         // WHEN
387         final TestCalculusFieldElement actualOperation = testElement1.linearCombination(coeff1, testElement1,
388                 coeff2, testElement2, coeff3, testElement3);
389         // THEN
390         final TestCalculusFieldElement expectedOperation = new TestCalculusFieldElement(
391                 coeff1 * value1 + coeff2 * value2 + coeff3 * value3);
392         assertEquals(expectedOperation, actualOperation);
393     }
394 
395     @Test
396     void testGetExponent() {
397         // GIVEN
398         final double value = 3.5;
399         final  TestCalculusFieldElement testElement = new TestCalculusFieldElement(value);
400         // WHEN
401         final int actualOperation = testElement.getExponent();
402         // THEN
403         final int expectedOperation = FastMath.getExponent(value);
404         assertEquals(expectedOperation, actualOperation);
405     }
406 
407     @Test
408     void testIsFinite() {
409         assertTrue(new TestCalculusFieldElement(1.).isFinite());
410         assertFalse(new TestCalculusFieldElement(Double.NaN).isFinite());
411         assertFalse(new TestCalculusFieldElement(Double.POSITIVE_INFINITY).isFinite());
412     }
413 
414     @Test
415     void testIsInfinite() {
416         assertFalse(new TestCalculusFieldElement(1.).isInfinite());
417         assertTrue(new TestCalculusFieldElement(Double.POSITIVE_INFINITY).isInfinite());
418     }
419 
420     @Test
421     void testIsNan() {
422         assertFalse(new TestCalculusFieldElement(1.).isNaN());
423         assertTrue(new TestCalculusFieldElement(Double.NaN).isNaN());
424     }
425 
426     @Test
427     void testNorm() {
428         assertEquals(0., new TestCalculusFieldElement(0.).norm(), 0.0);
429     }
430 
431     private static class TestCalculusFieldElement implements CalculusFieldElement<TestCalculusFieldElement> {
432 
433         private final double value;
434 
435         TestCalculusFieldElement (double value) {
436             this.value = value;
437         }
438 
439         @Override
440         public TestCalculusFieldElement getAddendum() {
441             return subtract(getReal());
442         }
443 
444         @Override
445         public TestCalculusFieldElement newInstance(double value) {
446             return new TestCalculusFieldElement(value);
447         }
448 
449         @Override
450         public TestCalculusFieldElement scalb(int n) {
451             return null;
452         }
453 
454         @Override
455         public TestCalculusFieldElement ulp() {
456             return new TestCalculusFieldElement(FastMath.ulp(value));
457         }
458 
459         @Override
460         public TestCalculusFieldElement hypot(TestCalculusFieldElement y) throws MathIllegalArgumentException {
461             return null;
462         }
463 
464         @Override
465         public TestCalculusFieldElement pow(TestCalculusFieldElement e) throws MathIllegalArgumentException {
466             return new TestCalculusFieldElement(FastMath.pow(value, e.value));
467         }
468 
469         @Override
470         public TestCalculusFieldElement exp() {
471             return null;
472         }
473 
474         @Override
475         public TestCalculusFieldElement expm1() {
476             return null;
477         }
478 
479         @Override
480         public TestCalculusFieldElement log() {
481             return null;
482         }
483 
484         @Override
485         public TestCalculusFieldElement log1p() {
486             return null;
487         }
488 
489         @Override
490         public TestCalculusFieldElement log10() {
491             return null;
492         }
493 
494         @Override
495         public TestCalculusFieldElement sin() {
496             return new TestCalculusFieldElement(FastMath.sin(value));
497         }
498 
499         @Override
500         public TestCalculusFieldElement cos() {
501             return new TestCalculusFieldElement(FastMath.cos(value));
502         }
503 
504         @Override
505         public TestCalculusFieldElement acos() {
506             return null;
507         }
508 
509         @Override
510         public TestCalculusFieldElement asin() {
511             return null;
512         }
513 
514         @Override
515         public TestCalculusFieldElement atan() {
516             return null;
517         }
518 
519         @Override
520         public TestCalculusFieldElement atan2(TestCalculusFieldElement x) throws MathIllegalArgumentException {
521             return null;
522         }
523 
524         @Override
525         public TestCalculusFieldElement sinh() {
526             return new TestCalculusFieldElement(FastMath.sinh(value));
527         }
528 
529         @Override
530         public TestCalculusFieldElement cosh() {
531             return new TestCalculusFieldElement(FastMath.cosh(value));
532         }
533 
534         @Override
535         public TestCalculusFieldElement acosh() {
536             return null;
537         }
538 
539         @Override
540         public TestCalculusFieldElement asinh() {
541             return null;
542         }
543 
544         @Override
545         public TestCalculusFieldElement atanh() {
546             return null;
547         }
548 
549         @Override
550         public TestCalculusFieldElement linearCombination(TestCalculusFieldElement[] a, TestCalculusFieldElement[] b) throws MathIllegalArgumentException {
551             return null;
552         }
553 
554         @Override
555         public TestCalculusFieldElement linearCombination(TestCalculusFieldElement a1, TestCalculusFieldElement b1, TestCalculusFieldElement a2, TestCalculusFieldElement b2) {
556             return newInstance(a1.value * b1.value + a2.value * b2.value);
557         }
558 
559         @Override
560         public TestCalculusFieldElement linearCombination(TestCalculusFieldElement a1, TestCalculusFieldElement b1, TestCalculusFieldElement a2, TestCalculusFieldElement b2, TestCalculusFieldElement a3, TestCalculusFieldElement b3) {
561             return newInstance(a1.value * b1.value + a2.value * b2.value + a3.value * b3.value);
562         }
563 
564         @Override
565         public TestCalculusFieldElement linearCombination(TestCalculusFieldElement a1, TestCalculusFieldElement b1, TestCalculusFieldElement a2, TestCalculusFieldElement b2, TestCalculusFieldElement a3, TestCalculusFieldElement b3, TestCalculusFieldElement a4, TestCalculusFieldElement b4) {
566             return newInstance(a1.value * b1.value + a2.value * b2.value + a3.value * b3.value +
567                     a4.value * b4.value);
568         }
569 
570         @Override
571         public TestCalculusFieldElement ceil() {
572             return new TestCalculusFieldElement(FastMath.ceil(value));
573         }
574 
575         @Override
576         public TestCalculusFieldElement floor() {
577             return new TestCalculusFieldElement(FastMath.floor(value));
578         }
579 
580         @Override
581         public TestCalculusFieldElement rint() {
582             return new TestCalculusFieldElement(FastMath.rint(value));
583         }
584 
585         @Override
586         public TestCalculusFieldElement remainder(double a) {
587             return null;
588         }
589 
590         @Override
591         public TestCalculusFieldElement remainder(TestCalculusFieldElement a) {
592             return null;
593         }
594 
595         @Override
596         public TestCalculusFieldElement sign() {
597             return new TestCalculusFieldElement(FastMath.signum(value));
598         }
599 
600         @Override
601         public TestCalculusFieldElement copySign(TestCalculusFieldElement sign) {
602             return null;
603         }
604 
605         @Override
606         public TestCalculusFieldElement abs() {
607             return new TestCalculusFieldElement(FastMath.abs(value));
608         }
609 
610         @Override
611         public double getReal() {
612             return value;
613         }
614 
615         @Override
616         public TestCalculusFieldElement add(TestCalculusFieldElement a) throws NullArgumentException {
617             return new TestCalculusFieldElement(value + a.value);
618         }
619 
620         @Override
621         public TestCalculusFieldElement negate() {
622             return new TestCalculusFieldElement(-value);
623         }
624 
625         @Override
626         public TestCalculusFieldElement multiply(TestCalculusFieldElement a) throws NullArgumentException {
627             return new TestCalculusFieldElement(value * a.value);
628         }
629 
630         @Override
631         public TestCalculusFieldElement reciprocal() throws MathRuntimeException {
632             return new TestCalculusFieldElement(1. / value);
633         }
634 
635         @Override
636         public Field<TestCalculusFieldElement> getField() {
637             return null;
638         }
639 
640         @Override
641         public boolean equals(Object obj) {
642             if (obj instanceof TestCalculusFieldElement) {
643                 return Double.compare(value, ((TestCalculusFieldElement) obj).value) == 0;
644             } else {
645                 return false;
646             }
647         }
648     }
649 
650 }