aGrUM 3.1.1
a C++ library for (probabilistic) graphical models
GTestPolicy_tpl.h
Go to the documentation of this file.
1/****************************************************************************
2 * This file is part of the aGrUM/pyAgrum library. *
3 * *
4 * Copyright (c) 2005-2026 by *
5 * - Pierre-Henri WUILLEMIN(_at_LIP6) *
6 * - Christophe GONZALES(_at_AMU) *
7 * *
8 * The aGrUM/pyAgrum library is free software; you can redistribute it *
9 * and/or modify it under the terms of either : *
10 * *
11 * - the GNU Lesser General Public License as published by *
12 * the Free Software Foundation, either version 3 of the License, *
13 * or (at your option) any later version, *
14 * - the MIT license (MIT), *
15 * - or both in dual license, as here. *
16 * *
17 * (see https://agrum.gitlab.io/articles/dual-licenses-lgplv3mit.html) *
18 * *
19 * This aGrUM/pyAgrum library is distributed in the hope that it will be *
20 * useful, but WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
21 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES MERCHANTABILITY or FITNESS *
22 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
25 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
26 * OTHER DEALINGS IN THE SOFTWARE. *
27 * *
28 * See LICENCES for more details. *
29 * *
30 * SPDX-FileCopyrightText: Copyright 2005-2026 *
31 * - Pierre-Henri WUILLEMIN(_at_LIP6) *
32 * - Christophe GONZALES(_at_AMU) *
33 * SPDX-License-Identifier: LGPL-3.0-or-later OR MIT *
34 * *
35 * Contact : info_at_agrum_dot_org *
36 * homepage : http://agrum.gitlab.io *
37 * gitlab : https://gitlab.com/agrumery/agrum *
38 * *
39 ****************************************************************************/
40
41#pragma once
42
43
50// =========================================================================
52
54
55// =========================================================================
56
57
58namespace gum {
59
60
61 // ##########################################################################
62 //
63 // ##########################################################################
64
65 // ==========================================================================
66 //
67 // ==========================================================================
68 template < typename GUM_ELEMENT >
69 void GTestPolicy< GUM_ELEMENT >::addObservation(Idx iattr, GUM_ELEMENT ivalue) {
71 _conTab_.add(iattr, ivalue);
72 }
73
74 // ############################################################################
75 // @name Test result
76 // ############################################################################
77
78 // ============================================================================
79 // Computes the GStat of current variable according to the test
80 // ============================================================================
81 template < typename GUM_ELEMENT >
84 _GStat_ = 0;
85
86 // Itération sur l'axe 1 du tableau
87 for (auto attrIter = _conTab_.attrABeginSafe(); attrIter != _conTab_.attrAEndSafe();
88 ++attrIter) {
89 // Mise en cache de valeur utile
90 double semiExpected = (double)(attrIter.val()) / (double)this->nbObservation();
91
92 // Itération sur l'axe 2 du tableau
93 for (auto valIter = _conTab_.attrBBeginSafe(); valIter != _conTab_.attrBEndSafe();
94 ++valIter) {
95 // Récupération de la valeur en cellule
96 Idx cell = _conTab_.joint(attrIter.key(), valIter.key());
97 if (cell < 5) continue;
98
99 // Récupération de la valeur en axe 2
100 double expected = semiExpected * (double)valIter.val();
101
102 _GStat_ += 2 * cell * log(cell / expected);
103 }
104 }
105 }
106
107 // ============================================================================
108 // Returns the performance of current variable according to the test
109 // ============================================================================
110 template < typename GUM_ELEMENT >
112 if (this->isModified_()) computeScore();
113 // std::cout << this->toString() << std::endl;
114 double score
115 = 1
116 - ChiSquare::probaChi2(_GStat_, (_conTab_.attrASize() - 1) * (_conTab_.attrBSize() - 1));
117 return score;
118 }
119
120 // ============================================================================
121 // Returns a second criterion to severe ties
122 // ============================================================================
123 template < typename GUM_ELEMENT >
125 if (this->isModified_()) computeScore();
126 return _GStat_;
127 }
128
129 template < typename GUM_ELEMENT >
134
135 template < typename GUM_ELEMENT >
137 GUM_CONSTRUCTOR(GTestPolicy);
138 }
139
140 template < typename GUM_ELEMENT >
142 GUM_DESTRUCTOR(GTestPolicy);
143 ;
144 }
145
146 template < typename GUM_ELEMENT >
150
151 template < typename GUM_ELEMENT >
155
156 template < typename GUM_ELEMENT >
158 return (this->nbObservation() > 20 && this->nbObservation() > _conTab_.attrASize() * 5);
159 }
160
161 template < typename GUM_ELEMENT >
165
166 template < typename GUM_ELEMENT >
168 return std::format("{}\t\t\tContingency Table : \n{}\n\t\t\tGStat : {}\n\t\t\tGStat : {}\n",
170 _conTab_.toString(),
171 _GStat_,
172 this->secondaryscore());
173 }
174
175} // End of namespace gum
Headers of the GTestPolicy.
static double probaChi2(double x, Size df)
computes the probability of chi2 value (used by the cache)
double score() const override
Returns the performance of current variable according to the test.
bool isTestRelevant() const override
Returns true if enough observation were made so that the test can be relevant.
GTestPolicy()
Constructor.
~GTestPolicy() override
Destructor.
void addObservation(Idx iattr, GUM_ELEMENT ivalue) override
Comptabilizes the new observation.
ContingencyTable< Idx, GUM_ELEMENT > _conTab_
The contingency table used to keeps records of all observation.
std::string toString() const
double secondaryscore() const override
Returns a second criterion to severe ties.
void computeScore() const override
Computes the GStat of current variable according to the test.
void add(const GTestPolicy< GUM_ELEMENT > &src)
Performs the merging of current GTestPolicy instance with given instance.
const ContingencyTable< Idx, GUM_ELEMENT > & ct() const
Returns contingency table (needed for the merging of GTestPolicy instances).
ITestPolicy()
Allocators and Deallocators redefinition.
bool isModified_() const
virtual void addObservation(Idx attr, GUM_ELEMENT value)
Comptabilizes the new observation.
virtual void computeScore() const
Recomputes the statistic from the beginning.
void add(const ITestPolicy< GUM_ELEMENT > &src)
Idx nbObservation() const
Comptabilizes the new observation.
std::string toString() const
static SmallObjectAllocator & instance()
void * allocate(const size_t &objectSize)
Allocates a block.
void deallocate(void *pDeallocatedObject, const size_t &objectSize)
Deallocates an object.
Size Idx
Type for indexes.
Definition types.h:79
Useful macros for maths.
gum is the global namespace for all aGrUM entities
Definition agrum.h:46