aGrUM 3.1.1
a C++ library for (probabilistic) graphical models
completeProjections4MultiDim_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
51
53#ifndef DOXYGEN_SHOULD_SKIP_THIS
54
55// allow projectionPatterns to be used
56# define GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED 1
57
59
60// a specialized max projection function for multiDimArrays
61
62# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimArray
63# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
64 if (y > x) x = y
65# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::lowest()
67# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
68# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
69# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
70
71# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMaxMultiDimArray
72# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
73 if (y > x) x = y
74# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::lowest()
76# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
77# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
78# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
79
80# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectMaxMultiDimArray4Pointers
81# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
82 if (*(y) > *(x)) *(x) = *(y)
83# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::lowest()
85# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
86# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
87# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
88
89# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectMaxMultiDimArray4Pointers
90# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
91 if (*(y) > *(x)) *(x) = *(y)
92# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::lowest()
94# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
95# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
96# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
97
98// a specialized min projection function for multiDimArrays
99
100# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimArray
101# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
102 if (x > y) x = y
103# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
105# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
106# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
107# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
108
109# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMinMultiDimArray
110# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
111 if (x > y) x = y
112# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
114# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
115# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
116# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
117
118# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectMinMultiDimArray4Pointers
119# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
120 if (*(x) > *(y)) *(x) = *(y)
121# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
123# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
124# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
125# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
126
127# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectMinMultiDimArray4Pointers
128# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
129 if (*(x) > *(y)) *(x) = *(y)
130# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
132# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
133# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
134# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
135
136// a specialized sum projection function for multiDimArrays
137
138# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimArray
139# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
140# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)0
142# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
143# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
144# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
145
146# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectSumMultiDimArray
147# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
148# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)0
150# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
151# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
152# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
153
154# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectSumMultiDimArray4Pointers
155# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
156# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)0
158# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
159# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
160# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
161
162# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectSumMultiDimArray4Pointers
163# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
164# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)0
166# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
167# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
168# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
169
170// a specialized product projection function for multiDimArrays
171
172# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProductMultiDimArray
173# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (x) *= (y)
174# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)1
176# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
177# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
178# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
179
180# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectProductMultiDimArray
181# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (x) *= (y)
182# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)1
184# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
185# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
186# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
187
188# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectProductMultiDimArray4Pointers
189# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
190# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)1
192# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
193# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
194# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
195
196# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME \
197 projectProductMultiDimArray4Pointers
198# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
199# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)1
201# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
202# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
203# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
204
205// the operators that should be used to select appropriately the functions
206// to project multiDims
207
208// the function to be used to project a MultiDimImplementation using a Max
209# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMax
210# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "max"
212# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
213# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
214
215// the function to be used to project a MultiDimImplementation using a Min
216# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMin
217# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "min"
219# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
220# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
221
222// the function to be used to project a MultiDimImplementation using a Sum
223# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSum
224# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "sum"
226# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
227# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
228
229// the function to be used to project a MultiDimImplementation using a Product
230# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProduct
231# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "product"
233# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
234# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
235
236// default "basename" functions for projecting MultiDimImplementations
237
238# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimImplementation
239# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
240 if (y > x) x = y
241# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::lowest()
243# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
244# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
245# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
246
247# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimImplementation
248# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
249 if (x > y) x = y
250# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_ELEMENT >::max()
252# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
253# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
254# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
255
256# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimImplementation
257# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
258# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)0
260# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
261# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
262# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
263
264# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProductMultiDimImplementation
265# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x *= y
266# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_ELEMENT)1
268# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
269# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
270# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
271
272//
273// DO NOT FORGET TO REGISTER YOUR BINARY FUNCTIONS
274//
275
276namespace gum {
277
278 // the function used to register all the above functions
279 template < typename GUM_ELEMENT >
281 // ensure that only one thread will register the projections
282 static std::once_flag first;
283 std::call_once(first, []() {
284 std::string MultiDimArrayString("MultiDimArray");
285 std::string BaseNameString("MultiDimImplementation");
286
287 // register base functions for multiDimArrays
289 MultiDimArrayString,
292 MultiDimArrayString,
295 MultiDimArrayString,
298 MultiDimArrayString,
300
301 // register default basename functions
303 BaseNameString,
304 &projectMaxMultiDimImplementation);
306 BaseNameString,
307 &projectMinMultiDimImplementation);
309 BaseNameString,
310 &projectSumMultiDimImplementation);
312 BaseNameString,
313 &projectProductMultiDimImplementation);
314 });
315 }
316
317 // the function used to register all the above functions
318 template < typename GUM_ELEMENT >
320 // ensure that only one thread will register the projections
321 static std::once_flag first;
322 std::call_once(first, []() {
323 std::string MultiDimArrayString("MultiDimArray");
324 std::string BaseNameString("MultiDimImplementation");
325
326 // register base functions for multiDimArrays
328 MultiDimArrayString,
331 MultiDimArrayString,
334 MultiDimArrayString,
337 MultiDimArrayString,
339 });
340 }
341
342 template < typename GUM_ELEMENT >
345 }
346
347 template < typename GUM_ELEMENT >
350 }
351
352} /* namespace gum */
353
354// remove permission to use operatorsPatterns
355# undef GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED
356
357#endif /* DOXYGEN_SHOULD_SKIP_THIS */
the pattern used by all the "basename" projections of multidim tables over all their variables
the pattern used by all the projections of multidim tables over all their variables
the pattern used by all the MultiDimImplementation projections
A container for registering complete projection functions on multiDimImplementations,...
Efficient functionals for projecting multidim tables over all their variables.
GUM_ELEMENT projectMaxMultiDimArray(const MultiDimArray< GUM_ELEMENT > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Max operator.
void registerCompleteProjection(std::string_view projection_name, std::string_view type_multidim, typename CompleteProjectionRegister4MultiDim< GUM_ELEMENT >::CompleteProjectionPtr function)
A function to more easily register new projection functions in MultiDims.
void pointerCompleteProjections4MultiDimInit()
The function used to register all the complete projections on multidimImplementations over pointers t...
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.
void completeProjections4MultiDimInit()
the function used to register all the complete projection operators on multidimImplementations over n...
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