From 245827ac854405cd03d3218a29c09530549bc5c2 Mon Sep 17 00:00:00 2001
From: joanvallve <jvallve@iri.upc.edu>
Date: Fri, 12 Nov 2021 09:58:49 +0100
Subject: [PATCH] adding more parameters

---
 include/core/ceres_wrapper/solver_ceres.h     | 43 +++++++++++++++++--
 ...ree_manager_sliding_window_dual_rate3.yaml |  6 +--
 ...ger_sliding_window_dual_rate_baseline.yaml |  5 +--
 test/yaml/solver.yaml                         |  9 ++++
 4 files changed, 50 insertions(+), 13 deletions(-)
 create mode 100644 test/yaml/solver.yaml

diff --git a/include/core/ceres_wrapper/solver_ceres.h b/include/core/ceres_wrapper/solver_ceres.h
index 4bf6f7de6..0c94e4c5e 100644
--- a/include/core/ceres_wrapper/solver_ceres.h
+++ b/include/core/ceres_wrapper/solver_ceres.h
@@ -44,17 +44,52 @@ struct ParamsCeres : public ParamsSolver
         if (update_immediately)
             min_num_iterations                  = _server.getParam<int>(prefix + "min_num_iterations");
 
-        // ceres solver options
+        // CERES SOLVER OPTIONS
         solver_options.max_num_iterations       = _server.getParam<int>(prefix + "max_num_iterations");
+        solver_options.function_tolerance       = _server.getParam<double>(prefix + "function_tolerance");
+        solver_options.gradient_tolerance       = _server.getParam<double>(prefix + "gradient_tolerance");
         solver_options.num_threads              = _server.getParam<int>(prefix + "n_threads");
-        covariance_options.num_threads          = _server.getParam<int>(prefix + "n_threads");
+        covariance_options.num_threads = solver_options.num_threads;
+
+        // minimizer type
+        std::string minimizer                   = _server.getParam<std::string>(prefix + "minimizer");
+        if (minimizer == "LEVENBERG_MARQUARDT" or minimizer == "levenberg_marquardt")
+        {
+            solver_options.minimizer_type = ceres::TRUST_REGION;
+            solver_options.trust_region_strategy_type = ceres::LEVENBERG_MARQUARDT;
+        }
+        else if (minimizer == "DOGLEG" or minimizer == "dogleg")
+        {
+            solver_options.minimizer_type = ceres::TRUST_REGION;
+            solver_options.trust_region_strategy_type = ceres::DOGLEG;
+        }
+        else if (minimizer == "LBFGS" or minimizer == "lbfgs")
+        {
+            solver_options.minimizer_type = ceres::LINE_SEARCH;
+            solver_options.line_search_direction_type == ceres::LBFGS;
+        }
+        else if (minimizer == "BFGS" or minimizer == "bfgs")
+        {
+            solver_options.minimizer_type = ceres::LINE_SEARCH;
+            solver_options.line_search_direction_type == ceres::LBFGS;
+        }
+        else
+        {
+            throw std::runtime_error("ParamsCeres: Wrong parameter 'minimizer'. Should be 'LEVENBERG_MARQUARDT', 'DOGLEG', 'LBFGS' or 'BFGS' (upper or lowercase)");
+        }
+
+        // specific options for TRUST REGION
+        if (solver_options.minimizer_type == ceres::TRUST_REGION)
+        {
+            solver_options.use_nonmonotonic_steps   = _server.getParam<bool>(prefix + "use_nonmonotonic_steps");
+            if (solver_options.use_nonmonotonic_steps)
+                solver_options.max_consecutive_nonmonotonic_steps = _server.getParam<int>(prefix + "max_consecutive_nonmonotonic_steps");
+        }
     }
 
     void loadHardcodedValues()
     {
         solver_options = ceres::Solver::Options();
-        solver_options.minimizer_type = ceres::TRUST_REGION; //ceres::LINE_SEARCH;
-        solver_options.trust_region_strategy_type = ceres::LEVENBERG_MARQUARDT; //ceres::DOGLEG;
         problem_options = ceres::Problem::Options();
         covariance_options = ceres::Covariance::Options();
         problem_options.cost_function_ownership = ceres::DO_NOT_TAKE_OWNERSHIP;
diff --git a/test/yaml/params_tree_manager_sliding_window_dual_rate3.yaml b/test/yaml/params_tree_manager_sliding_window_dual_rate3.yaml
index 8f00f6499..0b030b80f 100644
--- a/test/yaml/params_tree_manager_sliding_window_dual_rate3.yaml
+++ b/test/yaml/params_tree_manager_sliding_window_dual_rate3.yaml
@@ -1,10 +1,6 @@
 config:
   solver:
-    period: 1
-    verbose: 2
-    update_immediately: false
-    max_num_iterations: 10
-    n_threads: 2
+    follow: "test/yaml/solver.yaml"
   problem:
     frame_structure: "PO"
     dimension: 3
diff --git a/test/yaml/params_tree_manager_sliding_window_dual_rate_baseline.yaml b/test/yaml/params_tree_manager_sliding_window_dual_rate_baseline.yaml
index 114e865bd..d00b201f9 100644
--- a/test/yaml/params_tree_manager_sliding_window_dual_rate_baseline.yaml
+++ b/test/yaml/params_tree_manager_sliding_window_dual_rate_baseline.yaml
@@ -1,9 +1,6 @@
 config:
   solver:
-    period: 1
-    verbose: 2
-    update_immediately: false
-    max_num_iterations: 10
+    follow: "test/yaml/solver.yaml"
   problem:
     frame_structure: "PO"
     dimension: 3
diff --git a/test/yaml/solver.yaml b/test/yaml/solver.yaml
new file mode 100644
index 000000000..a748fc649
--- /dev/null
+++ b/test/yaml/solver.yaml
@@ -0,0 +1,9 @@
+period: 1
+verbose: 2
+update_immediately: false
+max_num_iterations: 1000
+n_threads: 2
+function_tolerance: 0.000001
+gradient_tolerance: 0.0000000001
+minimizer: "LEVENBERG_MARQUARDT"
+use_nonmonotonic_steps: false
\ No newline at end of file
-- 
GitLab