aGrUM 2.3.2
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-2025 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-2025 *
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#pragma once
41
42
50
51#ifndef DOXYGEN_SHOULD_SKIP_THIS
52
53// allow projectionPatterns to be used
54# define GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED 1
55
57
58// a specialized max projection function for multiDimArrays
59
60# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimArray
61# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
62 if (y > x) x = y
63# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::lowest()
65# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
66# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
67# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
68
69# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMaxMultiDimArray
70# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
71 if (y > x) x = y
72# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::lowest()
74# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
75# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
76# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
77
78# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectMaxMultiDimArray4Pointers
79# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
80 if (*(y) > *(x)) *(x) = *(y)
81# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::lowest()
83# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
84# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
85# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
86
87# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectMaxMultiDimArray4Pointers
88# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
89 if (*(y) > *(x)) *(x) = *(y)
90# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::lowest()
92# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
93# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
94# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
95
96// a specialized min projection function for multiDimArrays
97
98# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimArray
99# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
100 if (x > y) x = y
101# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
103# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
104# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
105# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
106
107# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMinMultiDimArray
108# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
109 if (x > y) x = y
110# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
112# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
113# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
114# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
115
116# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectMinMultiDimArray4Pointers
117# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
118 if (*(x) > *(y)) *(x) = *(y)
119# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
121# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
122# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
123# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
124
125# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectMinMultiDimArray4Pointers
126# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
127 if (*(x) > *(y)) *(x) = *(y)
128# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
130# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
131# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
132# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
133
134// a specialized sum projection function for multiDimArrays
135
136# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimArray
137# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
138# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
140# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
141# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
142# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
143
144# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectSumMultiDimArray
145# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
146# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
148# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
149# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
150# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
151
152# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectSumMultiDimArray4Pointers
153# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
154# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
156# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
157# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
158# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
159
160# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME projectSumMultiDimArray4Pointers
161# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
162# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
164# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
165# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
166# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
167
168// a specialized product projection function for multiDimArrays
169
170# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProductMultiDimArray
171# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (x) *= (y)
172# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
174# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
175# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
176# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
177
178# define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectProductMultiDimArray
179# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (x) *= (y)
180# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
182# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
183# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
184# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
185
186# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME projectProductMultiDimArray4Pointers
187# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
188# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
190# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
191# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
192# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
193
194# define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME \
195 projectProductMultiDimArray4Pointers
196# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
197# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
199# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
200# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
201# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
202
203// the operators that should be used to select appropriately the functions
204// to project multiDims
205
206// the function to be used to project a MultiDimImplementation using a Max
207# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMax
208# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "max"
210# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
211# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
212
213// the function to be used to project a MultiDimImplementation using a Min
214# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMin
215# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "min"
217# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
218# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
219
220// the function to be used to project a MultiDimImplementation using a Sum
221# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSum
222# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "sum"
224# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
225# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
226
227// the function to be used to project a MultiDimImplementation using a Product
228# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProduct
229# define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "product"
231# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
232# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
233
234// default "basename" functions for projecting MultiDimImplementations
235
236# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimImplementation
237# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
238 if (y > x) x = y
239# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::lowest()
241# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
242# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
243# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
244
245# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimImplementation
246# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
247 if (x > y) x = y
248# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL std::numeric_limits< GUM_SCALAR >::max()
250# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
251# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
252# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
253
254# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimImplementation
255# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
256# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
258# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
259# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
260# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
261
262# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProductMultiDimImplementation
263# define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x *= y
264# define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
266# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
267# undef GUM_MULTI_DIM_COMPLETE_PROJECTION
268# undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
269
270//
271// DO NOT FORGET TO REGISTER YOUR BINARY FUNCTIONS
272//
273
274namespace gum {
275
276 // the function used to register all the above functions
277 template < typename GUM_SCALAR >
279 // ensure that only one thread will register the projections
280 static std::once_flag first;
281 std::call_once(first, []() {
282 std::string MultiDimArrayString("MultiDimArray");
283 std::string BaseNameString("MultiDimImplementation");
284
285 // register base functions for multiDimArrays
287 MultiDimArrayString,
290 MultiDimArrayString,
293 MultiDimArrayString,
296 MultiDimArrayString,
298
299 // register default basename functions
301 BaseNameString,
302 &projectMaxMultiDimImplementation);
304 BaseNameString,
305 &projectMinMultiDimImplementation);
307 BaseNameString,
308 &projectSumMultiDimImplementation);
310 BaseNameString,
311 &projectProductMultiDimImplementation);
312 });
313 }
314
315 // the function used to register all the above functions
316 template < typename GUM_SCALAR >
318 // ensure that only one thread will register the projections
319 static std::once_flag first;
320 std::call_once(first, []() {
321 std::string MultiDimArrayString("MultiDimArray");
322 std::string BaseNameString("MultiDimImplementation");
323
324 // register base functions for multiDimArrays
326 MultiDimArrayString,
329 MultiDimArrayString,
332 MultiDimArrayString,
335 MultiDimArrayString,
337 });
338 }
339
340} /* namespace gum */
341
342// remove permission to use operatorsPatterns
343# undef GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED
344
345#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,...
void pointerCompleteProjections4MultiDimInit()
The function used to register all the complete projections on multidimImplementations over pointers t...
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
void registerCompleteProjection(const std::string &projection_name, const std::string &type_multidim, typename CompleteProjectionRegister4MultiDim< GUM_SCALAR >::CompleteProjectionPtr function)
A function to more easily register new projection functions in MultiDims.
void completeProjections4MultiDimInit()
the function used to register all the complete projection operators on multidimImplementations over n...
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
Definition agrum.h:46