aGrUM  0.20.3
a C++ library for (probabilistic) graphical models
influenceDiagramGenerator.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 Class for generating Bayesian networks.
24  *
25  * @author Pierre-Henri WUILLEMIN(@LIP6) and Jean-Christophe MAGNAN and Christophe
26  * GONZALES(@AMU)
27  */
28 #ifndef GUM_INF_DIAG_GENERATOR_H
29 #define GUM_INF_DIAG_GENERATOR_H
30 
31 #include <cstdio>
32 #include <cstdlib>
33 #include <iostream>
34 #include <vector>
35 
36 #include <agrum/BN/generator/simpleCPTGenerator.h>
37 #include <agrum/ID/generator/UTGenerator.h>
38 #include <agrum/ID/generator/simpleUTGenerator.h>
39 #include <agrum/ID/influenceDiagram.h>
40 #include <agrum/tools/variables/labelizedVariable.h>
41 
42 namespace gum {
43 
44  /**
45  * @class InfluenceDiagramGenerator influenceDiagramGenerator.h
46  *<agrum/ID/generator/influenceDiagramGenerator.h>
47  * @brief Class for generating influence diagram.
48  * @ingroup id_group
49  *
50  * This class randomly generates an influence diagram given four parameters:
51  * the number of nodes,the probability of adding an arc between two nodes,
52  * the proportion of chance node and the proportion of utility node (the
53  * proportion of decision node is deduce from thos two)
54  */
55  template < typename GUM_SCALAR >
56  class InfluenceDiagramGenerator {
57  public:
58  // ############################################################################
59  /// @name Constructors / Destructor
60  // ############################################################################
61  /// @{
62  /**
63  * Default constructor.
64  * Use the SimpleCPTGenerator for generating the IDs CPT.
65  * Use the SimpleUTGenerator for generating the IDs UT.
66  */
67  InfluenceDiagramGenerator();
68 
69  /**
70  * Use this constructor if you want to use a different policy for generating
71  * CPT than the default one.
72  * The cptGenerator will be erased when the destructor is called.
73  * @param cptGenerator The policy used to generate CPT.
74  */
75  explicit InfluenceDiagramGenerator(ICPTGenerator< GUM_SCALAR >* cptGenerator);
76 
77  /**
78  * Use this constructor if you want to use a different policy for generating
79  * UT than the default one.
80  * The utGenerator will be erased when the destructor is called.
81  * @param utGenerator The policy used to generate UT.
82  */
83  explicit InfluenceDiagramGenerator(UTGenerator* utGenerator);
84 
85  /**
86  * Use this constructor if you want to use a different policy for generating
87  * both CPT & UT than the defaults ones.
88  * The cptGenerator and utGenerator will be erased when the destructor is
89  * called.
90  * @param cptGenerator The policy used to generate CPT.
91  * @param utGenerator The policy used to generate UT.
92  */
93  InfluenceDiagramGenerator(ICPTGenerator< GUM_SCALAR >* cptGenerator, UTGenerator* utGenerator);
94 
95  /**
96  * Destructor.
97  */
98  ~InfluenceDiagramGenerator();
99  /// @}
100 
101  // ############################################################################
102  /// @name ID generation methods
103  // ############################################################################
104  /// @{
105  /**
106  * Generates an influence diagram using floats.
107  * @param nbrNodes The number of nodes in the generated ID.
108  * @param arcDensity The probability of adding an arc between two nodes.
109  * @param chanceNodeDensity The proportion of chance node
110  * @param utilityNodeDensity The proportion of utility node
111  * @param max_modality Each DRV has from 2 to max_modality modalities
112  * @return A IDs randomly generated.
113  */
114  InfluenceDiagram< GUM_SCALAR >* generateID(Size nbrNodes,
115  GUM_SCALAR arcDensity,
116  GUM_SCALAR chanceNodeDensity,
117  GUM_SCALAR utilityNodeDensity,
118  Size max_modality = 2);
119 
120  /// @}
121  private:
122  // Check if a temporal order exists and creates ones if not
123  void _checkTemporalOrder_(InfluenceDiagram< GUM_SCALAR >* infdiag);
124  // The Conditional Probability Table generator
125  ICPTGenerator< GUM_SCALAR >* _cptGenerator_;
126  // The Utility Table generator
127  UTGenerator* _utGenerator_;
128  };
129 
130 } /* namespace gum */
131 
132 #include <agrum/ID/generator/influenceDiagramGenerator_tpl.h>
133 #endif /* GUM_INF_DIAG_GENERATOR_H */