Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / src / inference_engine / data_stats.h
1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #pragma once
6
7 #include <float.h>
8
9 #include <vector>
10
11 #include "ie_api.h"
12
13 class INFERENCE_ENGINE_API_CLASS(DataStats) {
14   public:
15     template<typename T>
16     static void GetDataMinMax(const T* data, size_t count, T& min, T& max);
17
18     template<typename T>
19     static void GetDataAverage(const T* data, size_t count, T& ave);
20
21     template<typename T>
22     static void GetDataAbsMax(const T* data, size_t count, T& max);
23
24     template<typename T>
25     static T GetAbsMax(T min, T max);
26 };
27
28 template<typename T>
29 void DataStats::GetDataMinMax(const T* data, size_t count, T& min, T& max) {
30     for (size_t i = 0; i < count; i++) {
31         T val = data[i];
32
33         if (min > val) {
34             min = val;
35         }
36
37         if (max < val) {
38             max = val;
39         }
40     }
41 }
42
43 template<typename T>
44 void DataStats::GetDataAbsMax(const T* data, size_t count, T& max) {
45     T min = FLT_MAX;
46
47     GetDataMinMax(data, count, min, max);
48
49     max = GetAbsMax(min, max);
50 }
51
52 template void DataStats::GetDataMinMax<float>(const float* data, size_t count, float& min, float& max);
53 template void DataStats::GetDataMinMax<uint8_t>(const uint8_t* data, size_t count, uint8_t& min, uint8_t& max);
54
55 template void DataStats::GetDataAbsMax<float>(const float* data, size_t count, float& max);
56
57 template<typename T>
58 void DataStats::GetDataAverage(const T* data, size_t count, T& ave) {
59     ave = 0;
60
61     for (size_t i = 0; i < count; i++) {
62         ave += data[i];
63     }
64
65     ave /= count;
66 }
67
68 template void DataStats::GetDataAverage<float>(const float* data, size_t count, float& ave);
69
70 template<typename T>
71 T DataStats::GetAbsMax(T min, T max) {
72     if (min < 0) {
73         min *= -1;
74     }
75
76     if (max < 0) {
77         max *= -1;
78     }
79
80     return (max > min) ? max : min;
81 }
82
83 template float DataStats::GetAbsMax<float>(float min, float max);