//! Storage-agnostic building blocks shared by every Schur complement solver:
//! [`sparse::schur::ExplicitSparseSchur`](crate::linalg::sparse::schur::ExplicitSparseSchur),
//! [`sparse::schur::ImplicitSparseSchur`](crate::linalg::sparse::schur::ImplicitSparseSchur), and
//! [`dense::schur::ExplicitDenseSchur`](crate::linalg::dense::schur::ExplicitDenseSchur).
//!
//! Nothing here depends on whether the Hessian is a `SparseColMat` or a dense
//! `Mat`: the variable partition ([`SchurPartition`]), the automatic
//! eliminated/retained classification ([`SchurOrdering`]), the preconditioner
//! selection ([`SchurPreconditioner`]), and the PCG solve loop ([`pcg`]) are
//! the same regardless of storage or of what the eliminated variable
//! represents (a 3-D point, an inverse-depth landmark, or anything else).
pub use ;
pub use ;
pub use ;
pub use ;
pub use SchurPreconditioner;