1 |
|
|
/*************************************** |
2 |
|
|
Auteur : Pierre Aubert |
3 |
|
|
Mail : pierre.aubert@lapp.in2p3.fr |
4 |
|
|
Licence : CeCILL-C |
5 |
|
|
****************************************/ |
6 |
|
|
|
7 |
|
|
#ifndef __TENSOR_CHECK_IMPL_H__ |
8 |
|
|
#define __TENSOR_CHECK_IMPL_H__ |
9 |
|
|
|
10 |
|
|
#include <cmath> |
11 |
|
|
#include "tensor_check.h" |
12 |
|
|
|
13 |
|
|
///Check if tensors are the same |
14 |
|
|
/** @param testName : name of the test |
15 |
|
|
* @param tensor : PTensor to be checked |
16 |
|
|
* @param referenceTensor : reference PTensor |
17 |
|
|
* @return true on success, false otherwise |
18 |
|
|
*/ |
19 |
|
|
template<typename T> |
20 |
|
667 |
bool checkTensor(const std::string & testName, const PTensor<T> & tensor, const PTensor<T> & referenceTensor){ |
21 |
✓✓ |
667 |
if(tensor.getNbDim() != referenceTensor.getNbDim()){ |
22 |
|
1 |
std::cerr << "checkTensor("<<testName<<") : wrong number of dimension" << std::endl; |
23 |
|
1 |
return false; |
24 |
|
|
} |
25 |
|
666 |
const size_t * shape = tensor.getShape(); |
26 |
|
666 |
const size_t * refShape = referenceTensor.getShape(); |
27 |
✓✓ |
2124 |
for(size_t i(0lu); i < tensor.getNbDim(); ++i){ |
28 |
✓✓ |
1459 |
if(shape[i] != refShape[i]){ |
29 |
|
1 |
std::cerr << "checkTensor("<<testName<<") : wrong shape["<<i<<"](" << shape[i] << ") != refShape["<<i<<"]("<<refShape[i]<<")" << std::endl; |
30 |
|
1 |
return false; |
31 |
|
|
} |
32 |
|
|
} |
33 |
✓✓ |
665 |
if(tensor.getPadding() != referenceTensor.getPadding()){ |
34 |
|
1 |
std::cerr << "checkTensor("<<testName<<") : wrong padding tensor.getPadding("<<tensor.getPadding()<<") != referenceTensor.getPadding("<<referenceTensor.getPadding()<<")" << std::endl; |
35 |
|
1 |
return false; |
36 |
|
|
} |
37 |
✓✓ |
664 |
if(tensor.getAllocMode() != referenceTensor.getAllocMode()){ |
38 |
|
1 |
std::cerr << "checkTensor("<<testName<<") : wrong allocMode" << std::endl; |
39 |
|
1 |
return false; |
40 |
|
|
} |
41 |
✓✓ |
123824 |
for(size_t i(0lu); i < tensor.getFullNbRow(); ++i){ |
42 |
✓✓ |
5114109 |
for(size_t j(0lu); j < tensor.getNbCol(); ++j){ |
43 |
✓✓ |
4990948 |
if(tensor.getValue(i, j) != referenceTensor.getValue(i, j)){ |
44 |
|
1 |
std::cerr << "checkTensor("<<testName<<") : wrong tensor["<<i<<", "<<j<<"](" << tensor.getValue(i, j) << ") != referenceTensor["<<i<<", "<<j<<"]("<<referenceTensor.getValue(i, j)<<")" << std::endl; |
45 |
|
1 |
return false; |
46 |
|
|
} |
47 |
|
|
} |
48 |
|
|
} |
49 |
|
662 |
return true; |
50 |
|
|
} |
51 |
|
|
|
52 |
|
|
///Check if tensors are the same |
53 |
|
|
/** @param testName : name of the test |
54 |
|
|
* @param tensor : PTensor to be checked |
55 |
|
|
* @param referenceTensor : reference PTensor |
56 |
|
|
* @param epsilon : required precision |
57 |
|
|
* @return true on success, false otherwise |
58 |
|
|
*/ |
59 |
|
|
template<typename T> |
60 |
|
7 |
bool checkTensorEpsilon(const std::string & testName, const PTensor<T> & tensor, const PTensor<T> & referenceTensor, T epsilon){ |
61 |
✓✓ |
7 |
if(tensor.getNbDim() != referenceTensor.getNbDim()){ |
62 |
|
1 |
std::cerr << "checkTensorEpsilon("<<testName<<") : wrong number of dimension" << std::endl; |
63 |
|
1 |
return false; |
64 |
|
|
} |
65 |
|
6 |
const size_t * shape = tensor.getShape(); |
66 |
|
6 |
const size_t * refShape = referenceTensor.getShape(); |
67 |
✓✓ |
12 |
for(size_t i(0lu); i < tensor.getNbDim(); ++i){ |
68 |
✓✓ |
7 |
if(shape[i] != refShape[i]){ |
69 |
|
1 |
std::cerr << "checkTensorEpsilon("<<testName<<") : wrong shape["<<i<<"](" << shape[i] << ") != refShape["<<i<<"]("<<refShape[i]<<")" << std::endl; |
70 |
|
1 |
return false; |
71 |
|
|
} |
72 |
|
|
} |
73 |
✓✓ |
5 |
if(tensor.getPadding() != referenceTensor.getPadding()){ |
74 |
|
1 |
std::cerr << "checkTensorEpsilon("<<testName<<") : wrong padding tensor.getPadding("<<tensor.getPadding()<<") != referenceTensor.getPadding("<<referenceTensor.getPadding()<<")" << std::endl; |
75 |
|
1 |
return false; |
76 |
|
|
} |
77 |
✓✓ |
4 |
if(tensor.getAllocMode() != referenceTensor.getAllocMode()){ |
78 |
|
1 |
std::cerr << "checkTensorEpsilon("<<testName<<") : wrong allocMode" << std::endl; |
79 |
|
1 |
return false; |
80 |
|
|
} |
81 |
✓✓ |
8 |
for(size_t i(0lu); i < tensor.getFullNbRow(); ++i){ |
82 |
✓✓ |
33 |
for(size_t j(0lu); j < tensor.getNbCol(); ++j){ |
83 |
✓✓ |
28 |
if(fabs(tensor.getValue(i, j) - referenceTensor.getValue(i, j)) > epsilon){ |
84 |
|
1 |
std::cerr << "checkTensorEpsilon("<<testName<<") : wrong tensor["<<i<<", "<<j<<"](" << tensor.getValue(i, j) << ") != referenceTensor["<<i<<", "<<j<<"]("<<referenceTensor.getValue(i, j)<<")" << std::endl; |
85 |
|
1 |
return false; |
86 |
|
|
} |
87 |
|
|
} |
88 |
|
|
} |
89 |
|
2 |
return true; |
90 |
|
|
} |
91 |
|
|
|
92 |
|
|
#endif |
93 |
|
|
|