Skip to content

Sparse screw trajectory acceleration

The native screw_linear fitter now evaluates point, plane and pose-anchor residuals without building the derivatives that objective scoring discards. Linearization and marginal covariance still use every analytic Jacobian. Both paths share the original residual arithmetic. The SE(3) left Jacobian uses explicit FP64 three-vector cross products in place of general NumPy broadcast dispatch, preserving the multiply/subtract order.

This applies to fit_continuous_trajectory, artifact-backed trajectory fits, and calibrex trajectory recover-lidar-imu-joint --trajectory screw_linear. Public signatures, schemas, iteration limits, damping, reductions, sparse solve, covariance, IMU factors and quality controls are unchanged. It adds no dependency, approximate arithmetic, JIT compilation or result cache. The separate cubic B-spline fitter is outside this timing claim.

Complete comparisons

The baseline is the maintained implementation at 5a80e7470487ceab148f7d49b560f48c1158665e; the candidate source is 38b98d03be01919abb5d7a12cab5c939001eef95. Both full source trees and the measurement tools were fixed before timing. Each case runs six fresh workers in baseline/candidate, candidate/baseline, baseline/candidate order, with one BLAS thread, no warmups and an unreserved host. The predeclared gate is 2x on the median of the three paired complete API ratios for each case.

The synthetic joint recovery case uses seeds 20261010, 20261011 and 20261012, one pair per seed. Each call includes the full sparse trajectory and six calibration blocks, covariance, interleaved holdout, separability and all 32 signed controls. The recorder retains references and brackets the fit; input hashing and serialization take place after the API timer ends.

The public geometry fit case uses eight already-spent registration captures from AIST GLIM Livox Avia. It selects 128 evenly spaced source indices per capture, associates nearest target points within 1.5 m, and retains 10-neighbour PCA planes with planarity at most 0.2. This produces 1,013 point-to-plane factors. Assigned timestamps span four seconds and five initially perturbed knots; all fits keep the 30-iteration limit. Associations and geometry are fixed before timing. These assigned times and capture-local planes are a derived performance fixture, not a physical trajectory reconstruction or an end-to-end bag/IMU calibration.

Scope Baseline median Candidate median Median paired speedup
Synthetic joint recovery API 88.606 s 37.206 s 2.367x
Synthetic joint fresh worker 93.902 s 42.527 s 2.204x
Public geometry complete fit API 93.289 s 28.347 s 3.143x
Public geometry fresh worker 99.343 s 33.465 s 2.879x

The ratio column is the median of the three pair ratios, rather than the quotient of the separately reported timing medians. Joint API pair ratios range from 2.342x to 2.381x; public geometry ranges from 3.029x to 4.048x on this unreserved host. Both predeclared complete-API gates pass. All six public geometry fits converge in 15 iterations with identical full results.

The full saved result, full fitted knot/calibration/covariance result, complete input and options must agree exactly within every pair, excluding provenance only. Exact equality includes stopping decisions, iteration counts, holdout, signed controls and parameter uncertainty. The archive retains all twelve complete observations and their logs, imported-source digests, both 401-module source trees and the fixed tools.

API time excludes imports, source verification, input preparation and JSON serialization. Fresh-worker time includes these tasks, process startup and exit. Parent-side construction of the fixed geometry fixture and source capsules is outside both clocks. The two cases are reported separately; their speedups are not multiplied or extrapolated to bag decoding, map association or the cubic B-spline pipeline.

The original Windows seed-20261010 case reports max_iterations after 25 iterations while its recovery policy passes. Its pre-existing convergence assertion remains unchanged. Seed 20261011 converges, but both variants fail the same existing holdout gyro gate: about 0.000357 rad against 1.5 times the truth-calibration 0.000236 rad. All its parameter budgets and signed controls pass. Seed 20261012 converges and passes policy. The complete results retain these outcomes. Timing does not establish new calibration accuracy or change any SOTA verdict.

Reproduce and audit

To collect another cohort, supply the eight original registration-00.npz through registration-07.npz captures and their .json hash receipts. Each capture contains FP64 source and target arrays with three columns. Inputs are read in place; the tool neither fetches nor duplicates the bag. Commit runtime and tool changes before measuring and use a new output path:

python tools/benchmark_screw_residual_evaluation.py \
  --geometry-folder outputs/odometry-search-profile-v3 \
  --output outputs/screw-residual-comparison

Audit the complete published cohort without running calibration or archived Python code. It needs the ordinary validation dependencies, including jsonschema, but no GPU or original bag:

python tools/audit_screw_residual_archive.py \
  docs/assets/screw_residual_evaluation/complete-evidence.tar.gz

See the archive inventory and digests. The audit verifies full source capsules, actual imported-module bindings, every result/input/measurement/log digest, complete artifact schemas, pair equality and both clocks. It recomputes medians and gate decisions rather than trusting the supplied summary. Git canonical-text verification also runs during collection; archived sources use LF text, independent of the checkout's line endings.