aGrUM  0.21.0
a C++ library for (probabilistic) graphical models
varMod2BNsMap.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 /**
23  * @file
24  * @brief Class used to store optimum IBayesNet during some inference
25  * algorithms.
26  * @author Matthieu HOURBRACQ and Pierre-Henri WUILLEMIN(@LIP6)
27  */
28 
29 #ifndef __VAR_MOD_2_BNS_MAP__H__
30 #define __VAR_MOD_2_BNS_MAP__H__
31 
32 #include <list>
33 
34 //#include <tr1/functional>
35 
36 #include <agrum/tools/core/hashTable.h>
37 #include <agrum/tools/core/math/pow.h>
38 
39 #include <agrum/CN/credalNet.h>
40 
41 namespace gum {
42  namespace credal {
43 
44  /**
45  * @class VarMod2BNsMap
46  * @headerfile varMod2BNsMap.h <agrum/CN/varMod2BNsMap.h>
47  * @brief Class used to store optimum IBayesNet during some inference
48  * algorithms.
49  * @ingroup cn_group
50  * @tparam GUM_SCALAR A floating type ( float, double, long double ... ).
51  * @author Matthieu HOURBRACQ and Pierre-Henri WUILLEMIN(@LIP6)
52  */
53 
54  template < typename GUM_SCALAR >
55  class VarMod2BNsMap {
56  private:
57  typedef std::vector< bool > dBN;
58 
59  typedef typename std::vector< Size > varKey;
60 
61  typedef typename gum::HashTable< Size, dBN > hashNet;
62 
63  typedef typename gum::HashTable< varKey, std::list< Size > > varHashs;
64 
65  typedef typename gum::HashTable< Size, std::list< varKey > > hashVars;
66 
67  protected:
68  /** Map id - dBN : get a net from it's id. */
70  /** Map varKey - list(id) : get all optimal nets id from the given key :
71  * variable, modality and min=0 ( or max=1 ). */
73  /** Map id - list(varKey) : get all variables, modalities associated to
74  * this
75  * optimal net id. */
77 
78  /** Since all samples have the same structure, this will be used as
79  * default
80  * initialization (copy constructor) for any sample. */
81  std::vector< std::vector< std::vector< bool > > > sampleDef_;
82 
83  /** The current sampled IBayesNet. */
85  /** The current sampled IBayesNet hash. */
87  /** The hash fuction. Requires c++11/0x. */
88  std::hash< std::vector< bool > > vectHash_;
89 
90  /** A pointer to the CredalNet to be used. */
92 
93  public:
94  /// @name Constructors / Destructors
95  /// @{
96 
97  /**
98  * Thread constructor.
99  * Initialize _sampleDef_ from the CredalNet.
100  *
101  * @param cn The CredalNet to be used.
102  */
103  explicit VarMod2BNsMap(const CredalNet< GUM_SCALAR >& cn);
104 
105  /** Default constructor that should be used only by InferenceEngine since
106  * it
107  * has a member variable. */
108  VarMod2BNsMap();
109 
110  /** Destructor. */
111  ~VarMod2BNsMap();
112 
113  /// @}
114 
115  /**
116  * Insert for thread fusion. All inserted nets are optimums and none will
117  * be
118  * deleted because a better one is being inserted.
119  * @param bn The constant reference to the net to be inserted.
120  * @param key The constant reference to the key at which we will insert
121  * the
122  * net.
123  */
124  bool insert(const std::vector< bool >& bn, const std::vector< Size >& key);
125 
126  /**
127  * Thread insert.
128  * @param key The key at which the net will be inserted.
129  * @param isBetter \c True if the net is a better one, i.e. it gave better
130  * marginals.
131  * @return \c True if the net was inserted, \c false otherwise.
132  */
133  bool insert(const std::vector< Size >& key, const bool isBetter);
134 
135  /// @name Getters and setters
136  /// @{
137 
138  /**
139  * Initialize _sampleDef_ from the CredalNet.
140  *
141  * Shoud only be used by InferenceEngine to initialize it's member
142  *variable.
143  * @param cn The CredalNet to be used.
144  */
145  void setCNet(const CredalNet< GUM_SCALAR >& cn);
146 
147  /**
148  * %Set the current thread sample and it's hash.
149  * @param sample The constant reference to the sample with structure.
150  */
151  void setCurrentSample(const std::vector< std::vector< std::vector< bool > > >& sample);
152 
153  /**
154  * Get the current sample as a vector of bits without structure.
155  * @return The constant reference to the sampled IBayesNet without
156  * structure.
157  */
158  const dBN& getCurrentSample();
159 
160  /**
161  * Get the sample structure.
162  * @return The constant reference to the sample structure.
163  */
164  const std::vector< std::vector< std::vector< bool > > >& getSampleDef();
165 
166  /**
167  * Get optimum IBayesNet (s) without structure of the given variable,
168  * modality
169  * for min or max.
170  * @param key The constant reference to the variable, modality, min or
171  * max.
172  * @return The constant vector of not yet constant pointers to the nets.
173  */
174  const std::vector< dBN* > getBNOptsFromKey(const std::vector< Size >& key);
175 
176  /**
177  * Get optimum IBayesNet (s) with structure of the given variable, modality
178  * for
179  * min or max.
180  * @param key The constant reference to the variable, modality, min or max.
181  * @return The vector of not yet constant pointers to the nets.
182  */
183  std::vector< std::vector< std::vector< std::vector< bool > > > >
184  getFullBNOptsFromKey(const std::vector< Size >& key);
185 
186  /** Get the number of IBayesNet stored. */
187  Size getEntrySize() const;
188 
189  /// @}
190 
191  }; // end of OptBN
192 
193 
194 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS
195  extern template class VarMod2BNsMap< double >;
196 #endif
197 
198  } // namespace credal
199 } // namespace gum
200 
201 #include <agrum/CN/tools/varMod2BNsMap_tpl.h>
202 
203 #endif
hashVars myHashVars_
Map id - list(varKey) : get all variables, modalities associated to this optimal net id...
Definition: varMod2BNsMap.h:76
dBN currentSample_
The current sampled IBayesNet.
Definition: varMod2BNsMap.h:84
Size currentHash_
The current sampled IBayesNet hash.
Definition: varMod2BNsMap.h:86
INLINE void emplace(Args &&... args)
Definition: set_tpl.h:643
varHashs myVarHashs_
Map varKey - list(id) : get all optimal nets id from the given key : variable, modality and min=0 ( o...
Definition: varMod2BNsMap.h:72
const CredalNet< GUM_SCALAR > * cnet
A pointer to the CredalNet to be used.
Definition: varMod2BNsMap.h:91
hashNet myHashNet_
Map id - dBN : get a net from it&#39;s id.
Definition: varMod2BNsMap.h:69
std::vector< std::vector< std::vector< std::vector< bool > > > > getFullBNOptsFromKey(const std::vector< Size > &key)
Get optimum IBayesNet (s) with structure of the given variable, modality for min or max...
const std::vector< dBN *> getBNOptsFromKey(const std::vector< Size > &key)
Get optimum IBayesNet (s) without structure of the given variable, modality for min or max...
Size getEntrySize() const
Get the number of IBayesNet stored.
std::vector< bool > dBN
Definition: varMod2BNsMap.h:57
void setCNet(const CredalNet< GUM_SCALAR > &cn)
Initialize sampleDef from the CredalNet.
const dBN & getCurrentSample()
Get the current sample as a vector of bits without structure.
VarMod2BNsMap()
Default constructor that should be used only by InferenceEngine since it has a member variable...
VarMod2BNsMap(const CredalNet< GUM_SCALAR > &cn)
Thread constructor.
bool insert(const std::vector< bool > &bn, const std::vector< Size > &key)
Insert for thread fusion.
bool insert(const std::vector< Size > &key, const bool isBetter)
Thread insert.
namespace for all credal networks entities
Definition: LpInterface.cpp:37
void setCurrentSample(const std::vector< std::vector< std::vector< bool > > > &sample)
Set the current thread sample and it&#39;s hash.