add iteration hook to NonlinearOptimizerParams

release/4.3a0
Gerry Chen 2022-03-08 09:57:11 -05:00
parent bf8137b0c4
commit 5f601f76d5
No known key found for this signature in database
GPG Key ID: E9845092D3A57286
2 changed files with 22 additions and 0 deletions

View File

@ -403,6 +403,8 @@ virtual class NonlinearOptimizerParams {
bool isSequential() const; bool isSequential() const;
bool isCholmod() const; bool isCholmod() const;
bool isIterative() const; bool isIterative() const;
gtsam::NonlinearOptimizerParams::IterationHook iterationHook;
}; };
bool checkConvergence(double relativeErrorTreshold, bool checkConvergence(double relativeErrorTreshold,

View File

@ -83,6 +83,26 @@ class TestScenario(GtsamTestCase):
actual = GncLMOptimizer(self.fg, self.initial_values, gncParams).optimize() actual = GncLMOptimizer(self.fg, self.initial_values, gncParams).optimize()
self.assertAlmostEqual(0, self.fg.error(actual)) self.assertAlmostEqual(0, self.fg.error(actual))
def test_iteration_hook(self):
# set up iteration hook to track some testable values
iteration_count = 0
final_error = 0
final_values = None
def iteration_hook(iter, error_before, error_after):
nonlocal iteration_count, final_error, final_values
iteration_count = iter
final_error = error_after
final_values = optimizer.values()
# optimize
params = LevenbergMarquardtParams.CeresDefaults()
params.setOrdering(self.ordering)
params.iterationHook = iteration_hook
optimizer = LevenbergMarquardtOptimizer(self.fg, self.initial_values, params)
actual = optimizer.optimize()
self.assertAlmostEqual(0, self.fg.error(actual))
self.gtsamAssertEquals(final_values, actual)
self.assertEqual(self.fg.error(actual), final_error)
self.assertEqual(optimizer.iterations(), iteration_count)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()