49#ifndef DOXYGEN_SHOULD_SKIP_THIS
52# define GUM_PROJECTION_PATTERN_ALLOWED 1
59# define GUM_MULTI_DIM_PROJECTION_NAME projectMaxMultiDimArray
60# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
61# define GUM_MULTI_DIM_PROJECTION(x, y) \
63# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
65# undef GUM_MULTI_DIM_PROJECTION_NAME
66# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
67# undef GUM_MULTI_DIM_PROJECTION
68# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
70# define GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME projectMaxMultiDimArray
71# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
72# define GUM_MULTI_DIM_PROJECTION(x, y) \
74# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
76# undef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME
77# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
78# undef GUM_MULTI_DIM_PROJECTION
79# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
81# define GUM_MULTI_DIM_PROJECTION_POINTER_NAME projectMaxMultiDimArray4Pointers
82# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
83# define GUM_MULTI_DIM_PROJECTION(x, y) \
84 if (*(y) > *(x)) *(x) = *(y)
85# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
87# undef GUM_MULTI_DIM_PROJECTION_POINTER_NAME
88# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
89# undef GUM_MULTI_DIM_PROJECTION
90# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
92# define GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME projectMaxMultiDimArray4Pointers
93# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
94# define GUM_MULTI_DIM_PROJECTION(x, y) \
95 if (*(y) > *(x)) *(x) = *(y)
96# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
98# undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
99# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
100# undef GUM_MULTI_DIM_PROJECTION
101# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
105# define GUM_MULTI_DIM_PROJECTION_NAME projectMinMultiDimArray
106# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
107# define GUM_MULTI_DIM_PROJECTION(x, y) \
109# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
111# undef GUM_MULTI_DIM_PROJECTION_NAME
112# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
113# undef GUM_MULTI_DIM_PROJECTION
114# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
116# define GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME projectMinMultiDimArray
117# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
118# define GUM_MULTI_DIM_PROJECTION(x, y) \
120# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
122# undef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME
123# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
124# undef GUM_MULTI_DIM_PROJECTION
125# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
127# define GUM_MULTI_DIM_PROJECTION_POINTER_NAME projectMinMultiDimArray4Pointers
128# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
129# define GUM_MULTI_DIM_PROJECTION(x, y) \
130 if (*(x) > *(y)) *(x) = *(y)
131# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
133# undef GUM_MULTI_DIM_PROJECTION_POINTER_NAME
134# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
135# undef GUM_MULTI_DIM_PROJECTION
136# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
138# define GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME projectMinMultiDimArray4Pointers
139# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
140# define GUM_MULTI_DIM_PROJECTION(x, y) \
141 if (*(x) > *(y)) *(x) = *(y)
142# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
144# undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
145# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
146# undef GUM_MULTI_DIM_PROJECTION
147# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
151# define GUM_MULTI_DIM_PROJECTION_NAME projectSumMultiDimArray
152# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
153# define GUM_MULTI_DIM_PROJECTION(x, y) x += y
154# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
156# undef GUM_MULTI_DIM_PROJECTION_NAME
157# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
158# undef GUM_MULTI_DIM_PROJECTION
159# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
161# define GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME projectSumMultiDimArray
162# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
163# define GUM_MULTI_DIM_PROJECTION(x, y) x += y
164# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
166# undef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME
167# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
168# undef GUM_MULTI_DIM_PROJECTION
169# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
171# define GUM_MULTI_DIM_PROJECTION_POINTER_NAME projectSumMultiDimArray4Pointers
172# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
173# define GUM_MULTI_DIM_PROJECTION(x, y) *(x) += *(y)
174# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
176# undef GUM_MULTI_DIM_PROJECTION_POINTER_NAME
177# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
178# undef GUM_MULTI_DIM_PROJECTION
179# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
181# define GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME projectSumMultiDimArray4Pointers
182# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
183# define GUM_MULTI_DIM_PROJECTION(x, y) *(x) += *(y)
184# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
186# undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
187# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
188# undef GUM_MULTI_DIM_PROJECTION
189# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
193# define GUM_MULTI_DIM_PROJECTION_NAME projectProductMultiDimArray
194# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
195# define GUM_MULTI_DIM_PROJECTION(x, y) (x) *= (y)
196# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
198# undef GUM_MULTI_DIM_PROJECTION_NAME
199# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
200# undef GUM_MULTI_DIM_PROJECTION
201# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
203# define GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME projectProductMultiDimArray
204# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
205# define GUM_MULTI_DIM_PROJECTION(x, y) (x) *= (y)
206# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
208# undef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME
209# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
210# undef GUM_MULTI_DIM_PROJECTION
211# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
213# define GUM_MULTI_DIM_PROJECTION_POINTER_NAME projectProductMultiDimArray4Pointers
214# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
215# define GUM_MULTI_DIM_PROJECTION(x, y) (*x) *= (*y)
216# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
218# undef GUM_MULTI_DIM_PROJECTION_POINTER_NAME
219# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
220# undef GUM_MULTI_DIM_PROJECTION
221# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
223# define GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME projectProductMultiDimArray4Pointers
224# define GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
225# define GUM_MULTI_DIM_PROJECTION(x, y) (*x) *= (*y)
226# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
228# undef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME
229# undef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE
230# undef GUM_MULTI_DIM_PROJECTION
231# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
235# define GUM_MULTI_DIM_PROJECTION_OPERATOR Maximizes
236# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (-1 * std::numeric_limits< GUM_SCALAR >::max())
238# define GUM_MULTI_DIM_PROJECTION_NAME projectMaxMultiDimFunctionGraph
240# undef GUM_MULTI_DIM_PROJECTION_NAME
242# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectMaxMultiDimFunctionGraph
244# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
246# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
247# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
251# define GUM_MULTI_DIM_PROJECTION_OPERATOR Minimizes
252# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
254# define GUM_MULTI_DIM_PROJECTION_NAME projectMinMultiDimFunctionGraph
256# undef GUM_MULTI_DIM_PROJECTION_NAME
258# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectMinMultiDimFunctionGraph
260# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
262# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
263# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
267# define GUM_MULTI_DIM_PROJECTION_OPERATOR std::plus
268# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
270# define GUM_MULTI_DIM_PROJECTION_NAME projectSumMultiDimFunctionGraph
272# undef GUM_MULTI_DIM_PROJECTION_NAME
274# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectSumMultiDimFunctionGraph
276# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
278# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
279# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
283# define GUM_MULTI_DIM_PROJECTION_OPERATOR std::multiplies
284# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
286# define GUM_MULTI_DIM_PROJECTION_NAME projectProductMultiDimFunctionGraph
288# undef GUM_MULTI_DIM_PROJECTION_NAME
290# define GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME projectProductMultiDimFunctionGraph
292# undef GUM_MULTI_DIM_PROJECTION_IMPL2DECISION_GRAPH_NAME
294# undef GUM_MULTI_DIM_PROJECTION_OPERATOR
295# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
312# define GUM_MULTI_DIM_PROJECTION_NAME projectMax
313# define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "max"
314# define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
316# undef GUM_MULTI_DIM_PROJECTION_NAME
317# undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
318# undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
321# define GUM_MULTI_DIM_PROJECTION_NAME projectMin
322# define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "min"
323# define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
325# undef GUM_MULTI_DIM_PROJECTION_NAME
326# undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
327# undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
330# define GUM_MULTI_DIM_PROJECTION_NAME projectSum
331# define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "sum"
332# define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
334# undef GUM_MULTI_DIM_PROJECTION_NAME
335# undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
336# undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
339# define GUM_MULTI_DIM_PROJECTION_NAME projectProduct
340# define GUM_MULTI_DIM_PROJECTION_FUNC_NAME "product"
341# define GUM_MULTI_DIM_SYMMETRIC_PROJECTION
343# undef GUM_MULTI_DIM_PROJECTION_NAME
344# undef GUM_MULTI_DIM_PROJECTION_FUNC_NAME
345# undef GUM_MULTI_DIM_SYMMETRIC_PROJECTION
349# define GUM_MULTI_DIM_PROJECTION_NAME projectMaxMultiDimImplementation
350# define GUM_MULTI_DIM_PROJECTION(x, y) ((x) > (y) ? (x) : (y))
351# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::min()
353# undef GUM_MULTI_DIM_PROJECTION_NAME
354# undef GUM_MULTI_DIM_PROJECTION
355# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
357# define GUM_MULTI_DIM_PROJECTION_NAME projectMinMultiDimImplementation
358# define GUM_MULTI_DIM_PROJECTION(x, y) ((x) > (y) ? (y) : (x))
359# define GUM_MULTI_DIM_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
361# undef GUM_MULTI_DIM_PROJECTION_NAME
362# undef GUM_MULTI_DIM_PROJECTION
363# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
365# define GUM_MULTI_DIM_PROJECTION_NAME projectSumMultiDimImplementation
366# define GUM_MULTI_DIM_PROJECTION(x, y) ((x) + (y))
367# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)0
369# undef GUM_MULTI_DIM_PROJECTION_NAME
370# undef GUM_MULTI_DIM_PROJECTION
371# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
373# define GUM_MULTI_DIM_PROJECTION_NAME projectProductMultiDimImplementation
374# define GUM_MULTI_DIM_PROJECTION(x, y) ((x) * (y))
375# define GUM_MULTI_DIM_PROJECTION_NEUTRAL (GUM_SCALAR)1
377# undef GUM_MULTI_DIM_PROJECTION_NAME
378# undef GUM_MULTI_DIM_PROJECTION
379# undef GUM_MULTI_DIM_PROJECTION_NEUTRAL
387 template <
typename GUM_SCALAR >
390 static std::once_flag first;
391 std::call_once(first, []() {
392 std::string MultiDimArrayString(
"MultiDimArray");
393 std::string MultiDimFunctionGraphString(
"MultiDimFunctionGraph");
394 std::string BaseNameString(
"MultiDimImplementation");
406 MultiDimFunctionGraphString,
409 MultiDimFunctionGraphString,
412 MultiDimFunctionGraphString,
415 MultiDimFunctionGraphString,
424 &projectProductMultiDimImplementation);
429 template <
typename GUM_SCALAR >
432 static std::once_flag first;
433 std::call_once(first, []() {
434 std::string MultiDimArrayString(
"MultiDimArray");
435 std::string BaseNameString(
"MultiDimImplementation");
456# undef GUM_PROJECTION_PATTERN_ALLOWED
This files contains several function objects that are not (yet) defined in the STL.
GUM_SCALAR projectProductMultiDimArray(const MultiDimArray< GUM_SCALAR > *table, Instantiation *instantiation=0)
a function for projecting a multiDimArray using a Product operator
GUM_SCALAR projectSumMultiDimArray(const MultiDimArray< GUM_SCALAR > *table, Instantiation *instantiation=0)
a specialized function for projecting a multiDimArray using a Sum operator
GUM_SCALAR * projectMaxMultiDimArray4Pointers(const MultiDimArray< GUM_SCALAR * > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Max operator.
GUM_SCALAR projectMinMultiDimArray(const MultiDimArray< GUM_SCALAR > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Min operator.
GUM_SCALAR * projectProductMultiDimArray4Pointers(const MultiDimArray< GUM_SCALAR * > *table, Instantiation *instantiation=0)
a function for projecting a multiDimArray using a Product operator
GUM_SCALAR projectMaxMultiDimArray(const MultiDimArray< GUM_SCALAR > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Max operator.
GUM_SCALAR * projectSumMultiDimArray4Pointers(const MultiDimArray< GUM_SCALAR * > *table, Instantiation *instantiation=0)
a specialized function for projecting a multiDimArray using a Sum operator
GUM_SCALAR * projectMinMultiDimArray4Pointers(const MultiDimArray< GUM_SCALAR * > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Min operator.
gum is the global namespace for all aGrUM entities
MultiDimFunctionGraph< GUM_SCALAR > * projectMinMultiDimFunctionGraph(const MultiDimFunctionGraph< GUM_SCALAR > *table, const gum::VariableSet &del_vars)
a specialized function for projecting a multiDimFunctionGraph using a Min operator
MultiDimFunctionGraph< GUM_SCALAR > * projectProductMultiDimFunctionGraph(const MultiDimFunctionGraph< GUM_SCALAR > *table, const gum::VariableSet &del_vars)
a specialized function for projecting a multiDimFunctionGraph using products
void registerProjection(const std::string &projection_name, const std::string &type_multidim, typename ProjectionRegister4MultiDim< GUM_SCALAR >::ProjectionPtr function)
A function to more easily register new projection functions in MultiDims.
MultiDimFunctionGraph< GUM_SCALAR > * projectMaxMultiDimFunctionGraph(const MultiDimFunctionGraph< GUM_SCALAR > *table, const gum::VariableSet &del_vars)
a specialized function for projecting a multiDimFunctionGraph using a Max operator
MultiDimFunctionGraph< GUM_SCALAR > * projectSumMultiDimFunctionGraph(const MultiDimFunctionGraph< GUM_SCALAR > *table, const gum::VariableSet &del_vars)
a specialized function for projecting a multiDimFunctionGraph using a summation
void pointerProjections4MultiDimInit()
the function used to register all the projections on multidimImplementations over pointers types.
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.