Skip to content

liblaf.peach.linalg.fallback

Fallback linear-solver orchestration.

Classes:

FallbackSolver

Bases: LinearSolver[FallbackState, FallbackStats]


              flowchart TD
              liblaf.peach.linalg.fallback.FallbackSolver[FallbackSolver]
              liblaf.peach.linalg.base._solver.LinearSolver[LinearSolver]

                              liblaf.peach.linalg.base._solver.LinearSolver --> liblaf.peach.linalg.fallback.FallbackSolver
                


              click liblaf.peach.linalg.fallback.FallbackSolver href "" "liblaf.peach.linalg.fallback.FallbackSolver"
              click liblaf.peach.linalg.base._solver.LinearSolver href "" "liblaf.peach.linalg.base._solver.LinearSolver"
            

Parameters:

  • solvers (list[LinearSolver], default: [CupyCG(maxiter=None, rtol=1e-05, atol=0.0), CupyMinRes(maxiter=None, shift=0.0, tol=1e-05)] ) –

Type Aliases:

  • Solution

    Linear-solver output bundle.

Methods:

  • compute

    Run one complete solve from an initialized state.

  • init

    Create solver state from an initial parameter vector.

  • postprocess

    Wrap final state and result metadata in a solution object.

  • solve

    Initialize, compute, and postprocess a linear solve.

Attributes:

solvers class-attribute instance-attribute

solvers: list[LinearSolver] = field(
    factory=_default_solvers
)

Solution

Linear-solver output bundle.

Parameters:

  • result (Result) –
  • state (S) –
  • stats (T) –

compute

compute(
    problem: BaseProblem, state: FallbackState
) -> Result

Run one complete solve from an initialized state.

Source code in src/liblaf/peach/linalg/fallback/_fallback.py
@override
def compute(self, problem: BaseProblem, state: State) -> Result:
    problem: Problem = cast("Problem", problem)
    results: list[Result] = []
    absolute_residuals: list[Scalar] = []
    relative_residuals: list[Scalar] = []
    for solver in self.solvers:
        solution: Solution = solver.solve(problem, state.init_params)
        state.solutions.append(solution)
        results.append(solution.result)
        absolute_residual: Scalar = torch.linalg.vector_norm(
            problem.matvec(solution.state.params) - problem.b
        )
        relative_residual: Scalar = absolute_residual / torch.linalg.vector_norm(
            problem.b
        )
        absolute_residuals.append(absolute_residual)
        relative_residuals.append(relative_residual)
        if solution.success:
            break
    state.absolute_residuals = torch.as_tensor(absolute_residuals)
    state.relative_residuals = torch.as_tensor(relative_residuals)
    state.best_index = torch.argmin(state.absolute_residuals)
    return state.result

init

init(problem: BaseProblem, params: Vector) -> FallbackState

Create solver state from an initial parameter vector.

Source code in src/liblaf/peach/linalg/fallback/_fallback.py
@override
def init(self, problem: BaseProblem, params: Vector) -> State:
    return self.State(init_params=params)

postprocess

postprocess(
    problem: BaseProblem, state: S, result: Result
) -> Solution[S, T]

Wrap final state and result metadata in a solution object.

Source code in src/liblaf/peach/linalg/base/_solver.py
def postprocess(
    self, problem: BaseProblem, state: S, result: Result
) -> Solution[S, T]:
    """Wrap final state and result metadata in a solution object."""
    del problem
    stats: T = cast("T", self.Stats())  # ty:ignore[call-non-callable]
    return Solution(result=result, state=state, stats=stats)

solve

solve(
    problem: BaseProblem, params: Vector
) -> Solution[S, T]

Initialize, compute, and postprocess a linear solve.

Source code in src/liblaf/peach/linalg/base/_solver.py
def solve(self, problem: BaseProblem, params: Vector) -> Solution[S, T]:
    """Initialize, compute, and postprocess a linear solve."""
    state: S = self.init(problem, params)
    result: Result = self.compute(problem, state)
    return self.postprocess(problem, state, result)

FallbackState

Bases: State


              flowchart TD
              liblaf.peach.linalg.fallback.FallbackState[FallbackState]
              liblaf.peach.linalg.base._types.State[State]

                              liblaf.peach.linalg.base._types.State --> liblaf.peach.linalg.fallback.FallbackState
                


              click liblaf.peach.linalg.fallback.FallbackState href "" "liblaf.peach.linalg.fallback.FallbackState"
              click liblaf.peach.linalg.base._types.State href "" "liblaf.peach.linalg.base._types.State"
            

State collected while trying multiple linear solvers.

Parameters:

  • init_params (Vector) –
  • solutions (list[Solution], default: <dynamic> ) –

    Built-in mutable sequence.

    If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

  • absolute_residuals (Float[Tensor, S], default: <dynamic> ) –

    Built-in mutable sequence.

    If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

  • relative_residuals (Float[Tensor, S], default: <dynamic> ) –

    Built-in mutable sequence.

    If no argument is given, the constructor creates a new empty list. The argument must be an iterable if specified.

  • best_index (Integer[Tensor, ''], default: tensor(0, dtype=torch.int32) ) –

Attributes:

absolute_residuals class-attribute instance-attribute

absolute_residuals: Float[Tensor, " S"] = field(
    factory=list
)

best_index class-attribute instance-attribute

best_index: Integer[Tensor, ""] = field(
    factory=lambda: as_tensor(0, dtype=int32)
)

best_solution property

best_solution: Solution

init_params instance-attribute

init_params: Vector

params property

params: Vector

Current solution estimate.

relative_residuals class-attribute instance-attribute

relative_residuals: Float[Tensor, " S"] = field(
    factory=list
)

result property

result: Result

solutions class-attribute instance-attribute

solutions: list[Solution] = field(factory=list)

FallbackStats

Bases: Stats


              flowchart TD
              liblaf.peach.linalg.fallback.FallbackStats[FallbackStats]
              liblaf.peach.linalg.base._types.Stats[Stats]

                              liblaf.peach.linalg.base._types.Stats --> liblaf.peach.linalg.fallback.FallbackStats
                


              click liblaf.peach.linalg.fallback.FallbackStats href "" "liblaf.peach.linalg.fallback.FallbackStats"
              click liblaf.peach.linalg.base._types.Stats href "" "liblaf.peach.linalg.base._types.Stats"
            

Stats placeholder for fallback linear solves.