Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkVectorTest.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 // Testing
13 #include "mitkTestFixture.h"
14 #include <mitkTestingMacros.h>
15 
16 // std includes
17 #include <string>
18 
19 // MITK includes
20 #include "mitkStringProperty.h"
21 #include <mitkNumericTypes.h>
22 
23 // itksys
24 #include "itkImage.h"
25 
26 // VTK includes
27 #include <vtkDebugLeaks.h>
28 
29 // vnl includes
30 #include <vnl/vnl_vector_fixed.hxx>
31 
32 class mitkVectorTestSuite : public mitk::TestFixture
33 {
34  CPPUNIT_TEST_SUITE(mitkVectorTestSuite);
35 
36  MITK_TEST(ItkVecorEqualityUsingSameVector_Success);
37  MITK_TEST(ItkVecorEqualityUsingDifferentVectors_Failure);
38  MITK_TEST(ItkVecorEqualityForHigherEpsilonTolerance_Success);
39  MITK_TEST(ItkVecorEqualityUsingDifferentVectorsWithElementWise_Success);
40 
41  MITK_TEST(ItkPointEqualitySamePoint_Success);
42  MITK_TEST(ItkPointEqualityDifferentPoints_Failure);
43  MITK_TEST(ItkPointEqualitForHigherEpsilons_Success);
44  MITK_TEST(ItkPointEqualitDifferentPointsWithElementWise_Success);
45 
46  MITK_TEST(MitkVnlVectorEqualitySameMitkVnlVector_Success);
47  MITK_TEST(MitkVnlVectorEqualityDifferentMitkVnlVectors_Failure);
48  MITK_TEST(MitkVnlVectorEqualityHigherEpsilon_Success);
49  MITK_TEST(MitkVnlVectorEqualityUsingDifferentMitkVnlVectorsWithElementWise_Success);
50 
51  MITK_TEST(VnlVectorEqualitySameVnlVector_Success);
52  MITK_TEST(VnlVectorEqualityDifferentVnlVectors_Failure);
53  MITK_TEST(VnlVectorEqualityDifferentVnlVectorsWithHighEps_Success);
54  MITK_TEST(VnlVectorEqualityDifferentVnlVectorsWithLowEps_Success);
55  MITK_TEST(VnlVectorEqualityDifferentVnlVectorsWithLowEps_Failure);
56 
57  MITK_TEST(ScalarEqualitySameScalar_Successs);
58  MITK_TEST(ScalarEqualityDifferentScalarsDifferenceGreaterEps_Failure);
59  MITK_TEST(ScalarEqualityDifferentScalarsDifferenceEqualEps_Successs);
60  MITK_TEST(ScalarEqualityDifferentScalarsDifferenceLessEps_Successs);
61 
62  MITK_TEST(MatrixEqualitySameMatrixElementsWithEps_Success);
63  MITK_TEST(MatrixEqualityElementWiseDifferentMatrixElementsWithEpsilonZero_Failure);
64  MITK_TEST(MatrixEqualityDifferentMatrixElementsWithEpsilon_Success);
65  MITK_TEST(MatrixEqualityRMSDifferentMatrixElementsWithEpsilon_Failure);
66  MITK_TEST(MatrixEqualityRMSDifferentMatrixElementsWithEpsilonZero_Success);
67 
68  CPPUNIT_TEST_SUITE_END();
69 
70 private:
71  itk::Vector<mitk::ScalarType, 3> m_ItkVector_1;
72  itk::Vector<mitk::ScalarType, 3> m_ItkVector_2;
73  itk::Vector<mitk::ScalarType, 3> m_ItkVector_3;
74 
75  itk::Point<mitk::ScalarType, 3> m_ItkPoint_1;
76  itk::Point<mitk::ScalarType, 3> m_ItkPoint_2;
77  itk::Point<mitk::ScalarType, 3> m_ItkPoint_3;
78 
79  typedef mitk::ScalarType VnlValueType;
80  vnl_vector_fixed<VnlValueType, 7> m_VnlVector_1;
81  vnl_vector_fixed<VnlValueType, 7> m_VnlVector_2;
82  vnl_vector_fixed<VnlValueType, 7> m_VnlVector_3;
83 
84  mitk::ScalarType m_Scalar1;
85  mitk::ScalarType m_Scalar2;
86  mitk::ScalarType m_Scalar3;
87  mitk::ScalarType m_Scalar4;
88 
89  vnl_matrix_fixed<mitk::ScalarType, 3, 3> m_VnlMatrix3x3_1;
90  vnl_matrix_fixed<mitk::ScalarType, 3, 3> m_VnlMatrix3x3_2;
91 
92  mitk::ScalarType m_Epsilon;
93 
94 public:
95  void setUp() override
96  {
97  m_ItkVector_1[0] = 4.6;
98  m_ItkVector_1[1] = 9.76543;
99  m_ItkVector_1[2] = 746.09;
100 
101  m_VnlVector_1[0] = 4.6;
102  m_VnlVector_1[1] = 9.76543;
103  m_VnlVector_1[2] = 746.09;
104  m_VnlVector_1[3] = 56.98;
105  m_VnlVector_1[4] = 22.32;
106  m_VnlVector_1[5] = 1.00;
107  m_VnlVector_1[6] = 746.09;
108 
109  m_Scalar1 = 0.5689;
110  m_Scalar2 = m_Scalar1 + mitk::eps * 1.01;
111  m_Scalar3 = m_Scalar1;
112  m_Scalar4 = m_Scalar1 + mitk::eps * 0.95;
113 
114  m_VnlMatrix3x3_1(0, 0) = 1.1;
115  m_VnlMatrix3x3_1(0, 1) = 0.4;
116  m_VnlMatrix3x3_1(0, 2) = 5.3;
117  m_VnlMatrix3x3_1(1, 0) = 2.7;
118  m_VnlMatrix3x3_1(1, 1) = 3578.56418;
119  m_VnlMatrix3x3_1(1, 2) = 123.56;
120  m_VnlMatrix3x3_1(2, 0) = 546.89;
121  m_VnlMatrix3x3_1(2, 1) = 0.0001;
122  m_VnlMatrix3x3_1(2, 2) = 1.0;
123 
124  m_VnlMatrix3x3_2(0, 0) = 1.1000009;
125  m_VnlMatrix3x3_2(0, 1) = 0.4000009;
126  m_VnlMatrix3x3_2(0, 2) = 5.3000009;
127  m_VnlMatrix3x3_2(1, 0) = 2.7000009;
128  m_VnlMatrix3x3_2(1, 1) = 3578.5641809;
129  m_VnlMatrix3x3_2(1, 2) = 123.5600009;
130  m_VnlMatrix3x3_2(2, 0) = 546.8900009;
131  m_VnlMatrix3x3_2(2, 1) = 0.0001009;
132  m_VnlMatrix3x3_2(2, 2) = 1.0000009;
133 
134  m_Epsilon = 0.000001;
135  }
136 
137  void tearDown() override
138  {
139  m_ItkVector_1.Fill(0);
140  m_ItkVector_2.Fill(0);
141  m_ItkVector_3.Fill(0);
142  m_ItkPoint_1.Fill(0);
143  m_ItkPoint_2.Fill(0);
144  m_ItkPoint_3.Fill(0);
145 
146  m_VnlVector_1.fill(0);
147  m_VnlVector_2.fill(0);
148  m_VnlVector_3.fill(0);
149 
150  m_Scalar1 = 0;
151  m_Scalar2 = 0;
152  m_Scalar3 = 0;
153  m_Scalar4 = 0;
154 
155  m_VnlMatrix3x3_1.fill(0);
156  m_VnlMatrix3x3_2.fill(0);
157  }
158 
159  void ItkVecorEqualityUsingSameVector_Success()
160  {
161  CPPUNIT_ASSERT_MESSAGE("Test vector equality using the same vector with mitk::eps",
162  mitk::Equal(m_ItkVector_1, m_ItkVector_1));
163  }
164 
165  void ItkVecorEqualityUsingDifferentVectors_Failure()
166  {
167  for (int i = 0; i < 3; i++)
168  {
169  m_ItkVector_2[i] = m_ItkVector_1[i] - mitk::eps * 1.1;
170  }
171  CPPUNIT_ASSERT_NO_THROW_MESSAGE(
172  "Test vector equality using different vectors with an element-wise difference greater than mitk::eps",
173  mitk::Equal(m_ItkVector_1, m_ItkVector_2));
174  }
175 
176  void ItkVecorEqualityForHigherEpsilonTolerance_Success()
177  {
178  for (int i = 0; i < 3; i++)
179  {
180  m_ItkVector_2[i] = m_ItkVector_1[i] - mitk::eps * 1.1;
181  }
182  CPPUNIT_ASSERT_MESSAGE("Vectors are equal for higher epsilon tolerance ( 1.2 * mitk::eps )",
183  mitk::Equal(m_ItkVector_1, m_ItkVector_2, mitk::eps * 1.2));
184  }
185 
186  void ItkVecorEqualityUsingDifferentVectorsWithElementWise_Success()
187  {
188  for (int i = 0; i < 3; i++)
189  {
190  m_ItkVector_3[i] = m_ItkVector_1[i] - mitk::eps * 0.9;
191  }
192  CPPUNIT_ASSERT_MESSAGE(
193  "Test vector equality using different vectors with an element-wise difference less than mitk::eps",
194  mitk::Equal(m_ItkVector_1, m_ItkVector_3));
195  }
196 
197  void ItkPointEqualitySamePoint_Success()
198  {
199  // test itk point equality methods
200  for (int i = 0; i < 3; i++)
201  {
202  m_ItkPoint_1[i] = m_ItkVector_1[i];
203  }
204  CPPUNIT_ASSERT_MESSAGE("Test point equality using the same point with mitk::eps",
205  mitk::Equal(m_ItkPoint_1, m_ItkPoint_1));
206  }
207 
208  void ItkPointEqualityDifferentPoints_Failure()
209  {
210  for (int i = 0; i < 3; i++)
211  {
212  m_ItkPoint_1[i] = m_ItkVector_1[i];
213  m_ItkPoint_2[i] = m_ItkVector_2[i];
214  }
215  CPPUNIT_ASSERT_NO_THROW_MESSAGE(
216  "Test point equality using different points with an element-wise difference greater than mitk::eps",
217  mitk::Equal(m_ItkPoint_1, m_ItkPoint_2));
218  }
219 
220  void ItkPointEqualitForHigherEpsilons_Success()
221  {
222  for (int i = 0; i < 3; i++)
223  {
224  m_ItkVector_2[i] = m_ItkVector_1[i] - mitk::eps * 1.1;
225  }
226 
227  for (int i = 0; i < 3; i++)
228  {
229  m_ItkPoint_1[i] = m_ItkVector_1[i];
230  m_ItkPoint_2[i] = m_ItkVector_2[i];
231  }
232  CPPUNIT_ASSERT_MESSAGE("Points are equal for higher epsilon tolerance ( 1.2 * mitk::eps )",
233  mitk::Equal(m_ItkPoint_1, m_ItkPoint_2, mitk::eps * 1.2));
234  }
235 
236  void ItkPointEqualitDifferentPointsWithElementWise_Success()
237  {
238  for (int i = 0; i < 3; i++)
239  {
240  m_ItkVector_3[i] = m_ItkVector_1[i] - mitk::eps * 0.9;
241  }
242 
243  for (int i = 0; i < 3; i++)
244  {
245  m_ItkPoint_1[i] = m_ItkVector_1[i];
246  m_ItkPoint_3[i] = m_ItkVector_3[i];
247  }
248  CPPUNIT_ASSERT_MESSAGE(
249  "Test point equality using different points with an element-wise difference less than mitk::eps",
250  mitk::Equal(m_ItkPoint_1, m_ItkPoint_3));
251  }
252 
253  void MitkVnlVectorEqualitySameMitkVnlVector_Success()
254  {
255  mitk::VnlVector mitkVnlVector_1(3);
256 
257  for (int i = 0; i < 3; i++)
258  {
259  mitkVnlVector_1.put(i, m_ItkVector_1[i]);
260  }
261 
262  CPPUNIT_ASSERT_MESSAGE("Test mitk vnl vector equality using the same mitk vnl vector with mitk::eps",
263  mitk::Equal(mitkVnlVector_1, mitkVnlVector_1));
264  }
265 
266  void MitkVnlVectorEqualityDifferentMitkVnlVectors_Failure()
267  {
268  mitk::VnlVector mitkVnlVector_1(3);
269  mitk::VnlVector mitkVnlVector_2(3);
270 
271  for (int i = 0; i < 3; i++)
272  {
273  mitkVnlVector_1.put(i, m_ItkVector_1[i]);
274  mitkVnlVector_2.put(i, m_ItkVector_2[i]);
275  }
276 
277  CPPUNIT_ASSERT_NO_THROW_MESSAGE(
278  "Test mitk vnl vector equality using different mitk vnl vectors with an element-wise difference "
279  "greater than mitk::eps",
280  mitk::Equal(mitkVnlVector_1, mitkVnlVector_2));
281  }
282 
283  void MitkVnlVectorEqualityHigherEpsilon_Success()
284  {
285  mitk::VnlVector mitkVnlVector_1(3);
286  mitk::VnlVector mitkVnlVector_2(3);
287 
288  for (int i = 0; i < 3; i++)
289  {
290  m_ItkVector_2[i] = m_ItkVector_1[i] - mitk::eps * 1.1;
291  }
292 
293  for (int i = 0; i < 3; i++)
294  {
295  mitkVnlVector_1.put(i, m_ItkVector_1[i]);
296  mitkVnlVector_2.put(i, m_ItkVector_2[i]);
297  }
298 
299  CPPUNIT_ASSERT_MESSAGE("Vnl vectors are equal for higher epsilon tolerance ( 1.2 * mitk::eps )",
300  mitk::Equal(mitkVnlVector_1, mitkVnlVector_2, mitk::eps * 1.2));
301  }
302 
303  void MitkVnlVectorEqualityUsingDifferentMitkVnlVectorsWithElementWise_Success()
304  {
305  mitk::VnlVector mitkVnlVector_1(3);
306  mitk::VnlVector mitkVnlVector_3(3);
307 
308  for (int i = 0; i < 3; i++)
309  {
310  m_ItkVector_3[i] = m_ItkVector_1[i] - mitk::eps * 0.9;
311  }
312 
313  for (int i = 0; i < 3; i++)
314  {
315  mitkVnlVector_1.put(i, m_ItkVector_1[i]);
316  mitkVnlVector_3.put(i, m_ItkVector_3[i]);
317  }
318 
319  CPPUNIT_ASSERT_MESSAGE("Test mitk vnl vector equality using "
320  "different mitk vnl vectors with an "
321  "element-wise difference less than mitk::eps",
322  mitk::Equal(mitkVnlVector_1, mitkVnlVector_3));
323  }
324 
325  void VnlVectorEqualitySameVnlVector_Success()
326  {
327  // test vnl_vector equality method
328 
329  CPPUNIT_ASSERT_MESSAGE("vnl_fixed : v_1 == v_1 ", (mitk::Equal<VnlValueType, 7>(m_VnlVector_1, m_VnlVector_1)));
330  }
331 
332  // the v_2 is constructed so that the equality test fails for mitk::eps, the norm of the difference between the
333  // vectors is 7 * eps/6.9
334  void VnlVectorEqualityDifferentVnlVectors_Failure()
335  {
336  for (int i = 0; i < 7; i++)
337  {
338  m_VnlVector_2[i] = m_VnlVector_1[i] - mitk::eps * 1.1f;
339  }
340 
341  CPPUNIT_ASSERT_NO_THROW_MESSAGE("vnl_fixed : v_1 != v_2 with mitk::eps ",
342  (mitk::Equal<VnlValueType, 7>(m_VnlVector_1, m_VnlVector_2)));
343  }
344 
345  // increase the epsilon value used for testing equality - should now pass ( 1.2 * mitk::eps > 7 * mitk::eps/6.9 )
346  void VnlVectorEqualityDifferentVnlVectorsWithHighEps_Success()
347  {
348  for (int i = 0; i < 7; i++)
349  {
350  m_VnlVector_2[i] = m_VnlVector_1[i] - mitk::eps * 1.1f;
351  }
352 
353  CPPUNIT_ASSERT_MESSAGE("vnl_fixed : v_1 == v_2 with eps = 1.2 * mitk::eps ",
354  (mitk::Equal<VnlValueType, 7>(m_VnlVector_1, m_VnlVector_2, mitk::eps * 1.2f)));
355  }
356 
357  void VnlVectorEqualityDifferentVnlVectorsWithLowEps_Success()
358  {
359  for (int i = 0; i < 7; i++)
360  {
361  m_VnlVector_3[i] = m_VnlVector_1[i] - mitk::eps * 0.9f;
362  }
363 
364  CPPUNIT_ASSERT_MESSAGE("vnl_fixed : v_1 == v_3 with eps = 0.8 * mitk::eps ",
365  (mitk::Equal<VnlValueType, 7>(m_VnlVector_1, m_VnlVector_3, mitk::eps)));
366  }
367 
368  void VnlVectorEqualityDifferentVnlVectorsWithLowEps_Failure()
369  {
370  for (int i = 0; i < 7; i++)
371  {
372  m_VnlVector_3[i] = m_VnlVector_1[i] - mitk::eps * 0.9f;
373  }
374 
375  CPPUNIT_ASSERT_NO_THROW_MESSAGE("vnl_fixed : v_1 != v_3 with eps = 0.8 * mitk::eps ",
376  (mitk::Equal<VnlValueType, 7>(m_VnlVector_1, m_VnlVector_3, mitk::eps * 0.8f)));
377  }
378 
379  void ScalarEqualitySameScalar_Successs()
380  {
381  // test scalar equality method
382  CPPUNIT_ASSERT_MESSAGE("Test scalar equality using the same scalar with mitk::eps",
383  mitk::Equal(m_Scalar1, m_Scalar1));
384  }
385  void ScalarEqualityDifferentScalarsDifferenceGreaterEps_Failure()
386  {
387  CPPUNIT_ASSERT_NO_THROW_MESSAGE(
388  "Test scalar equality using the different scalars with a difference greater than mitk::eps",
389  mitk::Equal(m_Scalar1, m_Scalar2));
390  }
391 
392  void ScalarEqualityDifferentScalarsDifferenceEqualEps_Successs()
393  {
394  CPPUNIT_ASSERT_MESSAGE("Test scalar equality using the different scalars with a difference equal to mitk::eps",
395  mitk::Equal(m_Scalar1, m_Scalar3));
396  }
397 
398  void ScalarEqualityDifferentScalarsDifferenceLessEps_Successs()
399  {
400  CPPUNIT_ASSERT_MESSAGE("Test scalar equality using the different scalars with a difference less than mitk::eps",
401  mitk::Equal(m_Scalar1, m_Scalar4));
402  }
403 
404  void MatrixEqualitySameMatrixElementsWithEps_Success()
405  {
406  // test matrix equality methods
407  CPPUNIT_ASSERT_MESSAGE("Test for matrix equality with given epsilon=mitk::eps and exactly the same matrix elements",
408  mitk::MatrixEqualElementWise(m_VnlMatrix3x3_1, m_VnlMatrix3x3_1, mitk::eps));
409  }
410 
411  void MatrixEqualityElementWiseDifferentMatrixElementsWithEpsilonZero_Failure()
412  {
413  CPPUNIT_ASSERT_NO_THROW_MESSAGE(
414  "Test for matrix equality with given epsilon=0.0 and slightly different matrix elements",
415  mitk::MatrixEqualElementWise(m_VnlMatrix3x3_1, m_VnlMatrix3x3_2, 0.0));
416  }
417 
418  void MatrixEqualityDifferentMatrixElementsWithEpsilon_Success()
419  {
420  CPPUNIT_ASSERT_MESSAGE("Test for matrix equality with given epsilon and slightly different matrix elements",
421  mitk::MatrixEqualElementWise(m_VnlMatrix3x3_1, m_VnlMatrix3x3_2, m_Epsilon));
422  }
423 
424  void MatrixEqualityRMSDifferentMatrixElementsWithEpsilon_Failure()
425  {
426  CPPUNIT_ASSERT_NO_THROW_MESSAGE(
427  "Test for matrix equality with given epsilon=0.0 and slightly different matrix elements",
428  mitk::MatrixEqualRMS(m_VnlMatrix3x3_1, m_VnlMatrix3x3_2, 0.0));
429  }
430 
431  void MatrixEqualityRMSDifferentMatrixElementsWithEpsilonZero_Success()
432  {
433  CPPUNIT_ASSERT_MESSAGE("Test for matrix equality with given epsilon and slightly different matrix elements",
434  mitk::MatrixEqualRMS(m_VnlMatrix3x3_1, m_VnlMatrix3x3_2, m_Epsilon));
435  }
436 };
MITK_TEST_SUITE_REGISTRATION(mitkImageToItk)
bool MatrixEqualElementWise(const vnl_matrix_fixed< TCoordRep, NRows, NCols > &matrix1, const vnl_matrix_fixed< TCoordRep, NRows, NCols > &matrix2, mitk::ScalarType epsilon=mitk::eps)
Check for element-wise matrix equality with a user defined accuracy.
Definition: mitkMatrix.h:140
vnl_vector< ScalarType > VnlVector
Definition: mitkVector.h:134
double ScalarType
#define MITK_TEST(TESTMETHOD)
Adds a test to the current test suite.
Test fixture for parameterized tests.
bool MatrixEqualRMS(const vnl_matrix_fixed< TCoordRep, NRows, NCols > &matrix1, const vnl_matrix_fixed< TCoordRep, NRows, NCols > &matrix2, mitk::ScalarType epsilon=mitk::eps)
Check for matrix equality with a user defined accuracy. As an equality metric the root mean squared e...
Definition: mitkMatrix.h:96
MITKNEWMODULE_EXPORT bool Equal(mitk::ExampleDataStructure *leftHandSide, mitk::ExampleDataStructure *rightHandSide, mitk::ScalarType eps, bool verbose)
Returns true if the example data structures are considered equal.
MITKCORE_EXPORT const ScalarType eps