50 m_parameterManager(*this),
51 m_fitter( maxParameters ),
52 m_derivativesEnabled( false ),
53 m_status( kUndefinedStatus ),
54 m_newFlagFunction( 0 ),
55 m_lastMinuitFlag( -1 ),
75 m_parameterManager.
update();
78 double totalContribution = 0;
80 for ( MISubject::ObserverList::iterator iter = contributors.begin();
81 iter != contributors.end();
89 if( contributor !=
NULL )
93 ++m_functionCallCounter;
95 return totalContribution;
99 MinuitMinimizationManager::computeDerivatives(
double* grad )
101 m_parameterManager.
update();
105 for( MinuitParameterManager::const_iterator par = m_parameterManager.begin();
106 par != m_parameterManager.end();
109 double thisDerivative = 0;
110 for ( MISubject::ObserverList::iterator iter =
observerList().begin();
119 if( contributor !=
NULL )
120 thisDerivative += contributor->
derivative( **par );
123 grad[gradIndex++] = thisDerivative;
132 std::ostringstream command;
135 m_fitter.
Command( command.str().c_str() );
161 std::ostringstream command;
162 command <<
"SET STRATEGY " << strat;
164 m_fitter.
Command( command.str().c_str() );
178 m_derivativesEnabled =
true;
182 m_fitter.
Command(
"SET GRADIENT" );
186 m_fitter.
Command(
"SET GRADIENT 1" );
195 m_derivativesEnabled =
false;
197 m_fitter.
Command(
"SET NOGRADIENT" );
203 m_functionCallCounter = 0;
205 timeval tStart,tStop,tSpan;
208 gettimeofday( &(tStart),
NULL );
212 m_lastMinuitFlag = -1;
216 m_status = m_fitter.
Migrad();
217 m_fitter.
mnstat( m_bestMin, m_estDistToMin, dummyD, dummyI, dummyI, m_eMatrixStat );
224 gettimeofday( &(tStop),
NULL );
225 timersub( &(tStop), &(tStart), &tSpan );
226 dTime = tSpan.tv_sec + tSpan.tv_usec/1000000.0;
228 cout <<
"\n MIGRAD evaluation total wall time: " << dTime <<
" s." << endl;
229 cout <<
" average time per function call: " << dTime * 1000 / m_functionCallCounter
230 <<
" ms." << endl << endl;
236 m_functionCallCounter = 0;
238 timeval tStart,tStop,tSpan;
241 gettimeofday( &(tStart),
NULL );
245 m_lastMinuitFlag = -1;
249 m_status = m_fitter.
Minos();
250 m_fitter.
mnstat( m_bestMin, m_estDistToMin, dummyD, dummyI, dummyI, m_eMatrixStat );
257 gettimeofday( &(tStop),
NULL );
258 timersub( &(tStop), &(tStart), &tSpan );
259 dTime = tSpan.tv_sec + tSpan.tv_usec/1000000.0;
261 cout <<
"\n MINOS evaluation total wall time: " << dTime <<
" s." << endl;
262 cout <<
" average time per function call: " << dTime * 1000 / m_functionCallCounter
263 <<
" ms." << endl << endl;
267 vector< vector< double > >
270 m_functionCallCounter = 0;
272 timeval tStart,tStop,tSpan;
275 gettimeofday( &(tStart),
NULL );
279 m_lastMinuitFlag = -1;
283 m_status = m_fitter.
Hesse();
289 vector< vector< double > > secDerivMatrix;
292 for(
int i = 0; i < nPar; ++i )
293 secDerivMatrix.push_back( vector< double >( nPar ) );
296 for(
int i = 0; i < nPar; ++i ){
298 for(
int j = 0; j <= i; ++j ){
300 int index = i*(i+1)/2 + j;
301 secDerivMatrix[i][j] = m_fitter.
fSecDer[index];
302 secDerivMatrix[j][i] = m_fitter.
fSecDer[index];
307 m_fitter.
mnstat( m_bestMin, m_estDistToMin, dummyD, dummyI, dummyI, m_eMatrixStat );
314 gettimeofday( &(tStop),
NULL );
315 timersub( &(tStop), &(tStart), &tSpan );
316 dTime = tSpan.tv_sec + tSpan.tv_usec/1000000.0;
318 cout <<
"\n HESSE evaluation total wall time: " << dTime <<
" s." << endl;
319 cout <<
" average time per function call: " << dTime * 1000 / m_functionCallCounter
320 <<
" ms." << endl << endl;
322 return secDerivMatrix;
333 if ( m_newFlagFunction ) {
334 if ( flag != m_lastMinuitFlag ) {
335 (*m_newFlagFunction)(flag);
336 m_lastMinuitFlag = flag;
343 computeDerivatives( grad );
358 return m_lastCommand;
364 return m_eMatrixStat;
376 return m_estDistToMin;
379 const vector<double>&
const std::vector< double > & minuitWorkingValues() const
void setMaxIterations(int maxIter)
void operator()(int &npar, double *grad, double &fval, const std::vector< double > &par, int flag)
void SetLogStream(std::ostream &aStream)
int maxIterations() const
double estDistToMinimum() const
void disableDerivatives()
double evaluateFunction()
Int_urt GetMaxIterations() const
virtual double derivative(const MinuitParameter &par)
std::list< MIObserver * > ObserverList
virtual double contribution()
int numFloatingPars() const
virtual Int_urt Command(const char *command)
void setStrategy(int strategy)
void setLogStream(std::ostream &logStream)
virtual void mnstat(Double_urt &fmin, Double_urt &fedm, Double_urt &errdef, Int_urt &npari, Int_urt &nparx, Int_urt &istat)
MinuitMinimizationManager(int maxParameters=50)
~MinuitMinimizationManager()
void migradMinimization()
MinuitParameterManager & parameterManager()
double bestMinimum() const
URMinuit & minuitMinimizer()
virtual void SetMaxIterations(Int_urt maxiter=5000)
ObserverList & observerList()
vector< vector< double > > hesseEvaluation()
int eMatrixStatus() const
void setPrecision(double precision)
void enableDerivatives(Option optionArg=kCheckDerivativeCalc)
virtual void SetFCN(URFcn *fcn)
const std::vector< Double_urt > & GetParameterList() const