Jpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JTransformableMultiFunction.hh
Go to the documentation of this file.
1 #ifndef __JTOOLS__JTRANSFORMABLEMULTIFUNCTION__
2 #define __JTOOLS__JTRANSFORMABLEMULTIFUNCTION__
3 
4 #include <stdarg.h>
5 
6 #include "JIO/JSerialisable.hh"
8 
11 #include "JTools/JFunctional.hh"
12 #include "JTools/JArray.hh"
15 
16 
17 /**
18  * \author mdejong
19  */
20 
21 namespace JTOOLS {}
22 namespace JPP { using namespace JTOOLS; }
23 
24 namespace JTOOLS {
25 
26  using JIO::JReader;
27  using JIO::JWriter;
28 
29 
30  /**
31  * Transformable multidimensional function.
32  *
33  * This class implements the JTransformable interface.
34  */
35  template<class JFunction_t,
36  class JMaplist_t,
39  public JMultiFunction<JFunction_t, JMaplist_t, JDistance_t>,
40  public JTransformable<JMapLength<JMaplist_t>::value, typename JFunction_t::argument_type>
41  {
42  public:
43 
44  typedef JMultiFunction<JFunction_t,
45  JMaplist_t,
46  JDistance_t> multifunction_type;
47 
49 
50  typedef JFunction_t function_type;
51 
55 
59 
64 
67 
70 
72 
73 
74  /**
75  * Default constructor.
76  */
78  transformer(transformer_type::getClone())
79  {}
80 
81 
82  /**
83  * Constructor.
84  *
85  * \param input multidimensional input
86  */
87  template<class T>
88  JTransformableMultiFunction(const T& input)
89  {
90  insert(input);
91 
92  this->compile();
93  }
94 
95 
96  /**
97  * Get transformable multidimensional function.
98  *
99  * \return this transformable multidimensional function
100  */
102  {
103  return static_cast<const JTransformableMultiFunction&>(*this);
104  }
105 
106 
107  /**
108  * Get transformable multidimensional function.
109  *
110  * \return this transformable multidimensional function
111  */
113  {
114  return static_cast<JTransformableMultiFunction&>(*this);
115  }
116 
117 
118  /**
119  * Insert multidimensional input.
120  *
121  * \param input multidimensional function
122  */
123  template<class JPDF_t, class JPDFMaplist_t, class JPDFDistance_t>
125  {
126  this->transformer.reset(input.transformer->clone());
127 
129  }
130 
131 
132  /**
133  * Insert multidimensional input.
134  *
135  * \param input multidimensional histogram
136  */
137  template<class JHistogram_t, class JHistogramMaplist_t, class JHistogramDistance_t>
139  {
140  this->transformer.reset(input.transformer->clone());
141 
143  }
144 
145 
146  /**
147  * Add function.
148  *
149  * Note that the summation is made via iteration of the elements in this multidimensional function.
150  *
151  * \param input multidimensional function
152  */
153  template<class JMultiFunction_t>
154  void add(const JMultiFunction_t& input)
155  {
156  for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
157 
158  const array_type array = (*i).getKey();
159  function_type& f1 = (*i).getValue();
160 
161  if (!f1.empty()) {
162 
163  const JMultiMapGetTransformer<NUMBER_OF_DIMENSIONS - 1, value_type> get(*(this->transformer), array);
164  const JMultiMapPutTransformer<NUMBER_OF_DIMENSIONS - 1, value_type> put(*(this->transformer), array);
165 
166  f1.transform(get);
167 
168  for (typename function_type::iterator j = f1.begin(); j != f1.end(); ++j) {
169 
170  const JArray<NUMBER_OF_DIMENSIONS, argument_type> buffer(array, j->getX());
171 
172  j->getY() += get_value(input.evaluate(buffer.data()));
173  }
174 
175  f1.transform(put);
176  f1.compile();
177  }
178  }
179  }
180 
181 
182  /**
183  * Multidimensional interpolation method call.
184  *
185  * \param x comma seperated list of abscissa values
186  * \return function value
187  */
189  {
190  va_start(this->ap, x);
191 
192  this->buffer[0] = x;
193 
194  for (int i = 1; i != NUMBER_OF_DIMENSIONS; ++i) {
195  this->buffer[i] = va_arg(this->ap, argument_type);
196  }
197 
198  va_end(this->ap);
199 
200  return this->evaluate(this->buffer.data());
201  }
202 
203 
204  /**
205  * Recursive function value evaluation.
206  *
207  * \param pX pointer to abscissa values
208  * \return function value
209  */
210  virtual result_type evaluate(const argument_type* pX) const
211  {
212  for (int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
213  this->buffer[i] = pX[i];
214  }
215 
216  this->buffer[NUMBER_OF_DIMENSIONS - 1] = transformer->putXn(this->buffer, this->buffer[NUMBER_OF_DIMENSIONS - 1]);
217 
218  const result_type y = multifunction_type::evaluate(this->buffer.data());
219  const double W = transformer->getWeight(this->buffer);
220 
222  }
223 
224 
225  /**
226  * Application of weight function and coordinate transformation.
227  *
228  * \param transformer function transformer
229  */
231  {
232  for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
233 
234  const array_type array = (*i).getKey();
235  function_type& function = (*i).getValue();
236 
237  const JMultiMapGetTransformer<NUMBER_OF_DIMENSIONS - 1, value_type> get(*(this->transformer), array);
238  const JMultiMapPutTransformer<NUMBER_OF_DIMENSIONS - 1, value_type> put( transformer, array);
239 
240  function.transform(get);
241  function.transform(put);
242  }
243 
244  this->transformer.reset(transformer.clone());
245  this->compile();
246  }
247 
248 
249  /**
250  * Read transformable multidimensional function.
251  *
252  * \param in reader
253  * \param object transformable multidimensional function.
254  * \return reader
255  */
257  {
258  in >> static_cast<multifunction_type&>(object);
259 
260  return object.transformer->read(in);
261  }
262 
263 
264  /**
265  * Write transformable multidimensional function.
266  *
267  * \param out writer
268  * \param object transformable multidimensional function
269  * \return writer
270  */
271  friend inline JWriter& operator<<(JWriter& out, const JTransformableMultiFunction& object)
272  {
273  out << static_cast<const multifunction_type&>(object);
274 
275  return object.transformer->write(out);
276  }
277 
278 
280  };
281 
282 
283  /**
284  * Conversion of multidimensional histogram to multidimensional function.
285  *
286  * \param input multidimensional histogram
287  * \param output multidimensional function
288  */
289  template<class JHistogram_t,
290  class JHistogramMaplist_t,
291  class JHistogramDistance_t,
292  class JFunction_t,
293  class JFunctionMaplist_t,
294  class JFunctionDistance_t>
297  {
298  output.insert(input);
299  }
300 }
301 
302 #endif
void compile()
Compilation.
Interface for binary output.
multifunction_type::result_type result_type
Transformable multidimensional function.
JMultiMapTransformer< JMapLength< JMaplist_t >::value, argument_type > transformer_type
Template class for distance evaluation.
Definition: JDistance.hh:24
virtual clone_type clone() const =0
Get clone of this object.
multifunction_type::argument_type argument_type
JTransformableMultiFunction(const T &input)
Constructor.
JMultiFunction< JFunction_t, JMaplist_t, JDistance_t > multifunction_type
JLANG::JSharedPointer< transformer_type > transformer
virtual int write(const char *buffer, const int length)=0
Write byte array.
Auxiliary class to convert JMultiMapTransformer to JCollectionElementTransformer. ...
static result_type transform(const JMultiMapTransformer< N, JArgument_t > &transformer, typename JMultiMapTransformer< N, JArgument_t >::const_array_type array, const result_type &result)
void insert(const JTransformableMultiHistogram< JHistogram_t, JHistogramMaplist_t, JHistogramDistance_t > &input)
Insert multidimensional input.
virtual void transform(const transformer_type &transformer)
Application of weight function and coordinate transformation.
const JTransformableMultiFunction & getTransformableMultiFunction() const
Get transformable multidimensional function.
The template JSharedPointer class can be used to share a pointer to an object.
result_type operator()(const argument_type x,...) const
Multidimensional interpolation method call.
Abstract interface for transformable multidimensional map.
Multidimensional interpolation method.
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).
JArray< NUMBER_OF_DIMENSIONS, argument_type > buffer
Transformable multidimensional histogram.
void add(const JMultiFunction_t &input)
Add function.
Interface for binary input.
friend JWriter & operator<<(JWriter &out, const JTransformableMultiFunction &object)
Write transformable multidimensional function.
multifunction_type::const_iterator const_iterator
multifunction_type::ordinate_type ordinate_type
multifunction_type::supervisor_type supervisor_type
void insert(const JMultiFunction< JPDF_t, JPDFMaplist_t, JPDFDistance_t > &input)
Insert multidimensional input.
Interface for weight application and coordinate transformation of function.
multifunction_type::abscissa_type abscissa_type
Auxiliary class to convert JMultiMapTransformer to JCollectionElementTransformer. ...
void insert(const JTransformableMultiFunction< JPDF_t, JPDFMaplist_t, JPDFDistance_t > &input)
Insert multidimensional input.
multifunction_type::super_iterator super_iterator
JLANG::JSharedPointer< transformer_type > transformer
multifunction_type::super_const_iterator super_const_iterator
JTransformableMultiFunction & getTransformableMultiFunction()
Get transformable multidimensional function.
JResultEvaluator< JResult_t >::result_type get_value(const JResult_t &value)
Helper method to recursively evaluate a to function value.
Definition: JResult.hh:748
const_pointer data() const
Get pointer to data.
Definition: JArray.hh:247
multifunction_type::const_reverse_iterator const_reverse_iterator
multifunction_type::reverse_iterator reverse_iterator
virtual result_type evaluate(const argument_type *pX) const
Recursive function value evaluation.
friend JReader & operator>>(JReader &in, JTransformableMultiFunction &object)
Read transformable multidimensional function.