diff --git a/optimization/optimizers/nelder_mead/nelder_mead.h b/optimization/optimizers/nelder_mead/nelder_mead.h index 662d08597816d3894afe4081882f226b3c19de75..36826b12a30a2508dd615da8bd5d45d022fe6cac 100644 --- a/optimization/optimizers/nelder_mead/nelder_mead.h +++ b/optimization/optimizers/nelder_mead/nelder_mead.h @@ -28,6 +28,8 @@ public: MatrixDN const& simplex_vertices() const { return simplex_vertices_; } VectorN const& simplex_values() const { return simplex_values_; } + // Constructs a simplex from an initial point by offset all coordinate values. + VectorD optimize(Objective& objective, VectorD const& initial_point, Scalar offset = 1); // Each row of simplex is a vertex. VectorD optimize(Objective& objective, MatrixDN const& simplex); @@ -60,6 +62,23 @@ private: static constexpr Scalar tiny_ = 1e-10; }; +//.................................................................................................. +template <typename Objective, int32_t D> +auto NelderMead<Objective, D>::optimize( + Objective& objective, + VectorD const& initial_point, + Scalar offset +) -> VectorD { + MatrixDN simplex; + simplex.resize(initial_point.size(), initial_point.size() + 1); + simplex.col(0) = initial_point; + for (uint32_t i = 0; i < initial_point.size(); ++i) { + simplex.col(i + 1) = initial_point; + simplex(i, i + 1) += offset; + } + return optimize(objective, simplex); +} + //.................................................................................................. template <typename Objective, int32_t D> auto NelderMead<Objective, D>::optimize(Objective& objective, MatrixDN const& simplex) -> VectorD {