1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.numerics.spline;
39
40 import static org.junit.Assert.assertEquals;
41
42 import java.util.Arrays;
43 import java.util.Collection;
44
45 import ffx.utilities.FFXTest;
46 import org.junit.Test;
47 import org.junit.runner.RunWith;
48 import org.junit.runners.Parameterized;
49 import org.junit.runners.Parameterized.Parameters;
50
51
52
53
54
55
56
57 @RunWith(Parameterized.class)
58 public class UniformBSplineTest extends FFXTest {
59
60 private static double tolerance = 1.0e-6;
61 private final String info;
62 private final int order;
63 private final double x;
64 private final double[] coefficients;
65 private final double[] expected;
66 private final double[] expectedDiff;
67 private final int deriveOrder;
68 private final double[][] theta;
69 private final double[][] bSplineWork;
70
71
72
73
74
75
76
77
78
79
80
81 public UniformBSplineTest(
82 String info, int order, double x, double[] expected, double[] expectedDiff) {
83 this.info = info;
84 this.order = order;
85 this.x = x;
86 this.expected = expected;
87 this.expectedDiff = expectedDiff;
88
89 deriveOrder = order - 1;
90 coefficients = new double[order];
91 theta = new double[order][deriveOrder + 1];
92 bSplineWork = new double[order][order];
93 }
94
95 @Parameters
96 public static Collection<Object[]> data() {
97
98 double[] c30 = {0.500000e0, 0.5000000e0, 0.000000e0};
99 double[] d30 = {-1.0000000e0, 1.0000000e0, 0.0000000e0};
100
101 double[] c31 = {0.1250000e0, 0.7500000e0, 0.1250000e0};
102 double[] d31 = {-0.5000000e0, 0.0000000e0, 0.5000000e0};
103
104
105 double[] c50 = {0.0416666e0, 0.4583333e0, 0.4583333e0, 0.0416666e0, 0.0000000e0};
106 double[] d50 = {-0.1666667e0, -0.5000000e0, 0.5000000e0, 0.1666667e0, 0.0000000e0};
107
108 double[] c51 = {0.0131836e0, 0.3248700e0, 0.5608720e0, 0.1009110e0, 0.0001627e0};
109 double[] d51 = {-0.0703125e0, -0.5416670e0, 0.2968750e0, 0.3125000e0, 0.0026042e0};
110
111 double[] c52 = {0.0026041e0, 0.1979167e0, 0.5989583e0, 0.1979167e0, 0.0026041e0};
112 double[] d52 = {-0.0208333e0, -0.4583333e0, 0.0000000e0, 0.4583333e0, 0.0208333e0};
113
114 double[] c53 = {0.0001627e0, 0.1009110e0, 0.5608720e0, 0.3248700e0, 0.0131836e0};
115 double[] d53 = {-0.0026042e0, -0.3125000e0, -0.2968750e0, 0.5416670e0, 0.0703125e0};
116
117 double[] c54 = {0.0000000e0, 0.0416666e0, 0.4583333e0, 0.4583333e0, 0.0416666e0};
118 double[] d54 = {0.0000000e0, -0.1666667e0, -0.5000000e0, 0.5000000e0, 0.1666667e0};
119
120 return Arrays.asList(
121 new Object[][] {
122 {"Order 3, x = 0.00", 3, 0.00e0, c30, d30},
123 {"Order 3, x = 0.50", 3, 0.50e0, c31, d31},
124 {"Order 5, x = 0.00", 5, 0.00e0, c50, d50},
125 {"Order 5, x = 0.25", 5, 0.25e0, c51, d51},
126 {"Order 5, x = 0.50", 5, 0.50e0, c52, d52},
127 {"Order 5, x = 0.75", 5, 0.75e0, c53, d53},
128 {"Order 5, x = 1.00", 5, 1.00e0, c54, d54}
129 });
130 }
131
132
133
134
135
136
137 @Test
138 public void testBSpline() {
139 UniformBSpline.bSpline(x, order, coefficients);
140 for (int i = 0; i < order; i++) {
141 assertEquals(info, expected[i], coefficients[i], tolerance);
142 }
143 }
144
145
146
147
148
149
150 @Test
151 public void testBSplineDerivatives() {
152 UniformBSpline.bSplineDerivatives(x, order, deriveOrder, theta, bSplineWork);
153 for (int i = 0; i < order; i++) {
154 double actual = theta[i][0];
155 assertEquals(info, expected[i], actual, tolerance);
156 actual = theta[i][1];
157 assertEquals(info, expectedDiff[i], actual, tolerance);
158 }
159 }
160 }