pub enum ArrowSolverMode {
Direct,
SqrtBA,
InexactPCG,
}Expand description
BA Schur solve variant for the reduced shared β system.
-
ArrowSolverMode::Directis BA’s dense reduced-camera-system solve: eliminate the per-point/per-row blocks, form the reduced system, and Cholesky factor it. This is the Ceres/g2o default for modest camera counts and is appropriate here forK <= 2000. GPU support: ✓ — requires dense H_ββ and dense per-row H_tβ slabs. -
ArrowSolverMode::SqrtBAports Square-Root BA (Demmel/Gao/Gu et al., CVPR 2021): Schur terms are formed as(L_i^-1 H_tβ_i)^T (L_i^-1 H_tβ_i)from the per-row square-root factorL_i, avoiding explicitH_tt^-1 H_tβproducts. It is the preferred direct path when single-precision assembly is introduced or when row blocks are poorly conditioned. GPU support: ✓ — requires dense H_ββ and dense per-row H_tβ slabs. -
ArrowSolverMode::InexactPCGports “Bundle Adjustment in the Large” (Agarwal et al.): the Schur system is solved inexactly by PCG with a Jacobi Schur preconditioner, avoiding denseK × Kfactorization for SAE-manifold scale shared systems. GPU support: CPU only until the row-procedural H_tβ GPU PCG path (issue #288 Part B) is wired. The topology selector must not requestInexactPCGvia the GPU entry point;solve_arrow_newton_stepreturnsGpuRequiresDenseSystemfor matrix-free systems, and the wrapper insolver/gpu/arrow_schur_gpu.rsroutes those to CPU InexactPCG automatically. At K ≥ 5000 the GPU PCG path will supersede the CPU path once the row-procedural H_tβ kernel and boxed GPU matvec backend inrun_pcg_with_preconditionerare wired.
Variants§
Implementations§
Source§impl ArrowSolverMode
impl ArrowSolverMode
Sourcepub const fn automatic(k: usize) -> Self
pub const fn automatic(k: usize) -> Self
BA-size heuristic: dense RCS for modest K, inexact Schur PCG for
large shared systems. This follows Agarwal et al.’s direct-vs-iterative
split for large BA, mapped from cameras to decoder coefficients.
Sourcepub const fn automatic_for_single_precision(k: usize) -> Self
pub const fn automatic_for_single_precision(k: usize) -> Self
Square-Root BA is the direct-solve stability mode for future f32
callers. Large K still routes to inexact PCG because dense Schur
storage dominates precision concerns at that scale.
Trait Implementations§
Source§impl Clone for ArrowSolverMode
impl Clone for ArrowSolverMode
Source§fn clone(&self) -> ArrowSolverMode
fn clone(&self) -> ArrowSolverMode
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for ArrowSolverMode
Source§impl Debug for ArrowSolverMode
impl Debug for ArrowSolverMode
impl Eq for ArrowSolverMode
Source§impl PartialEq for ArrowSolverMode
impl PartialEq for ArrowSolverMode
Source§fn eq(&self, other: &ArrowSolverMode) -> bool
fn eq(&self, other: &ArrowSolverMode) -> bool
self and other values to be equal, and is used by ==.impl StructuralPartialEq for ArrowSolverMode
Auto Trait Implementations§
impl Freeze for ArrowSolverMode
impl RefUnwindSafe for ArrowSolverMode
impl Send for ArrowSolverMode
impl Sync for ArrowSolverMode
impl Unpin for ArrowSolverMode
impl UnsafeUnpin for ArrowSolverMode
impl UnwindSafe for ArrowSolverMode
Blanket Implementations§
impl<T> Allocation for T
impl<T> Boilerplate for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
impl<T, U> Imply<T> for U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
impl<T> Scalar for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.