aGrUM 3.1.1
a C++ library for (probabilistic) graphical models
projections4MultiDim_tpl.h
Go to the documentation of this file.
1/****************************************************************************
2 * This file is part of the aGrUM/pyAgrum library. *
3 * *
4 * Copyright (c) 2005-2026 by *
5 * - Pierre-Henri WUILLEMIN(_at_LIP6) *
6 * - Christophe GONZALES(_at_AMU) *
7 * *
8 * The aGrUM/pyAgrum library is free software; you can redistribute it *
9 * and/or modify it under the terms of either : *
10 * *
11 * - the GNU Lesser General Public License as published by *
12 * the Free Software Foundation, either version 3 of the License, *
13 * or (at your option) any later version, *
14 * - the MIT license (MIT), *
15 * - or both in dual license, as here. *
16 * *
17 * (see https://agrum.gitlab.io/articles/dual-licenses-lgplv3mit.html) *
18 * *
19 * This aGrUM/pyAgrum library is distributed in the hope that it will be *
20 * useful, but WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
21 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES MERCHANTABILITY or FITNESS *
22 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
25 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
26 * OTHER DEALINGS IN THE SOFTWARE. *
27 * *
28 * See LICENCES for more details. *
29 * *
30 * SPDX-FileCopyrightText: Copyright 2005-2026 *
31 * - Pierre-Henri WUILLEMIN(_at_LIP6) *
32 * - Christophe GONZALES(_at_AMU) *
33 * SPDX-License-Identifier: LGPL-3.0-or-later OR MIT *
34 * *
35 * Contact : info_at_agrum_dot_org *
36 * homepage : http://agrum.gitlab.io *
37 * gitlab : https://gitlab.com/agrumery/agrum *
38 * *
39 ****************************************************************************/
40
41#pragma once
42
43
49
51#ifndef DOXYGEN_SHOULD_SKIP_THIS
52
53// allow projectionPatterns to be used
54# define GUM_PROJECTION_PATTERN_ALLOWED 1
55
58
59// a specialized max projection function for multiDimArrays
60
61# define GUM_MULTI_DIM_PROJECTION_NAME projectMaxMultiDimArray
62# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
63# define GUM_MULTI_DIM_PROJECTION(x, y) \
64 if (y > x) x = y
65# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::min()
67# undef GUM_MULTI_DIM_PROJECTION_NAME
68# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
69# undef GUM_MULTI_DIM_PROJECTION
70# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
71
72# define GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME projectMaxMultiDimArray
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_ELEMENT >::min()
78# undef GUM_MULTI_DIM_PROJECTION_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# define GUM_MULTI_DIM_PROJECTION_POINTER_NAME projectMaxMultiDimArray4Pointers
84# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
85# define GUM_MULTI_DIM_PROJECTION(x, y) \
86 if (*(y) > *(x)) *(x) = *(y)
87# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::min()
89# undef GUM_MULTI_DIM_PROJECTION_POINTER_NAME
90# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
91# undef GUM_MULTI_DIM_PROJECTION
92# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
93
94# define GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME projectMaxMultiDimArray4Pointers
95# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
96# define GUM_MULTI_DIM_PROJECTION(x, y) \
97 if (*(y) > *(x)) *(x) = *(y)
98# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::min()
100# undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
101# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
102# undef GUM_MULTI_DIM_PROJECTION
103# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
104
105// a specialized min projection function for multiDimArrays
106
107# define GUM_MULTI_DIM_PROJECTION_NAME projectMinMultiDimArray
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_ELEMENT >::max()
113# undef GUM_MULTI_DIM_PROJECTION_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_IMPL2ARRAY_NAME projectMinMultiDimArray
119# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
120# define GUM_MULTI_DIM_PROJECTION(x, y) \
121 if (x > y) x = y
122# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
124# undef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME
125# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
126# undef GUM_MULTI_DIM_PROJECTION
127# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
128
129# define GUM_MULTI_DIM_PROJECTION_POINTER_NAME projectMinMultiDimArray4Pointers
130# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
131# define GUM_MULTI_DIM_PROJECTION(x, y) \
132 if (*(x) > *(y)) *(x) = *(y)
133# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
135# undef GUM_MULTI_DIM_PROJECTION_POINTER_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_POINTER_IMPL2ARRAY_NAME projectMinMultiDimArray4Pointers
141# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
142# define GUM_MULTI_DIM_PROJECTION(x, y) \
143 if (*(x) > *(y)) *(x) = *(y)
144# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
146# undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
147# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
148# undef GUM_MULTI_DIM_PROJECTION
149# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
150
151// a specialized sum projection function for multiDimArrays
152
153# define GUM_MULTI_DIM_PROJECTION_NAME projectSumMultiDimArray
154# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
155# define GUM_MULTI_DIM_PROJECTION(x, y) x += y
156# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)0
158# undef GUM_MULTI_DIM_PROJECTION_NAME
159# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
160# undef GUM_MULTI_DIM_PROJECTION
161# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
162
163# define GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME projectSumMultiDimArray
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_ELEMENT)0
168# undef GUM_MULTI_DIM_PROJECTION_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# define GUM_MULTI_DIM_PROJECTION_POINTER_NAME projectSumMultiDimArray4Pointers
174# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
175# define GUM_MULTI_DIM_PROJECTION(x, y) *(x) += *(y)
176# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)0
178# undef GUM_MULTI_DIM_PROJECTION_POINTER_NAME
179# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
180# undef GUM_MULTI_DIM_PROJECTION
181# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
182
183# define GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME projectSumMultiDimArray4Pointers
184# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
185# define GUM_MULTI_DIM_PROJECTION(x, y) *(x) += *(y)
186# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)0
188# undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
189# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
190# undef GUM_MULTI_DIM_PROJECTION
191# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
192
193// a specialized product projection function for multiDimArrays
194
195# define GUM_MULTI_DIM_PROJECTION_NAME projectProductMultiDimArray
196# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
197# define GUM_MULTI_DIM_PROJECTION(x, y) (x) *= (y)
198# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)1
200# undef GUM_MULTI_DIM_PROJECTION_NAME
201# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
202# undef GUM_MULTI_DIM_PROJECTION
203# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
204
205# define GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME projectProductMultiDimArray
206# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
207# define GUM_MULTI_DIM_PROJECTION(x, y) (x) *= (y)
208# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)1
210# undef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME
211# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
212# undef GUM_MULTI_DIM_PROJECTION
213# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
214
215# define GUM_MULTI_DIM_PROJECTION_POINTER_NAME projectProductMultiDimArray4Pointers
216# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
217# define GUM_MULTI_DIM_PROJECTION(x, y) (*x) *= (*y)
218# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)1
220# undef GUM_MULTI_DIM_PROJECTION_POINTER_NAME
221# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
222# undef GUM_MULTI_DIM_PROJECTION
223# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
224
225# define GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME projectProductMultiDimArray4Pointers
226# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
227# define GUM_MULTI_DIM_PROJECTION(x, y) (*x) *= (*y)
228# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)1
230# undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
231# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
232# undef GUM_MULTI_DIM_PROJECTION
233# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
234
235// a specialized max projection function for multiDimFunctionGraphs
236
237# define GUM_MULTI_DIM_PROJECTION_OPERATOR Maximizes
238# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (-1 * std::numeric_limits< GUM_ELEMENT >::max())
239
240# define GUM_MULTI_DIM_PROJECTION_NAME projectMaxMultiDimFunctionGraph
242# undef GUM_MULTI_DIM_PROJECTION_NAME
243
244# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectMaxMultiDimFunctionGraph
246# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
247
248# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
249# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
250
251// a specialized min projection function for multiDimFunctionGraphs
252
253# define GUM_MULTI_DIM_PROJECTION_OPERATOR Minimizes
254# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
255
256# define GUM_MULTI_DIM_PROJECTION_NAME projectMinMultiDimFunctionGraph
258# undef GUM_MULTI_DIM_PROJECTION_NAME
259
260# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectMinMultiDimFunctionGraph
262# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
263
264# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
265# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
266
267// a specialized sum projection function for multiDimFunctionGraphs
268
269# define GUM_MULTI_DIM_PROJECTION_OPERATOR std::plus
270# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)0
271
272# define GUM_MULTI_DIM_PROJECTION_NAME projectSumMultiDimFunctionGraph
274# undef GUM_MULTI_DIM_PROJECTION_NAME
275
276# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectSumMultiDimFunctionGraph
278# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
279
280# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
281# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
282
283// a specialized product projection function for multiDimFunctionGraphs
284
285# define GUM_MULTI_DIM_PROJECTION_OPERATOR std::multiplies
286# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)1
287
288# define GUM_MULTI_DIM_PROJECTION_NAME projectProductMultiDimFunctionGraph
290# undef GUM_MULTI_DIM_PROJECTION_NAME
291
292# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectProductMultiDimFunctionGraph
294# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
295
296# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
297# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
298
299// a specialized function for functionally projecting a multiDimArray
300
301/*
302#define GUM_MULTI_DIM_PROJECTION_NAME_F projectFuncMultiDimArray
303#define GUM_MULTI_DIM_PROJECTION(x,y) f( (x),(y) )
304#define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT) 0
305#include <agrum/base/multidim/utils/patterns/projectionPattern4MultiDimArray.h>
306#undef GUM_MULTI_DIM_PROJECTION_NAME_F
307#undef GUM_MULTI_DIM_PROJECTION
308*/
309
310// the operators that should be used to select appropriately the functions
311// to project multiDims
312
313// the function to be used to project a MultiDimImplementation using a Max
314# define GUM_MULTI_DIM_PROJECTION_NAME projectMax
315# define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "max"
316# define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
318# undef GUM_MULTI_DIM_PROJECTION_NAME
319# undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
320# undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
321
322// the function to be used to project a MultiDimImplementation using a Min
323# define GUM_MULTI_DIM_PROJECTION_NAME projectMin
324# define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "min"
325# define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
327# undef GUM_MULTI_DIM_PROJECTION_NAME
328# undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
329# undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
330
331// the function to be used to project a MultiDimImplementation using a Sum
332# define GUM_MULTI_DIM_PROJECTION_NAME projectSum
333# define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "sum"
334# define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
336# undef GUM_MULTI_DIM_PROJECTION_NAME
337# undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
338# undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
339
340// the function to be used to project a MultiDimImplementation using a Product
341# define GUM_MULTI_DIM_PROJECTION_NAME projectProduct
342# define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "product"
343# define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
345# undef GUM_MULTI_DIM_PROJECTION_NAME
346# undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
347# undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
348
349// default "basename" functions for projecting MultiDimImplementations
350
351# define GUM_MULTI_DIM_PROJECTION_NAME projectMaxMultiDimImplementation
352# define GUM_MULTI_DIM_PROJECTION(x, y) ((x) > (y) ? (x) : (y))
353# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::min()
355# undef GUM_MULTI_DIM_PROJECTION_NAME
356# undef GUM_MULTI_DIM_PROJECTION
357# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
358
359# define GUM_MULTI_DIM_PROJECTION_NAME projectMinMultiDimImplementation
360# define GUM_MULTI_DIM_PROJECTION(x, y) ((x) > (y) ? (y) : (x))
361# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
363# undef GUM_MULTI_DIM_PROJECTION_NAME
364# undef GUM_MULTI_DIM_PROJECTION
365# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
366
367# define GUM_MULTI_DIM_PROJECTION_NAME projectSumMultiDimImplementation
368# define GUM_MULTI_DIM_PROJECTION(x, y) ((x) + (y))
369# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)0
371# undef GUM_MULTI_DIM_PROJECTION_NAME
372# undef GUM_MULTI_DIM_PROJECTION
373# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
374
375# define GUM_MULTI_DIM_PROJECTION_NAME projectProductMultiDimImplementation
376# define GUM_MULTI_DIM_PROJECTION(x, y) ((x) * (y))
377# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)1
379# undef GUM_MULTI_DIM_PROJECTION_NAME
380# undef GUM_MULTI_DIM_PROJECTION
381# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
382
383//
384// DO NOT FORGET TO REGISTER YOUR BINARY FUNCTIONS
385//
386
387namespace gum {
388 // the function used to register all the above functions
389 template < typename GUM_ELEMENT >
391 // ensure that only one thread will register the projections
392 static std::once_flag first;
393 std::call_once(first, []() {
394 std::string MultiDimArrayString("MultiDimArray");
395 std::string MultiDimFunctionGraphString("MultiDimFunctionGraph");
396 std::string BaseNameString("MultiDimImplementation");
397
398 // register base functions for multiDimArrays
403 MultiDimArrayString,
405
406 // register base functions for multiDimArrays
408 MultiDimFunctionGraphString,
411 MultiDimFunctionGraphString,
414 MultiDimFunctionGraphString,
417 MultiDimFunctionGraphString,
419
420 // register default basename functions
421 registerProjection< GUM_ELEMENT >("max", BaseNameString, &projectMaxMultiDimImplementation);
422 registerProjection< GUM_ELEMENT >("min", BaseNameString, &projectMinMultiDimImplementation);
423 registerProjection< GUM_ELEMENT >("sum", BaseNameString, &projectSumMultiDimImplementation);
425 BaseNameString,
426 &projectProductMultiDimImplementation);
427 });
428 }
429
430 // the function used to register all the above functions
431 template < typename GUM_ELEMENT >
433 // ensure that only one thread will register the projections
434 static std::once_flag first;
435 std::call_once(first, []() {
436 std::string MultiDimArrayString("MultiDimArray");
437 std::string BaseNameString("MultiDimImplementation");
438
439 // register base functions for multiDimArrays
441 MultiDimArrayString,
444 MultiDimArrayString,
447 MultiDimArrayString,
450 MultiDimArrayString,
452 });
453 }
454
455 template < typename GUM_ELEMENT >
458 }
459
460 template < typename GUM_ELEMENT >
463 }
464
465} /* namespace gum */
466
467// remove permission to use operatorsPatterns
468# undef GUM_PROJECTION_PATTERN_ALLOWED
469
470#endif /* DOXYGEN_SHOULD_SKIP_THIS */
This files contains several function objects that are not (yet) defined in the STL.
GUM_ELEMENT projectMaxMultiDimArray(const MultiDimArray< GUM_ELEMENT > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Max operator.
GUM_ELEMENT * projectSumMultiDimArray4Pointers(const MultiDimArray< GUM_ELEMENT * > *table, Instantiation *instantiation=0)
a specialized function for projecting a multiDimArray using a Sum operator
GUM_ELEMENT * projectMaxMultiDimArray4Pointers(const MultiDimArray< GUM_ELEMENT * > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Max operator.
GUM_ELEMENT projectMinMultiDimArray(const MultiDimArray< GUM_ELEMENT > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Min operator.
GUM_ELEMENT * projectMinMultiDimArray4Pointers(const MultiDimArray< GUM_ELEMENT * > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Min operator.
GUM_ELEMENT * projectProductMultiDimArray4Pointers(const MultiDimArray< GUM_ELEMENT * > *table, Instantiation *instantiation=0)
a function for projecting a multiDimArray using a Product operator
GUM_ELEMENT projectProductMultiDimArray(const MultiDimArray< GUM_ELEMENT > *table, Instantiation *instantiation=0)
a function for projecting a multiDimArray using a Product operator
GUM_ELEMENT projectSumMultiDimArray(const MultiDimArray< GUM_ELEMENT > *table, Instantiation *instantiation=0)
a specialized function for projecting a multiDimArray using a Sum operator
gum is the global namespace for all aGrUM entities
Definition agrum.h:46
MultiDimFunctionGraph< GUM_ELEMENT > * projectSumMultiDimFunctionGraph(const MultiDimFunctionGraph< GUM_ELEMENT > *table, const gum::VariableSet &del_vars)
a specialized function for projecting a multiDimFunctionGraph using a summation
MultiDimFunctionGraph< GUM_ELEMENT > * projectMaxMultiDimFunctionGraph(const MultiDimFunctionGraph< GUM_ELEMENT > *table, const gum::VariableSet &del_vars)
a specialized function for projecting a multiDimFunctionGraph using a Max operator
MultiDimFunctionGraph< GUM_ELEMENT > * projectProductMultiDimFunctionGraph(const MultiDimFunctionGraph< GUM_ELEMENT > *table, const gum::VariableSet &del_vars)
a specialized function for projecting a multiDimFunctionGraph using products
void registerProjection(std::string_view projection_name, std::string_view type_multidim, typename ProjectionRegister4MultiDim< GUM_ELEMENT >::ProjectionPtr function)
A function to more easily register new projection functions in MultiDims.
void pointerProjections4MultiDimInit()
the function used to register all the projections on multidimImplementations over pointers types.
MultiDimFunctionGraph< GUM_ELEMENT > * projectMinMultiDimFunctionGraph(const MultiDimFunctionGraph< GUM_ELEMENT > *table, const gum::VariableSet &del_vars)
a specialized function for projecting a multiDimFunctionGraph using a Min operator
void projections4MultiDimInit()
the function used to register all the projection operators on multidimImplementations over non-pointe...
the pattern used by all the "basename" projections of multidim tables
the pattern used by all the projections of multidimensional tables
the pattern used by all the projections of multidimensional tables
the pattern used by all the MultiDimImplementation projections
A container for registering projection functions on multiDimImplementations.
Efficient functionals for projecting multiDimensional tables.