3 #ifndef FORPY_IMPURITIES_INDUCEDENTROPY_H_ 4 #define FORPY_IMPURITIES_INDUCEDENTROPY_H_ 6 #include "../util/serialization/basics.h" 11 #include "../global.h" 12 #include "../util/checks.h" 13 #include "../util/exponentials.h" 51 inline virtual float operator()(
const float *class_members_numbers,
52 const size_t &n,
const float &fsum)
const {
53 FASSERT(static_cast<float>(std::accumulate(class_members_numbers,
54 class_members_numbers + n,
55 static_cast<float>(0))) == fsum);
56 if (fsum == 0.f)
return 0.f;
59 for (
size_t i = 0; i < n; ++i, ++class_members_numbers)
60 sq_left += *class_members_numbers * *class_members_numbers;
61 return 1.f - sq_left / (fsum * fsum);
63 float n_classes_f =
static_cast<float>(n);
64 float max_unorder_val = 1.f / n_classes_f;
66 if (ceilf(
p) ==
p || floorf(
p) ==
p) {
67 const uint whole_p =
static_cast<uint>(
p);
68 entropy_sum =
fpowi(1.f - max_unorder_val, whole_p) +
69 (n_classes_f - 1.f) *
fpowi(max_unorder_val, whole_p);
70 for (
size_t i = 0; i < n; ++i) {
71 float quot = *(class_members_numbers++) / fsum;
72 entropy_sum -=
fpowi(fabs(quot - max_unorder_val), whole_p);
75 entropy_sum = powf(1.f - max_unorder_val,
p) +
76 (n_classes_f - 1.f) * powf(max_unorder_val,
p);
77 for (
size_t i = 0; i < n; ++i) {
78 float quot = *(class_members_numbers++) / fsum;
79 entropy_sum -= powf(fabs(quot - max_unorder_val),
p);
86 inline friend std::ostream &
operator<<(std::ostream &stream,
88 stream <<
"forpy::InducedEntropy[p=" <<
self.get_p() <<
"]";
94 if (rhs_c ==
nullptr) {
97 bool eq_p =
p == rhs_c->p;
102 inline float get_p()
const {
return p; };
107 friend class cereal::access;
108 template <
class Archive>
110 ar(cereal::make_nvp(
"base", cereal::base_class<IEntropyFunction>(
this)),
122 #endif // FORPY_IMPURITIES_INDUCEDENTROPY_H_ bool operator==(const IEntropyFunction &rhs) const
float fpowi(float base, unsigned int exp)
Computes a float power by an unsigned int.
CEREAL_REGISTER_TYPE(forpy::InducedEntropy)
Interface for an entropy calculation functor.
#define FASSERT(condition)
virtual float operator()(const float *class_members_numbers, const size_t &n, const float &fsum) const
Computes the induced p entropy.
friend std::ostream & operator<<(std::ostream &stream, const InducedEntropy &self)
DISALLOW_COPY_AND_ASSIGN(InducedEntropy)
InducedEntropy(const float &p)
void serialize(Archive &ar, const uint &)
unsigned int uint
Convenience typedef for unsigned int.