102 template <
typename T,
typename CostFunc,
typename ReportFunc>
103 static bool simplex_minimize(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& p,
104 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
111 ReportFunc&& report_func);
117 template <
typename T,
typename CostFunc>
118 static bool simplex_minimize(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic>& p,
119 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
128 template <
typename T,
typename CostFunc>
129 static T tryit(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> &p,
130 Eigen::Matrix<T,Eigen::Dynamic, 1> &y,
131 Eigen::Matrix<T,Eigen::Dynamic, 1> &psum,
143T SimplexAlgorithm::tryit(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> &p,
144 Eigen::Matrix<T,Eigen::Dynamic, 1> &y,
145 Eigen::Matrix<T,Eigen::Dynamic, 1> &psum,
178 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
185 auto no_report = [](int,
const Eigen::Matrix<T,Eigen::Dynamic,1>&, double, double, double) {
return true; };
186 return simplex_minimize<T>(p, y, ftol, stol, std::forward<CostFunc>(func), max_eval, neval, -1, no_report);
193 Eigen::Matrix<T,Eigen::Dynamic, 1>& y,
200 ReportFunc&& report_func)
202 constexpr int MIN_STOL_LOOP = 5;
208 Eigen::Matrix<T,Eigen::Dynamic, 1> psum(ndim);
214 psum = p.colwise().sum();
216 constexpr T kAlpha =
static_cast<T
>(1.0);
217 constexpr T kBeta =
static_cast<T
>(0.5);
218 constexpr T kGamma =
static_cast<T
>(2.0);
221 report_func(0,
static_cast<Eigen::Matrix<T,Eigen::Dynamic, 1>
>(p.row(0)), -1.0, -1.0, 0.0);
224 for (;;count++,loop++) {
226 ihi = y[1]>y[2] ? (inhi = 2,1) : (inhi = 1,2);
227 for (i = 0; i < mpts; i++) {
228 if (y[i] < y[ilo]) ilo = i;
232 }
else if (y[i] > y[inhi])
233 if (i != ihi) inhi = i;
235 rtol = 2.0*std::fabs(y[ihi]-y[ilo])/(std::fabs(y[ihi])+std::fabs(y[ilo]));
239 if (count == report) {
240 if (!report_func(loop,
static_cast<Eigen::Matrix<T,Eigen::Dynamic, 1>
>(p.row(ilo)),
241 y[ilo], y[ihi], std::sqrt(dsum))) {
242 qWarning(
"Iteration interrupted.");
248 if (rtol < ftol)
break;
249 if (neval >= max_eval) {
250 qWarning(
"Maximum number of evaluations exceeded.");
255 dsum = (p.row(ilo) - p.row(ihi)).squaredNorm();
256 if (loop > MIN_STOL_LOOP && std::sqrt(dsum) < stol)
259 ytry = tryit<T>(p,y,psum,func,ihi,neval,-kAlpha);
261 tryit<T>(p,y,psum,func,ihi,neval,kGamma);
262 else if (ytry >= y[inhi]) {
264 ytry = tryit<T>(p,y,psum,func,ihi,neval,kBeta);
266 for (i = 0; i < mpts; i++) {
268 psum =
static_cast<T
>(0.5) * (p.row(i) + p.row(ilo));
274 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)