41 #include "reportingUtils.hpp"
53 printErr <<
"need wave list file name as argument. aborting." << endl;
56 const bool useNormalizedAmps =
false;
57 const unsigned int rank = 2;
58 const string waveListFileName = argv[1];
59 const string normIntFileName =
"norm.int";
60 const string accIntFileName =
"norm.int";
61 const string ampDirName =
".";
62 const unsigned int numbAccEvents = 0;
67 L.
init(rank, waveListFileName, normIntFileName, accIntFileName, ampDirName, numbAccEvents);
69 const unsigned int nmbPar = L.
NDim();
70 cout <<
"number of parameters = " << nmbPar << endl;
77 gRandom->SetSeed(123456789);
78 vector<unsigned int> parIndices = L.orderedParIndices();
79 for (
unsigned int i = 0;
i < parIndices.size(); ++
i) {
80 const unsigned int parIndex = parIndices[
i];
81 cout <<
"parameter[" <<
i <<
"] = " << L.parName(parIndex) << endl;
82 par[parIndex] = gRandom->Rndm();
89 printInfo <<
"production amplitudes:" << endl;
93 for (
unsigned int iRank = 0; iRank < L.rank(); ++iRank)
94 for (
unsigned int iRefl = 0; iRefl < 2; ++iRefl)
95 for (
unsigned int iWave = 0; iWave < L.nmbWaves(2 * iRefl - 1); ++iWave)
96 cout <<
"prodAmps[" << iRank <<
"][" << iRefl <<
"][" << iWave <<
"] = "
97 << maxPrecisionDouble(prodAmps[iRank][iRefl][iWave]) << endl;
98 printInfo <<
"parameters:" << endl;
100 L.copyToParArray(prodAmps, prodAmpFlat, par2);
103 for (
unsigned int i = 0;
i < nmbPar; ++
i)
104 cout <<
"delta par[" <<
i <<
"] = " << maxPrecision(par[
i] - par2[
i]) << endl;
109 const double logLikelihood = L.DoEval(par);
110 printInfo <<
"log likelihood = " << maxPrecision(logLikelihood) << endl;
114 double numericalDerivates[nmbPar];
116 const double delta = 1E-7;
117 for (
unsigned int i = 0;
i < nmbPar; ++
i) {
118 const double oldParVal = par[
i];
120 const double logLikelihood2 = L.DoEval(par);
121 numericalDerivates[
i] = (logLikelihood2 - logLikelihood) / delta;
126 double analyticalDerivates[nmbPar];
129 L.Gradient(par, analyticalDerivates);
131 printInfo <<
"derivatives:" << endl;
132 for (
unsigned int i = 0;
i < parIndices.size(); ++
i) {
133 const unsigned int parIndex = parIndices[
i];
134 const double delta = numericalDerivates[parIndex] - analyticalDerivates[parIndex];
135 if (abs(delta) > maxDelta)
136 maxDelta = abs(delta);
137 cout <<
" dL / dPar[" << setw(nmbOfDigits(nmbPar - 1)) << parIndex <<
"]: numerical = "
138 << maxPrecisionAlign(numericalDerivates[parIndex])
139 <<
" vs. analytical = " << maxPrecisionAlign(analyticalDerivates[parIndex])
140 <<
"; (numer. - analyt.) = "
141 << maxPrecisionAlign(delta) << endl;
143 cout <<
" maximum deviation = " << maxPrecision(maxDelta) << endl;