Publishing 2019 R3 content
[platform/upstream/dldt.git] / inference-engine / tools / calibration_tool / statistics_collector / data_stats.hpp
1 // Copyright (C) 2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #pragma once
6
7 #include <list>
8 #include <map>
9 #include <mutex>
10 #include <unordered_map>
11 #include <string>
12 #include <vector>
13 #include <limits>
14
15 struct TensorStatistic {
16     TensorStatistic(float* data, size_t count, size_t nbuckets = 1000);
17     float getMaxValue() const;
18     float getMinValue()const;
19 protected:
20     float _min;
21     float _max;
22 };
23
24 class dataStats {
25 public:
26     struct layerInfo {
27         std::string _name;
28         size_t _batch;
29         size_t _channels;
30     };
31
32     virtual void addStatistics(const std::string& name, size_t channel, float* data, size_t count) = 0;
33     void addStatistics(const std::string& name, size_t channel, short* data, size_t count);
34     void addStatistics(const std::string& name, size_t channel, uint8_t* data, size_t count);
35     virtual void registerLayer(const std::string& name, size_t batch, size_t channels);
36     inline const std::list<layerInfo>& registeredLayers() const {
37         return _registeredLayers;
38     }
39     virtual void getDataMinMax(const std::string& name, size_t channel, float& min, float& max, float threshold = 100.f) = 0;
40     virtual size_t getNumberChannels(const std::string& name) const = 0;
41 protected:
42     std::list<layerInfo> _registeredLayers;
43     std::mutex add_mutex;
44 };
45
46 class simpleDataStats : public dataStats {
47 public:
48     void addStatistics(const std::string& name, size_t channel, float* data, size_t count);
49     void registerLayer(const std::string& name, size_t batch, size_t channels);
50     size_t getNumberChannels(const std::string& name) const;
51     void getDataMinMax(const std::string& name, size_t channel, float& min, float& max, float threshold = 100.f);
52 protected:
53     struct statsPair {
54         float _min = std::numeric_limits<float>::max();
55         float _max = std::numeric_limits<float>::min();
56     };
57     std::unordered_map<std::string, std::unordered_map<size_t, statsPair>> _data;
58 };
59
60 class AggregatedDataStats : public dataStats {
61 public:
62     typedef std::unordered_map<std::string, std::map<size_t, std::vector<TensorStatistic>>> internalData;
63
64     void addStatistics(const std::string& name, size_t channel, float* data, size_t count);
65     void getDataMinMax(const std::string& name, size_t channel, float& min, float& max, float threshold = 100.f);
66     size_t getNumberChannels(const std::string& name) const;
67     void registerLayer(const std::string& name, size_t batch, size_t channels);
68 protected:
69     internalData _data;
70 };