1 |
// @(#)root/minuit2:$Id$
|
2 |
// Author: L. Moneta 12/2005
|
3 |
/**
|
4 |
test of a pure minimization passing a user FCN class directly to the
|
5 |
TFitterMinuit
|
6 |
|
7 |
*/
|
8 |
#include "TH1.h"
|
9 |
#include "TF1.h"
|
10 |
#include "TRandom3.h"
|
11 |
#include "TVirtualFitter.h"
|
12 |
#include "TStyle.h"
|
13 |
#include "Minuit2/FCNBase.h"
|
14 |
#include "TFitterMinuit.h"
|
15 |
#include "TSystem.h"
|
16 |
#include "TStopwatch.h"
|
17 |
|
18 |
#include <vector>
|
19 |
#include <iostream>
|
20 |
|
21 |
class MyFCN : public ROOT::Minuit2::FCNBase {
|
22 |
|
23 |
public:
|
24 |
|
25 |
MyFCN(double a = 100, double b = 1) : fA(a), fB(b) {}
|
26 |
|
27 |
double operator() (const std::vector<double> & x) const {
|
28 |
// Rosebrock function
|
29 |
return fA*(x[1] - x[0]*x[0])*(x[1] - x[0]*x[0]) + fB*(1 - x[0])*(1 - x[0]);
|
30 |
}
|
31 |
|
32 |
double Up() const { return 1.; }
|
33 |
|
34 |
private:
|
35 |
|
36 |
double fA;
|
37 |
double fB;
|
38 |
|
39 |
};
|
40 |
|
41 |
int testMinimize() {
|
42 |
|
43 |
gSystem->Load("libMinuit2");
|
44 |
|
45 |
TFitterMinuit * minuit = new TFitterMinuit();
|
46 |
|
47 |
MyFCN fcn;
|
48 |
minuit->SetMinuitFCN(&fcn);
|
49 |
// starting values
|
50 |
double startX = -1.2;
|
51 |
double startY = 1.0;
|
52 |
// if not limited (vhigh <= vlow)
|
53 |
minuit->SetParameter(0,"x",startX,0.1,0,0);
|
54 |
minuit->SetParameter(1,"y",startY,0.1,0,0);
|
55 |
minuit->SetPrintLevel(3);
|
56 |
// create Minimizer (default is Migrad)
|
57 |
minuit->CreateMinimizer();
|
58 |
int iret = minuit->Minimize();
|
59 |
if (iret != 0) {
|
60 |
return iret;
|
61 |
}
|
62 |
|
63 |
std::cout << "\nTest performances........\n\n";
|
64 |
|
65 |
// test performances
|
66 |
int nMin = 10000;
|
67 |
TStopwatch w;
|
68 |
w.Start();
|
69 |
for (int i = 0; i < nMin; ++i) {
|
70 |
minuit->Clear();
|
71 |
// reset -everything
|
72 |
//minuit->SetMinuitFCN(&fcn);
|
73 |
minuit->SetParameter(0,"x",startX,0.1,0,0);
|
74 |
minuit->SetParameter(1,"y",startY,0.1,0,0);
|
75 |
minuit->SetPrintLevel(0);
|
76 |
// create Minimizer (default is Migrad)
|
77 |
minuit->CreateMinimizer();
|
78 |
iret = minuit->Minimize();
|
79 |
if (iret != 0) {
|
80 |
std::cout << "Minimization failed - exit " ;
|
81 |
return iret;
|
82 |
}
|
83 |
}
|
84 |
w.Stop();
|
85 |
std::cout << "\nTime: \t" << w.RealTime() << " , " << w.CpuTime() << std::endl;
|
86 |
return 0;
|
87 |
}
|
88 |
|
89 |
#ifndef __CINT__
|
90 |
int main() {
|
91 |
int iret = testMinimize();
|
92 |
if (iret != 0) {
|
93 |
std::cerr << "ERROR: Minimize test failed !" << std::endl;
|
94 |
return iret;
|
95 |
}
|
96 |
return 0;
|
97 |
}
|
98 |
#endif
|