From f8b48db581730ea484d7307cdac685dcf8b545f9 Mon Sep 17 00:00:00 2001 From: Fan Jiang Date: Wed, 8 Jul 2020 17:10:43 -0400 Subject: [PATCH 1/4] Fix lambda check in logging optimizer --- cython/gtsam/utils/logging_optimizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cython/gtsam/utils/logging_optimizer.py b/cython/gtsam/utils/logging_optimizer.py index b201bb8aa..34f0fe5c9 100644 --- a/cython/gtsam/utils/logging_optimizer.py +++ b/cython/gtsam/utils/logging_optimizer.py @@ -50,5 +50,5 @@ def gtsam_optimize(optimizer: NonlinearOptimizer, def check_convergence(optimizer, current_error, new_error): return (optimizer.iterations() >= params.getMaxIterations()) or ( gtsam.checkConvergence(params.getRelativeErrorTol(), params.getAbsoluteErrorTol(), params.getErrorTol(), - current_error, new_error)) + current_error, new_error)) or (optimizer.lambda_() > params.getlambdaUpperBound()) optimize(optimizer, check_convergence, hook) From 4a0b031a2a07fa15dad643d091a6b3beb4f6bd2a Mon Sep 17 00:00:00 2001 From: Fan Jiang Date: Thu, 9 Jul 2020 14:26:18 -0400 Subject: [PATCH 2/4] add return value in gtsam_optimize --- cython/gtsam/utils/logging_optimizer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cython/gtsam/utils/logging_optimizer.py b/cython/gtsam/utils/logging_optimizer.py index 34f0fe5c9..3f0110945 100644 --- a/cython/gtsam/utils/logging_optimizer.py +++ b/cython/gtsam/utils/logging_optimizer.py @@ -52,3 +52,4 @@ def gtsam_optimize(optimizer: NonlinearOptimizer, gtsam.checkConvergence(params.getRelativeErrorTol(), params.getAbsoluteErrorTol(), params.getErrorTol(), current_error, new_error)) or (optimizer.lambda_() > params.getlambdaUpperBound()) optimize(optimizer, check_convergence, hook) + return optimizer.values() From 8e5f1447e3d57b4722f1089b1fc5152e966cfc00 Mon Sep 17 00:00:00 2001 From: Fan Jiang Date: Sat, 11 Jul 2020 11:54:40 -0400 Subject: [PATCH 3/4] Add check to ensure we are calling lambda on a LM --- cython/gtsam/tests/test_logging_optimizer.py | 15 +++++++++++++++ cython/gtsam/utils/logging_optimizer.py | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/cython/gtsam/tests/test_logging_optimizer.py b/cython/gtsam/tests/test_logging_optimizer.py index 69665db65..2560a72a2 100644 --- a/cython/gtsam/tests/test_logging_optimizer.py +++ b/cython/gtsam/tests/test_logging_optimizer.py @@ -43,6 +43,11 @@ class TestOptimizeComet(GtsamTestCase): self.optimizer = gtsam.GaussNewtonOptimizer( graph, initial, self.params) + self.lmparams = gtsam.LevenbergMarquardtParams() + self.lmoptimizer = gtsam.LevenbergMarquardtOptimizer( + graph, initial, self.lmparams + ) + # setup output capture self.capturedOutput = StringIO() sys.stdout = self.capturedOutput @@ -65,6 +70,16 @@ class TestOptimizeComet(GtsamTestCase): actual = self.optimizer.values() self.gtsamAssertEquals(actual.atRot3(KEY), self.expected, tol=1e-6) + def test_lm_simple_printing(self): + """Make sure we are properly terminating LM""" + def hook(_, error): + print(error) + + gtsam_optimize(self.lmoptimizer, self.lmparams, hook) + + actual = self.lmoptimizer.values() + self.gtsamAssertEquals(actual.atRot3(KEY), self.expected, tol=1e-6) + @unittest.skip("Not a test we want run every time, as needs comet.ml account") def test_comet(self): """Test with a comet hook.""" diff --git a/cython/gtsam/utils/logging_optimizer.py b/cython/gtsam/utils/logging_optimizer.py index a48413212..27b9b3a3a 100644 --- a/cython/gtsam/utils/logging_optimizer.py +++ b/cython/gtsam/utils/logging_optimizer.py @@ -46,6 +46,7 @@ def gtsam_optimize(optimizer, def check_convergence(optimizer, current_error, new_error): return (optimizer.iterations() >= params.getMaxIterations()) or ( gtsam.checkConvergence(params.getRelativeErrorTol(), params.getAbsoluteErrorTol(), params.getErrorTol(), - current_error, new_error)) or (optimizer.lambda_() > params.getlambdaUpperBound()) + current_error, new_error)) or ( + type(optimizer).__name__ == "LevenbergMarquardtOptimizer" and optimizer.lambda_() > params.getlambdaUpperBound()) optimize(optimizer, check_convergence, hook) return optimizer.values() From 566467de5ddec015f419d3be6237899955e4017d Mon Sep 17 00:00:00 2001 From: Fan Jiang Date: Sat, 11 Jul 2020 16:50:25 -0400 Subject: [PATCH 4/4] use isinstance --- cython/gtsam/utils/logging_optimizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cython/gtsam/utils/logging_optimizer.py b/cython/gtsam/utils/logging_optimizer.py index 27b9b3a3a..3d9175951 100644 --- a/cython/gtsam/utils/logging_optimizer.py +++ b/cython/gtsam/utils/logging_optimizer.py @@ -47,6 +47,6 @@ def gtsam_optimize(optimizer, return (optimizer.iterations() >= params.getMaxIterations()) or ( gtsam.checkConvergence(params.getRelativeErrorTol(), params.getAbsoluteErrorTol(), params.getErrorTol(), current_error, new_error)) or ( - type(optimizer).__name__ == "LevenbergMarquardtOptimizer" and optimizer.lambda_() > params.getlambdaUpperBound()) + isinstance(optimizer, gtsam.LevenbergMarquardtOptimizer) and optimizer.lambda_() > params.getlambdaUpperBound()) optimize(optimizer, check_convergence, hook) return optimizer.values()