33 template <
typename GUM_SCALAR >
40 template <
typename GUM_SCALAR >
47 template <
typename GUM_SCALAR >
52 template <
typename GUM_SCALAR >
57 auto Ip =
_p.completeInstantiation();
58 auto Iq =
_q.completeInstantiation();
63 for (
Idx ite = 0; ite < Ip.nbrDim(); ++ite) {
64 map.
insert(&Ip.variable(ite), &
_q.variableFromName(Ip.variable(ite).name()));
66 GUM_SCALAR pp, pq, pmid, lpp, lpq, lpmid;
67 for (Ip.setFirst(); !Ip.end(); ++Ip) {
68 Iq.setValsFrom(map, Ip);
69 pp =
_p.jointProbability(Ip);
70 pq =
_q.jointProbability(Iq);
71 pmid = (pp + pq) / 2.0;
72 lpmid = lpq = lpp = (GUM_SCALAR)0.0;
73 if (pmid != (GUM_SCALAR)0.0) lpmid = log2(pmid);
74 if (pp != (GUM_SCALAR)0.0) lpp = log2(pp);
75 if (pq != (GUM_SCALAR)0.0) lpq = log2(pq);
78 _hellinger += std::pow(std::sqrt(pp) - std::sqrt(pq), 2);
81 if (pp != (GUM_SCALAR)0.0) {
82 if (pq != (GUM_SCALAR)0.0) {
83 _klPQ -= pp * (lpq - lpp);
89 if (pq != (GUM_SCALAR)0.0) {
90 if (pp != (GUM_SCALAR)0.0) {
91 _klQP -= pq * (lpp - lpq);
96 if (pmid != (GUM_SCALAR)0.0) {
virtual ~ExactBNdistance()
destructor
const IBayesNet< GUM_SCALAR > & _p
Class representing Bayesian networks.
algorithm for KL divergence between BNs
Class representing the minimal interface for Bayesian Network.
gum is the global namespace for all aGrUM entities
The class for generic Hash Tables.
const IBayesNet< GUM_SCALAR > & _q
algorithm for exact computation KL divergence between BNs
ExactBNdistance computes exactly the KL divergence betweens 2 BNs.
ExactBNdistance(const IBayesNet< GUM_SCALAR > &P, const IBayesNet< GUM_SCALAR > &Q)
constructor must give 2 BNs
Size Idx
Type for indexes.
value_type & insert(const Key &key, const Val &val)
Adds a new element (actually a copy of this element) into the hash table.