Skip to content

Commit 8622ab2

Browse files
cdtwiggfacebook-github-bot
authored andcommitted
Add sequence Cholesky solver (#1396)
Summary: Add a separate `SequenceCholeskySolver` for sequence problems where the existing online-QR solver is too expensive. The new solver accumulates compact banded normal equations online, packs frame-local and universal columns contiguously before `J^T J`, supports chunked multithreaded accumulation with deterministic boundary and sequence-error handling, and solves the banded system with block LDLT by default. A scalar banded LDLT path remains user-switchable for debugging and benchmarking. Compact normal-equation accumulation defaults to double precision so float error functions can still evaluate residuals and Jacobians in float without losing precision before the double LDLT solve. This diff also extracts shared sequence-solver helpers into `SequenceSolverBase`, exposes read-only `SequenceSolverFunction` accessors needed by the solver, wires the new solver into Momentum build/fwd generation, adds solver timing counters for normal-equation accumulation and linear solve, and adds a benchmark target that compares QR, block LDLT, scalar LDLT behavior, chunk size, `J^T J` packing, double normal-equation accumulation, and 93-joint larger-character cases. Reviewed By: cstollmeta Differential Revision: D105035576
1 parent c991716 commit 8622ab2

10 files changed

Lines changed: 1710 additions & 100 deletions

File tree

cmake/build_variables.bzl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,8 @@ character_sequence_solver_public_headers = [
442442
"character_sequence_solver/multipose_solver_function.h",
443443
"character_sequence_solver/multipose_solver.h",
444444
"character_sequence_solver/sequence_error_function.h",
445+
"character_sequence_solver/sequence_cholesky_solver.h",
446+
"character_sequence_solver/sequence_solver_base.h",
445447
"character_sequence_solver/sequence_solver_function.h",
446448
"character_sequence_solver/sequence_solver.h",
447449
"character_sequence_solver/state_sequence_error_function.h",
@@ -456,6 +458,7 @@ character_sequence_solver_sources = [
456458
"character_sequence_solver/model_parameters_sequence_error_function.cpp",
457459
"character_sequence_solver/multipose_solver_function.cpp",
458460
"character_sequence_solver/multipose_solver.cpp",
461+
"character_sequence_solver/sequence_cholesky_solver.cpp",
459462
"character_sequence_solver/sequence_solver_function.cpp",
460463
"character_sequence_solver/sequence_solver.cpp",
461464
"character_sequence_solver/state_sequence_error_function.cpp",

momentum/character_sequence_solver/fwd.h

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,26 @@ using MultiposeSolverOptions_const_p = ::std::shared_ptr<const MultiposeSolverOp
2424
using MultiposeSolverOptions_const_u = ::std::unique_ptr<const MultiposeSolverOptions>;
2525
using MultiposeSolverOptions_const_w = ::std::weak_ptr<const MultiposeSolverOptions>;
2626

27+
struct SequenceCholeskySolverOptions;
28+
29+
using SequenceCholeskySolverOptions_p = ::std::shared_ptr<SequenceCholeskySolverOptions>;
30+
using SequenceCholeskySolverOptions_u = ::std::unique_ptr<SequenceCholeskySolverOptions>;
31+
using SequenceCholeskySolverOptions_w = ::std::weak_ptr<SequenceCholeskySolverOptions>;
32+
using SequenceCholeskySolverOptions_const_p =
33+
::std::shared_ptr<const SequenceCholeskySolverOptions>;
34+
using SequenceCholeskySolverOptions_const_u =
35+
::std::unique_ptr<const SequenceCholeskySolverOptions>;
36+
using SequenceCholeskySolverOptions_const_w = ::std::weak_ptr<const SequenceCholeskySolverOptions>;
37+
38+
struct SequenceSolverOptionsBase;
39+
40+
using SequenceSolverOptionsBase_p = ::std::shared_ptr<SequenceSolverOptionsBase>;
41+
using SequenceSolverOptionsBase_u = ::std::unique_ptr<SequenceSolverOptionsBase>;
42+
using SequenceSolverOptionsBase_w = ::std::weak_ptr<SequenceSolverOptionsBase>;
43+
using SequenceSolverOptionsBase_const_p = ::std::shared_ptr<const SequenceSolverOptionsBase>;
44+
using SequenceSolverOptionsBase_const_u = ::std::unique_ptr<const SequenceSolverOptionsBase>;
45+
using SequenceSolverOptionsBase_const_w = ::std::weak_ptr<const SequenceSolverOptionsBase>;
46+
2747
struct SequenceSolverOptions;
2848

2949
using SequenceSolverOptions_p = ::std::shared_ptr<SequenceSolverOptions>;
@@ -196,6 +216,44 @@ using MultiposeSolverFunctiond_const_p = ::std::shared_ptr<const MultiposeSolver
196216
using MultiposeSolverFunctiond_const_u = ::std::unique_ptr<const MultiposeSolverFunctiond>;
197217
using MultiposeSolverFunctiond_const_w = ::std::weak_ptr<const MultiposeSolverFunctiond>;
198218

219+
template <typename T>
220+
class SequenceCholeskySolverT;
221+
using SequenceCholeskySolver = SequenceCholeskySolverT<float>;
222+
using SequenceCholeskySolverd = SequenceCholeskySolverT<double>;
223+
224+
using SequenceCholeskySolver_p = ::std::shared_ptr<SequenceCholeskySolver>;
225+
using SequenceCholeskySolver_u = ::std::unique_ptr<SequenceCholeskySolver>;
226+
using SequenceCholeskySolver_w = ::std::weak_ptr<SequenceCholeskySolver>;
227+
using SequenceCholeskySolver_const_p = ::std::shared_ptr<const SequenceCholeskySolver>;
228+
using SequenceCholeskySolver_const_u = ::std::unique_ptr<const SequenceCholeskySolver>;
229+
using SequenceCholeskySolver_const_w = ::std::weak_ptr<const SequenceCholeskySolver>;
230+
231+
using SequenceCholeskySolverd_p = ::std::shared_ptr<SequenceCholeskySolverd>;
232+
using SequenceCholeskySolverd_u = ::std::unique_ptr<SequenceCholeskySolverd>;
233+
using SequenceCholeskySolverd_w = ::std::weak_ptr<SequenceCholeskySolverd>;
234+
using SequenceCholeskySolverd_const_p = ::std::shared_ptr<const SequenceCholeskySolverd>;
235+
using SequenceCholeskySolverd_const_u = ::std::unique_ptr<const SequenceCholeskySolverd>;
236+
using SequenceCholeskySolverd_const_w = ::std::weak_ptr<const SequenceCholeskySolverd>;
237+
238+
template <typename T>
239+
class SequenceSolverBaseT;
240+
using SequenceSolverBase = SequenceSolverBaseT<float>;
241+
using SequenceSolverBased = SequenceSolverBaseT<double>;
242+
243+
using SequenceSolverBase_p = ::std::shared_ptr<SequenceSolverBase>;
244+
using SequenceSolverBase_u = ::std::unique_ptr<SequenceSolverBase>;
245+
using SequenceSolverBase_w = ::std::weak_ptr<SequenceSolverBase>;
246+
using SequenceSolverBase_const_p = ::std::shared_ptr<const SequenceSolverBase>;
247+
using SequenceSolverBase_const_u = ::std::unique_ptr<const SequenceSolverBase>;
248+
using SequenceSolverBase_const_w = ::std::weak_ptr<const SequenceSolverBase>;
249+
250+
using SequenceSolverBased_p = ::std::shared_ptr<SequenceSolverBased>;
251+
using SequenceSolverBased_u = ::std::unique_ptr<SequenceSolverBased>;
252+
using SequenceSolverBased_w = ::std::weak_ptr<SequenceSolverBased>;
253+
using SequenceSolverBased_const_p = ::std::shared_ptr<const SequenceSolverBased>;
254+
using SequenceSolverBased_const_u = ::std::unique_ptr<const SequenceSolverBased>;
255+
using SequenceSolverBased_const_w = ::std::weak_ptr<const SequenceSolverBased>;
256+
199257
template <typename T>
200258
class SequenceSolverT;
201259
using SequenceSolver = SequenceSolverT<float>;

0 commit comments

Comments
 (0)