pub struct ArrowSchurInnerConfig {
pub n_rows: usize,
pub latent_dim: usize,
pub n_beta: usize,
pub build: Arc<dyn Fn(&Array1<f64>) -> Option<ArrowSchurSystem> + Send + Sync>,
pub solver_mode: Option<ArrowSolverMode>,
pub streaming_chunk_size: Option<usize>,
pub trust_region_radius: f64,
pub block_offsets: Option<Arc<[Range<usize>]>>,
pub apply_delta_t: Arc<dyn Fn(&Array1<f64>) + Send + Sync>,
pub snapshot_t: Arc<dyn Fn() -> Array1<f64> + Send + Sync>,
pub restore_t: Arc<dyn Fn(&Array1<f64>) + Send + Sync>,
}Expand description
Per-iteration arrow-Schur builder hook.
The driver supplies a closure that, given the current β iterate,
returns a freshly-populated crate::arrow_schur::ArrowSchurSystem
— i.e. the per-row H_tt^(i), H_tβ^(i), g_t^(i) blocks and the
β-block H_ββ, g_β. The driver owns the assembly because the
per-row Jacobians depend on the latent-coord term’s basis (Duchon,
Sphere, …) and the analytic-penalty contributions depend on the
registry the outer-fit configuration owns. PIRLS only knows how to
solve the bordered system once it has been assembled.
Fields§
§n_rows: usizeNumber of latent rows N.
latent_dim: usizeLatent dimensionality d.
n_beta: usizeβ dimensionality K (must match the inner Hessian dimension).
build: Arc<dyn Fn(&Array1<f64>) -> Option<ArrowSchurSystem> + Send + Sync>Closure that builds the bordered system at the current β and
current latent t (the latter held externally by the driver, e.g.
in a LatentCoordValues registered alongside the working model).
Returning None signals “fall back to the β-only path for this
iteration” — useful for the seeding sweep before t has been
initialized.
solver_mode: Option<ArrowSolverMode>BA Schur solve mode. None selects Direct for K <= 2000 and
InexactPCG above, following “Bundle Adjustment in the Large”.
streaming_chunk_size: Option<usize>When set, assemble the reduced dense Schur block in row chunks.
trust_region_radius: f64Steihaug trust-region radius for the reduced shared step. This ports the Ceres/BA trust-region guard while retaining PIRLS’s LM damping.
block_offsets: Option<Arc<[Range<usize>]>>Optional β-block column ranges for the block-Jacobi Schur preconditioner.
When Some, the PIRLS driver calls
crate::arrow_schur::ArrowSchurSystem::set_block_offsets on
every system returned by the build closure, wiring the block-Jacobi
path without requiring each family’s closure to call it manually.
Derive from ParameterBlockSpec slices via
gam_custom_family::block_offsets_from_specs. When
None, the preconditioner falls back to scalar-diagonal Jacobi (the
pre-#287 behaviour); when Some([]) (empty slice), the same fallback
applies.
apply_delta_t: Arc<dyn Fn(&Array1<f64>) + Send + Sync>Callback that the inner solver invokes after each LM-attempted
joint step to write the latent tangent increment back into the
driver’s LatentCoordValues via that latent’s update rule
(retract_flat_delta for manifold latents). delta_t is the flat
row-major increment of length n_rows * latent_dim.
snapshot_t: Arc<dyn Fn() -> Array1<f64> + Send + Sync>Snapshot the driver’s latent field before an LM trial step mutates it.
restore_t: Arc<dyn Fn(&Array1<f64>) + Send + Sync>Restore a snapshot produced by Self::snapshot_t after any rejected
LM trial. Accepted trials deliberately do not call this hook: β and t
commit together.
Trait Implementations§
Source§impl Clone for ArrowSchurInnerConfig
impl Clone for ArrowSchurInnerConfig
Source§fn clone(&self) -> ArrowSchurInnerConfig
fn clone(&self) -> ArrowSchurInnerConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl !RefUnwindSafe for ArrowSchurInnerConfig
impl !UnwindSafe for ArrowSchurInnerConfig
impl Freeze for ArrowSchurInnerConfig
impl Send for ArrowSchurInnerConfig
impl Sync for ArrowSchurInnerConfig
impl Unpin for ArrowSchurInnerConfig
impl UnsafeUnpin for ArrowSchurInnerConfig
Blanket Implementations§
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,
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,
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.