• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright 2015 The TensorFlow Authors. All Rights Reserved.
2 
3 Licensed under the Apache License, Version 2.0 (the "License");
4 you may not use this file except in compliance with the License.
5 You may obtain a copy of the License at
6 
7     http://www.apache.org/licenses/LICENSE-2.0
8 
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14 ==============================================================================*/
15 
16 #include "tensorflow/core/lib/histogram/histogram.h"
17 #include <float.h>
18 #include "tensorflow/core/framework/summary.pb.h"
19 #include "tensorflow/core/platform/logging.h"
20 #include "tensorflow/core/platform/test.h"
21 
22 namespace tensorflow {
23 namespace histogram {
24 
Validate(const Histogram & h)25 static void Validate(const Histogram& h) {
26   string s1 = h.ToString();
27   LOG(ERROR) << s1;
28 
29   HistogramProto proto_with_zeroes;
30   h.EncodeToProto(&proto_with_zeroes, true);
31   Histogram h2;
32   EXPECT_TRUE(h2.DecodeFromProto(proto_with_zeroes));
33   string s2 = h2.ToString();
34   LOG(ERROR) << s2;
35 
36   EXPECT_EQ(s1, s2);
37 
38   HistogramProto proto_no_zeroes;
39   h.EncodeToProto(&proto_no_zeroes, false);
40   LOG(ERROR) << proto_no_zeroes.DebugString();
41   Histogram h3;
42   EXPECT_TRUE(h3.DecodeFromProto(proto_no_zeroes));
43   string s3 = h3.ToString();
44   LOG(ERROR) << s3;
45 
46   EXPECT_EQ(s1, s3);
47 }
48 
TEST(Histogram,Empty)49 TEST(Histogram, Empty) {
50   Histogram h;
51   Validate(h);
52 }
53 
TEST(Histogram,SingleValue)54 TEST(Histogram, SingleValue) {
55   Histogram h;
56   h.Add(-3.0);
57   Validate(h);
58 }
59 
TEST(Histogram,CustomBuckets)60 TEST(Histogram, CustomBuckets) {
61   Histogram h({-10, -5, 0, 5, 10, 100, 1000, 10000, DBL_MAX});
62   h.Add(-3.0);
63   h.Add(4.99);
64   h.Add(5.0);
65   h.Add(1000.0);
66   Validate(h);
67 }
68 
TEST(Histogram,Median)69 TEST(Histogram, Median) {
70   Histogram h({0, 10, 100, DBL_MAX});
71   h.Add(-2);
72   h.Add(-2);
73   h.Add(0);
74   double median = h.Median();
75   EXPECT_EQ(median, -0.5);
76 }
77 
TEST(Histogram,Percentile)78 TEST(Histogram, Percentile) {
79   // 10%, 30%, 40%, 20%
80   Histogram h({1, 2, 3, 4});
81   // 10% first bucket
82   h.Add(-1.0);
83   // 30% second bucket
84   h.Add(1.5);
85   h.Add(1.5);
86   h.Add(1.5);
87   // 40% third bucket
88   h.Add(2.5);
89   h.Add(2.5);
90   h.Add(2.5);
91   h.Add(2.5);
92   // 20% fourth bucket
93   h.Add(3.5);
94   h.Add(3.9);
95 
96   EXPECT_EQ(h.Percentile(0), -1.0);    // -1.0 = histo.min_
97   EXPECT_EQ(h.Percentile(25), 1.5);    // 1.5 = remap(25, 10, 40, 1, 2)
98   EXPECT_EQ(h.Percentile(50), 2.25);   // 2.25 = remap(50, 40, 80, 2, 3)
99   EXPECT_EQ(h.Percentile(75), 2.875);  // 2.875 = remap(75, 40, 80, 2, 3)
100   EXPECT_EQ(h.Percentile(90), 3.45);   // 3.45 = remap(90, 80, 100, 3, 3.9)
101   EXPECT_EQ(h.Percentile(100), 3.9);   // 3.9 = histo.max_
102 }
103 
TEST(Histogram,Basic)104 TEST(Histogram, Basic) {
105   Histogram h;
106   for (int i = 0; i < 100; i++) {
107     h.Add(i);
108   }
109   for (int i = 1000; i < 100000; i += 1000) {
110     h.Add(i);
111   }
112   Validate(h);
113 }
114 
TEST(ThreadSafeHistogram,Basic)115 TEST(ThreadSafeHistogram, Basic) {
116   // Fill a normal histogram.
117   Histogram h;
118   for (int i = 0; i < 100; i++) {
119     h.Add(i);
120   }
121 
122   // Fill a thread-safe histogram with the same values.
123   ThreadSafeHistogram tsh;
124   for (int i = 0; i < 100; i++) {
125     tsh.Add(i);
126   }
127 
128   for (int i = 0; i < 2; ++i) {
129     bool preserve_zero_buckets = (i == 0);
130     HistogramProto h_proto;
131     h.EncodeToProto(&h_proto, preserve_zero_buckets);
132     HistogramProto tsh_proto;
133     tsh.EncodeToProto(&tsh_proto, preserve_zero_buckets);
134 
135     // Let's decode from the proto of the other histogram type.
136     Histogram h2;
137     EXPECT_TRUE(h2.DecodeFromProto(tsh_proto));
138     ThreadSafeHistogram tsh2;
139     EXPECT_TRUE(tsh2.DecodeFromProto(h_proto));
140 
141     // Now let's reencode and check they match.
142     EXPECT_EQ(h2.ToString(), tsh2.ToString());
143   }
144 
145   EXPECT_EQ(h.Median(), tsh.Median());
146   EXPECT_EQ(h.Percentile(40.0), tsh.Percentile(40.0));
147   EXPECT_EQ(h.Average(), tsh.Average());
148   EXPECT_EQ(h.StandardDeviation(), tsh.StandardDeviation());
149   EXPECT_EQ(h.ToString(), tsh.ToString());
150 }
151 
152 }  // namespace histogram
153 }  // namespace tensorflow
154