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