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