aGrUM  0.14.2
operators4MultiDim_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  ***************************************************************************/
27 #ifndef DOXYGEN_SHOULD_SKIP_THIS
28 
29 // allow operatorsPatterns to be used
30 # define GUM_OPERATOR_PATTERN_ALLOWED 1
31 
33 
34 // ==========================================================================
35 // MultiDimArrays functions
36 // ==========================================================================
37 
38 // a specialized function for summing two multiDimArrays
39 
40 // addition taking in argument 2 multiDimArrays
41 # define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimArrays
42 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y)
44 # undef GUM_MULTI_DIM_OPERATOR_NAME
45 # undef GUM_MULTI_DIM_OPERATOR
46 
47 # define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME add2MultiDimArrays
48 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y)
50 # undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
51 # undef GUM_MULTI_DIM_OPERATOR
52 
53 # define GUM_MULTI_DIM_OPERATOR_POINTER_NAME add2MultiDimArrays4Pointers
54 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) + (*y))
56 # undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
57 # undef GUM_MULTI_DIM_OPERATOR
58 
59 # define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME \
60  add2MultiDimArrays4Pointers
61 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) + (*y))
63 # undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
64 # undef GUM_MULTI_DIM_OPERATOR
65 
66 // a specialized function for subtracting two multiDimArrays
67 
68 # define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimArrays
69 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y)
71 # undef GUM_MULTI_DIM_OPERATOR_NAME
72 # undef GUM_MULTI_DIM_OPERATOR
73 
74 # define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME subtract2MultiDimArrays
75 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y)
77 # undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
78 # undef GUM_MULTI_DIM_OPERATOR
79 
80 # define GUM_MULTI_DIM_OPERATOR_POINTER_NAME subtract2MultiDimArrays4Pointers
81 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) - (*y))
83 # undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
84 # undef GUM_MULTI_DIM_OPERATOR
85 
86 # define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME \
87  subtract2MultiDimArrays4Pointers
88 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) - (*y))
90 # undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
91 # undef GUM_MULTI_DIM_OPERATOR
92 
93 // a specialized function for multiplying two multiDimArrays
94 
95 # define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimArrays
96 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y)
98 # undef GUM_MULTI_DIM_OPERATOR_NAME
99 # undef GUM_MULTI_DIM_OPERATOR
100 
101 # define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME multiply2MultiDimArrays
102 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y)
104 # undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
105 # undef GUM_MULTI_DIM_OPERATOR
106 
107 # define GUM_MULTI_DIM_OPERATOR_POINTER_NAME multiply2MultiDimArrays4Pointers
108 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) * (*y))
110 # undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
111 # undef GUM_MULTI_DIM_OPERATOR
112 
113 # define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME \
114  multiply2MultiDimArrays4Pointers
115 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) * (*y))
117 # undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
118 # undef GUM_MULTI_DIM_OPERATOR
119 
120 // a specialized function for dividing two multiDimArrays
121 
122 # define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimArrays
123 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y)
125 # undef GUM_MULTI_DIM_OPERATOR_NAME
126 # undef GUM_MULTI_DIM_OPERATOR
127 
128 # define GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME divide2MultiDimArrays
129 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y)
131 # undef GUM_MULTI_DIM_OPERATOR_IMPL2ARRAY_NAME
132 # undef GUM_MULTI_DIM_OPERATOR
133 
134 # define GUM_MULTI_DIM_OPERATOR_POINTER_NAME divide2MultiDimArrays4Pointers
135 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) / (*y))
137 # undef GUM_MULTI_DIM_OPERATOR_POINTER_NAME
138 # undef GUM_MULTI_DIM_OPERATOR
139 
140 # define GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME \
141  divide2MultiDimArrays4Pointers
142 # define GUM_MULTI_DIM_OPERATOR(x, y) new T((*x) / (*y))
144 # undef GUM_MULTI_DIM_OPERATOR_POINTER_IMPL2ARRAY_NAME
145 # undef GUM_MULTI_DIM_OPERATOR
146 
147 // ==========================================================================
148 // MultiDimFunctionGraphs functions
149 // ==========================================================================
150 
151 // ///////////////////////////////////////////////////////
152 // a specialized function for summing two multiDimFunctionGraphs
153 // ///////////////////////////////////////////////////////
154 
155 # define GUM_MULTI_DIM_OPERATOR std::plus
156 
157 # define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimFunctionGraphs
159 # undef GUM_MULTI_DIM_OPERATOR_NAME
160 
161 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \
162  add2MultiDimFunctionGraphs
164 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
165 
166 # undef GUM_MULTI_DIM_OPERATOR
167 
168 // ///////////////////////////////////////////////////////
169 // a specialized function for subtracting two multiDimFunctionGraphs
170 // ///////////////////////////////////////////////////////
171 
172 # define GUM_MULTI_DIM_OPERATOR std::minus
173 
174 # define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimFunctionGraphs
176 # undef GUM_MULTI_DIM_OPERATOR_NAME
177 
178 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \
179  subtract2MultiDimFunctionGraphs
181 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
182 
183 # undef GUM_MULTI_DIM_OPERATOR
184 
185 // ///////////////////////////////////////////////////////
186 // a specialized function for multiplying two multiDimFunctionGraphs
187 // ///////////////////////////////////////////////////////
188 
189 # define GUM_MULTI_DIM_OPERATOR std::multiplies
190 
191 # define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimFunctionGraphs
193 # undef GUM_MULTI_DIM_OPERATOR_NAME
194 
195 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \
196  multiply2MultiDimFunctionGraphs
198 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
199 
200 # undef GUM_MULTI_DIM_OPERATOR
201 
202 // ///////////////////////////////////////////////////////
203 // a specialized function for dividing two multiDimFunctionGraphs
204 // ///////////////////////////////////////////////////////
205 
206 # define GUM_MULTI_DIM_OPERATOR std::divides
207 
208 # define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimFunctionGraphs
210 # undef GUM_MULTI_DIM_OPERATOR_NAME
211 
212 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \
213  divide2MultiDimFunctionGraphs
215 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
216 
217 # undef GUM_MULTI_DIM_OPERATOR
218 
219 // ///////////////////////////////////////////////////////
220 // a specialized function for finding max of two multiDimFunctionGraphs
221 // ///////////////////////////////////////////////////////
222 
223 # define GUM_MULTI_DIM_OPERATOR Maximizes
224 
225 # define GUM_MULTI_DIM_OPERATOR_NAME maximize2MultiDimFunctionGraphs
227 # undef GUM_MULTI_DIM_OPERATOR_NAME
228 
229 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \
230  maximize2MultiDimFunctionGraphs
232 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
233 
234 # undef GUM_MULTI_DIM_OPERATOR
235 
236 // ///////////////////////////////////////////////////////
237 // a specialized function for finding min of two multiDimFunctionGraphs
238 // ///////////////////////////////////////////////////////
239 
240 # define GUM_MULTI_DIM_OPERATOR Minimizes
241 
242 # define GUM_MULTI_DIM_OPERATOR_NAME minimize2MultiDimFunctionGraphs
244 # undef GUM_MULTI_DIM_OPERATOR_NAME
245 
246 # define GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME \
247  minimize2MultiDimFunctionGraphs
249 # undef GUM_MULTI_DIM_OPERATOR_IMPL2DECISION_GRAPH_NAME
250 
251 # undef GUM_MULTI_DIM_OPERATOR
252 
253 // a specialized function for functionally combining two multiDimArrays
254 
255 # define GUM_MULTI_DIM_OPERATOR_NAME_F combine2MultiDimArrays
256 # define GUM_MULTI_DIM_OPERATOR(x, y) f((x), (y))
258 # undef GUM_MULTI_DIM_OPERATOR_NAME_F
259 # undef GUM_MULTI_DIM_OPERATOR
260 
261 // the operators that should be used to select appropriately the functions
262 // to combine multiDims
263 
264 // the function to be used to add two MultiDimImplementations
265 # define GUM_MULTI_DIM_OPERATOR_NAME operator+
266 # define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "+"
267 # define GUM_MULTI_DIM_SYMMETRIC_OPERATOR
269 # undef GUM_MULTI_DIM_OPERATOR_NAME
270 # undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
271 # undef GUM_MULTI_DIM_SYMMETRIC_OPERATOR
272 
273 // the function to be used to multiply two MultiDimImplementations
274 # define GUM_MULTI_DIM_OPERATOR_NAME operator*
275 # define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "*"
276 # define GUM_MULTI_DIM_SYMMETRIC_OPERATOR
278 # undef GUM_MULTI_DIM_OPERATOR_NAME
279 # undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
280 # undef GUM_MULTI_DIM_SYMMETRIC_OPERATOR
281 
282 // the function to be used to subtract two MultiDimImplementations
283 # define GUM_MULTI_DIM_OPERATOR_NAME operator-
284 # define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "-"
286 # undef GUM_MULTI_DIM_OPERATOR_NAME
287 # undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
288 
289 // the function to be used to divide two MultiDimImplementations
290 # define GUM_MULTI_DIM_OPERATOR_NAME operator/
291 # define GUM_MULTI_DIM_OPERATOR_FUNC_NAME "/"
293 # undef GUM_MULTI_DIM_OPERATOR_NAME
294 # undef GUM_MULTI_DIM_OPERATOR_FUNC_NAME
295 
296 // default "basename" functions for combining two MultiDimImplementations
297 
298 # define GUM_MULTI_DIM_OPERATOR_NAME add2MultiDimImplementations
299 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) + (y)
301 # undef GUM_MULTI_DIM_OPERATOR_NAME
302 # undef GUM_MULTI_DIM_OPERATOR
303 
304 # define GUM_MULTI_DIM_OPERATOR_NAME subtract2MultiDimImplementations
305 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) - (y)
307 # undef GUM_MULTI_DIM_OPERATOR_NAME
308 # undef GUM_MULTI_DIM_OPERATOR
309 
310 # define GUM_MULTI_DIM_OPERATOR_NAME multiply2MultiDimImplementations
311 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) * (y)
313 # undef GUM_MULTI_DIM_OPERATOR_NAME
314 # undef GUM_MULTI_DIM_OPERATOR
315 
316 # define GUM_MULTI_DIM_OPERATOR_NAME divide2MultiDimImplementations
317 # define GUM_MULTI_DIM_OPERATOR(x, y) (x) / (y)
319 # undef GUM_MULTI_DIM_OPERATOR_NAME
320 # undef GUM_MULTI_DIM_OPERATOR
321 
322 //
323 // DO NOT FORGET TO REGISTER YOUR BINARY FUNCTIONS
324 //
325 
326 namespace gum {
327 
328  // the function used to register all the above functions
329  template < typename GUM_SCALAR >
330  void operators4MultiDimInit() {
331  static bool first_init = true;
332 
333  if (first_init) {
334  first_init = false;
335 
336  std::string MultiDimArrayString("MultiDimArray");
337  std::string MultiDimFunctionGraphString("MultiDimFunctionGraph");
338  std::string BaseNameString("MultiDimImplementation");
339 
340  // register base functions for multiDimArrays
341  registerOperator< GUM_SCALAR >(
342  "+", MultiDimArrayString, MultiDimArrayString, &add2MultiDimArrays);
343  registerOperator< GUM_SCALAR >(
344  "-", MultiDimArrayString, MultiDimArrayString, &subtract2MultiDimArrays);
345  registerOperator< GUM_SCALAR >(
346  "*", MultiDimArrayString, MultiDimArrayString, &multiply2MultiDimArrays);
347  registerOperator< GUM_SCALAR >(
348  "/", MultiDimArrayString, MultiDimArrayString, &divide2MultiDimArrays);
349 
350  // register base functions for multiDimFunctionGraphs
351  registerOperator< GUM_SCALAR >("+",
352  MultiDimFunctionGraphString,
353  MultiDimFunctionGraphString,
355  registerOperator< GUM_SCALAR >("-",
356  MultiDimFunctionGraphString,
357  MultiDimFunctionGraphString,
359  registerOperator< GUM_SCALAR >("*",
360  MultiDimFunctionGraphString,
361  MultiDimFunctionGraphString,
363  registerOperator< GUM_SCALAR >("/",
364  MultiDimFunctionGraphString,
365  MultiDimFunctionGraphString,
367 
368  // register default basename functions
369  registerOperator< GUM_SCALAR >(
370  "+", BaseNameString, BaseNameString, &add2MultiDimImplementations);
371  registerOperator< GUM_SCALAR >(
372  "-", BaseNameString, BaseNameString, &subtract2MultiDimImplementations);
373  registerOperator< GUM_SCALAR >(
374  "*", BaseNameString, BaseNameString, &multiply2MultiDimImplementations);
375  registerOperator< GUM_SCALAR >(
376  "/", BaseNameString, BaseNameString, &divide2MultiDimImplementations);
377  }
378  }
379 
380  // the function used to register all the above functions
381  template < typename GUM_SCALAR >
383  static bool first_init = true;
384 
385  if (first_init) {
386  first_init = false;
387 
388  std::string MultiDimArrayString("MultiDimArray");
389  std::string BaseNameString("MultiDimImplementation");
390 
391  // register base functions for multiDimArrays
392  registerOperator< GUM_SCALAR* >("+",
393  MultiDimArrayString,
394  MultiDimArrayString,
396  registerOperator< GUM_SCALAR* >("-",
397  MultiDimArrayString,
398  MultiDimArrayString,
400  registerOperator< GUM_SCALAR* >("*",
401  MultiDimArrayString,
402  MultiDimArrayString,
404  registerOperator< GUM_SCALAR* >("/",
405  MultiDimArrayString,
406  MultiDimArrayString,
408  }
409  }
410 
411 } /* namespace gum */
412 
413 // remove permission to use operatorsPatterns
414 # undef GUM_OPERATOR_PATTERN_ALLOWED
415 
416 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
MultiDimArray< T > * multiply2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for multiplying two multiDimArraysThe function produces a tensorial product of...
A container for registering binary functions on multiDimImplementations.
void operators4MultiDimInit()
the function used to register all the operators on multidimImplementations over non-pointers types...
MultiDimArray< T *> * divide2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for dividing two multiDimArraysThe function produces a tensorial division of t...
the pattern used by all binary MultiDimImplementations operators
MultiDimArray< T *> * add2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for summing two multiDimArraysThe function produces a tensorial addition of t1...
MultiDimFunctionGraph< T > * subtract2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for subtracting two multiDimArraysThe function produces a tensorial subtractio...
gum is the global namespace for all aGrUM entities
Definition: agrum.h:25
the pattern used by all binary MultiDimFunctionGraphs operators
MultiDimArray< T *> * subtract2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for subtracting two multiDimArraysThe function produces a tensorial subtractio...
MultiDimArray< T *> * multiply2MultiDimArrays4Pointers(const MultiDimArray< T * > *t1, const MultiDimArray< T * > *t2)
a specialized function for multiplying two multiDimArraysThe function produces a tensorial product of...
void pointerOperators4MultiDimInit()
the function used to register all the operators on multidimImplementations over pointers types...
MultiDimFunctionGraph< T > * multiply2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for multiplying two multiDimArraysThe function produces a tensorial product of...
MultiDimArray< T > * add2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for summing two multiDimArraysThe function produces a tensorial addition of t1...
MultiDimArray< T > * subtract2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for subtracting two multiDimArraysThe function produces a tensorial subtractio...
MultiDimFunctionGraph< T > * add2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for summing two multiDimArraysThe function produces a tensorial addition of t1...
MultiDimFunctionGraph< T > * divide2MultiDimFunctionGraphs(const MultiDimFunctionGraph< T > *t1, const MultiDimFunctionGraph< T > *t2)
a specialized function for dividing two multiDimArraysThe function produces a tensorial division of t...
MultiDimArray< T > * divide2MultiDimArrays(const MultiDimArray< T > *t1, const MultiDimArray< T > *t2)
a specialized function for dividing two multiDimArraysThe function produces a tensorial division of t...
the pattern used by all binary MultiDimArrays operators
the pattern used by all "basename" binary operators