testSMatrixSVector.cc
Go to the documentation of this file.
1 
11 #include <iostream>
12 
13 #include <utl/SVector.h>
14 #include <utl/SMatrix.h>
15 
16 #include <tst/Verify.h>
17 #include <cppunit/extensions/HelperMacros.h>
18 
19 using namespace std;
20 using namespace utl;
21 using namespace tst;
22 
23 #define ASSERT_CLOSE(x, y) CPPUNIT_ASSERT(Verify<CloseTo>(x, y))
24 #define ASSERT_CLOSE_EPS(x, y, eps) CPPUNIT_ASSERT(Verify<CloseTo>(x, y, eps))
25 #define ASSERT_EQUAL(x, y) CPPUNIT_ASSERT(Verify<Equal>(x, y))
26 
27 
28 class Foo {
29 public:
30  Foo(const int off = 0) : fOffset(off) { }
31 
32  int operator[](const unsigned int i) const { return 2*int(i) + fOffset; }
33 
34 private:
35  const int fOffset;
36 };
37 
38 
39 class Bar {
40 public:
41  Foo operator[](const unsigned int i) const { return Foo(i); }
42 };
43 
44 
48 class TestSMatrixSVector : public CppUnit::TestFixture {
49 
50  CPPUNIT_TEST_SUITE(TestSMatrixSVector);
51  CPPUNIT_TEST(TestSVectorCtor);
52  CPPUNIT_TEST(TestSVectorOp);
53  CPPUNIT_TEST(TestSVectorAngle);
54  CPPUNIT_TEST(TestSVectorListAssignment);
55  CPPUNIT_TEST(TestSVectorIterators);
56  CPPUNIT_TEST(TestSMatrixCtor);
57  CPPUNIT_TEST(TestSMatrixOp);
58  //CPPUNIT_TEST(TestSMatrixSVectorOp);
59  CPPUNIT_TEST(TestSMatrixListAssignment);
60  CPPUNIT_TEST(TestSVectorNontrivialTypes);
61  CPPUNIT_TEST_SUITE_END();
62 
63 public:
64  void
66  {
67  // default ctor
68  SVector<10> v1;
69 
70  ASSERT_EQUAL((unsigned int)(SVector<10>::Size), 10U);
71  ASSERT_EQUAL(v1.GetSize(), std::size_t(10));
72 
73  // clear
74  v1.Clear();
75 
76  for (unsigned int i = 0; i < v1.GetSize(); ++i)
77  ASSERT_EQUAL(v1[i], 0.);
78 
79  ASSERT_EQUAL(v1.Get<0>(), 0.);
80  ASSERT_EQUAL(v1.Get<1>(), 0.);
81  ASSERT_EQUAL(v1.Get<2>(), 0.);
82  ASSERT_EQUAL(v1.Get<3>(), 0.);
83  ASSERT_EQUAL(v1.Get<4>(), 0.);
84 
85  const int v1value = 1;
86  v1.Clear(v1value);
87 
88  for (unsigned int i = 0; i < v1.GetSize(); ++i)
89  ASSERT_EQUAL(v1[i], double(v1value));
90 
91  // scalar initializer
92  const int v2value = 13;
93  SVector<100, int> v2(v2value);
94 
95  for (unsigned int i = 0; i < v2.GetSize(); ++i)
96  ASSERT_EQUAL(v2[i], 13);
97 
98  ASSERT_EQUAL(v2.Get<0>(), 13);
99  ASSERT_EQUAL(v2.Get<1>(), 13);
100  ASSERT_EQUAL(v2.Get<10>(), 13);
101  ASSERT_EQUAL(v2.Get<50>(), 13);
102  ASSERT_EQUAL(v2.Get<99>(), 13);
103 
104  // functor initializer
105  Foo foo;
106  SVector<5> v3(foo);
107 
108  for (unsigned int i = 0; i < v3.GetSize(); ++i)
109  ASSERT_EQUAL(v3[i], double(foo[i]));
110 
111  // c-array initializer
112  const int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
113 
114  SVector<5, int> v4(a);
115 
116  for (unsigned int i = 0; i < v4.GetSize(); ++i)
117  ASSERT_EQUAL(v4[i], int(i+1));
118 
119  SVector<7> v41(a);
120 
121  for (unsigned int i = 0; i < v41.GetSize(); ++i)
122  ASSERT_EQUAL(v41[i], i+1.);
123 
124  // pointer initializer
125  const int* const pa = &(a[0]);
126 
127  SVector<5, int> v5(pa);
128 
129  for (unsigned int i = 0; i < v5.GetSize(); ++i)
130  ASSERT_EQUAL(v5[i], int(i+1));
131 
132  // copy ctor
133  SVector<5, int> v6(v5);
134 
135  for (unsigned int i = 0; i < v6.GetSize(); ++i)
136  ASSERT_EQUAL(v6[i], v5[i]);
137 
138  // non-identical copy
139  SVector<100> v7(v2);
140 
141  for (unsigned int i = 0; i < v7.GetSize(); ++i)
142  ASSERT_EQUAL(v7[i], double(v2[i]));
143  }
144 
145  void
147  {
148  SVector<10> v1(1.);
149 
150  v1 *= 2;
151 
152  for (unsigned int i = 0; i < v1.GetSize(); ++i)
153  ASSERT_EQUAL(v1[i], 2.);
154 
155  SVector<10> v2(0.);
156 
157  v2 += v1;
158 
159  for (unsigned int i = 0; i < v2.GetSize(); ++i)
160  ASSERT_EQUAL(v2[i], 2.);
161 
162  v2 += v1;
163  v2 *= 0.5;
164  v2 -= v1;
165 
166  for (unsigned int i = 0; i < v2.GetSize(); ++i)
167  ASSERT_EQUAL(v2[i], 0.);
168 
169  SVector<10> v3;
170  SVector<10> v4;
171 
172  for (unsigned int i = 0; i < v3.GetSize(); ++i) {
173  v3[i] = i;
174  v4[i] = -2 * int(i);
175  }
176 
177  const double dot = v3 * v4;
178 
179  ASSERT_EQUAL(dot, -570.);
180 
181  const SVector<10> v5 = v3 + v4;
182 
183  for (unsigned int i = 0; i < v5.GetSize(); ++i)
184  ASSERT_EQUAL(v5[i], -double(i));
185 
186  const SVector<10> v6 = v3 - v4;
187 
188  for (unsigned int i = 0; i < v5.GetSize(); ++i)
189  ASSERT_EQUAL(v6[i], 3.*i);
190  }
191 
192  void
194  {
195  const double eps = 1e-8;
196  SVector<3> v1;
197  v1 = 1., 1., 1.;
198  SVector<3> v2;
199  v2 = 1., 1., 1.+eps;
200  ASSERT_CLOSE(CosAngle(v1, v2), 1.);
201  ASSERT_CLOSE(Angle(v1, v2), 0.);
202  SVector<3> v3;
203  v3 = -1., -1., -1.+eps;
204  ASSERT_CLOSE(CosAngle(v1, v3), -1.);
205  ASSERT_CLOSE(Angle(v1, v3), M_PI);
206  }
207 
208  void
210  {
211  {
212  SVector<5> v;
213  v = 1., 2, 3, 4, 5;
214  double count = 0;
215  for (unsigned int i = 0; i < v.GetSize(); ++i)
216  ASSERT_EQUAL(v[i], ++count);
217  }
218 
219  {
220  SVector<10, int> v(0);
221  v = 1, 2, 3;
222 
223  for (unsigned int i = 0; i < 3; ++i)
224  ASSERT_EQUAL(v[i], int(i+1));
225  for (unsigned int i = 3; i < v.GetSize(); ++i)
226  ASSERT_EQUAL(v[i], 0);
227  }
228  {
229  SVector<10> v(0.);
230  v = 1., 2, 3;
231 
232  for (unsigned int i = 0; i < 3; ++i)
233  ASSERT_EQUAL(v[i], double(i+1));
234  for (unsigned int i = 3; i < v.GetSize(); ++i)
235  ASSERT_EQUAL(v[i], 0.);
236  }
237  {
238  SVector<10> v(0.);
239  v = 1., 2, 3;
240 
242  m = v, v, v;
243 
244  for (unsigned int i = 0; i < 3; ++i)
245  for (unsigned int j = 0; j < m[0].GetSize(); ++j)
246  ASSERT_EQUAL(m[i][j], v[j]);
247  for (unsigned int i = 3; i < v.GetSize(); ++i)
248  for (unsigned int j = 0; j < m[0].GetSize(); ++j)
249  ASSERT_EQUAL(m[i][j], 0.);
250  }
251  }
252 
253  void
255  {
256  const int n = 10;
257  typedef SVector<n, int> SVNI;
258  SVNI v;
259  for (int i = 0; i < n; ++i)
260  v[i] = i;
261  int i = 0;
262  for (SVNI::Iterator it = v.Begin(); it != v.End(); ++it) {
263  ASSERT_EQUAL(*it, i);
264  ++i;
265  }
266  i = 0;
267  for (SVNI::ConstIterator it = v.Begin(); it != v.End(); ++it) {
268  ASSERT_EQUAL(*it, i);
269  ++i;
270  }
271  }
272 
273  void
275  {
276  {
277  // default ctor
279 
282  ASSERT_EQUAL(m.GetNRows(), 10U);
283  ASSERT_EQUAL(m.GetNColumns(), 100U);
284 
285  // clear
286  m.Clear();
287 
288  for (unsigned int i = 0; i < m.GetNRows(); ++i)
289  for (unsigned int j = 0; j < m.GetNColumns(); ++j)
290  ASSERT_EQUAL(m[i][j], 0.);
291 
292  ASSERT_EQUAL((m.Get<0, 0>()), 0.);
293  ASSERT_EQUAL((m.Get<9, 0>()), 0.);
294  ASSERT_EQUAL((m.Get<0, 99>()), 0.);
295  ASSERT_EQUAL((m.Get<9, 99>()), 0.);
296  ASSERT_EQUAL((m.Get<5, 50>()), 0.);
297 
298  const int value = 1;
299  m.Clear(value);
300 
301  for (unsigned int i = 0; i < m.GetNRows(); ++i)
302  for (unsigned int j = 0; j < m.GetNColumns(); ++j)
303  ASSERT_EQUAL(m[i][j], double(value));
304  }
305 
306  {
307  // scalar initializer
308  const int value = 13;
309  SMatrix<100, 5, int> m(value);
310 
311  for (unsigned int i = 0; i < m.GetNRows(); ++i)
312  for (unsigned int j = 0; j < m.GetNColumns(); ++j)
313  ASSERT_EQUAL(m[i][j], 13);
314 
315  ASSERT_EQUAL((m.Get<0, 0>()), 13);
316  ASSERT_EQUAL((m.Get<99, 0>()), 13);
317  ASSERT_EQUAL((m.Get<0, 4>()), 13);
318  ASSERT_EQUAL((m.Get<99, 4>()), 13);
319  ASSERT_EQUAL((m.Get<50, 2>()), 13);
320 
321  // non-identical copy
322  SMatrix<100, 5> md(m);
323 
324  for (unsigned int i = 0; i < md.GetNRows(); ++i)
325  for (unsigned int j = 0; j < md.GetNColumns(); ++j)
326  ASSERT_EQUAL(md[i][j], double(m[i][j]));
327  }
328 
329  {
330  // functor initializer
331  Bar bar;
332  SMatrix<5, 5> m(bar);
333 
334  for (unsigned int i = 0; i < m.GetNRows(); ++i)
335  for (unsigned int j = 0; j < m.GetNColumns(); ++j)
336  ASSERT_EQUAL(m[i][j], double(bar[i][j]));
337  }
338 
339  {
340  // c-array initializer
341  const int a[][3] = {
342  { 1, 2, 3 },
343  { 4, 5, 6 },
344  { 7, 8, 9 },
345  { 10, 11, 12 }
346  };
347 
349 
350  {
351  int count = 0;
352  for (unsigned int i = 0; i < m.GetNRows(); ++i)
353  for (unsigned int j = 0; j < m.GetNColumns(); ++j)
354  ASSERT_EQUAL(m[i][j], ++count);
355  }
356 
357  // nonidentical copy
358  SMatrix<4, 3> md(a);
359 
360  {
361  double count = 0;
362  for (unsigned int i = 0; i < md.GetNRows(); ++i)
363  for (unsigned int j = 0; j < md.GetNColumns(); ++j)
364  ASSERT_EQUAL(md[i][j], ++count);
365  }
366 
367  // copy ctor
369 
370  for (unsigned int i = 0; i < m2.GetNRows(); ++i)
371  for (unsigned int j = 0; j < m2.GetNColumns(); ++j)
372  ASSERT_EQUAL(m2[i][j], m[i][j]);
373  }
374 
375  {
376  int** ma = new int*[10];
377  int count = 0;
378  for (unsigned int i = 0; i < 10; ++i) {
379  ma[i] = new int[100];
380  for (unsigned int j = 0; j < 100; ++j)
381  ma[i][j] = ++count;
382  }
383 
384  // ** ctor
385  SMatrix<10, 100> m(ma);
386 
387  for (unsigned int i = 0; i < 10; ++i)
388  for (unsigned int j = 0; j < 100; j++)
389  ASSERT_EQUAL(m[i][j], double(ma[i][j]));
390 
391  for (unsigned int i = 0; i < 10; ++i)
392  delete[] ma[i];
393  delete[] ma;
394  }
395  }
396 
397  void
399  {
400  SMatrix<10, 5> m1(1.);
401 
402  m1 *= 2;
403 
404  for (unsigned int i = 0; i < m1.GetNRows(); ++i)
405  for (unsigned int j = 0; j < m1.GetNColumns(); ++j)
406  ASSERT_EQUAL(m1[i][j], 2.);
407 
408  SMatrix<10, 5> m2(0.);
409 
410  m2 += m1;
411 
412  for (unsigned int i = 0; i < m2.GetNRows(); ++i)
413  for (unsigned int j = 0; j < m2.GetNColumns(); ++j)
414  ASSERT_EQUAL(m2[i][j], 2.);
415 
416  m2 += m1;
417  m2 *= 0.5;
418  m2 -= m1;
419 
420  for (unsigned int i = 0; i < m2.GetNRows(); ++i)
421  for (unsigned int j = 0; j < m2.GetNColumns(); ++j)
422  ASSERT_EQUAL(m2[i][j], 0.);
423 
424  {
425  const unsigned int n = 100;
426  const unsigned int m = 50;
428  SMatrix<m, n> m4;
429 
430  for (unsigned int i = 0; i < m3.GetNRows(); ++i)
431  for (unsigned int j = 0; j < m3.GetNColumns(); ++j) {
432  m3[i][j] = i + j;
433  m4[j][i] = -2 * int(i) + int(j);
434  }
435 
436  const SMatrix<10, 10> prod(m3 * m4);
437 
438  {
439  const int m = m3.GetNColumns();
440  ASSERT_EQUAL(m, int(m4.GetNRows()));
441  for (unsigned int i = 0; i < prod.GetNRows(); ++i)
442  for (unsigned int j = 0; j < prod.GetNColumns(); ++j) {
443  const int ii = i;
444  const int jj = j;
445  ASSERT_EQUAL(
446  prod[i][j],
447  double(-2*m*ii*jj+(ii-2*jj)*(m-1)*m/2+(m-1)*m*(2*m-1)/6)
448  );
449  }
450  }
451  }
452  }
453 
454  /*void
455  TestSMatrixSVectorOp()
456  {
457  const unsigned int n = 10;
458  const unsigned int m = 5;
459 
460  SMatrix<n, m> a;
461 
462  for (unsigned int i = 0; i < a.GetNRows(); ++i)
463  for (unsigned int j = 0; j < a.GetNColumns(); ++j)
464  a[i][j] = int(i) - 3*int(j);
465 
466  SVector<m> x;
467  SVector<m, int> xi;
468 
469  for (unsigned int i = 0; i < x.GetSize(); ++i) {
470  x[i] = i;
471  xi[i] = i;
472  }
473 
474  const SVector<n> y = a * x;
475  const SVector<n> yi = a * xi;
476 
477  {
478  const int mm = m;
479  for (unsigned int i = 0; i < x.GetSize(); ++i) {
480  const int ii = i;
481  ASSERT_EQUAL(y[i],
482  double(ii*(mm-1)*mm/2-(mm-1)*mm*(2*mm-1)/2));
483  ASSERT_EQUAL(yi[i],
484  double(ii*(mm-1)*mm/2-(mm-1)*mm*(2*mm-1)/2));
485  }
486  }
487  }*/
488 
489  void
491  {
492  {
494  m =
495  1., 2., 3., 4.,
496  5., 6., 7., 8.,
497  9., 10, 11, 12;
498  double count = 0;
499  for (unsigned int i = 0; i < m.GetNRows(); ++i)
500  for (unsigned int j = 0; j < m.GetNColumns(); ++j)
501  ASSERT_EQUAL(m[i][j], ++count);
502  }
503 
504  {
506  m =
507  1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
508  14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
509  27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
510  40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
511  53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
512  66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
513  79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
514  92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
515  105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
516  118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
517  131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
518  144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156,
519  157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
520  170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182,
521  183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195,
522  196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
523  209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221,
524  222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234,
525  235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
526  248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
527  261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273;
528  int count = 0;
529  for (unsigned int i = 0; i < m.GetNRows(); ++i)
530  for (unsigned int j = 0; j < m.GetNColumns(); ++j)
531  ASSERT_EQUAL(m[i][j], ++count);
532  }
533  }
534 
535  void
537  {
538  {
539  // dot product of two vectors of vectors is a scalar
540  // (recursive dot product)
541 
544 
545  const double partialDot = v1[0] * v2[0];
546 
547  ASSERT_EQUAL(partialDot, 2.*v1[0].GetSize());
548 
549  const double dot = v1 * v2;
550 
551  ASSERT_EQUAL(dot, 2.*v1.GetSize()*v1[0].GetSize());
552  }
553 
554  {
555  // dot product of two vectors of matrices is a matrix
556 
559 
560  const SMatrix<20, 20> partialDot = v1[0] * v2[0];
561 
562  const SMatrix<20, 20> partialRes(2.*v1[0].GetNColumns());
563 
564  ASSERT_EQUAL(partialDot, partialRes);
565 
566  const SMatrix<20, 20> dot = v1 * v2;
567 
568  const SMatrix<20, 20> dotRes(2.*v1[0].GetNColumns()*v1.GetSize());
569 
570  ASSERT_EQUAL(dot, dotRes);
571  }
572 
573  {
574  // dot product of two vectors of matrices of different type
575  // is a matrix
576 
579 
580  const SMatrix<20, 20, double> partialDot = v1[0] * v2[0];
581 
582  const SMatrix<20, 20, double> partialRes(2.*v1[0].GetNColumns());
583 
584  ASSERT_EQUAL(partialDot, partialRes);
585 
586  const SMatrix<20, 20, double> dot = v1 * v2;
587 
588  const SMatrix<20, 20, double> dotRes(2.*v1[0].GetNColumns()*v1.GetSize());
589 
590  ASSERT_EQUAL(dot, dotRes);
591  }
592  }
593 
594 };
595 
596 
double Angle(const double theta1, const double phi1, const double theta2, const double phi2)
const int fOffset
constexpr double m2
Definition: AugerUnits.h:122
CPPUNIT_TEST_SUITE_REGISTRATION(testAiresShowerFile)
#define U
T & Get()
Definition: SMatrix.h:77
#define ASSERT_CLOSE(x, y)
Static (small and dense) vector class.
Definition: SVector.h:33
constexpr double m3
Definition: AugerUnits.h:123
static std::size_t GetSize()
Definition: SVector.h:41
Foo operator[](const unsigned int i) const
double eps
#define ASSERT_EQUAL(x, y)
T & Get()
static getter
Definition: SVector.h:125
double CosAngle(const Vector &l, const Vector &r)
Definition: OperationsVV.h:71
int operator[](const unsigned int i) const
static unsigned int GetNRows()
Definition: SMatrix.h:31
constexpr double m
Definition: AugerUnits.h:121
constexpr double bar
Definition: AugerUnits.h:213
static unsigned int GetNColumns()
Definition: SMatrix.h:33
Foo(const int off=0)
Static (small and dense) matrix class.
Definition: SMatrix.h:23

, generated on Tue Sep 26 2023.