From 764be714f614572f60a8cce51901d224bb372269 Mon Sep 17 00:00:00 2001
From: Erik Strand <erik.strand@cba.mit.edu>
Date: Thu, 16 Apr 2020 12:21:32 -0400
Subject: [PATCH] Teach nm to build its own simplex

---
 .../optimizers/nelder_mead/nelder_mead.h      | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/optimization/optimizers/nelder_mead/nelder_mead.h b/optimization/optimizers/nelder_mead/nelder_mead.h
index 662d085..36826b1 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 {
-- 
GitLab