36 #ifndef SIMPLEXALGORITHM_H
37 #define SIMPLEXALGORITHM_H
100 static bool simplex_minimize(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& p,
101 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
103 T (*func)(
const Eigen::Matrix<T,Eigen::Dynamic, 1>& x,
const void *user_data),
104 const void *user_data,
108 bool (*report_func)(
int loop,
const Eigen::Matrix<T,Eigen::Dynamic, 1>& fitpar,
double fval));
112 template <
typename T>
113 static T tryit(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> &p,
114 Eigen::Matrix<T,Eigen::Dynamic, 1> &y,
115 Eigen::Matrix<T,Eigen::Dynamic, 1> &psum,
116 T (*func)(
const Eigen::Matrix<T,Eigen::Dynamic, 1> &x,
const void *user_data),
117 const void *user_data,
127 template <
typename T>
129 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
131 T (*func)(
const Eigen::Matrix<T,Eigen::Dynamic, 1>& x,
const void *user_data),
132 const void *user_data,
136 bool (*report_func)(
int loop,
const Eigen::Matrix<T,Eigen::Dynamic, 1>& fitpar,
double fval))
142 Eigen::Matrix<T,Eigen::Dynamic, 1> psum(ndim);
148 psum = p.colwise().sum();
150 if (report_func != NULL && report > 0) {
151 report_func(0,
static_cast< Eigen::Matrix<T,Eigen::Dynamic, 1>
>(p.row(0)),-1.0);
154 for (;;count++,loop++) {
156 ihi = y[1]>y[2] ? (inhi = 2,1) : (inhi = 1,2);
157 for (i = 0; i < mpts; i++) {
163 }
else if (y[i] > y[inhi])
167 rtol = 2.0*std::fabs(y[ihi]-y[ilo])/(std::fabs(y[ihi])+std::fabs(y[ilo]));
171 if (count == report && report_func != NULL) {
172 if (!report_func(loop,
static_cast< Eigen::Matrix<T,Eigen::Dynamic, 1>
>(p.row(ilo)),y[ilo])) {
173 qCritical(
"Interation interrupted.");
179 if (rtol < ftol)
break;
180 if (neval >= max_eval) {
181 qCritical(
"Maximum number of evaluations exceeded.");
185 ytry = tryit<T>(p,y,psum,func,user_data,ihi,neval,-ALPHA);
187 tryit<T>(p,y,psum,func,user_data,ihi,neval,GAMMA);
188 else if (ytry >= y[inhi]) {
190 ytry = tryit<T>(p,y,psum,func,user_data,ihi,neval,BETA);
192 for (i = 0; i < mpts; i++) {
194 psum = 0.5 * ( p.row(i) + p.row(ilo) );
196 y[i] = (*func)(psum,user_data);
200 psum = p.colwise().sum();
210 template <
typename T>
211 T SimplexAlgorithm::tryit(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> &p,
212 Eigen::Matrix<T,Eigen::Dynamic, 1> &y,
213 Eigen::Matrix<T,Eigen::Dynamic, 1> &psum,
214 T (*func)(
const Eigen::Matrix<T,Eigen::Dynamic, 1> &x,
const void *user_data),
215 const void *user_data,
223 Eigen::Matrix<T,Eigen::Dynamic, 1> ptry(ndim);
225 fac1 = (1.0-fac)/ndim;
228 ptry = psum * fac1 - p.row(ihi).transpose() * fac2;
230 ytry = (*func)(ptry,user_data);
236 psum += ptry - p.row(ihi).transpose();
248 #endif // SIMPLEXALGORITHM_H