aGrUM  0.20.3
a C++ library for (probabilistic) graphical models
scoreBIC.h
Go to the documentation of this file.
1 /**
2  *
3  * Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(@LIP6) & Christophe GONZALES(@AMU)
4  * info_at_agrum_dot_org
5  *
6  * This library is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this library. If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 
22 /** @file
23  * @brief the class for computing BIC scores
24  *
25  * @author Christophe GONZALES(@AMU) and Pierre-Henri WUILLEMIN(@LIP6)
26  */
27 
28 #ifndef GUM_LEARNING_SCORE_BIC_H
29 #define GUM_LEARNING_SCORE_BIC_H
30 
31 #include <string>
32 
33 #include <agrum/agrum.h>
34 #include <agrum/tools/core/math/math_utils.h>
35 #include <agrum/BN/learning/scores_and_tests/score.h>
36 #include <agrum/BN/learning/aprioris/aprioriNoApriori.h>
37 
38 namespace gum {
39 
40  namespace learning {
41 
42  /** @class ScoreBIC
43  * @brief the class for computing BIC scores
44  * @headerfile scoreBIC.h <agrum/BN/learning/scores_and_tests/scoreBIC.h>
45  * @ingroup learning_scores
46  *
47  * @warning If you pass an apriori to the score, this one will be added
48  * into the log-likelihood part of the score.
49  */
50  template < template < typename > class ALLOC = std::allocator >
51  class ScoreBIC: public Score< ALLOC > {
52  public:
53  /// type for the allocators passed in arguments of methods
55 
56  // ##########################################################################
57  /// @name Constructors / Destructors
58  // ##########################################################################
59  /// @{
60 
61  /// default constructor
62  /** @param parser the parser used to parse the database
63  * @param apriori An apriori that we add to the computation of the score
64  * @param ranges a set of pairs {(X1,Y1),...,(Xn,Yn)} of database's rows
65  * indices. The countings are then performed only on the union of the
66  * rows [Xi,Yi), i in {1,...,n}. This is useful, e.g, when performing
67  * cross validation tasks, in which part of the database should be ignored.
68  * An empty set of ranges is equivalent to an interval [X,Y) ranging over
69  * the whole database.
70  * @param nodeId2Columns a mapping from the ids of the nodes in the
71  * graphical model to the corresponding column in the DatabaseTable
72  * parsed by the parser. This enables estimating from a database in
73  * which variable A corresponds to the 2nd column the parameters of a BN
74  * in which variable A has a NodeId of 5. An empty nodeId2Columns
75  * bijection means that the mapping is an identity, i.e., the value of a
76  * NodeId is equal to the index of the column in the DatabaseTable.
77  * @param alloc the allocator used to allocate the structures within the
78  * Score.
79  * @warning If nodeId2columns is not empty, then only the scores over the
80  * ids belonging to this bijection can be computed: applying method
81  * score() over other ids will raise exception NotFound. */
82  ScoreBIC(const DBRowGeneratorParser< ALLOC >& parser,
83  const Apriori< ALLOC >& apriori,
84  const std::vector< std::pair< std::size_t, std::size_t >,
85  ALLOC< std::pair< std::size_t, std::size_t > > >& ranges,
87  = Bijection< NodeId, std::size_t, ALLOC< std::size_t > >(),
89 
90 
91  /// default constructor
92  /** @param parser the parser used to parse the database
93  * @param apriori An apriori that we add to the computation of the score
94  * @param nodeId2Columns a mapping from the ids of the nodes in the
95  * graphical model to the corresponding column in the DatabaseTable
96  * parsed by the parser. This enables estimating from a database in
97  * which variable A corresponds to the 2nd column the parameters of a BN
98  * in which variable A has a NodeId of 5. An empty nodeId2Columns
99  * bijection means that the mapping is an identity, i.e., the value of a
100  * NodeId is equal to the index of the column in the DatabaseTable.
101  * @param alloc the allocator used to allocate the structures within the
102  * Score.
103  * @warning If nodeId2columns is not empty, then only the scores over the
104  * ids belonging to this bijection can be computed: applying method
105  * score() over other ids will raise exception NotFound. */
106  ScoreBIC(const DBRowGeneratorParser< ALLOC >& parser,
107  const Apriori< ALLOC >& apriori,
109  = Bijection< NodeId, std::size_t, ALLOC< std::size_t > >(),
110  const allocator_type& alloc = allocator_type());
111 
112  /// copy constructor
113  ScoreBIC(const ScoreBIC< ALLOC >& from);
114 
115  /// copy constructor with a given allocator
116  ScoreBIC(const ScoreBIC< ALLOC >& from, const allocator_type& alloc);
117 
118  /// move constructor
119  ScoreBIC(ScoreBIC< ALLOC >&& from);
120 
121  /// move constructor with a given allocator
122  ScoreBIC(ScoreBIC< ALLOC >&& from, const allocator_type& alloc);
123 
124  /// virtual copy constructor
125  virtual ScoreBIC< ALLOC >* clone() const;
126 
127  /// virtual copy constructor with a given allocator
128  virtual ScoreBIC< ALLOC >* clone(const allocator_type& alloc) const;
129 
130  /// destructor
131  virtual ~ScoreBIC();
132 
133  /// @}
134 
135 
136  // ##########################################################################
137  /// @name Operators
138  // ##########################################################################
139 
140  /// @{
141 
142  /// copy operator
143  ScoreBIC< ALLOC >& operator=(const ScoreBIC< ALLOC >& from);
144 
145  /// move operator
147 
148  /// @}
149 
150 
151  // ##########################################################################
152  /// @name Accessors / Modifiers
153  // ##########################################################################
154  /// @{
155 
156  /// indicates whether the apriori is compatible (meaningful) with the score
157  /** The combination of some scores and aprioris can be meaningless. For
158  * instance, adding a Dirichlet apriori to the K2 score is not very
159  * meaningful since K2 corresonds to a BD score with a 1-smoothing
160  * apriori.
161  * aGrUM allows you to perform such combination, but you can check with
162  * method isAprioriCompatible () whether the result the score will give
163  * you is meaningful or not.
164  * @returns a non empty string if the apriori is compatible with the
165  * score.*/
166  virtual std::string isAprioriCompatible() const final;
167 
168  /// returns the internal apriori of the score
169  /** Some scores include an apriori. For instance, the K2 score is a BD
170  * score with a Laplace Apriori ( smoothing(1) ). BDeu is a BD score with
171  * a N'/(r_i * q_i) apriori, where N' is an effective sample size and r_i
172  * is the domain size of the target variable and q_i is the domain size of
173  * the Cartesian product of its parents. The goal of the score's internal
174  * apriori classes is to enable to account for these aprioris outside the
175  * score, e.g., when performing parameter estimation. It is important to
176  * note that, to be meaningful, a structure + parameter learning requires
177  * that the same aprioris are taken into account during structure learning
178  * and parameter learning. */
179  virtual const Apriori< ALLOC >& internalApriori() const final;
180 
181  /// returns the size of the database w.r.t. a given idset
182  /** Usually, the size of the database should be a constant. But some
183  * a priori violate this condition. This is the case, for instance, of
184  * the Laplace a priori: this one adds ones to each cells of the
185  * contingency tables. As all those tables have not necessarily the same
186  * size, the number of ones added differ from one contingency table
187  * to the other. As a result, the size of the database, including the a
188  * priori, depends on the variables of the contingency tables (the idset
189  * passed in argument of this function). */
190  double N(const IdCondSet< ALLOC >& idset);
191 
192  /// @}
193 
194 
195  /// indicates whether the apriori is compatible (meaningful) with the score
196  /** @returns a non empty string if the apriori is compatible with the score.
197  */
198  static std::string isAprioriCompatible(const std::string& apriori_type, double weight = 1.0f);
199 
200  /// indicates whether the apriori is compatible (meaningful) with the score
201  /** a non empty string if the apriori is compatible with the score. */
202  static std::string isAprioriCompatible(const Apriori< ALLOC >& apriori);
203 
204 
205  protected:
206  /// returns the score for a given IdCondSet
207  /** @throws OperationNotAllowed is raised if the score does not support
208  * calling method score such an idset (due to too many/too few variables
209  * in the left hand side or the right hand side of the idset). */
210  virtual double score_(const IdCondSet< ALLOC >& idset) final;
211 
212 
213 #ifndef DOXYGEN_SHOULD_SKIP_THIS
214 
215  private:
216  /// the internal apriori of the score
217  AprioriNoApriori< ALLOC > _internal_apriori_;
218 
219 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
220  };
221 
222  } /* namespace learning */
223 
224 } /* namespace gum */
225 
226 
227 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS
228 extern template class gum::learning::ScoreBIC<>;
229 #endif
230 
231 
232 // always include the template implementation
233 #include <agrum/BN/learning/scores_and_tests/scoreBIC_tpl.h>
234 
235 #endif /* GUM_LEARNING_SCORE_BIC_H */
virtual ScoreBIC< ALLOC > * clone() const
virtual copy constructor
ScoreBIC< ALLOC > & operator=(const ScoreBIC< ALLOC > &from)
copy operator
virtual ~ScoreBIC()
destructor
virtual ScoreBIC< ALLOC > * clone(const allocator_type &alloc) const
virtual copy constructor with a given allocator
INLINE void emplace(Args &&... args)
Definition: set_tpl.h:643
static std::string isAprioriCompatible(const std::string &apriori_type, double weight=1.0f)
indicates whether the apriori is compatible (meaningful) with the score
ScoreBIC(const ScoreBIC< ALLOC > &from, const allocator_type &alloc)
copy constructor with a given allocator
ScoreBIC(ScoreBIC< ALLOC > &&from)
move constructor
double N(const IdCondSet< ALLOC > &idset)
returns the size of the database w.r.t. a given idset
virtual std::string isAprioriCompatible() const final
indicates whether the apriori is compatible (meaningful) with the score
ScoreBIC(const ScoreBIC< ALLOC > &from)
copy constructor
ScoreBIC(const DBRowGeneratorParser< ALLOC > &parser, const Apriori< ALLOC > &apriori, const std::vector< std::pair< std::size_t, std::size_t >, ALLOC< std::pair< std::size_t, std::size_t > > > &ranges, const Bijection< NodeId, std::size_t, ALLOC< std::size_t > > &nodeId2columns=Bijection< NodeId, std::size_t, ALLOC< std::size_t > >(), const allocator_type &alloc=allocator_type())
default constructor
ScoreBIC< ALLOC > & operator=(ScoreBIC< ALLOC > &&from)
move operator
the class for computing BIC scores
Definition: scoreBIC.h:51
static std::string isAprioriCompatible(const Apriori< ALLOC > &apriori)
indicates whether the apriori is compatible (meaningful) with the score
virtual const Apriori< ALLOC > & internalApriori() const final
returns the internal apriori of the score
ScoreBIC(ScoreBIC< ALLOC > &&from, const allocator_type &alloc)
move constructor with a given allocator
virtual double score_(const IdCondSet< ALLOC > &idset) final
returns the score for a given IdCondSet
Database(const std::string &filename, const BayesNet< GUM_SCALAR > &bn, const std::vector< std::string > &missing_symbols)
ScoreBIC(const DBRowGeneratorParser< ALLOC > &parser, const Apriori< ALLOC > &apriori, const Bijection< NodeId, std::size_t, ALLOC< std::size_t > > &nodeId2columns=Bijection< NodeId, std::size_t, ALLOC< std::size_t > >(), const allocator_type &alloc=allocator_type())
default constructor