98 static bool simplex_minimize(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& p,
99 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
102 T (*func)(
const Eigen::Matrix<T,Eigen::Dynamic, 1>& x,
const void *user_data),
103 const void *user_data,
107 bool (*report_func)(
int loop,
108 const Eigen::Matrix<T,Eigen::Dynamic, 1>& fitpar,
115 template <
typename T>
116 static T tryit(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> &p,
117 Eigen::Matrix<T,Eigen::Dynamic, 1> &y,
118 Eigen::Matrix<T,Eigen::Dynamic, 1> &psum,
119 T (*func)(
const Eigen::Matrix<T,Eigen::Dynamic, 1> &x,
const void *user_data),
120 const void *user_data,
131T SimplexAlgorithm::tryit(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> &p,
167 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
170 T (*func)(
const Eigen::Matrix<T,Eigen::Dynamic, 1>& x,
const void *user_data),
171 const void *user_data,
175 bool (*report_func)(
int loop,
176 const Eigen::Matrix<T,Eigen::Dynamic, 1>& fitpar,
181 constexpr int MIN_STOL_LOOP = 5;
187 Eigen::Matrix<T,Eigen::Dynamic, 1> psum(ndim);
193 psum = p.colwise().sum();
195 constexpr T kAlpha =
static_cast<T
>(1.0);
196 constexpr T kBeta =
static_cast<T
>(0.5);
197 constexpr T kGamma =
static_cast<T
>(2.0);
199 if (report_func !=
nullptr && report > 0)
200 report_func(0,
static_cast<Eigen::Matrix<T,Eigen::Dynamic, 1>
>(p.row(0)), -1.0, -1.0, 0.0);
203 for (;;count++,loop++) {
205 ihi = y[1]>y[2] ? (inhi = 2,1) : (inhi = 1,2);
206 for (i = 0; i < mpts; i++) {
207 if (y[i] < y[ilo]) ilo = i;
211 }
else if (y[i] > y[inhi])
212 if (i != ihi) inhi = i;
214 rtol = 2.0*std::fabs(y[ihi]-y[ilo])/(std::fabs(y[ihi])+std::fabs(y[ilo]));
218 if (count == report && report_func !=
nullptr) {
219 if (!report_func(loop,
static_cast<Eigen::Matrix<T,Eigen::Dynamic, 1>
>(p.row(ilo)),
220 y[ilo], y[ihi], std::sqrt(dsum))) {
221 qWarning(
"Iteration interrupted.");
227 if (rtol < ftol)
break;
228 if (neval >= max_eval) {
229 qWarning(
"Maximum number of evaluations exceeded.");
234 dsum = (p.row(ilo) - p.row(ihi)).squaredNorm();
235 if (loop > MIN_STOL_LOOP && std::sqrt(dsum) < stol)
238 ytry = tryit<T>(p,y,psum,func,user_data,ihi,neval,-kAlpha);
240 tryit<T>(p,y,psum,func,user_data,ihi,neval,kGamma);
241 else if (ytry >= y[inhi]) {
243 ytry = tryit<T>(p,y,psum,func,user_data,ihi,neval,kBeta);
245 for (i = 0; i < mpts; i++) {
247 psum =
static_cast<T
>(0.5) * (p.row(i) + p.row(ilo));
249 y[i] = (*func)(psum,user_data);
253 psum = p.colwise().sum();
static bool simplex_minimize(Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &p, Eigen::Matrix< T, Eigen::Dynamic, 1 > &y, T ftol, T stol, T(*func)(const Eigen::Matrix< T, Eigen::Dynamic, 1 > &x, const void *user_data), const void *user_data, int max_eval, int &neval, int report, bool(*report_func)(int loop, const Eigen::Matrix< T, Eigen::Dynamic, 1 > &fitpar, double fval_lo, double fval_hi, double par_diff))