Skip to main content

BlockLu

Struct BlockLu 

Source
pub struct BlockLu { /* private fields */ }
Expand description

A numeric block LU factorization, computed against a BlockSymbolic’s known structure — either freshly analyzed (factorize) or reusing an existing BlockSymbolic across calls (refactor, the cheap path used once per Newton-Raphson iteration).

Simplification, clearly scoped: this uses the diagonal entry as the pivot for each column directly — no partial pivoting (row swapping). Partial pivoting on a sparse block matrix would mean swapping entries across every already-factored column’s stored structure, potentially inserting or removing sparse entries (new fill-in from the swap itself), a substantially larger and more fragile undertaking than the rest of this module. Power-system Y-bus/Jacobian matrices are normally diagonally dominant enough for this to succeed; factorization returns None (treated as singular, same contract as sparse::RealSparseSystem) if a diagonal pivot is ever too close to singular, rather than silently producing a wrong answer.

Relies on the Y-bus/Jacobian’s sparsity pattern being structurally symmetric (if bus i affects bus k, bus k affects bus i too, since branch admittance couples both directions) for BlockSymbolic::analyze’s structural reachability search, which uses BlockAdjacency::row for both row and column structural lookups on that assumption. The numeric scatter step below needs actual column values though (block(i, j) != block(j, i) in general for this matrix), so it reads BlockAdjacency::col rather than reusing row values under the same assumption.

Implementations§

Source§

impl BlockLu

Source

pub fn factorize(adj: &BlockAdjacency) -> Option<Self>

Analyzes adj’s structure and factorizes it in one step. Prefer refactor when solving the same sparsity pattern repeatedly (e.g. across Newton-Raphson iterations) — it skips the colamd ordering and elimination-graph reachability search entirely, reusing a cached BlockSymbolic instead.

Source

pub fn refactor(symbolic: &BlockSymbolic, adj: &BlockAdjacency) -> Option<Self>

Numeric-only refactorization against symbolic’s known structure — no ordering or reachability recomputation, just walking the already known l_struct/u_struct positions and computing their (new) numeric values. Returns None if any diagonal pivot is singular.

adj must have the exact same sparsity pattern symbolic was built from (values may differ) — this is not re-validated, matching sparse::RealSparseSystem::factor_and_solve’s same-pattern requirement.

Source

pub fn solve(&self, b: &[[f64; 2]]) -> Vec<[f64; 2]>

Solves A x = b using this factorization. b is in original (unpermuted) bus indexing; the result is too.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> ByRef<T> for T

Source§

fn by_ref(&self) -> &T

Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> DistributionExt for T
where T: ?Sized,

Source§

fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> T
where Self: Distribution<T>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Imply<T> for U
where T: ?Sized, U: ?Sized,

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V