aGrUM  0.20.2
a C++ library for (probabilistic) graphical models
projections4MultiDim_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 multiDimensional tables
25  *
26  * @author Christophe GONZALES(@AMU) and Pierre-Henri WUILLEMIN(@LIP6) */
27 
28 #ifndef DOXYGEN_SHOULD_SKIP_THIS
29 
30 // allow projectionPatterns to be used
31 # define GUM_PROJECTION_PATTERN_ALLOWED 1
32 
33 # include <agrum/tools/core/functors.h>
34 # include <agrum/tools/multidim/utils/operators/projectionRegister4MultiDim.h>
35 
36 // a specialized max projection function for multiDimArrays
37 
38 # define GUM_MULTI_DIM_PROJECTION_NAME projectMaxMultiDimArray
39 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
40 # define GUM_MULTI_DIM_PROJECTION(x, y)
41  if (y > x) x = y
42 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
43 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
44 # undef GUM_MULTI_DIM_PROJECTION_NAME
45 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
46 # undef GUM_MULTI_DIM_PROJECTION
47 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
48 
49 # define GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME projectMaxMultiDimArray
50 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
51 # define GUM_MULTI_DIM_PROJECTION(x, y)
52  if (y > x) x = y
53 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
54 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
55 # undef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME
56 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
57 # undef GUM_MULTI_DIM_PROJECTION
58 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
59 
60 # define GUM_MULTI_DIM_PROJECTION_POINTER_NAME projectMaxMultiDimArray4Pointers
61 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
62 # define GUM_MULTI_DIM_PROJECTION(x, y)
63  if (*(y) > *(x)) *(x) = *(y)
64 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
65 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
66 # undef GUM_MULTI_DIM_PROJECTION_POINTER_NAME
67 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
68 # undef GUM_MULTI_DIM_PROJECTION
69 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
70 
71 # define GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
72  projectMaxMultiDimArray4Pointers
73 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
74 # define GUM_MULTI_DIM_PROJECTION(x, y)
75  if (*(y) > *(x)) *(x) = *(y)
76 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
77 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
78 # undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
79 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
80 # undef GUM_MULTI_DIM_PROJECTION
81 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
82 
83 // a specialized min projection function for multiDimArrays
84 
85 # define GUM_MULTI_DIM_PROJECTION_NAME projectMinMultiDimArray
86 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
87 # define GUM_MULTI_DIM_PROJECTION(x, y)
88  if (x > y) x = y
89 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
90 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
91 # undef GUM_MULTI_DIM_PROJECTION_NAME
92 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
93 # undef GUM_MULTI_DIM_PROJECTION
94 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
95 
96 # define GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME projectMinMultiDimArray
97 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
98 # define GUM_MULTI_DIM_PROJECTION(x, y)
99  if (x > y) x = y
100 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
101 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
102 # undef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME
103 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
104 # undef GUM_MULTI_DIM_PROJECTION
105 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
106 
107 # define GUM_MULTI_DIM_PROJECTION_POINTER_NAME projectMinMultiDimArray4Pointers
108 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
109 # define GUM_MULTI_DIM_PROJECTION(x, y)
110  if (*(x) > *(y)) *(x) = *(y)
111 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
112 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
113 # undef GUM_MULTI_DIM_PROJECTION_POINTER_NAME
114 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
115 # undef GUM_MULTI_DIM_PROJECTION
116 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
117 
118 # define GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
119  projectMinMultiDimArray4Pointers
120 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
121 # define GUM_MULTI_DIM_PROJECTION(x, y)
122  if (*(x) > *(y)) *(x) = *(y)
123 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
124 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
125 # undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
126 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
127 # undef GUM_MULTI_DIM_PROJECTION
128 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
129 
130 // a specialized sum projection function for multiDimArrays
131 
132 # define GUM_MULTI_DIM_PROJECTION_NAME projectSumMultiDimArray
133 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
134 # define GUM_MULTI_DIM_PROJECTION(x, y) x += y
135 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
136 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
137 # undef GUM_MULTI_DIM_PROJECTION_NAME
138 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
139 # undef GUM_MULTI_DIM_PROJECTION
140 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
141 
142 # define GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME projectSumMultiDimArray
143 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
144 # define GUM_MULTI_DIM_PROJECTION(x, y) x += y
145 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
146 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
147 # undef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME
148 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
149 # undef GUM_MULTI_DIM_PROJECTION
150 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
151 
152 # define GUM_MULTI_DIM_PROJECTION_POINTER_NAME projectSumMultiDimArray4Pointers
153 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
154 # define GUM_MULTI_DIM_PROJECTION(x, y) *(x) += *(y)
155 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
156 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
157 # undef GUM_MULTI_DIM_PROJECTION_POINTER_NAME
158 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
159 # undef GUM_MULTI_DIM_PROJECTION
160 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
161 
162 # define GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
163  projectSumMultiDimArray4Pointers
164 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
165 # define GUM_MULTI_DIM_PROJECTION(x, y) *(x) += *(y)
166 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
167 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
168 # undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
169 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
170 # undef GUM_MULTI_DIM_PROJECTION
171 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
172 
173 // a specialized product projection function for multiDimArrays
174 
175 # define GUM_MULTI_DIM_PROJECTION_NAME projectProductMultiDimArray
176 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
177 # define GUM_MULTI_DIM_PROJECTION(x, y) (x) *= (y)
178 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
179 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
180 # undef GUM_MULTI_DIM_PROJECTION_NAME
181 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
182 # undef GUM_MULTI_DIM_PROJECTION
183 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
184 
185 # define GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME projectProductMultiDimArray
186 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
187 # define GUM_MULTI_DIM_PROJECTION(x, y) (x) *= (y)
188 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
189 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
190 # undef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME
191 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
192 # undef GUM_MULTI_DIM_PROJECTION
193 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
194 
195 # define GUM_MULTI_DIM_PROJECTION_POINTER_NAME
196  projectProductMultiDimArray4Pointers
197 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
198 # define GUM_MULTI_DIM_PROJECTION(x, y) (*x) *= (*y)
199 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
200 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
201 # undef GUM_MULTI_DIM_PROJECTION_POINTER_NAME
202 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
203 # undef GUM_MULTI_DIM_PROJECTION
204 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
205 
206 # define GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
207  projectProductMultiDimArray4Pointers
208 # define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
209 # define GUM_MULTI_DIM_PROJECTION(x, y) (*x) *= (*y)
210 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
211 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
212 # undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
213 # undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
214 # undef GUM_MULTI_DIM_PROJECTION
215 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
216 
217 // a specialized max projection function for multiDimFunctionGraphs
218 
219 # define GUM_MULTI_DIM_PROJECTION_OPERATOR Maximizes
220 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL
221  (-1 * std::numeric_limits< GUM_SCALAR >::max())
222 
223 # define GUM_MULTI_DIM_PROJECTION_NAME projectMaxMultiDimFunctionGraph
224 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimFunctionGraph.h>
225 # undef GUM_MULTI_DIM_PROJECTION_NAME
226 
227 # define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
228  projectMaxMultiDimFunctionGraph
229 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimFunctionGraph.h>
230 # undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
231 
232 # undef GUM_MULTI_DIM_PROJECTION_OPERATOR
233 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
234 
235 // a specialized min projection function for multiDimFunctionGraphs
236 
237 # define GUM_MULTI_DIM_PROJECTION_OPERATOR Minimizes
238 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
239 
240 # define GUM_MULTI_DIM_PROJECTION_NAME projectMinMultiDimFunctionGraph
241 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimFunctionGraph.h>
242 # undef GUM_MULTI_DIM_PROJECTION_NAME
243 
244 # define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
245  projectMinMultiDimFunctionGraph
246 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimFunctionGraph.h>
247 # undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
248 
249 # undef GUM_MULTI_DIM_PROJECTION_OPERATOR
250 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
251 
252 // a specialized sum projection function for multiDimFunctionGraphs
253 
254 # define GUM_MULTI_DIM_PROJECTION_OPERATOR std::plus
255 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
256 
257 # define GUM_MULTI_DIM_PROJECTION_NAME projectSumMultiDimFunctionGraph
258 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimFunctionGraph.h>
259 # undef GUM_MULTI_DIM_PROJECTION_NAME
260 
261 # define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
262  projectSumMultiDimFunctionGraph
263 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimFunctionGraph.h>
264 # undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
265 
266 # undef GUM_MULTI_DIM_PROJECTION_OPERATOR
267 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
268 
269 // a specialized product projection function for multiDimFunctionGraphs
270 
271 # define GUM_MULTI_DIM_PROJECTION_OPERATOR std::multiplies
272 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
273 
274 # define GUM_MULTI_DIM_PROJECTION_NAME projectProductMultiDimFunctionGraph
275 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimFunctionGraph.h>
276 # undef GUM_MULTI_DIM_PROJECTION_NAME
277 
278 # define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
279  projectProductMultiDimFunctionGraph
280 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimFunctionGraph.h>
281 # undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
282 
283 # undef GUM_MULTI_DIM_PROJECTION_OPERATOR
284 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
285 
286 // a specialized function for functionally projecting a multiDimArray
287 
288 /*
289 #define GUM_MULTI_DIM_PROJECTION_NAME_F projectFuncMultiDimArray
290 #define GUM_MULTI_DIM_PROJECTION(x,y) f( (x),(y) )
291 #define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR) 0
292 #include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
293 #undef GUM_MULTI_DIM_PROJECTION_NAME_F
294 #undef GUM_MULTI_DIM_PROJECTION
295 */
296 
297 // the operators that should be used to select appropriately the functions
298 // to project multiDims
299 
300 // the function to be used to project a MultiDimImplementation using a Max
301 # define GUM_MULTI_DIM_PROJECTION_NAME projectMax
302 # define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "max"
303 # define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
304 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimImplementation.h>
305 # undef GUM_MULTI_DIM_PROJECTION_NAME
306 # undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
307 # undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
308 
309 // the function to be used to project a MultiDimImplementation using a Min
310 # define GUM_MULTI_DIM_PROJECTION_NAME projectMin
311 # define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "min"
312 # define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
313 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimImplementation.h>
314 # undef GUM_MULTI_DIM_PROJECTION_NAME
315 # undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
316 # undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
317 
318 // the function to be used to project a MultiDimImplementation using a Sum
319 # define GUM_MULTI_DIM_PROJECTION_NAME projectSum
320 # define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "sum"
321 # define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
322 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimImplementation.h>
323 # undef GUM_MULTI_DIM_PROJECTION_NAME
324 # undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
325 # undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
326 
327 // the function to be used to project a MultiDimImplementation using a Product
328 # define GUM_MULTI_DIM_PROJECTION_NAME projectProduct
329 # define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "product"
330 # define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
331 # include <agrum/tools/multidim/utils/patterns/projectionPattern4MultiDimImplementation.h>
332 # undef GUM_MULTI_DIM_PROJECTION_NAME
333 # undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
334 # undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
335 
336 // default "basename" functions for projecting MultiDimImplementations
337 
338 # define GUM_MULTI_DIM_PROJECTION_NAME projectMaxMultiDimImplementation
339 # define GUM_MULTI_DIM_PROJECTION(x, y) ((x) > (y) ? (x) : (y))
340 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
341 # include <agrum/tools/multidim/utils/patterns/projectionPattern4BaseName.h>
342 # undef GUM_MULTI_DIM_PROJECTION_NAME
343 # undef GUM_MULTI_DIM_PROJECTION
344 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
345 
346 # define GUM_MULTI_DIM_PROJECTION_NAME projectMinMultiDimImplementation
347 # define GUM_MULTI_DIM_PROJECTION(x, y) ((x) > (y) ? (y) : (x))
348 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
349 # include <agrum/tools/multidim/utils/patterns/projectionPattern4BaseName.h>
350 # undef GUM_MULTI_DIM_PROJECTION_NAME
351 # undef GUM_MULTI_DIM_PROJECTION
352 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
353 
354 # define GUM_MULTI_DIM_PROJECTION_NAME projectSumMultiDimImplementation
355 # define GUM_MULTI_DIM_PROJECTION(x, y) ((x) + (y))
356 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
357 # include <agrum/tools/multidim/utils/patterns/projectionPattern4BaseName.h>
358 # undef GUM_MULTI_DIM_PROJECTION_NAME
359 # undef GUM_MULTI_DIM_PROJECTION
360 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
361 
362 # define GUM_MULTI_DIM_PROJECTION_NAME projectProductMultiDimImplementation
363 # define GUM_MULTI_DIM_PROJECTION(x, y) ((x) * (y))
364 # define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
365 # include <agrum/tools/multidim/utils/patterns/projectionPattern4BaseName.h>
366 # undef GUM_MULTI_DIM_PROJECTION_NAME
367 # undef GUM_MULTI_DIM_PROJECTION
368 # undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
369 
370 //
371 // DO NOT FORGET TO REGISTER YOUR BINARY FUNCTIONS
372 //
373 
374 namespace gum {
375  // the function used to register all the above functions
376  template < typename GUM_SCALAR >
377  void projections4MultiDimInit() {
378  static bool first_init = true;
379 
380  if (first_init) {
381  first_init = false;
382 
383  std::string MultiDimArrayString("MultiDimArray");
384  std::string MultiDimFunctionGraphString("MultiDimFunctionGraph");
385  std::string BaseNameString("MultiDimImplementation");
386 
387  // register base functions for multiDimArrays
388  registerProjection< GUM_SCALAR >("max",
389  MultiDimArrayString,
390  &projectMaxMultiDimArray);
391  registerProjection< GUM_SCALAR >("min",
392  MultiDimArrayString,
393  &projectMinMultiDimArray);
394  registerProjection< GUM_SCALAR >("sum",
395  MultiDimArrayString,
396  &projectSumMultiDimArray);
397  registerProjection< GUM_SCALAR >("product",
398  MultiDimArrayString,
399  &projectProductMultiDimArray);
400 
401  // register base functions for multiDimArrays
402  registerProjection< GUM_SCALAR >("max",
403  MultiDimFunctionGraphString,
404  &projectMaxMultiDimFunctionGraph);
405  registerProjection< GUM_SCALAR >("min",
406  MultiDimFunctionGraphString,
407  &projectMinMultiDimFunctionGraph);
408  registerProjection< GUM_SCALAR >("sum",
409  MultiDimFunctionGraphString,
410  &projectSumMultiDimFunctionGraph);
411  registerProjection< GUM_SCALAR >("product",
412  MultiDimFunctionGraphString,
413  &projectProductMultiDimFunctionGraph);
414 
415  // register default basename functions
416  registerProjection< GUM_SCALAR >("max",
417  BaseNameString,
418  &projectMaxMultiDimImplementation);
419  registerProjection< GUM_SCALAR >("min",
420  BaseNameString,
421  &projectMinMultiDimImplementation);
422  registerProjection< GUM_SCALAR >("sum",
423  BaseNameString,
424  &projectSumMultiDimImplementation);
425  registerProjection< GUM_SCALAR >("product",
426  BaseNameString,
427  &projectProductMultiDimImplementation);
428  }
429  }
430 
431  // the function used to register all the above functions
432  template < typename GUM_SCALAR >
434  static bool first_init = true;
435 
436  if (first_init) {
437  first_init = false;
438 
439  std::string MultiDimArrayString("MultiDimArray");
440  std::string BaseNameString("MultiDimImplementation");
441 
442  // register base functions for multiDimArrays
443  registerProjection< GUM_SCALAR* >("max",
444  MultiDimArrayString,
445  &projectMaxMultiDimArray4Pointers);
446  registerProjection< GUM_SCALAR* >("min",
447  MultiDimArrayString,
448  &projectMinMultiDimArray4Pointers);
449  registerProjection< GUM_SCALAR* >("sum",
450  MultiDimArrayString,
451  &projectSumMultiDimArray4Pointers);
452  registerProjection< GUM_SCALAR* >("product",
453  MultiDimArrayString,
454  &projectProductMultiDimArray4Pointers);
455  }
456  }
457 
458 } /* namespace gum */
459 
460 // remove permission to use operatorsPatterns
461 # undef GUM_PROJECTION_PATTERN_ALLOWED
462 
463 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
INLINE void emplace(Args &&... args)
Definition: set_tpl.h:669
void projections4MultiDimInit()
the function used to register all the projection operators on multidimImplementations over non-pointe...
void pointerProjections4MultiDimInit()
the function used to register all the projections on multidimImplementations over pointers types...