103 template <
typename T,
typename CostFunc,
typename ReportFunc>
104 static bool simplex_minimize(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& p,
105 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
112 ReportFunc&& report_func);
118 template <
typename T,
typename CostFunc>
119 static bool simplex_minimize(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& p,
120 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
129 template <
typename T,
typename CostFunc>
130 static T tryit(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> &p,
131 Eigen::Matrix<T,Eigen::Dynamic, 1> &y,
132 Eigen::Matrix<T,Eigen::Dynamic, 1> &psum,
144T SimplexAlgorithm::tryit(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> &p,
145 Eigen::Matrix<T,Eigen::Dynamic, 1> &y,
146 Eigen::Matrix<T,Eigen::Dynamic, 1> &psum,
179 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
186 auto no_report = [](int,
const Eigen::Matrix<T,Eigen::Dynamic,1>&, double, double, double) {
return true; };
187 return simplex_minimize<T>(p, y, ftol, stol, std::forward<CostFunc>(func), max_eval, neval, -1, no_report);
194 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
201 ReportFunc&& report_func)
203 constexpr int MIN_STOL_LOOP = 5;
209 Eigen::Matrix<T,Eigen::Dynamic, 1> psum(ndim);
215 psum = p.colwise().sum();
217 constexpr T kAlpha =
static_cast<T
>(1.0);
218 constexpr T kBeta =
static_cast<T
>(0.5);
219 constexpr T kGamma =
static_cast<T
>(2.0);
222 report_func(0,
static_cast<Eigen::Matrix<T,Eigen::Dynamic, 1>
>(p.row(0)), -1.0, -1.0, 0.0);
225 for (;;count++,loop++) {
227 ihi = y[1]>y[2] ? (inhi = 2,1) : (inhi = 1,2);
228 for (i = 0; i < mpts; i++) {
229 if (y[i] < y[ilo]) ilo = i;
233 }
else if (y[i] > y[inhi])
234 if (i != ihi) inhi = i;
236 rtol = 2.0*std::fabs(y[ihi]-y[ilo])/(std::fabs(y[ihi])+std::fabs(y[ilo]));
240 if (count == report) {
241 if (!report_func(loop,
static_cast<Eigen::Matrix<T,Eigen::Dynamic, 1>
>(p.row(ilo)),
242 y[ilo], y[ihi], std::sqrt(dsum))) {
243 qWarning(
"Iteration interrupted.");
249 if (rtol < ftol)
break;
250 if (neval >= max_eval) {
251 qWarning(
"Maximum number of evaluations exceeded.");
256 dsum = (p.row(ilo) - p.row(ihi)).squaredNorm();
257 if (loop > MIN_STOL_LOOP && std::sqrt(dsum) < stol)
260 ytry = tryit<T>(p,y,psum,func,ihi,neval,-kAlpha);
262 tryit<T>(p,y,psum,func,ihi,neval,kGamma);
263 else if (ytry >= y[inhi]) {
265 ytry = tryit<T>(p,y,psum,func,ihi,neval,kBeta);
267 for (i = 0; i < mpts; i++) {
269 psum =
static_cast<T
>(0.5) * (p.row(i) + p.row(ilo));
275 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, CostFunc &&func, int max_eval, int &neval, int report, ReportFunc &&report_func)