View Javadoc
1   /*
2    * Licensed to the Hipparchus project 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 Hipparchus project 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  package org.hipparchus.analysis;
18  
19  import org.hipparchus.CalculusFieldElement;
20  import org.hipparchus.util.Binary64;
21  import org.hipparchus.util.Binary64Field;
22  import org.hipparchus.util.MathArrays;
23  import org.junit.jupiter.api.Test;
24  
25  import static org.junit.jupiter.api.Assertions.assertEquals;
26  
27  class FieldFunctionsTest {
28  
29      @Test
30      void testScalarUnivariateFunctionConversion() {
31          FieldUnivariateFunction f1 = new FieldUnivariateFunction() {
32              public <T extends CalculusFieldElement<T>> T value(T x) {
33                  return x.multiply(2);
34              }
35          };
36          CalculusFieldUnivariateFunction<Binary64> f1Converted = f1.toCalculusFieldUnivariateFunction(Binary64Field.getInstance());
37          CalculusFieldUnivariateFunction<Binary64> f2 = x -> x.multiply(2);
38  
39          for (double x = 0; x < 1; x += 0.01) {
40              assertEquals(f2.value(new Binary64(x)).getReal(),
41                                  f1Converted.value(new Binary64(x)).getReal(),
42                                  1.0e-15);
43          }
44      }
45  
46      @Test
47      void testScalarMultivariateFunctionConversion() {
48          FieldMultivariateFunction f1 = new FieldMultivariateFunction() {
49              public <T extends CalculusFieldElement<T>> T value(@SuppressWarnings("unchecked") T... x) {
50                  return x[0].multiply(2).add(x[1]);
51              }
52          };
53          CalculusFieldMultivariateFunction<Binary64> f1Converted = f1.toCalculusFieldMultivariateFunction(Binary64Field.getInstance());
54          CalculusFieldMultivariateFunction<Binary64> f2 = x -> x[0].multiply(2).add(x[1]);
55  
56          for (double x0 = 0; x0 < 1; x0 += 0.01) {
57              for (double x1 = 0; x1 < 1; x1 += 0.01) {
58                  assertEquals(f2.value(new Binary64(x0), new Binary64(x1)).getReal(),
59                                      f1Converted.value(new Binary64(x0), new Binary64(x1)).getReal(),
60                                      1.0e-15);
61              }
62          }
63      }
64  
65      @Test
66      void testVectorUnivariateFunctionConversion() {
67          FieldUnivariateVectorFunction f1 = new FieldUnivariateVectorFunction() {
68              public <T extends CalculusFieldElement<T>> T[] value(T x) {
69                  T[] y = MathArrays.buildArray(x.getField(), 3);
70                  y[0] = x.add(1);
71                  y[1] = x.multiply(2);
72                  y[2] = x.square();
73                  return y;
74              }
75          };
76          CalculusFieldUnivariateVectorFunction<Binary64> f1Converted = f1.toCalculusFieldUnivariateVectorFunction(Binary64Field.getInstance());
77          CalculusFieldUnivariateVectorFunction<Binary64> f2 = x -> new Binary64[] {
78              x.add(1), x.multiply(2), x.square()
79          };
80  
81          for (double x = 0; x < 1; x += 0.01) {
82              for (int i = 0; i < 3; ++i) {
83                  assertEquals(f2.value(new Binary64(x))[i].getReal(),
84                                      f1Converted.value(new Binary64(x))[i].getReal(),
85                                      1.0e-15);
86              }
87          }
88      }
89  
90      @Test
91      void testVectorMultivariateFunctionConversion() {
92          FieldMultivariateVectorFunction f1 = new FieldMultivariateVectorFunction() {
93              public <T extends CalculusFieldElement<T>> T[] value(@SuppressWarnings("unchecked") T... x) {
94                  T[] y = MathArrays.buildArray(x[0].getField(), 3);
95                  y[0] = x[0].add(1);
96                  y[1] = x[1].multiply(2);
97                  y[2] = x[0].multiply(x[1]);
98                  return y;
99              }
100         };
101         CalculusFieldMultivariateVectorFunction<Binary64> f1Converted = f1.toCalculusFieldMultivariateVectorFunction(Binary64Field.getInstance());
102         CalculusFieldMultivariateVectorFunction<Binary64> f2 = x -> new Binary64[] {
103             x[0].add(1), x[1].multiply(2), x[0].multiply(x[1])
104         };
105 
106         for (double x0 = 0; x0 < 1; x0 += 0.01) {
107             for (double x1 = 0; x1 < 1; x1 += 0.01) {
108                 for (int i = 0; i < 3; ++i) {
109                     assertEquals(f2.value(new Binary64(x0), new Binary64(x1))[i].getReal(),
110                                         f1Converted.value(new Binary64(x0), new Binary64(x1))[i].getReal(),
111                                         1.0e-15);
112                 }
113             }
114         }
115     }
116 
117     @Test
118     void testMatrixUnivariateFunctionConversion() {
119         FieldUnivariateMatrixFunction f1 = new FieldUnivariateMatrixFunction() {
120             public <T extends CalculusFieldElement<T>> T[][] value(T x) {
121                 T[][] y = MathArrays.buildArray(x.getField(), 2, 2);
122                 y[0][0] = x.add(1);
123                 y[0][1] = x.multiply(2);
124                 y[1][0] = x.square();
125                 y[1][1] = x.sin();
126                 return y;
127             }
128         };
129         CalculusFieldUnivariateMatrixFunction<Binary64> f1Converted = f1.toCalculusFieldUnivariateMatrixFunction(Binary64Field.getInstance());
130         CalculusFieldUnivariateMatrixFunction<Binary64> f2 = x -> new Binary64[][] {
131             { x.add(1), x.multiply(2) },
132             { x.square(), x.sin() }
133         };
134 
135         for (double x = 0; x < 1; x += 0.01) {
136             for (int i = 0; i < 2; ++i) {
137                 for (int j = 0; j < 2; ++j) {
138                     assertEquals(f2.value(new Binary64(x))[i][j].getReal(),
139                                         f1Converted.value(new Binary64(x))[i][j].getReal(),
140                                         1.0e-15);
141                 }
142             }
143         }
144     }
145 
146     @Test
147     void testMatrixMultivariateFunctionConversion() {
148         FieldMultivariateMatrixFunction f1 = new FieldMultivariateMatrixFunction() {
149             public <T extends CalculusFieldElement<T>> T[][] value(@SuppressWarnings("unchecked") T... x) {
150                 T[][] y = MathArrays.buildArray(x[0].getField(), 2, 2);
151                 y[0][0] = x[0].add(1);
152                 y[0][1] = x[1].multiply(2);
153                 y[1][0] = x[0].multiply(x[1]);
154                 y[1][1] = x[1].sin();
155                 return y;
156             }
157         };
158         CalculusFieldMultivariateMatrixFunction<Binary64> f1Converted = f1.toCalculusFieldMultivariateMatrixFunction(Binary64Field.getInstance());
159         CalculusFieldMultivariateMatrixFunction<Binary64> f2 = x -> new Binary64[][] {
160             { x[0].add(1), x[1].multiply(2) },
161             { x[0].multiply(x[1]), x[1].sin() }
162         };
163 
164         for (double x0 = 0; x0 < 1; x0 += 0.01) {
165             for (double x1 = 0; x1 < 1; x1 += 0.01) {
166                 for (int i = 0; i < 2; ++i) {
167                     for (int j = 0; j < 2; ++j) {
168                         assertEquals(f2.value(new Binary64(x0), new Binary64(x1))[i][j].getReal(),
169                                             f1Converted.value(new Binary64(x0), new Binary64(x1))[i][j].getReal(),
170                                             1.0e-15);
171                     }
172                 }
173             }
174         }
175     }
176 
177 }