Jpp  15.0.2
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JResultHesse3D.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <iomanip>
3 
4 #include "TRandom3.h"
5 
6 #include "JMath/JPolynome.hh"
7 #include "JTools/JElement.hh"
9 #include "JTools/JGridMap.hh"
10 #include "JTools/JPolint.hh"
11 #include "JTools/JMapList.hh"
12 #include "JTools/JMultiFunction.hh"
13 #include "JTools/JQuantile.hh"
14 
15 #include "Jeep/JPrint.hh"
16 #include "Jeep/JParser.hh"
17 #include "Jeep/JMessage.hh"
18 
19 
20 namespace {
21 
22  const int N = 3;
23 
24  using namespace JPP;
25 
26  JPolynome fx;
27  JPolynome fy;
28  JPolynome fz;
29 
30  /**
31  * 3D function.
32  */
33  inline double f3(const double x, const double y, const double z)
34  {
35  return fx(x) * fy(y) * fz(z);
36  }
37 
38  template<class JKey_t, class JValue_t, class JDistance_t>
39  struct JMap_t :
40  public JPolintMap<N, JKey_t, JValue_t, JGridMap,
41  JResultHesse<typename JResultType<JValue_t>::result_type>,
42  JDistance_t>
43  {};
44 }
45 
46 
47 /**
48  * \file
49  *
50  * Example program to test multi-dimensional interpolation.
51  * \author mdejong
52  */
53 int main(int argc, char **argv)
54 {
55  using namespace std;
56  using namespace JPP;
57 
58  int numberOfEvents;
59  int numberOfBins;
60  double precision;
61  int debug;
62 
63  try {
64 
65  JParser<> zap("Example program to test multi-dimensional interpolation.");
66 
67  zap['n'] = make_field(numberOfEvents) = 1000;
68  zap['N'] = make_field(numberOfBins) = 11;
69  zap['X'] = make_field(fx) = JPolynome(3, 1.0, 1.0, 1.0);
70  zap['Y'] = make_field(fy) = JPolynome(3, 1.0, 1.0, 1.0);
71  zap['Z'] = make_field(fz) = JPolynome(3, 1.0, 1.0, 1.0);
72  zap['e'] = make_field(precision) = 1.0e-13;
73  zap['d'] = make_field(debug) = 3;
74 
75  zap(argc, argv);
76  }
77  catch(const exception &error) {
78  FATAL(error.what() << endl);
79  }
80 
81 
82  const double xmin = -1.0;
83  const double xmax = +1.0;
84  const double dx = (xmax - xmin) / (numberOfBins - 1);
85 
86  typedef JPolintFunction1D<N,
89  JResultHesse<double> > JFunction1D_t;
90  typedef JMAPLIST<JMap_t,
91  JMap_t>::maplist JMaplist_t;
92 
93  typedef JMultiFunction<JFunction1D_t, JMaplist_t> JMultiFunction_t;
94  typedef JMultiFunction_t::result_type result_type;
95 
96  JMultiFunction_t g3;
97 
98 
99  for (double x = xmin; x < xmax + 0.5*dx; x += dx) {
100  for (double y = xmin; y < xmax + 0.5*dx; y += dx) {
101  for (double z = xmin; z < xmax + 0.5*dx; z += dx) {
102  g3[x][y][z] = f3(x,y,z);
103  }
104  }
105  }
106 
107 
108  g3.compile();
109 
110 
111  if (numberOfEvents > 0) {
112 
113  JQuantile Q;
114  JQuantile H[N][N];
115 
116  for (int i = 0; i != numberOfEvents; ++i) {
117 
118  const double x = gRandom->Uniform(xmin, xmax);
119  const double y = gRandom->Uniform(xmin, xmax);
120  const double z = gRandom->Uniform(xmin, xmax);
121 
122  const result_type result = g3(x,y,z);
123 
124  const double v = f3(x,y,z);
125  const double w = get_value(result);
126 
127  Q.put(v - w);
128 
129  H[0][0].put(fx.getDerivative().getDerivative(x) * fy(y) * fz(z) - result.fpp.f.f);
130  H[1][0].put(fx.getDerivative(x) * fy.getDerivative(y) * fz(z) - result.fp.fp.f);
131  H[2][0].put(fx.getDerivative(x) * fy(y) * fz.getDerivative(z) - result.fp.f.fp);
132 
133  H[1][1].put(fx(x) * fy.getDerivative().getDerivative(y) * fz(z) - result.f.fpp.f);
134  H[2][1].put(fx(x) * fy.getDerivative(y) * fz.getDerivative(z) - result.f.fp.fp);
135 
136  H[2][2].put(fx(x) * fy(y) * fz.getDerivative().getDerivative(z) - result.f.f.fpp);
137  }
138 
139  if (debug >= debug_t) {
140 
141  Q.print(cout);
142 
143  cout << "Hessian matrix" << endl;
144 
145  for (int i = 0; i != N; ++i) {
146  for (int j = 0; j <= i; ++j) {
147  cout << ' ' << SCIENTIFIC(12,3) << H[i][j].getMean();
148  }
149  cout << endl;
150  }
151 
152  for (int i = 0; i != N; ++i) {
153  for (int j = 0; j <= i; ++j) {
154  cout << ' ' << SCIENTIFIC(12,3) << H[i][j].getSTDev();
155  }
156  cout << endl;
157  }
158  }
159 
160  ASSERT(Q.getMean() <= precision);
161  ASSERT(Q.getSTDev() <= precision);
162 
163  for (int i = 0; i != N; ++i) {
164  for (int j = 0; j <= i; ++j) {
165  ASSERT(H[i][j].getMean() <= precision);
166  ASSERT(H[i][j].getSTDev() <= precision);
167  }
168  }
169 
170  } else {
171 
172  for ( ; ; ) {
173 
174  cout << "> " << flush;
175 
176  string buffer;
177 
178  if (getline(cin, buffer) && !buffer.empty()) {
179 
180  double x, y, z;
181 
182  istringstream(buffer) >> x >> y >> z;
183 
184  try {
185  cout << f3(x,y,z) << ' ' << get_value(g3(x,y,z)) << endl;
186  }
187  catch(const JException& exception) {
188  cout << exception << endl;
189  }
190 
191  } else {
192  break;
193  }
194  }
195  }
196 
197  return 0;
198 }
Utility class to parse command line options.
Definition: JParser.hh:1500
General exception.
Definition: JException.hh:23
data_type w[N+1][M+1]
Definition: JPolint.hh:741
Q(UTCMax_s-UTCMin_s)-livetime_s
debug
Definition: JMessage.hh:29
int main(int argc, char *argv[])
Definition: Main.cc:15
The elements in a collection are sorted according to their abscissa values and a given distance opera...
double getSTDev() const
Get standard deviation.
Definition: JQuantile.hh:266
Auxiliary data structure for running average, standard deviation and quantiles.
Definition: JQuantile.hh:43
then JShowerPostfit f $INPUT_FILE o $OUTPUT_FILE N
static const double H
Planck constant [eV s].
double getMean(vector< double > &v)
get mean of vector content
double getMean() const
Get mean value.
Definition: JQuantile.hh:252
#define ASSERT(A,...)
Assert macro.
Definition: JMessage.hh:90
I/O formatting auxiliaries.
Multidimensional interpolation method.
std::ostream & print(std::ostream &out, bool lpr=true) const
Print quantile.
Definition: JQuantile.hh:335
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
General purpose class for collection of equidistant elements.
return result
Definition: JPolint.hh:727
void put(const double x, const double w=1.0)
Put value.
Definition: JQuantile.hh:133
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
Definition: JString.hh:478
int debug
debug level
Definition: JSirene.cc:63
Auxiliary class for recursive map list generation.
Definition: JMapList.hh:108
General purpose messaging.
#define FATAL(A)
Definition: JMessage.hh:67
Utility class to parse command line options.
Functional map with polynomial interpolation.
Definition: JPolint.hh:1020
2D Element.
Definition: JElement.hh:46
double f3(const double x, const double y, const double z)
3D function.
Definition: JPolynome3D.cc:23
int j
Definition: JPolint.hh:666
Polynome function object.
Definition: JPolynome.hh:163
data_type v[N+1][M+1]
Definition: JPolint.hh:740
Data structure for result including value and first derivative of function.
Definition: JResult.hh:212
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:484
JResultEvaluator< JResult_t >::result_type get_value(const JResult_t &value)
Helper method to recursively evaluate a to function value.
Definition: JResult.hh:998
int numberOfBins
number of bins for average CDF integral of optical module
Definition: JSirene.cc:64
Template class for polynomial interpolation in 1D.
Definition: JPolint.hh:966