aGrUM  0.14.2
completeProjections4MultiDim_tpl.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2005 by Pierre-Henri WUILLEMIN et Christophe GONZALES *
3  * {prenom.nom}_at_lip6.fr *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public License *
16  * along with this program; if not, write to the *
17  * Free Software Foundation, Inc., *
18  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19  ***************************************************************************/
28 #ifndef DOXYGEN_SHOULD_SKIP_THIS
29 
30 // allow projectionPatterns to be used
31 # define GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED 1
32 
34 
35 // a specialized max projection function for multiDimArrays
36 
37 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimArray
38 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
39  if (y > x) x = y
40 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
41  std::numeric_limits< GUM_SCALAR >::min()
43 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
44 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
45 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
46 
47 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMaxMultiDimArray
48 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
49  if (y > x) x = y
50 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
51  std::numeric_limits< GUM_SCALAR >::min()
53 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
54 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
55 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
56 
57 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME \
58  projectMaxMultiDimArray4Pointers
59 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
60  if (*(y) > *(x)) *(x) = *(y)
61 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
62  std::numeric_limits< GUM_SCALAR >::min()
64 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
65 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
66 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
67 
68 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME \
69  projectMaxMultiDimArray4Pointers
70 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
71  if (*(y) > *(x)) *(x) = *(y)
72 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
73  std::numeric_limits< GUM_SCALAR >::min()
75 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
76 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
77 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
78 
79 // a specialized min projection function for multiDimArrays
80 
81 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimArray
82 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
83  if (x > y) x = y
84 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
85  std::numeric_limits< GUM_SCALAR >::max()
87 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
88 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
89 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
90 
91 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMinMultiDimArray
92 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
93  if (x > y) x = y
94 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
95  std::numeric_limits< GUM_SCALAR >::max()
97 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
98 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
99 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
100 
101 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME \
102  projectMinMultiDimArray4Pointers
103 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
104  if (*(x) > *(y)) *(x) = *(y)
105 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
106  std::numeric_limits< GUM_SCALAR >::max()
108 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
109 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
110 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
111 
112 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME \
113  projectMinMultiDimArray4Pointers
114 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
115  if (*(x) > *(y)) *(x) = *(y)
116 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
117  std::numeric_limits< GUM_SCALAR >::max()
119 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
120 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
121 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
122 
123 // a specialized sum projection function for multiDimArrays
124 
125 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimArray
126 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
127 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
129 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
130 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
131 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
132 
133 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectSumMultiDimArray
134 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
135 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
137 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
138 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
139 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
140 
141 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME \
142  projectSumMultiDimArray4Pointers
143 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
144 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
146 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
147 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
148 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
149 
150 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME \
151  projectSumMultiDimArray4Pointers
152 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
153 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
155 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
156 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
157 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
158 
159 // a specialized product projection function for multiDimArrays
160 
161 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProductMultiDimArray
162 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (x) *= (y)
163 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
165 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
166 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
167 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
168 
169 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME \
170  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_IMPL2ARRAY_NAME
175 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
176 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
177 
178 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME \
179  projectProductMultiDimArray4Pointers
180 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
181 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
183 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
184 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
185 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
186 
187 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME \
188  projectProductMultiDimArray4Pointers
189 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
190 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
192 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
193 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
194 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
195 
196 // the operators that should be used to select appropriately the functions
197 // to project multiDims
198 
199 // the function to be used to project a MultiDimImplementation using a Max
200 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMax
201 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "max"
203 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
204 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
205 
206 // the function to be used to project a MultiDimImplementation using a Min
207 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMin
208 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "min"
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 Sum
214 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSum
215 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "sum"
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 Product
221 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProduct
222 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "product"
224 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
225 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
226 
227 // default "basename" functions for projecting MultiDimImplementations
228 
229 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimImplementation
230 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
231  if (y > x) x = y
232 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
233  std::numeric_limits< GUM_SCALAR >::min()
235 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
236 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
237 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
238 
239 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimImplementation
240 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
241  if (x > y) x = y
242 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
243  std::numeric_limits< GUM_SCALAR >::max()
245 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
246 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
247 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
248 
249 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimImplementation
250 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
251 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
253 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
254 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
255 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
256 
257 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME \
258  projectProductMultiDimImplementation
259 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x *= y
260 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
262 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
263 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
264 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
265 
266 //
267 // DO NOT FORGET TO REGISTER YOUR BINARY FUNCTIONS
268 //
269 
270 namespace gum {
271 
272  // the function used to register all the above functions
273  template < typename GUM_SCALAR >
275  static bool first_init = true;
276 
277  if (first_init) {
278  first_init = false;
279 
280  std::string MultiDimArrayString("MultiDimArray");
281  std::string BaseNameString("MultiDimImplementation");
282 
283  // register base functions for multiDimArrays
284  registerCompleteProjection< GUM_SCALAR >(
285  "max", MultiDimArrayString, &projectMaxMultiDimArray);
286  registerCompleteProjection< GUM_SCALAR >(
287  "min", MultiDimArrayString, &projectMinMultiDimArray);
288  registerCompleteProjection< GUM_SCALAR >(
289  "sum", MultiDimArrayString, &projectSumMultiDimArray);
290  registerCompleteProjection< GUM_SCALAR >(
291  "product", MultiDimArrayString, &projectProductMultiDimArray);
292 
293  // register default basename functions
294  registerCompleteProjection< GUM_SCALAR >(
295  "max", BaseNameString, &projectMaxMultiDimImplementation);
296  registerCompleteProjection< GUM_SCALAR >(
297  "min", BaseNameString, &projectMinMultiDimImplementation);
298  registerCompleteProjection< GUM_SCALAR >(
299  "sum", BaseNameString, &projectSumMultiDimImplementation);
300  registerCompleteProjection< GUM_SCALAR >(
301  "product", BaseNameString, &projectProductMultiDimImplementation);
302  }
303  }
304 
305  // the function used to register all the above functions
306  template < typename GUM_SCALAR >
308  static bool first_init = true;
309 
310  if (first_init) {
311  first_init = false;
312 
313  std::string MultiDimArrayString("MultiDimArray");
314  std::string BaseNameString("MultiDimImplementation");
315 
316  // register base functions for multiDimArrays
317  registerCompleteProjection< GUM_SCALAR* >(
318  "max", MultiDimArrayString, &projectMaxMultiDimArray4Pointers);
319  registerCompleteProjection< GUM_SCALAR* >(
320  "min", MultiDimArrayString, &projectMinMultiDimArray4Pointers);
321  registerCompleteProjection< GUM_SCALAR* >(
322  "sum", MultiDimArrayString, &projectSumMultiDimArray4Pointers);
323  registerCompleteProjection< GUM_SCALAR* >(
324  "product", MultiDimArrayString, &projectProductMultiDimArray4Pointers);
325  }
326  }
327 
328 } /* namespace gum */
329 
330 // remove permission to use operatorsPatterns
331 # undef GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED
332 
333 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
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:25
GUM_SCALAR projectMinMultiDimArray(const MultiDimArray< GUM_SCALAR > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Min operator.
GUM_SCALAR projectMaxMultiDimArray(const MultiDimArray< GUM_SCALAR > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Max operator.
the pattern used by all the projections of multidim tables over all their variables ...
GUM_SCALAR * projectMaxMultiDimArray4Pointers(const MultiDimArray< GUM_SCALAR * > *table, Instantiation *instantiation=0)
A specialized function for projecting a multiDimArray using a Max operator.
void completeProjections4MultiDimInit()
the function used to register all the complete projection operators on multidimImplementations over n...
A container for registering complete projection functions on multiDimImplementations, i.e., projections over all variables.
the pattern used by all the MultiDimImplementation projections
GUM_SCALAR projectProductMultiDimArray(const MultiDimArray< GUM_SCALAR > *table, Instantiation *instantiation=0)
a function for projecting a multiDimArray using a Product operatorThe function projects a table over ...
void pointerCompleteProjections4MultiDimInit()
The function used to register all the complete projections on multidimImplementations over pointers t...
GUM_SCALAR projectSumMultiDimArray(const MultiDimArray< GUM_SCALAR > *table, Instantiation *instantiation=0)
a specialized function for projecting a multiDimArray using a Sum operatorThe function projects a tab...
the pattern used by all the "basename" projections of multidim tables over all their variables ...
GUM_SCALAR * projectProductMultiDimArray4Pointers(const MultiDimArray< GUM_SCALAR * > *table, Instantiation *instantiation=0)
a function for projecting a multiDimArray using a Product operatorThe function projects a table over ...
GUM_SCALAR * projectSumMultiDimArray4Pointers(const MultiDimArray< GUM_SCALAR * > *table, Instantiation *instantiation=0)
a specialized function for projecting a multiDimArray using a Sum operatorThe function projects a tab...