39 #include <unsupported/Eigen/NonLinearOptimization>
78 double log_eval_no_normalize(
double x)
const;
92 template<
typename _Scalar,
int NX = Eigen::Dynamic,
int NY = Eigen::Dynamic>
97 InputsAtCompileTime = NX,
98 ValuesAtCompileTime = NY
100 typedef Eigen::Matrix<Scalar,InputsAtCompileTime,1>
InputType;
101 typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,1>
ValueType;
102 typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime>
JacobianType;
106 Functor() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {}
107 Functor(
int inputs,
int values) : m_inputs(inputs), m_values(values) {}
119 m_data(data), m_weights(weights)
123 int operator()(
const Eigen::VectorXd &x, Eigen::VectorXd &fvec)
const
126 double sigma = fabs(x(1));
127 double logsigma = log(sigma);
128 auto wit = m_weights.cbegin();
129 for (
auto it = m_data.cbegin(); it != m_data.cend(); ++it, ++wit)
131 double diff = (*it - x(0)) / sigma;
132 fvec(0) += *wit * (-logsigma - diff - exp(-diff));
134 double foo = -fvec(0);
155 Eigen::VectorXd x_init (2);
156 x_init(0) = init_param_.a;
157 x_init(1) = init_param_.b;
159 Eigen::NumericalDiff<GumbelDistributionFunctor> numDiff(functor);
160 Eigen::LevenbergMarquardt<Eigen::NumericalDiff<GumbelDistributionFunctor>,
double> lm(numDiff);
161 Eigen::LevenbergMarquardtSpace::Status status = lm.minimize(x_init);
166 if (status <= Eigen::LevenbergMarquardtSpace::Status::ImproperInputParameters)
168 throw Exception::UnableToFit(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION,
"UnableToFit-GumbelMaxLikelihoodFitter",
"Could not fit the gumbel distribution to the data");
171 #ifdef GUMBEL_DISTRIBUTION_FITTER_VERBOSE
173 stringstream formula;
174 formula <<
"f(x)=" <<
"(1/" << x_init(1) <<
") * " <<
"exp(( " << x_init(0) <<
"- x)/" << x_init(1) <<
") * exp(-exp((" << x_init(0) <<
" - x)/" << x_init(1) <<
"))";
175 cout << formula.str() << endl;
177 init_param_.a = x_init(0);
178 init_param_.b = fabs(x_init(1));
180 return {x_init(0), fabs(x_init(1))};