aGrUM 3.1.1
a C++ library for (probabilistic) graphical models
Chi2TestPolicy_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
53// =========================================================================
54
55
56namespace gum {
57
58
59 // ##########################################################################
60 //
61 // ##########################################################################
62
63 // ==========================================================================
64 //
65 // ==========================================================================
66 template < typename GUM_ELEMENT >
67 void Chi2TestPolicy< GUM_ELEMENT >::addObservation(Idx iattr, GUM_ELEMENT ivalue) {
69 _conTab_.add(iattr, ivalue);
70 }
71
72 // ############################################################################
73 // @name Test result
74 // ############################################################################
75
76 // ============================================================================
77 // Computes the GStat of current variable according to the test
78 // ============================================================================
79 template < typename GUM_ELEMENT >
82 _chi2Score_ = 0;
83 for (auto attrIter = _conTab_.attrABeginSafe(); attrIter != _conTab_.attrAEndSafe();
84 ++attrIter) {
85 double semiExpected = (double)(attrIter.val()) / (double)this->nbObservation();
86 for (auto valIter = _conTab_.attrBBeginSafe(); valIter != _conTab_.attrBEndSafe();
87 ++valIter) {
88 double cell = (double)_conTab_.joint(attrIter.key(), valIter.key());
89 if (cell < 5) continue;
90 double expected = semiExpected * (double)(valIter.val());
91
92 _chi2Score_ += std::pow(cell - expected, 2.0) / expected;
93 }
94 }
95 }
96
97 // ============================================================================
98 // Returns the performance of current variable according to the test
99 // ============================================================================
100 template < typename GUM_ELEMENT >
102 if (this->isModified_()) computeScore();
103 double score = 1
105 (_conTab_.attrASize() - 1) * (_conTab_.attrBSize() - 1));
106 return score;
107 }
108
109 // ============================================================================
110 // Returns a second criterion to severe ties
111 // ============================================================================
112 template < typename GUM_ELEMENT >
114 if (this->isModified_()) computeScore();
115 return _chi2Score_;
116 }
117
118 template < typename GUM_ELEMENT >
123
124 template < typename GUM_ELEMENT >
126 ITestPolicy< GUM_ELEMENT >(), _conTab_(), _chi2Score_(0) {
127 GUM_CONSTRUCTOR(Chi2TestPolicy);
128 }
129
130 template < typename GUM_ELEMENT >
135
136 template < typename GUM_ELEMENT >
140
141 template < typename GUM_ELEMENT >
145
146 template < typename GUM_ELEMENT >
148 return (this->nbObservation() > 20 && this->nbObservation() > _conTab_.attrASize() * 5);
149 }
150
151 template < typename GUM_ELEMENT >
155
156 template < typename GUM_ELEMENT >
158 return std::format("{}\t\t\tContingency Table : \n{}\n\t\t\tGStat : {}\n\t\t\tGStat : {}\n",
160 _conTab_.toString(),
161 this->score(),
162 this->secondaryscore());
163 }
164
165} // End of namespace gum
Headers of the Chi2TestPolicy.
void add(const Chi2TestPolicy< GUM_ELEMENT > &src)
void addObservation(Idx attr, GUM_ELEMENT value) override
Comptabilizes the new observation.
std::string toString() const
bool isTestRelevant() const override
Returns true if enough observation were made so that the test can be relevant.
void computeScore() const override
Recomputes the statistic from the beginning.
ContingencyTable< Idx, GUM_ELEMENT > _conTab_
The contingency table used to keeps records of all observation.
double secondaryscore() const override
Returns a second criterion to severe ties.
const ContingencyTable< Idx, GUM_ELEMENT > & ct() const
double score() const override
Returns the performance of current variable according to the test.
static double probaChi2(double x, Size df)
computes the probability of chi2 value (used by the cache)
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
gum is the global namespace for all aGrUM entities
Definition agrum.h:46