GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: src/tensor_check_impl.h Lines: 44 44 100.0 %
Date: 2026-03-27 22:08:32 Branches: 32 32 100.0 %

Line Branch Exec Source
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