Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
JTransformableMultiFunction.hh
Go to the documentation of this file.
1#ifndef __JTOOLS__JTRANSFORMABLEMULTIFUNCTION__
2#define __JTOOLS__JTRANSFORMABLEMULTIFUNCTION__
3
4#include <memory>
5
7
10#include "JTools/JFunctional.hh"
11#include "JTools/JArray.hh"
17
18
19/**
20 * \author mdejong
21 */
22
23namespace JTOOLS {}
24namespace JPP { using namespace JTOOLS; }
25
26namespace JTOOLS {
27
28 using JIO::JReader;
29 using JIO::JWriter;
30
31
32 /**
33 * Transformable multidimensional function.
34 *
35 * This class implements the JTransformable interface.
36 */
37 template<class JFunction_t,
38 class JMaplist_t,
41 public JMultiFunction<JFunction_t, JMaplist_t, JDistance_t>,
42 public JTransformable<JMapLength<JMaplist_t>::value, typename JFunction_t::argument_type>
43 {
44 public:
45
46 typedef JMultiFunction<JFunction_t,
47 JMaplist_t,
48 JDistance_t> multifunction_type;
49
51
52 typedef JFunction_t function_type;
53
56 typedef typename multifunction_type::supervisor_type supervisor_type;
57
61
66
69
72
74
75
76 /**
77 * Default constructor.
78 */
82
83
84 /**
85 * Constructor.
86 *
87 * \param input multidimensional input
88 */
89 template<class T>
91 {
92 insert(input);
93
94 this->compile();
95 }
96
97
98 /**
99 * Get transformable multidimensional function.
100 *
101 * \return this transformable multidimensional function
102 */
104 {
105 return static_cast<const JTransformableMultiFunction&>(*this);
106 }
107
108
109 /**
110 * Get transformable multidimensional function.
111 *
112 * \return this transformable multidimensional function
113 */
118
119
120 /**
121 * Insert multidimensional input.
122 *
123 * \param input multidimensional function
124 */
125 template<class __JFunction_t, class __JMaplist_t, class __JDistance_t>
127 {
128 this->transformer.reset(input.transformer->clone());
129
131 }
132
133
134 /**
135 * Insert multidimensional input.
136 *
137 * \param input multidimensional histogram
138 */
139 template<class JHistogram_t, class __JMaplist_t, class __JDistance_t>
141 {
142 this->transformer.reset(input.transformer->clone());
143
145 }
146
147
148 /**
149 * Add function.
150 *
151 * Note that the summation is made via iteration of the elements in this multidimensional function.
152 *
153 * \param input multidimensional function
154 */
155 template<class JMultiFunction_t>
156 void add(const JMultiFunction_t& input)
157 {
158 for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
159
160 const array_type array = (*i).getKey();
161 function_type& f1 = (*i).getValue();
162
163 if (!f1.empty()) {
164
167
168 f1.transform(get);
169
170 for (typename function_type::iterator j = f1.begin(); j != f1.end(); ++j) {
171
172 const JArray<NUMBER_OF_DIMENSIONS, argument_type> buffer(array, j->getX());
173
174 j->getY() += get_value(input.evaluate(buffer.data()));
175 }
176
177 f1.transform(put);
178 f1.compile();
179 }
180 }
181 }
182
183
184 /**
185 * Multidimensional interpolation method call.
186 *
187 * \param args comma seperated list of abscissa values
188 * \return function value
189 */
190 template<class ...Args>
191 result_type operator()(const Args& ...args) const
192 {
194
195 return this->evaluate(buffer.data());
196 }
197
198
199 /**
200 * Recursive function value evaluation.
201 *
202 * \param pX pointer to abscissa values
203 * \return function value
204 */
205 virtual result_type evaluate(const argument_type* pX) const override
206 {
208
209 for (int i = 0; i != NUMBER_OF_DIMENSIONS; ++i) {
210 buffer[i] = pX[i];
211 }
212
213 buffer[NUMBER_OF_DIMENSIONS - 1] = transformer->putXn(buffer, buffer[NUMBER_OF_DIMENSIONS - 1]);
214
215 const result_type y = multifunction_type::evaluate(buffer.data());
216 const double W = transformer->getWeight(buffer);
217
219 }
220
221
222 /**
223 * Application of weight function and coordinate transformation.
224 *
225 * \param transformer function transformer
226 */
227 virtual void transform(const transformer_type& transformer) override
228 {
229 for (super_iterator i = this->super_begin(); i != this->super_end(); ++i) {
230
231 const array_type array = (*i).getKey();
232 function_type& function = (*i).getValue();
233
234 const JMultiMapGetTransformer<NUMBER_OF_DIMENSIONS - 1, value_type> get(*(this->transformer), array);
236
237 function.transform(get);
238 function.transform(put);
239 }
240
241 this->transformer.reset(transformer.clone());
242 this->compile();
243 }
244
245
246 /**
247 * Read transformable multidimensional function.
248 *
249 * \param in reader
250 * \param object transformable multidimensional function.
251 * \return reader
252 */
254 {
255 in >> static_cast<multifunction_type&>(object);
256
257 return object.transformer->read(in);
258 }
259
260
261 /**
262 * Write transformable multidimensional function.
263 *
264 * \param out writer
265 * \param object transformable multidimensional function
266 * \return writer
267 */
268 friend inline JWriter& operator<<(JWriter& out, const JTransformableMultiFunction& object)
269 {
270 out << static_cast<const multifunction_type&>(object);
271
272 return object.transformer->write(out);
273 }
274
275
276 std::shared_ptr<transformer_type> transformer;
277 };
278
279
280 /**
281 * Conversion of multidimensional histogram to multidimensional function.
282 *
283 * \param input multidimensional histogram
284 * \param output multidimensional function
285 */
286 template<class JHistogram_t,
287 class JHistogramMaplist_t,
288 class JHistogramDistance_t,
289 class JFunction_t,
290 class JFunctionMaplist_t,
291 class JFunctionDistance_t>
297}
298
299#endif
Interface for binary input.
Interface for binary output.
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
Multidimensional interpolation method.
multimap_type::super_iterator super_iterator
multimap_type::super_const_iterator super_const_iterator
multimap_type::result_type result_type
multimap_type::ordinate_type ordinate_type
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
function_type::value_type value_type
function_type::argument_type argument_type
multimap_type::abscissa_type abscissa_type
Auxiliary class to convert JMultiMapTransformer to JCollectionElementTransformer.
Auxiliary class to convert JMultiMapTransformer to JCollectionElementTransformer.
Interface for weight application and coordinate transformation of function.
Transformable multidimensional function.
multifunction_type::ordinate_type ordinate_type
multifunction_type::const_iterator const_iterator
multifunction_type::result_type result_type
JMultiFunction< JFunction_t, JMaplist_t, JDistance_t > multifunction_type
multifunction_type::super_const_iterator super_const_iterator
void add(const JMultiFunction_t &input)
Add function.
multifunction_type::argument_type argument_type
JMultiMapTransformer< JMapLength< JMaplist_t >::value, argument_type > transformer_type
multifunction_type::super_iterator super_iterator
multifunction_type::abscissa_type abscissa_type
friend JWriter & operator<<(JWriter &out, const JTransformableMultiFunction &object)
Write transformable multidimensional function.
virtual void transform(const transformer_type &transformer) override
Application of weight function and coordinate transformation.
std::shared_ptr< transformer_type > transformer
virtual result_type evaluate(const argument_type *pX) const override
Recursive function value evaluation.
multifunction_type::supervisor_type supervisor_type
void insert(const JTransformableMultiHistogram< JHistogram_t, __JMaplist_t, __JDistance_t > &input)
Insert multidimensional input.
result_type operator()(const Args &...args) const
Multidimensional interpolation method call.
JTransformableMultiFunction(const T &input)
Constructor.
friend JReader & operator>>(JReader &in, JTransformableMultiFunction &object)
Read transformable multidimensional function.
multifunction_type::reverse_iterator reverse_iterator
const JTransformableMultiFunction & getTransformableMultiFunction() const
Get transformable multidimensional function.
void insert(const JTransformableMultiFunction< __JFunction_t, __JMaplist_t, __JDistance_t > &input)
Insert multidimensional input.
JTransformableMultiFunction & getTransformableMultiFunction()
Get transformable multidimensional function.
multifunction_type::const_reverse_iterator const_reverse_iterator
Transformable multidimensional histogram.
std::shared_ptr< transformer_type > transformer
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary classes and methods for multi-dimensional interpolations and histograms.
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).
int j
Definition JPolint.hh:801
JResultEvaluator< JResult_t >::result_type get_value(const JResult_t &value)
Helper method to recursively evaluate a to function value.
Definition JResult.hh:998
double getValue(const double x) const
Function value.
Definition JMathlib.hh:1421
Template class for distance evaluation.
Definition JDistance.hh:24
static result_type transform(const JMultiMapTransformer< N, JArgument_t > &transformer, typename JMultiMapTransformer< N, JArgument_t >::const_array_type array, const result_type &result)
Abstract interface for transformable multidimensional map.