Jpp  16.0.0
the software that should make you happy
 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 "JIO/JSerialisable.hh"
6 
9 #include "JTools/JFunctional.hh"
10 #include "JTools/JArray.hh"
13 
14 
15 /**
16  * \author mdejong
17  */
18 
19 namespace JTOOLS {}
20 namespace JPP { using namespace JTOOLS; }
21 
22 namespace JTOOLS {
23 
24  using JIO::JReader;
25  using JIO::JWriter;
26 
27 
28  /**
29  * Transformable multidimensional function.
30  *
31  * This class implements the JTransformable interface.
32  */
33  template<class JFunction_t,
34  class JMaplist_t,
37  public JMultiFunction<JFunction_t, JMaplist_t, JDistance_t>,
38  public JTransformable<JMapLength<JMaplist_t>::value, typename JFunction_t::argument_type>
39  {
40  public:
41 
42  typedef JMultiFunction<JFunction_t,
43  JMaplist_t,
44  JDistance_t> multifunction_type;
45 
47 
48  typedef JFunction_t function_type;
49 
52  typedef typename multifunction_type::supervisor_type supervisor_type;
53 
57 
62 
65 
68 
70 
71 
72  /**
73  * Default constructor.
74  */
76  transformer(transformer_type::getClone())
77  {}
78 
79 
80  /**
81  * Constructor.
82  *
83  * \param input multidimensional input
84  */
85  template<class T>
87  {
88  insert(input);
89 
90  this->compile();
91  }
92 
93 
94  /**
95  * Get transformable multidimensional function.
96  *
97  * \return this transformable multidimensional function
98  */
100  {
101  return static_cast<const JTransformableMultiFunction&>(*this);
102  }
103 
104 
105  /**
106  * Get transformable multidimensional function.
107  *
108  * \return this transformable multidimensional function
109  */
111  {
112  return static_cast<JTransformableMultiFunction&>(*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  this->transformer.reset(input.transformer->clone());
125 
127  }
128 
129 
130  /**
131  * Insert multidimensional input.
132  *
133  * \param input multidimensional histogram
134  */
135  template<class JHistogram_t, class JHistogramMaplist_t, class JHistogramDistance_t>
137  {
138  this->transformer.reset(input.transformer->clone());
139 
141  }
142 
143 
144  /**
145  * Add function.
146  *
147  * Note that the summation is made via iteration of the elements in this multidimensional function.
148  *
149  * \param input multidimensional function
150  */
151  template<class JMultiFunction_t>
152  void add(const JMultiFunction_t& input)
153  {
154  for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
155 
156  const array_type array = (*i).getKey();
157  function_type& f1 = (*i).getValue();
158 
159  if (!f1.empty()) {
160 
161  const JMultiMapGetTransformer<NUMBER_OF_DIMENSIONS - 1, value_type> get(*(this->transformer), array);
162  const JMultiMapPutTransformer<NUMBER_OF_DIMENSIONS - 1, value_type> put(*(this->transformer), array);
163 
164  f1.transform(get);
165 
166  for (typename function_type::iterator j = f1.begin(); j != f1.end(); ++j) {
167 
169 
170  j->getY() += get_value(input.evaluate(buffer.data()));
171  }
172 
173  f1.transform(put);
174  f1.compile();
175  }
176  }
177  }
178 
179 
180  /**
181  * Multidimensional interpolation method call.
182  *
183  * \param args comma seperated list of abscissa values
184  * \return function value
185  */
186  template<class ...Args>
187  result_type operator()(const Args& ...args) const
188  {
189  return this->evaluate(this->buffer.set(args...).data());
190  }
191 
192 
193  /**
194  * Recursive function value evaluation.
195  *
196  * \param pX pointer to abscissa values
197  * \return function value
198  */
199  virtual result_type evaluate(const argument_type* pX) const override
200  {
201  for (int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
202  this->buffer[i] = pX[i];
203  }
204 
205  this->buffer[NUMBER_OF_DIMENSIONS - 1] = transformer->putXn(this->buffer, this->buffer[NUMBER_OF_DIMENSIONS - 1]);
206 
207  const result_type y = multifunction_type::evaluate(this->buffer.data());
208  const double W = transformer->getWeight(this->buffer);
209 
211  }
212 
213 
214  /**
215  * Application of weight function and coordinate transformation.
216  *
217  * \param transformer function transformer
218  */
219  virtual void transform(const transformer_type& transformer) override
220  {
221  for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
222 
223  const array_type array = (*i).getKey();
224  function_type& function = (*i).getValue();
225 
226  const JMultiMapGetTransformer<NUMBER_OF_DIMENSIONS - 1, value_type> get(*(this->transformer), array);
227  const JMultiMapPutTransformer<NUMBER_OF_DIMENSIONS - 1, value_type> put( transformer, array);
228 
229  function.transform(get);
230  function.transform(put);
231  }
232 
233  this->transformer.reset(transformer.clone());
234  this->compile();
235  }
236 
237 
238  /**
239  * Read transformable multidimensional function.
240  *
241  * \param in reader
242  * \param object transformable multidimensional function.
243  * \return reader
244  */
246  {
247  in >> static_cast<multifunction_type&>(object);
248 
249  return object.transformer->read(in);
250  }
251 
252 
253  /**
254  * Write transformable multidimensional function.
255  *
256  * \param out writer
257  * \param object transformable multidimensional function
258  * \return writer
259  */
260  friend inline JWriter& operator<<(JWriter& out, const JTransformableMultiFunction& object)
261  {
262  out << static_cast<const multifunction_type&>(object);
263 
264  return object.transformer->write(out);
265  }
266 
267 
269 
270  private:
272  };
273 
274 
275  /**
276  * Conversion of multidimensional histogram to multidimensional function.
277  *
278  * \param input multidimensional histogram
279  * \param output multidimensional function
280  */
281  template<class JHistogram_t,
282  class JHistogramMaplist_t,
283  class JHistogramDistance_t,
284  class JFunction_t,
285  class JFunctionMaplist_t,
286  class JFunctionDistance_t>
289  {
290  output.insert(input);
291  }
292 }
293 
294 #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
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.
result_type operator()(const Args &...args) const
Multidimensional interpolation method call.
Auxiliary class to convert JMultiMapTransformer to JCollectionElementTransformer. ...
JArray & set(const Args &...args)
Set array.
Definition: JArray.hh:197
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.
JArray< NUMBER_OF_DIMENSIONS, argument_type > buffer
const JTransformableMultiFunction & getTransformableMultiFunction() const
Get transformable multidimensional function.
virtual clone_type clone() const override
Get clone of this object.
Definition: JClonable.hh:69
The template JSharedPointer class can be used to share a pointer to an object.
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).
Transformable multidimensional histogram.
void add(const JMultiFunction_t &input)
Add function.
do set_variable OUTPUT_DIRECTORY $WORKDIR T
Interface for binary input.
One dimensional array of template objects with fixed length.
Definition: JArray.hh:40
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.
virtual result_type evaluate(const argument_type *pX) const override
Recursive function value evaluation.
multifunction_type::abscissa_type abscissa_type
Auxiliary class to convert JMultiMapTransformer to JCollectionElementTransformer. ...
int j
Definition: JPolint.hh:682
void insert(const JTransformableMultiFunction< JPDF_t, JPDFMaplist_t, JPDFDistance_t > &input)
Insert multidimensional input.
multifunction_type::super_iterator super_iterator
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Definition: JCanberra.sh:42
virtual void transform(const transformer_type &transformer) override
Application of weight function and coordinate transformation.
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:998
const_pointer data() const
Get pointer to data.
Definition: JArray.hh:282
multifunction_type::const_reverse_iterator const_reverse_iterator
multifunction_type::reverse_iterator reverse_iterator
friend JReader & operator>>(JReader &in, JTransformableMultiFunction &object)
Read transformable multidimensional function.