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