#include #include #include #include #include #include "caffe2/core/logging.h" #include "dynamic_histogram.h" using namespace std; using namespace dnnlowp; TEST(DynamicHistogram, HistSimilar) { default_random_engine generator; normal_distribution distribution; constexpr int n = 65536; array data; // make_array(n); for (int i = 0; i < n; ++i) { data[i] = distribution(generator); } // Construct static and dynamic histogram and compare. float minimum = *min_element(data.begin(), data.end()); float maximum = *max_element(data.begin(), data.end()); int nbins = 64; Histogram static_hist(nbins, minimum, maximum); vector> dynamic_hist(3); for (auto i = 0; i < dynamic_hist.size(); ++i) { dynamic_hist[i].reset(new DynamicHistogram(nbins)); } static_hist.Add(data.data(), n); dynamic_hist[0]->Add(data.data(), n); for (int i = 0; i < n; ++i) { dynamic_hist[1]->Add(data[i]); } for (int i = 0; i < 64; ++i) { dynamic_hist[2]->Add(data.data() + n / 64 * i, n / 64); } stringstream ss; static_hist.Finalize(); for (int i = 0; i < nbins; ++i) { ss << (*static_hist.GetHistogram())[i] << " "; } LOG(INFO) << "static: " << ss.str(); vector errors(dynamic_hist.size()); for (auto i = 0; i < dynamic_hist.size(); ++i) { ss.str(""); const Histogram* dynamic_hist_result = dynamic_hist[i]->Finalize(); for (auto j = 0; j < nbins; ++j) { ss << (*dynamic_hist_result->GetHistogram())[j] << " "; } LOG(INFO) << "dynamic " << i << " : " << ss.str(); // Compute the normalized squared error between the two histograms float error = 0.0; for (int j = 0; j < nbins; ++j) { float e = (float)(*static_hist.GetHistogram())[j] - (*dynamic_hist_result->GetHistogram())[j]; error += e * e; } error /= n; LOG(INFO) << "error: " << error << endl; errors[i] = error; } for (auto i = 0; i < dynamic_hist.size(); ++i) { EXPECT_TRUE(errors[i] < 0.3); } }