51#ifndef DOXYGEN_SHOULD_SKIP_THIS
54# define GUM_PROJECTION_PATTERN_ALLOWED 1
61# define GUM_MULTI_DIM_PROJECTION_NAME projectMaxMultiDimArray
62# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
63# define GUM_MULTI_DIM_PROJECTION(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
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) \
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
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
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
107# define GUM_MULTI_DIM_PROJECTION_NAME projectMinMultiDimArray
108# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
109# define GUM_MULTI_DIM_PROJECTION(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
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) \
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
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
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
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
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
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
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
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
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
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
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
237# define GUM_MULTI_DIM_PROJECTION_OPERATOR Maximizes
238# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (-1 * std::numeric_limits< GUM_ELEMENT >::max())
240# define GUM_MULTI_DIM_PROJECTION_NAME projectMaxMultiDimFunctionGraph
242# undef GUM_MULTI_DIM_PROJECTION_NAME
244# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectMaxMultiDimFunctionGraph
246# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
248# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
249# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
253# define GUM_MULTI_DIM_PROJECTION_OPERATOR Minimizes
254# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
256# define GUM_MULTI_DIM_PROJECTION_NAME projectMinMultiDimFunctionGraph
258# undef GUM_MULTI_DIM_PROJECTION_NAME
260# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectMinMultiDimFunctionGraph
262# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
264# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
265# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
269# define GUM_MULTI_DIM_PROJECTION_OPERATOR std::plus
270# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)0
272# define GUM_MULTI_DIM_PROJECTION_NAME projectSumMultiDimFunctionGraph
274# undef GUM_MULTI_DIM_PROJECTION_NAME
276# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectSumMultiDimFunctionGraph
278# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
280# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
281# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
285# define GUM_MULTI_DIM_PROJECTION_OPERATOR std::multiplies
286# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_ELEMENT)1
288# define GUM_MULTI_DIM_PROJECTION_NAME projectProductMultiDimFunctionGraph
290# undef GUM_MULTI_DIM_PROJECTION_NAME
292# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectProductMultiDimFunctionGraph
294# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
296# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
297# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
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
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
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
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
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
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
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
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
389 template <
typename GUM_ELEMENT >
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");
408 MultiDimFunctionGraphString,
411 MultiDimFunctionGraphString,
414 MultiDimFunctionGraphString,
417 MultiDimFunctionGraphString,
426 &projectProductMultiDimImplementation);
431 template <
typename GUM_ELEMENT >
434 static std::once_flag first;
435 std::call_once(first, []() {
436 std::string MultiDimArrayString(
"MultiDimArray");
437 std::string BaseNameString(
"MultiDimImplementation");
455 template <
typename GUM_ELEMENT >
460 template <
typename GUM_ELEMENT >
468# undef GUM_PROJECTION_PATTERN_ALLOWED
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
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.