testSplineInterpolator.cc
Go to the documentation of this file.
1 
11 #include <cmath>
12 #include <iostream>
13 #include <vector>
14 #include <fstream>
15 
16 #include <utl/SplineInterpolator.h>
17 
18 #include <tst/Verify.h>
19 #include <cppunit/extensions/HelperMacros.h>
20 
21 using namespace std;
22 using namespace utl;
23 using namespace tst;
24 using boost::multi_array;
25 using namespace utl::Spline;
26 
30 class SplineInterpolatorTest : public CppUnit::TestFixture {
31 
32  CPPUNIT_TEST_SUITE(SplineInterpolatorTest);
33  CPPUNIT_TEST(test1d);
34  CPPUNIT_TEST(test1dmulti);
35  CPPUNIT_TEST(test2d);
36  CPPUNIT_TEST(test2dmulti);
37  CPPUNIT_TEST(test3d);
38  CPPUNIT_TEST(test3dmulti);
39  CPPUNIT_TEST_SUITE_END();
40 
41 public:
42  void setUp() {
43  fNX = 17;
44  fNY = 13;
45  fNZ = 7;
46  fOrder = 3;
47  fOver = 1;
48 
49  fX0 = -1.2;
50  fX1 = 5.8;
51 
52  fY0 = -7.7;
53  fY1 = 1.3;
54 
55  fZ0 = -3.9;
56  fZ1 = 4.2;
57  }
58 
59  void tearDown() { }
60 
61  void
63  {
64  vector<double> vs(fNX);
65  for (size_t i=0;i<fNX;++i)
66  {
67  const double d = double(i)/(fNX-1);
68  const double x = fX1*d + fX0*(1-d);
69  vs[i] = ExpectedValue(x);
70  }
71 
73  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(), fX0, 1e-7));
74  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(), fX1, 1e-7));
75 
76  for (size_t i = 0; i < fNX*fOver; ++i) {
77  const double d = double(i)/(fNX*fOver-1);
78  const double x = fX1*d + fX0*(1-d);
79  const double vt = ExpectedValue(x);
80  CPPUNIT_ASSERT(Verify<CloseTo>(ip(x), vt, 1e-7));
81  }
82  }
83 
84  void
86  {
87  multi_array<double,2> vs(boost::extents[2][fNX]);
88  for (size_t i=0;i<fNX;++i)
89  {
90  const double d = double(i)/(fNX-1);
91  const double x = fX1*d + fX0*(1-d);
92  const double v = ExpectedValue(x);
93  vs[0][i] = v;
94  vs[1][i] = 2*v;
95  }
96 
97  VectorInterpolator1D ip(fX0,fX1,vs);
98  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(), fX0, 1e-7));
99  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(), fX1, 1e-7));
100 
101  vector<double> out(2);
102  for (size_t i = 0; i < fNX*fOver; ++i) {
103  const double d = double(i)/(fNX*fOver-1);
104  const double x = fX1*d + fX0*(1-d);
105  ip(out,x);
106  const double vt = ExpectedValue(x);
107  CPPUNIT_ASSERT(Verify<CloseTo>(out[0], vt , 1e-7));
108  CPPUNIT_ASSERT(Verify<CloseTo>(out[1], 2*vt, 1e-7));
109  }
110  }
111 
112  void
114  {
115  multi_array<double,2> vs(boost::extents[fNX][fNY]);
116  for (size_t i = 0; i < fNX; ++i)
117  for (size_t j = 0; j < fNY; ++j)
118  {
119  const double di = double(i)/(fNX-1);
120  const double dj = double(j)/(fNY-1);
121  const double x = fX1*di + fX0*(1-di);
122  const double y = fY1*dj + fY0*(1-dj);
123  vs[i][j] = ExpectedValue(x) + ExpectedValue(y);
124  }
125 
126  Interpolator2D ip(fX0,fX1,fY0,fY1,vs);
127  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(0), fX0, 1e-7));
128  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(0), fX1, 1e-7));
129  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(1), fY0, 1e-7));
130  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(1), fY1, 1e-7));
131 
132  for (size_t i = 0; i < fNX*fOver; ++i)
133  for (size_t j = 0; j < fNY*fOver; ++j)
134  {
135  const double di = double(i)/(fNX*fOver-1);
136  const double dj = double(j)/(fNY*fOver-1);
137  const double x = fX1*di + fX0*(1-di);
138  const double y = fY1*dj + fY0*(1-dj);
139  const double vt = ExpectedValue(x) + ExpectedValue(y);
140  CPPUNIT_ASSERT(Verify<CloseTo>(ip(x,y), vt, 1e-7));
141  }
142  }
143 
144  void
146  {
147  multi_array<double,3> vs(boost::extents[2][fNX][fNY]);
148  for (size_t i = 0; i < fNX; ++i)
149  for (size_t j = 0; j < fNY; ++j)
150  {
151  const double di = double(i)/(fNX-1);
152  const double dj = double(j)/(fNY-1);
153  const double x = fX1*di + fX0*(1-di);
154  const double y = fY1*dj + fY0*(1-dj);
155  const double vt = ExpectedValue(x) + ExpectedValue(y);
156  vs[0][i][j] = vt;
157  vs[1][i][j] = 2*vt;
158  }
159 
160  VectorInterpolator2D ip(fX0,fX1,fY0,fY1,vs);
161  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(0), fX0, 1e-7));
162  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(0), fX1, 1e-7));
163  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(1), fY0, 1e-7));
164  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(1), fY1, 1e-7));
165 
166  vector<double> out(2);
167  for (size_t i = 0; i < fNX*fOver; ++i)
168  for (size_t j = 0; j < fNY*fOver; ++j)
169  {
170  const double di = double(i)/(fNX*fOver-1);
171  const double dj = double(j)/(fNY*fOver-1);
172  const double x = fX1*di + fX0*(1-di);
173  const double y = fY1*dj + fY0*(1-dj);
174  ip(out,x,y);
175  const double vt = ExpectedValue(x) + ExpectedValue(y);
176  CPPUNIT_ASSERT(Verify<CloseTo>(out[0], vt , 1e-7));
177  CPPUNIT_ASSERT(Verify<CloseTo>(out[1], 2*vt, 1e-7));
178  }
179  }
180 
181  void
183  {
184  multi_array<double,3> vs(boost::extents[fNX][fNY][fNZ]);
185  for (size_t i = 0; i < fNX; ++i)
186  for (size_t j = 0; j < fNY; ++j)
187  for (size_t k = 0; k < fNZ; ++k)
188  {
189  const double di = double(i)/(fNX-1);
190  const double dj = double(j)/(fNY-1);
191  const double dk = double(k)/(fNZ-1);
192  const double x = fX1*di + fX0*(1-di);
193  const double y = fY1*dj + fY0*(1-dj);
194  const double z = fZ1*dk + fZ0*(1-dk);
195  vs[i][j][k] = ExpectedValue(x)
196  + ExpectedValue(y)
197  + ExpectedValue(z);
198  }
199 
200  Interpolator3D ip(fX0,fX1,fY0,fY1,fZ0,fZ1,vs);
201  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(0), fX0, 1e-7));
202  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(0), fX1, 1e-7));
203  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(1), fY0, 1e-7));
204  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(1), fY1, 1e-7));
205  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(2), fZ0, 1e-7));
206  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(2), fZ1, 1e-7));
207 
208  for (size_t i = 0; i < fNX*fOver; ++i)
209  for (size_t j = 0; j < fNY*fOver; ++j)
210  for (size_t k = 0; k < fNZ*fOver; ++k)
211  {
212  const double di = double(i)/(fNX*fOver-1);
213  const double dj = double(j)/(fNY*fOver-1);
214  const double dk = double(k)/(fNZ*fOver-1);
215  const double x = fX1*di + fX0*(1-di);
216  const double y = fY1*dj + fY0*(1-dj);
217  const double z = fZ1*dk + fZ0*(1-dk);
218  const double vt = ExpectedValue(x)
219  + ExpectedValue(y)
220  + ExpectedValue(z);
221  CPPUNIT_ASSERT(Verify<CloseTo>(ip(x,y,z), vt, 1e-7));
222  }
223  }
224 
225  void
227  {
228  multi_array<double,4> vs(boost::extents[2][fNX][fNY][fNZ]);
229  for (size_t i = 0; i < fNX; ++i)
230  for (size_t j = 0; j < fNY; ++j)
231  for (size_t k = 0; k < fNZ; ++k)
232  {
233  const double di = double(i)/(fNX-1);
234  const double dj = double(j)/(fNY-1);
235  const double dk = double(k)/(fNZ-1);
236  const double x = fX1*di + fX0*(1-di);
237  const double y = fY1*dj + fY0*(1-dj);
238  const double z = fZ1*dk + fZ0*(1-dk);
239  const double vt = ExpectedValue(x)
240  + ExpectedValue(y)
241  + ExpectedValue(z);
242  vs[0][i][j][k] = vt;
243  vs[1][i][j][k] = 2*vt;
244  }
245 
246  VectorInterpolator3D ip(fX0,fX1,fY0,fY1,fZ0,fZ1,vs);
247  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(0), fX0, 1e-7));
248  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(0), fX1, 1e-7));
249  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(1), fY0, 1e-7));
250  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(1), fY1, 1e-7));
251  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStart(2), fZ0, 1e-7));
252  CPPUNIT_ASSERT(Verify<CloseTo>(ip.GetStop(2), fZ1, 1e-7));
253 
254  vector<double> out(2);
255  for (size_t i = 0; i < fNX*fOver; ++i)
256  for (size_t j = 0; j < fNY*fOver; ++j)
257  for (size_t k = 0; k < fNZ*fOver; ++k)
258  {
259  const double di = double(i)/(fNX*fOver-1);
260  const double dj = double(j)/(fNY*fOver-1);
261  const double dk = double(k)/(fNZ*fOver-1);
262  const double x = fX1*di + fX0*(1-di);
263  const double y = fY1*dj + fY0*(1-dj);
264  const double z = fZ1*dk + fZ0*(1-dk);
265  ip(out,x,y,z);
266  const double vt = ExpectedValue(x)
267  + ExpectedValue(y)
268  + ExpectedValue(z);
269  CPPUNIT_ASSERT(Verify<CloseTo>(out[0], vt, 1e-7));
270  CPPUNIT_ASSERT(Verify<CloseTo>(out[1], 2*vt, 1e-7));
271  }
272  }
273 
274 private:
275 
276  size_t fNX, fNY, fNZ, fOrder, fOver;
277  double fX0, fX1, fY0, fY1, fZ0, fZ1;
278 
279  double
280  ExpectedValue(const double x)
281  const
282  {
283  const double factors[] = { 2.9, 6.1, 9.5 };
284  double result = 0;
285  for (size_t o=0; o<fOrder; ++o)
286  result += factors[o]*pow(x, int(o));
287  return result;
288  }
289 
290 };
291 
292 
294 
295 
296 // Configure (x)emacs for this file ...
297 // Local Variables:
298 // mode: c++
299 // End:
double GetStart(const unsigned char dimension) const
double GetStart(const unsigned char dimension) const
vector< t2list > out
output of the algorithm: a list of clusters
Definition: XbAlgo.cc:32
double pow(const double x, const unsigned int i)
double GetStop(const unsigned char dimension) const
CPPUNIT_TEST_SUITE_REGISTRATION(testAiresShowerFile)
const Data result[]
double GetStart(const unsigned char dimension) const
double GetStop(const unsigned char dimension) const
double GetStart(const unsigned char dimension) const
double GetStop(const unsigned char dimension) const
double GetStop(const unsigned char dimension) const

, generated on Tue Sep 26 2023.