Jpp test-rotations-new
the software that should make you happy
Loading...
Searching...
No Matches
JMultiFunction.hh
Go to the documentation of this file.
1#ifndef __JTOOLS__JMULTIFUNCTION__
2#define __JTOOLS__JMULTIFUNCTION__
3
4#include "JTools/JMultiMap.hh"
7#include "JTools/JArray.hh"
11
12
13/**
14 * \author mdejong
15 */
16
17namespace JTOOLS {}
18namespace JPP { using namespace JTOOLS; }
19
20namespace JTOOLS {
21
22 /**
23 * Multidimensional interpolation method.
24 *
25 * The template parameters respectively refer to:
26 * -# function object used for the lowest dimension(s);
27 * -# list of functional maps used for the higher dimension(s); and
28 * -# distance operator.
29 *
30 * The number of dimensions of this function object is equal to the length of
31 * the given map list plus the extra dimensions of the first function object.
32 * When converting a multidimensional histogram to a multidimensional function for
33 * subsequent interpolations, the function object used for the lowest dimension(s)
34 * is treated as a probability density function.
35 */
36 template<class JFunction_t,
37 class JMaplist_t,
40 public JMultiMap<typename JFunction_t::argument_type, JFunction_t, JMaplist_t, JDistance_t>
41 {
42 public:
43
44 typedef JMultiMap<typename JFunction_t::argument_type,
45 JFunction_t,
46 JMaplist_t,
47 JDistance_t> multimap_type;
48
49 enum { NUMBER_OF_DIMENSIONS = JMapLength<JMaplist_t>::value + JFunction_t::NUMBER_OF_DIMENSIONS };
50
51 typedef JFunction_t function_type;
52
53 typedef typename function_type::value_type value_type;
54 typedef typename function_type::argument_type argument_type;
55
56 typedef typename multimap_type::abscissa_type abscissa_type;
57 typedef typename multimap_type::ordinate_type ordinate_type;
58 typedef typename multimap_type::result_type result_type;
59
60 typedef typename multimap_type::const_iterator const_iterator;
61 typedef typename multimap_type::const_reverse_iterator const_reverse_iterator;
62 typedef typename multimap_type::iterator iterator;
63 typedef typename multimap_type::reverse_iterator reverse_iterator;
64
65 typedef typename multimap_type::super_iterator super_iterator;
66 typedef typename multimap_type::super_const_iterator super_const_iterator;
67
69 using multimap_type::insert;
70
71
72 /**
73 * Default constructor.
74 */
77
78
79 /**
80 * Constructor.
81 *
82 * \param input multidimensional input
83 */
84 template<class T>
85 JMultiFunction(const T& input)
86 {
87 insert(input);
88
89 this->compile();
90 }
91
92
93 /**
94 * Get multidimensional function.
95 *
96 * \return this multidimensional function
97 */
99 {
100 return static_cast<const JMultiFunction&>(*this);
101 }
102
103
104 /**
105 * Get multidimensional function.
106 *
107 * \return this multidimensional function
108 */
110 {
111 return static_cast<JMultiFunction&>(*this);
112 }
113
114
115 /**
116 * Insert multidimensional input.
117 *
118 * \param input multidimensional function
119 */
120 template<class __JFunction_t, class __JMaplist_t, class __JDistance_t>
122 {
123 copy(input, *this);
124 }
125
126
127 /**
128 * Insert multidimensional input.
129 *
130 * \param input multidimensional histogram
131 */
132 template<class JHistogram_t, class __JMaplist_t, class __JDistance_t>
137
138
139 /**
140 * Compilation.
141 */
142 void compile()
143 {
144 this->for_each(compiler);
145
146 for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
147 (*i).getValue().compile();
148 }
149 }
150
151
152 /**
153 * Set the supervisor for handling of exceptions.
154 *
155 * \param supervisor supervisor
156 */
157 void setExceptionHandler(const typename function_type::supervisor_type& supervisor)
158 {
159 this->for_each(supervisor);
160
161 for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
162 (*i).getValue().setExceptionHandler(supervisor);
163 }
164 }
165
166
167 /**
168 * Multi-dimensional interpolation method call.
169 *
170 * \param args comma seperated list of abscissa values
171 * \return function value
172 */
173 template<class ...Args>
174 result_type operator()(const Args& ...args) const
175 {
177
178 return this->evaluate(buffer.data());
179 }
180
181
182 protected:
183 /**
184 * Insert multidimensional histogram at multidimensional key.
185 *
186 * \param key multidimensional key
187 * \param input multidimensional histogram
188 */
189 template<unsigned int N,
190 class __JAbscissa_t,
191 class __JContents_t,
192 template<class, class, class> class __JMap_t,
193 class __JDistance_t>
196 {
197 if (input.size() > 1) {
198
199 for (auto j = input.begin(), i = j++; j != input.end(); ++i, ++j) {
200
201 const argument_type x = 0.5 * (i->getX() + j->getX());
202
203 insert(JMultiKey<N+1, argument_type>(key, x), i->getY());
204 }
205 }
206 }
207
208
209 /**
210 * Convert one-dimensional histogram to PDF and insert result at given multidimensional key.
211 *
212 * \param key multidimensional key
213 * \param input histogram
214 */
215 template<class __JElement_t, template<class, class> class __JContainer_t, class __JDistance_t>
218
219 {
220 JFunction_t buffer;
221
222 makePDF(input, buffer);
223
224 multimap_type::insert(key, buffer);
225 }
226
227
228 /**
229 * Convert multidimensional histogram to PDF and insert result at given multidimensional key.
230 *
231 * \param key multidimensional key
232 * \param input multidimensional histogram
233 */
234 template<class JHistogram_t, class __JMaplist_t, class __JDistance_t>
237 {
238 JFunction_t buffer;
239
240 makePDF(input, buffer);
241
242 multimap_type::insert(key, buffer);
243 }
244 };
245
246
247 /**
248 * Template specialisation of JMultiFunction for a JConstantFunction.
249 * The primary 2D function is reduced to a 1D function.
250 */
251 template<class JArgument_t,
252 class JResult_t,
253 template<class, class, class> class JMap_t,
254 class JDistance_t>
255 class JMultiFunction<JConstantFunction1D<JArgument_t, JResult_t>, JMapList<JMap_t>, JDistance_t> :
256 public JMap_t<JArgument_t, JResult_t, JDistance_t>
257 {
258 public:
259
260 typedef JMap_t<JArgument_t, JResult_t, JDistance_t> multimap_type;
261
262 typedef typename multimap_type::abscissa_type abscissa_type;
263 typedef typename multimap_type::ordinate_type ordinate_type;
264
265 typedef typename multimap_type::argument_type argument_type;
266 typedef typename multimap_type::result_type result_type;
267
268 typedef typename multimap_type::const_iterator const_iterator;
269 typedef typename multimap_type::const_reverse_iterator const_reverse_iterator;
270 typedef typename multimap_type::iterator iterator;
271 typedef typename multimap_type::reverse_iterator reverse_iterator;
272
274 typedef JMap_t<JArgument_t, JResult_t, JDistance_t> map_type;
275
277
278 using multimap_type::insert;
279
280
281 /**
282 * Insert element.
283 *
284 * \param key multidimensional key
285 * \param function function
286 */
287 void insert(const JMultiKey<1, abscissa_type>& key, const function_type& function)
288 {
289 this->insert(key.first, function.getY());
290 }
291 };
292
293
294 /**
295 * Template specialisation of JMultiFunction for a JConstantFunction.
296 * The number of dimensions of the primary function is reduced by one.
297 */
298 template<class JArgument_t,
299 class JResult_t,
300 class JMaplist_t,
301 class JDistance_t>
302 class JMultiFunction<JConstantFunction1D<JArgument_t, JResult_t>, JMaplist_t, JDistance_t> :
303 public JMultiFunction<JMultiFunction<JConstantFunction1D<JArgument_t, JResult_t>,
304 typename JMaplist_t::tail_type,
305 JDistance_t>,
306 typename JMaplist_t::head_list,
307 JDistance_t>
308 {
309 public:
310
312 typename JMaplist_t::tail_type,
313 JDistance_t>,
314 typename JMaplist_t::head_list,
315 JDistance_t> multifunction_type;
316
318
319 typedef typename multimap_type::abscissa_type abscissa_type;
320 typedef typename multimap_type::ordinate_type ordinate_type;
321
322 typedef typename multimap_type::argument_type argument_type;
323 typedef typename multimap_type::result_type result_type;
324
325 typedef typename multimap_type::const_iterator const_iterator;
326 typedef typename multimap_type::const_reverse_iterator const_reverse_iterator;
327 typedef typename multimap_type::iterator iterator;
328 typedef typename multimap_type::reverse_iterator reverse_iterator;
329
330 typedef typename multimap_type::super_iterator super_iterator;
331 typedef typename multimap_type::super_const_iterator super_const_iterator;
332
335 typename JMaplist_t::tail_type,
336 JDistance_t> map_type;
337
339
340 using multimap_type::insert;
341
342
343 /**
344 * Insert element.
345 *
346 * \param key multidimensional key
347 * \param function function
348 */
350 {
351 this->get(key.front()).put(key.back(), function.getY());
352 }
353 };
354
355
356 /**
357 * Conversion of multidimensional histogram to multidimensional function.
358 *
359 * \param input multidimensional histogram
360 * \param output multidimensional function
361 */
362 template<class JHistogram_t,
363 class JHistogramMaplist_t,
364 class JHistogramDistance_t,
365 class JFunction_t,
366 class JFunctionMaplist_t,
367 class JFunctionDistance_t>
373}
374
375#endif
General purpose multidimensional map based on a type list of maps.
One dimensional array of template objects with fixed length.
Definition JArray.hh:43
const_pointer data() const
Get pointer to data.
Definition JArray.hh:295
Template implementation of function object in one dimension returning a constant value.
result_type getY() const
Function value.
Histogram in 1D.
void insert(const JMultiKey< NUMBER_OF_DIMENSIONS, abscissa_type > &key, const function_type &function)
Insert element.
JMultiFunction< JConstantFunction1D< JArgument_t, JResult_t >, typename JMaplist_t::tail_type, JDistance_t > map_type
JMultiFunction< JMultiFunction< JConstantFunction1D< JArgument_t, JResult_t >, typename JMaplist_t::tail_type, JDistance_t >, typename JMaplist_t::head_list, JDistance_t > multifunction_type
void insert(const JMultiKey< 1, abscissa_type > &key, const function_type &function)
Insert element.
Multidimensional interpolation method.
multimap_type::super_iterator super_iterator
multimap_type::super_const_iterator super_const_iterator
void insert(const JMultiKey< JMapLength< JMaplist_t >::value, argument_type > &key, const JMultiHistogram< JHistogram_t, __JMaplist_t, __JDistance_t > &input)
Convert multidimensional histogram to PDF and insert result at given multidimensional key.
multimap_type::result_type result_type
result_type operator()(const Args &...args) const
Multi-dimensional interpolation method call.
void setExceptionHandler(const typename function_type::supervisor_type &supervisor)
Set the supervisor for handling of exceptions.
multimap_type::ordinate_type ordinate_type
JMultiFunction()
Default constructor.
void compile()
Compilation.
multimap_type::const_iterator const_iterator
multimap_type::iterator iterator
void insert(const JMultiFunction< __JFunction_t, __JMaplist_t, __JDistance_t > &input)
Insert multidimensional input.
multimap_type::reverse_iterator reverse_iterator
multimap_type::const_reverse_iterator const_reverse_iterator
JMultiFunction & getMultiFunction()
Get multidimensional function.
const JMultiFunction & getMultiFunction() const
Get multidimensional function.
void insert(const JMultiKey< N, argument_type > &key, const JHistogramMap< __JAbscissa_t, __JContents_t, __JMap_t, __JDistance_t > &input)
Insert multidimensional histogram at multidimensional key.
JMultiFunction(const T &input)
Constructor.
void insert(const JMultiKey< JMapLength< JMaplist_t >::value, argument_type > &key, const JHistogram1D< __JElement_t, __JContainer_t, __JDistance_t > &input)
Convert one-dimensional histogram to PDF and insert result at given multidimensional key.
JMultiMap< typename JFunction_t::argument_type, JFunction_t, JMaplist_t, JDistance_t > multimap_type
function_type::value_type value_type
void insert(const JMultiHistogram< JHistogram_t, __JMaplist_t, __JDistance_t > &input)
Insert multidimensional input.
function_type::argument_type argument_type
multimap_type::abscissa_type abscissa_type
Multidimensional histogram.
Multidimensional key.
Definition JMultiKey.hh:69
Multidimensional map.
Definition JMultiMap.hh:52
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary classes and methods for multi-dimensional interpolations and histograms.
void copy(const T &input, T &output)
Copy of input to output.
static const JCompiler compiler
Function object for functional object compilation.
void makePDF(const JHistogram1D< JElement_t, JContainer_t, JDistance_t > &input, typename JMappable< JElement_t >::map_type &output)
Conversion of histogram to probability density function (PDF).
JObject_t & for_each(JObject_t &object, JType< JTypeList< JHead_t, JTail_t > > typelist, const JTuple< T > &tuple)
For each data type method.
Definition JTuple.hh:666
int j
Definition JPolint.hh:801
Template class for distance evaluation.
Definition JDistance.hh:24
Template definition of function object interface in multidimensions.
Length of map list.
Definition JMapList.hh:45
Map list.
Definition JMapList.hh:25