aGrUM  0.16.0
completeProjections4MultiDim_tpl.h
Go to the documentation of this file.
1 
31 #ifndef DOXYGEN_SHOULD_SKIP_THIS
32 
33 // allow projectionPatterns to be used
34 # define GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED 1
35 
37 
38 // a specialized max projection function for multiDimArrays
39 
40 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimArray
41 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
42  if (y > x) x = y
43 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
44  std::numeric_limits< GUM_SCALAR >::min()
46 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
47 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
48 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
49 
50 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMaxMultiDimArray
51 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
52  if (y > x) x = y
53 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
54  std::numeric_limits< GUM_SCALAR >::min()
56 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
57 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
58 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
59 
60 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME \
61  projectMaxMultiDimArray4Pointers
62 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
63  if (*(y) > *(x)) *(x) = *(y)
64 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
65  std::numeric_limits< GUM_SCALAR >::min()
67 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
68 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
69 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
70 
71 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME \
72  projectMaxMultiDimArray4Pointers
73 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
74  if (*(y) > *(x)) *(x) = *(y)
75 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
76  std::numeric_limits< GUM_SCALAR >::min()
78 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
79 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
80 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
81 
82 // a specialized min projection function for multiDimArrays
83 
84 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimArray
85 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
86  if (x > y) x = y
87 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
88  std::numeric_limits< GUM_SCALAR >::max()
90 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
91 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
92 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
93 
94 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME projectMinMultiDimArray
95 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
96  if (x > y) x = y
97 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
98  std::numeric_limits< GUM_SCALAR >::max()
100 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
101 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
102 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
103 
104 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME \
105  projectMinMultiDimArray4Pointers
106 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
107  if (*(x) > *(y)) *(x) = *(y)
108 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
109  std::numeric_limits< GUM_SCALAR >::max()
111 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
112 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
113 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
114 
115 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME \
116  projectMinMultiDimArray4Pointers
117 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
118  if (*(x) > *(y)) *(x) = *(y)
119 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
120  std::numeric_limits< GUM_SCALAR >::max()
122 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
123 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
124 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
125 
126 // a specialized sum projection function for multiDimArrays
127 
128 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimArray
129 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
130 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
132 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
133 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
134 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
135 
136 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_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_IMPL2ARRAY_NAME
141 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
142 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
143 
144 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME \
145  projectSumMultiDimArray4Pointers
146 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
147 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
149 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
150 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
151 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
152 
153 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME \
154  projectSumMultiDimArray4Pointers
155 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) *(x) += *(y)
156 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
158 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
159 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
160 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
161 
162 // a specialized product projection function for multiDimArrays
163 
164 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProductMultiDimArray
165 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (x) *= (y)
166 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
168 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
169 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
170 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
171 
172 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME \
173  projectProductMultiDimArray
174 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (x) *= (y)
175 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
177 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
178 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
179 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
180 
181 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME \
182  projectProductMultiDimArray4Pointers
183 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
184 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
186 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
187 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
188 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
189 
190 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME \
191  projectProductMultiDimArray4Pointers
192 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) (*x) *= (*y)
193 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
195 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
196 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
197 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
198 
199 // the operators that should be used to select appropriately the functions
200 // to project multiDims
201 
202 // the function to be used to project a MultiDimImplementation using a Max
203 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMax
204 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "max"
206 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
207 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
208 
209 // the function to be used to project a MultiDimImplementation using a Min
210 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMin
211 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "min"
213 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
214 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
215 
216 // the function to be used to project a MultiDimImplementation using a Sum
217 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSum
218 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "sum"
220 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
221 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
222 
223 // the function to be used to project a MultiDimImplementation using a Product
224 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectProduct
225 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME "product"
227 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
228 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_FUNC_NAME
229 
230 // default "basename" functions for projecting MultiDimImplementations
231 
232 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMaxMultiDimImplementation
233 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
234  if (y > x) x = y
235 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
236  std::numeric_limits< GUM_SCALAR >::min()
238 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
239 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
240 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
241 
242 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectMinMultiDimImplementation
243 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) \
244  if (x > y) x = y
245 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL \
246  std::numeric_limits< GUM_SCALAR >::max()
248 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
249 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
250 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
251 
252 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME projectSumMultiDimImplementation
253 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x += y
254 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)0
256 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
257 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
258 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
259 
260 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME \
261  projectProductMultiDimImplementation
262 # define GUM_MULTI_DIM_COMPLETE_PROJECTION(x, y) x *= y
263 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL (GUM_SCALAR)1
265 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
266 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION
267 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL
268 
269 //
270 // DO NOT FORGET TO REGISTER YOUR BINARY FUNCTIONS
271 //
272 
273 namespace gum {
274 
275  // the function used to register all the above functions
276  template < typename GUM_SCALAR >
278  static bool first_init = true;
279 
280  if (first_init) {
281  first_init = false;
282 
283  std::string MultiDimArrayString("MultiDimArray");
284  std::string BaseNameString("MultiDimImplementation");
285 
286  // register base functions for multiDimArrays
287  registerCompleteProjection< GUM_SCALAR >(
288  "max", MultiDimArrayString, &projectMaxMultiDimArray);
289  registerCompleteProjection< GUM_SCALAR >(
290  "min", MultiDimArrayString, &projectMinMultiDimArray);
291  registerCompleteProjection< GUM_SCALAR >(
292  "sum", MultiDimArrayString, &projectSumMultiDimArray);
293  registerCompleteProjection< GUM_SCALAR >(
294  "product", MultiDimArrayString, &projectProductMultiDimArray);
295 
296  // register default basename functions
297  registerCompleteProjection< GUM_SCALAR >(
298  "max", BaseNameString, &projectMaxMultiDimImplementation);
299  registerCompleteProjection< GUM_SCALAR >(
300  "min", BaseNameString, &projectMinMultiDimImplementation);
301  registerCompleteProjection< GUM_SCALAR >(
302  "sum", BaseNameString, &projectSumMultiDimImplementation);
303  registerCompleteProjection< GUM_SCALAR >(
304  "product", BaseNameString, &projectProductMultiDimImplementation);
305  }
306  }
307 
308  // the function used to register all the above functions
309  template < typename GUM_SCALAR >
311  static bool first_init = true;
312 
313  if (first_init) {
314  first_init = false;
315 
316  std::string MultiDimArrayString("MultiDimArray");
317  std::string BaseNameString("MultiDimImplementation");
318 
319  // register base functions for multiDimArrays
320  registerCompleteProjection< GUM_SCALAR* >(
321  "max", MultiDimArrayString, &projectMaxMultiDimArray4Pointers);
322  registerCompleteProjection< GUM_SCALAR* >(
323  "min", MultiDimArrayString, &projectMinMultiDimArray4Pointers);
324  registerCompleteProjection< GUM_SCALAR* >(
325  "sum", MultiDimArrayString, &projectSumMultiDimArray4Pointers);
326  registerCompleteProjection< GUM_SCALAR* >(
327  "product", MultiDimArrayString, &projectProductMultiDimArray4Pointers);
328  }
329  }
330 
331 } /* namespace gum */
332 
333 // remove permission to use operatorsPatterns
334 # undef GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED
335 
336 #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.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
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.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
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...
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
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...
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
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...