104 template<
typename T,
typename CostFunc,
typename ReportFunc>
105 static bool simplex_minimize(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& p,
106 Eigen::Matrix<T, Eigen::Dynamic, 1>& y,
113 ReportFunc&& report_func);
129 template<
typename T,
typename CostFunc>
130 static bool simplex_minimize(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& p,
131 Eigen::Matrix<T, Eigen::Dynamic, 1>& y,
139 template<
typename T,
typename CostFunc>
140 static T tryit(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& p,
141 Eigen::Matrix<T, Eigen::Dynamic, 1>& y,
142 Eigen::Matrix<T, Eigen::Dynamic, 1>& psum,
154T SimplexAlgorithm::tryit(Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& p,
155 Eigen::Matrix<T, Eigen::Dynamic, 1>& y,
156 Eigen::Matrix<T, Eigen::Dynamic, 1>& psum,
189 Eigen::Matrix<T, Eigen::Dynamic, 1>& y,
196 auto no_report = [](int,
const Eigen::Matrix<T, Eigen::Dynamic, 1>&, double, double, double) {
199 return simplex_minimize<T>(p, y, ftol, stol, std::forward<CostFunc>(func), max_eval, neval, -1, no_report);
206 Eigen::Matrix<T, Eigen::Dynamic, 1>& y,
213 ReportFunc&& report_func)
215 constexpr int MIN_STOL_LOOP = 5;
217 int i, ilo, ihi, inhi;
221 Eigen::Matrix<T, Eigen::Dynamic, 1> psum(ndim);
227 psum = p.colwise().sum();
229 constexpr T kAlpha =
static_cast<T
>(1.0);
230 constexpr T kBeta =
static_cast<T
>(0.5);
231 constexpr T kGamma =
static_cast<T
>(2.0);
234 report_func(0,
static_cast<Eigen::Matrix<T, Eigen::Dynamic, 1>
>(p.row(0)), -1.0, -1.0, 0.0);
237 for (;; count++, loop++) {
239 ihi = y[1] > y[2] ? (inhi = 2, 1) : (inhi = 1, 2);
240 for (i = 0; i < mpts; i++) {
246 }
else if (y[i] > y[inhi])
250 rtol = 2.0 * std::fabs(y[ihi] - y[ilo]) / (std::fabs(y[ihi]) + std::fabs(y[ilo]));
254 if (count == report) {
255 if (!report_func(loop,
static_cast<Eigen::Matrix<T, Eigen::Dynamic, 1>
>(p.row(ilo)),
256 y[ilo], y[ihi], std::sqrt(dsum))) {
257 qWarning(
"Iteration interrupted.");
265 if (neval >= max_eval) {
266 qWarning(
"Maximum number of evaluations exceeded.");
271 dsum = (p.row(ilo) - p.row(ihi)).squaredNorm();
272 if (loop > MIN_STOL_LOOP && std::sqrt(dsum) < stol)
275 ytry = tryit<T>(p, y, psum, func, ihi, neval, -kAlpha);
277 tryit<T>(p, y, psum, func, ihi, neval, kGamma);
278 else if (ytry >= y[inhi]) {
280 ytry = tryit<T>(p, y, psum, func, ihi, neval, kBeta);
282 for (i = 0; i < mpts; i++) {
284 psum =
static_cast<T
>(0.5) * (p.row(i) + p.row(ilo));
290 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)