aGrUM  0.20.3
a C++ library for (probabilistic) graphical models
completeProjections4MultiDim_tpl.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 Efficient functionals for projecting multidim tables over all their
25  * variables
26  *
27  * @author Christophe GONZALES(@AMU) and Pierre-Henri WUILLEMIN(@LIP6)
28  */
29 
30 #ifndef DOXYGEN_SHOULD_SKIP_THIS
31 
32 // allow projectionPatterns to be used
33 # define GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED 1
34 
35 # include <agrum/tools/multidim/utils/operators/completeProjectionRegister4MultiDim.h>
36 
37 // a specialized max projection function for multiDimArrays
38 
39 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimArray
40 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y)
41  if (y > x) x = y
42 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
43 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
44 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
45 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
46 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
47 
48 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMaxMultiDimArray
49 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y)
50  if (y > x) x = y
51 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
52 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
53 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
54 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
55 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
56 
57 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectMaxMultiDimArray4Pointers
58 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y)
59  if (*(y) > *(x)) *(x) = *(y)
60 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
61 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
62 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
63 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
64 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
65 
66 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectMaxMultiDimArray4Pointers
67 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y)
68  if (*(y) > *(x)) *(x) = *(y)
69 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
70 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
71 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
72 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
73 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
74 
75 // a specialized min projection function for multiDimArrays
76 
77 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimArray
78 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y)
79  if (x > y) x = y
80 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
81 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
82 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
83 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
84 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
85 
86 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMinMultiDimArray
87 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y)
88  if (x > y) x = y
89 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
90 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
91 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
92 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
93 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
94 
95 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectMinMultiDimArray4Pointers
96 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y)
97  if (*(x) > *(y)) *(x) = *(y)
98 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
99 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
100 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
101 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
102 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
103 
104 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectMinMultiDimArray4Pointers
105 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y)
106  if (*(x) > *(y)) *(x) = *(y)
107 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
108 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
109 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
110 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
111 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
112 
113 // a specialized sum projection function for multiDimArrays
114 
115 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimArray
116 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
117 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
118 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
119 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
120 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
121 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
122 
123 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectSumMultiDimArray
124 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
125 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
126 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
127 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
128 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
129 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
130 
131 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectSumMultiDimArray4Pointers
132 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
133 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
134 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
135 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
136 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
137 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
138 
139 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectSumMultiDimArray4Pointers
140 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
141 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
142 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
143 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
144 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
145 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
146 
147 // a specialized product projection function for multiDimArrays
148 
149 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProductMultiDimArray
150 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (x) *= (y)
151 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
152 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
153 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
154 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
155 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
156 
157 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectProductMultiDimArray
158 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (x) *= (y)
159 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
160 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
161 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
162 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
163 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
164 
165 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectProductMultiDimArray4Pointers
166 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
167 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
168 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
169 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
170 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
171 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
172 
173 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
174  projectProductMultiDimArray4Pointers
175 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
176 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
177 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimArray.h>
178 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
179 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
180 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
181 
182 // the operators that should be used to select appropriately the functions
183 // to project multiDims
184 
185 // the function to be used to project a MultiDimImplementation using a Max
186 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMax
187 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "max"
188 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimImplementation.h>
189 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
190 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
191 
192 // the function to be used to project a MultiDimImplementation using a Min
193 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMin
194 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "min"
195 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimImplementation.h>
196 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
197 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
198 
199 // the function to be used to project a MultiDimImplementation using a Sum
200 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSum
201 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "sum"
202 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimImplementation.h>
203 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
204 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
205 
206 // the function to be used to project a MultiDimImplementation using a Product
207 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProduct
208 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "product"
209 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4MultiDimImplementation.h>
210 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
211 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
212 
213 // default "basename" functions for projecting MultiDimImplementations
214 
215 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimImplementation
216 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y)
217  if (y > x) x = y
218 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
219 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4BaseName.h>
220 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
221 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
222 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
223 
224 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimImplementation
225 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y)
226  if (x > y) x = y
227 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
228 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4BaseName.h>
229 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
230 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
231 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
232 
233 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimImplementation
234 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
235 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
236 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4BaseName.h>
237 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
238 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
239 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
240 
241 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProductMultiDimImplementation
242 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x *= y
243 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
244 # include <agrum/tools/multidim/utils/patterns/completeProjectionPattern4BaseName.h>
245 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
246 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
247 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
248 
249 //
250 // DO NOT FORGET TO REGISTER YOUR BINARY FUNCTIONS
251 //
252 
253 namespace gum {
254 
255  // the function used to register all the above functions
256  template < typename GUM_SCALAR >
258  static bool first_init = true;
259 
260  if (first_init) {
261  first_init = false;
262 
263  std::string MultiDimArrayString("MultiDimArray");
264  std::string BaseNameString("MultiDimImplementation");
265 
266  // register base functions for multiDimArrays
267  registerCompleteProjection< GUM_SCALAR >("max",
268  MultiDimArrayString,
269  &projectMaxMultiDimArray);
270  registerCompleteProjection< GUM_SCALAR >("min",
271  MultiDimArrayString,
272  &projectMinMultiDimArray);
273  registerCompleteProjection< GUM_SCALAR >("sum",
274  MultiDimArrayString,
275  &projectSumMultiDimArray);
276  registerCompleteProjection< GUM_SCALAR >("product",
277  MultiDimArrayString,
278  &projectProductMultiDimArray);
279 
280  // register default basename functions
281  registerCompleteProjection< GUM_SCALAR >("max",
282  BaseNameString,
283  &projectMaxMultiDimImplementation);
284  registerCompleteProjection< GUM_SCALAR >("min",
285  BaseNameString,
286  &projectMinMultiDimImplementation);
287  registerCompleteProjection< GUM_SCALAR >("sum",
288  BaseNameString,
289  &projectSumMultiDimImplementation);
290  registerCompleteProjection< GUM_SCALAR >("product",
291  BaseNameString,
292  &projectProductMultiDimImplementation);
293  }
294  }
295 
296  // the function used to register all the above functions
297  template < typename GUM_SCALAR >
299  static bool first_init = true;
300 
301  if (first_init) {
302  first_init = false;
303 
304  std::string MultiDimArrayString("MultiDimArray");
305  std::string BaseNameString("MultiDimImplementation");
306 
307  // register base functions for multiDimArrays
308  registerCompleteProjection< GUM_SCALAR* >("max",
309  MultiDimArrayString,
310  &projectMaxMultiDimArray4Pointers);
311  registerCompleteProjection< GUM_SCALAR* >("min",
312  MultiDimArrayString,
313  &projectMinMultiDimArray4Pointers);
314  registerCompleteProjection< GUM_SCALAR* >("sum",
315  MultiDimArrayString,
316  &projectSumMultiDimArray4Pointers);
317  registerCompleteProjection< GUM_SCALAR* >("product",
318  MultiDimArrayString,
319  &projectProductMultiDimArray4Pointers);
320  }
321  }
322 
323 } /* namespace gum */
324 
325 // remove permission to use operatorsPatterns
326 # undef GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED
327 
328 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
INLINE void emplace(Args &&... args)
Definition: set_tpl.h:643
void completeProjections4MultiDimInit()
the function used to register all the complete projection operators on multidimImplementations over n...
void pointerCompleteProjections4MultiDimInit()
The function used to register all the complete projections on multidimImplementations over pointers t...