| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_LEARNING_COMMON_TARGET_HISTOGRAM_H_ |
| #define MEDIA_LEARNING_COMMON_TARGET_HISTOGRAM_H_ |
| |
| #include <ostream> |
| #include <string> |
| |
| #include "base/component_export.h" |
| #include "base/containers/flat_map.h" |
| #include "base/macros.h" |
| #include "media/learning/common/labelled_example.h" |
| #include "media/learning/common/value.h" |
| |
| #include "mojo/public/cpp/bindings/struct_traits.h" // nogncheck |
| |
| namespace media { |
| namespace learning { |
| |
| namespace mojom { |
| class TargetHistogramDataView; |
| } |
| |
| // Intermediate type for mojom struct traits translation. |
| // See learning_types.mojom. |
| struct COMPONENT_EXPORT(LEARNING_COMMON) TargetHistogramPair { |
| TargetValue target_value; |
| double count; |
| }; |
| |
| // Histogram of target values that allows fractional counts. |
| class COMPONENT_EXPORT(LEARNING_COMMON) TargetHistogram { |
| public: |
| // We use a flat_map since this will often have only one or two TargetValues, |
| // such as "true" or "false". |
| using CountMap = base::flat_map<TargetValue, double>; |
| |
| TargetHistogram(); |
| TargetHistogram(const TargetHistogram& rhs); |
| TargetHistogram(TargetHistogram&& rhs); |
| ~TargetHistogram(); |
| |
| TargetHistogram& operator=(const TargetHistogram& rhs); |
| TargetHistogram& operator=(TargetHistogram&& rhs); |
| |
| bool operator==(const TargetHistogram& rhs) const; |
| |
| // Add |rhs| to our counts. |
| TargetHistogram& operator+=(const TargetHistogram& rhs); |
| |
| // Increment |rhs| by one. |
| TargetHistogram& operator+=(const TargetValue& rhs); |
| |
| // Increment the histogram by |example|'s target value and weight. |
| TargetHistogram& operator+=(const LabelledExample& example); |
| |
| // Return the number of counts for |value|. |
| double operator[](const TargetValue& value) const; |
| double& operator[](const TargetValue& value); |
| |
| // Return the total counts in the map. |
| double total_counts() const { |
| double total = 0.; |
| for (auto& entry : counts_) |
| total += entry.second; |
| return total; |
| } |
| |
| CountMap::const_iterator begin() const { return counts_.begin(); } |
| |
| CountMap::const_iterator end() const { return counts_.end(); } |
| |
| // Return the number of buckets in the histogram. |
| // TODO(liberato): Do we want this? |
| size_t size() const { return counts_.size(); } |
| |
| // Find the singular value with the highest counts, and copy it into |
| // |value_out| and (optionally) |counts_out|. Returns true if there is a |
| // singular maximum, else returns false with the out params undefined. |
| bool FindSingularMax(TargetValue* value_out, |
| double* counts_out = nullptr) const; |
| |
| // Return the average value of the entries in this histogram. Of course, |
| // this only makes sense if the TargetValues can be interpreted as numeric. |
| double Average() const; |
| |
| // Normalize the histogram so that it has one total count, unless it's |
| // empty. It will continue to have zero in that case. |
| void Normalize(); |
| |
| std::string ToString() const; |
| |
| private: |
| friend struct mojo::StructTraits< |
| media::learning::mojom::TargetHistogramDataView, |
| media::learning::TargetHistogram>; |
| |
| const CountMap& counts() const { return counts_; } |
| |
| // [value] == counts |
| CountMap counts_; |
| |
| // Allow copy and assign. |
| }; |
| |
| COMPONENT_EXPORT(LEARNING_COMMON) |
| std::ostream& operator<<(std::ostream& out, const TargetHistogram& dist); |
| |
| } // namespace learning |
| } // namespace media |
| |
| #endif // MEDIA_LEARNING_COMMON_TARGET_HISTOGRAM_H_ |