1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  package org.apache.commons.math4.legacy.analysis.function;
19  
20  import org.apache.commons.math4.legacy.analysis.UnivariateFunction;
21  import org.apache.commons.math4.legacy.analysis.differentiation.DerivativeStructure;
22  import org.apache.commons.math4.legacy.analysis.differentiation.UnivariateDifferentiableFunction;
23  import org.apache.commons.math4.legacy.exception.DimensionMismatchException;
24  import org.apache.commons.math4.legacy.exception.NotStrictlyPositiveException;
25  import org.apache.commons.math4.legacy.exception.NullArgumentException;
26  import org.apache.commons.math4.core.jdkmath.JdkMath;
27  import org.junit.Assert;
28  import org.junit.Test;
29  
30  
31  
32  
33  public class GaussianTest {
34      private final double EPS = Math.ulp(1d);
35  
36      @Test(expected=NotStrictlyPositiveException.class)
37      public void testPreconditions() {
38          new Gaussian(1, 2, -1);
39      }
40  
41      @Test
42      public void testSomeValues() {
43          final UnivariateFunction f = new Gaussian();
44  
45          Assert.assertEquals(1 / JdkMath.sqrt(2 * Math.PI), f.value(0), EPS);
46      }
47  
48      @Test
49      public void testLargeArguments() {
50          final UnivariateFunction f = new Gaussian();
51  
52          Assert.assertEquals(0, f.value(Double.NEGATIVE_INFINITY), 0);
53          Assert.assertEquals(0, f.value(-Double.MAX_VALUE), 0);
54          Assert.assertEquals(0, f.value(-1e2), 0);
55          Assert.assertEquals(0, f.value(1e2), 0);
56          Assert.assertEquals(0, f.value(Double.MAX_VALUE), 0);
57          Assert.assertEquals(0, f.value(Double.POSITIVE_INFINITY), 0);
58      }
59  
60      @Test
61      public void testDerivatives() {
62          final UnivariateDifferentiableFunction gaussian = new Gaussian(2.0, 0.9, 3.0);
63          final DerivativeStructure dsX = new DerivativeStructure(1, 4, 0, 1.1);
64          final DerivativeStructure dsY = gaussian.value(dsX);
65          Assert.assertEquals( 1.9955604901712128349,   dsY.getValue(),              EPS);
66          Assert.assertEquals(-0.044345788670471396332, dsY.getPartialDerivative(1), EPS);
67          Assert.assertEquals(-0.22074348138190206174,  dsY.getPartialDerivative(2), EPS);
68          Assert.assertEquals( 0.014760030401924800557, dsY.getPartialDerivative(3), EPS);
69          Assert.assertEquals( 0.073253159785035691678, dsY.getPartialDerivative(4), EPS);
70      }
71  
72      @Test
73      public void testDerivativeLargeArguments() {
74          final Gaussian f = new Gaussian(0, 1e-50);
75  
76          Assert.assertEquals(0, f.value(new DerivativeStructure(1, 1, 0, Double.NEGATIVE_INFINITY)).getPartialDerivative(1), 0);
77          Assert.assertEquals(0, f.value(new DerivativeStructure(1, 1, 0, -Double.MAX_VALUE)).getPartialDerivative(1), 0);
78          Assert.assertEquals(0, f.value(new DerivativeStructure(1, 1, 0, -1e50)).getPartialDerivative(1), 0);
79          Assert.assertEquals(0, f.value(new DerivativeStructure(1, 1, 0, -1e2)).getPartialDerivative(1), 0);
80          Assert.assertEquals(0, f.value(new DerivativeStructure(1, 1, 0, 1e2)).getPartialDerivative(1), 0);
81          Assert.assertEquals(0, f.value(new DerivativeStructure(1, 1, 0, 1e50)).getPartialDerivative(1), 0);
82          Assert.assertEquals(0, f.value(new DerivativeStructure(1, 1, 0, Double.MAX_VALUE)).getPartialDerivative(1), 0);
83          Assert.assertEquals(0, f.value(new DerivativeStructure(1, 1, 0, Double.POSITIVE_INFINITY)).getPartialDerivative(1), 0);
84      }
85  
86      @Test
87      public void testDerivativesNaN() {
88          final Gaussian f = new Gaussian(0, 1e-50);
89          final DerivativeStructure fx = f.value(new DerivativeStructure(1, 5, 0, Double.NaN));
90          for (int i = 0; i <= fx.getOrder(); ++i) {
91              Assert.assertTrue(Double.isNaN(fx.getPartialDerivative(i)));
92          }
93      }
94  
95      @Test(expected=NullArgumentException.class)
96      public void testParametricUsage1() {
97          final Gaussian.Parametric g = new Gaussian.Parametric();
98          g.value(0, null);
99      }
100 
101     @Test(expected=DimensionMismatchException.class)
102     public void testParametricUsage2() {
103         final Gaussian.Parametric g = new Gaussian.Parametric();
104         g.value(0, new double[] {0});
105     }
106 
107     @Test(expected=NotStrictlyPositiveException.class)
108     public void testParametricUsage3() {
109         final Gaussian.Parametric g = new Gaussian.Parametric();
110         g.value(0, new double[] {0, 1, 0});
111     }
112 
113     @Test(expected=NullArgumentException.class)
114     public void testParametricUsage4() {
115         final Gaussian.Parametric g = new Gaussian.Parametric();
116         g.gradient(0, null);
117     }
118 
119     @Test(expected=DimensionMismatchException.class)
120     public void testParametricUsage5() {
121         final Gaussian.Parametric g = new Gaussian.Parametric();
122         g.gradient(0, new double[] {0});
123     }
124 
125     @Test(expected=NotStrictlyPositiveException.class)
126     public void testParametricUsage6() {
127         final Gaussian.Parametric g = new Gaussian.Parametric();
128         g.gradient(0, new double[] {0, 1, 0});
129     }
130 
131     @Test
132     public void testParametricValue() {
133         final double norm = 2;
134         final double mean = 3;
135         final double sigma = 4;
136         final Gaussian f = new Gaussian(norm, mean, sigma);
137 
138         final Gaussian.Parametric g = new Gaussian.Parametric();
139         Assert.assertEquals(f.value(-1), g.value(-1, new double[] {norm, mean, sigma}), 0);
140         Assert.assertEquals(f.value(0), g.value(0, new double[] {norm, mean, sigma}), 0);
141         Assert.assertEquals(f.value(2), g.value(2, new double[] {norm, mean, sigma}), 0);
142     }
143 
144     @Test
145     public void testParametricGradient() {
146         final double norm = 2;
147         final double mean = 3;
148         final double sigma = 4;
149         final Gaussian.Parametric f = new Gaussian.Parametric();
150 
151         final double x = 1;
152         final double[] grad = f.gradient(1, new double[] {norm, mean, sigma});
153         final double diff = x - mean;
154         final double n = JdkMath.exp(-diff * diff / (2 * sigma * sigma));
155         Assert.assertEquals(n, grad[0], EPS);
156         final double m = norm * n * diff / (sigma * sigma);
157         Assert.assertEquals(m, grad[1], EPS);
158         final double s = m * diff / sigma;
159         Assert.assertEquals(s, grad[2], EPS);
160     }
161 }