33 GSLSimAnMinimizer::GSLSimAnMinimizer(
int ) :
38 SetMaxIterations(100);
42 GSLSimAnMinimizer::~GSLSimAnMinimizer () {
46 bool GSLSimAnMinimizer::Minimize() {
48 int debugLevel = PrintLevel();
50 if (debugLevel >=1 ) std::cout <<
"Minimize using GSLSimAnMinimizer " << std::endl;
52 const ROOT::Math::IMultiGenFunction *
function = ObjFunction();
54 MATH_ERROR_MSG(
"GSLSimAnMinimizer::Minimize",
"Function has not been set");
59 unsigned int npar = NPar();
60 std::vector<double> xvar;
61 std::vector<double> steps(StepSizes(),StepSizes()+npar);
64 MultiNumGradFunction * gradFunc =
new MultiNumGradFunction( *
function );
65 gradFunc->SetOwnership();
67 MinimTransformFunction * trFunc = CreateTransformation(xvar, gradFunc );
72 trFunc->InvStepTransformation(X(), StepSizes(), &steps[0]);
73 steps.resize( trFunc->NDim() );
76 assert (xvar.size() == steps.size() );
80 for (
unsigned int i = 0; i < npar ; ++i) {
81 std::cout <<
"x = " << xvar[i] <<
" steps " << steps[i] <<
" x " << X()[i] << std::endl;
83 std::cout <<
"f(x) = " << (*ObjFunction())(&xvar.front() ) << std::endl;
84 std::cout <<
"f(x) not transf = " << (*function)( X() ) << std::endl;
85 if (trFunc) std::cout <<
"ftrans(x) = " << (*trFunc) (&xvar.front() ) << std::endl;
89 std::vector<double> xmin(xvar.size() );
92 int iret = fSolver.Solve(*ObjFunction(), &xvar.front(), &steps.front(), &xmin[0], (debugLevel > 1) );
94 SetMinValue( (*ObjFunction())(&xmin.front() ) );
96 SetFinalValues(&xmin.front());
99 if (debugLevel >=1 ) {
101 std::cout <<
"GSLSimAnMinimizer: Minimum Found" << std::endl;
103 std::cout <<
"GSLSimAnMinimizer: Error in solving" << std::endl;
105 int pr = std::cout.precision(18);
106 std::cout <<
"FVAL = " << MinValue() << std::endl;
107 std::cout.precision(pr);
108 for (
unsigned int i = 0; i < NDim(); ++i)
109 std::cout << VariableName(i) <<
"\t = " << X()[i] << std::endl;
113 return ( iret == 0) ?
true :
false;
117 unsigned int GSLSimAnMinimizer::NCalls()
const {
119 const ROOT::Math::MinimTransformFunction * tfunc =
dynamic_cast<const ROOT::Math::MinimTransformFunction *
>(ObjFunction());
120 const ROOT::Math::MultiNumGradFunction * f = 0;
121 if (tfunc) f =
dynamic_cast<const ROOT::Math::MultiNumGradFunction *
>(tfunc->OriginalFunction());
123 f =
dynamic_cast<const ROOT::Math::MultiNumGradFunction *
>(ObjFunction());
124 if (f)
return f->NCalls();
128 ROOT::Math::MinimizerOptions GSLSimAnMinimizer::Options()
const {
129 ROOT::Math::MinimizerOptions opt;
130 opt.SetMinimizerType(
"GSLSimAn");
132 opt.SetTolerance(-1);
133 opt.SetPrintLevel(0);
134 opt.SetMaxIterations(-1);
135 opt.SetMaxFunctionCalls(0);
139 opt.SetMinimizerAlgorithm(
"");
141 const GSLSimAnParams & params = MinimizerParameters();
143 ROOT::Math::GenAlgoOptions simanOpt;
144 simanOpt.SetValue(
"n_tries",params.n_tries);
145 simanOpt.SetValue(
"iters_fixed_T",params.iters_fixed_T);
146 simanOpt.SetValue(
"step_size",params.step_size);
147 simanOpt.SetValue(
"k",params.k);
148 simanOpt.SetValue(
"t_initial",params.t_initial);
149 simanOpt.SetValue(
"mu_t",params.mu_t);
150 simanOpt.SetValue(
"t_min",params.t_min);
152 opt.SetExtraOptions(simanOpt);
156 void GSLSimAnMinimizer::SetOptions(
const ROOT::Math::MinimizerOptions & opt) {
159 const ROOT::Math::IOptions * simanOpt = opt.ExtraOptions();
161 MATH_WARN_MSG(
"GSLSimAnMinimizer::SetOptions",
"No specific sim. annealing minimizer options are provided. No options are set");
164 GSLSimAnParams params;
165 simanOpt->GetValue(
"n_tries",params.n_tries);
166 simanOpt->GetValue(
"iters_fixed_T",params.iters_fixed_T);
167 simanOpt->GetValue(
"step_size",params.step_size);
168 simanOpt->GetValue(
"k",params.k);
169 simanOpt->GetValue(
"t_initial",params.t_initial);
170 simanOpt->GetValue(
"mu_t",params.mu_t);
171 simanOpt->GetValue(
"t_min",params.t_min);
173 SetParameters(params);