#ifndef JENSENSHANNON_H #define JENSENSHANNON_H #include "KullbackLeibler.h" #include "../../Assertions.h" #include namespace Divergence { template class JensenShannon { public: /** Calculate the Jensen Shannon Divergece from a set of sample densities * Info: https://en.wikipedia.org/wiki/Jensen–Shannon_divergence * @param P is the vector containing the densities of a set of samples * @param Q is a vector containg the densities of the same samples set then P */ static inline Scalar getGeneralFromSamples(Eigen::VectorXd P, Eigen::VectorXd Q, LOGMODE mode){ // normalize P /= P.sum(); Q /= Q.sum(); Assert::isNear((double)P.sum(), 1.0, 0.01,"Normalization failed.. this shouldn't happen"); Assert::isNear((double)Q.sum(), 1.0, 0.01, "Normalization failed.. this shouldn't happen"); Eigen::VectorXd M = 0.5 * (P + Q); return (0.5 * KullbackLeibler::getGeneralFromSamples(P, M, mode)) + (0.5 * KullbackLeibler::getGeneralFromSamples(Q, M, mode)); } }; } #endif // JENSENSHANNON_H