# ProbabilisticLinearSolver¶

class probnum.linalg.solvers.ProbabilisticLinearSolver(policy, information_op, belief_update, stopping_criterion)

Compose a custom probabilistic linear solver.

Class implementing probabilistic linear solvers. Such (iterative) solvers infer solutions to problems of the form

$Ax=b,$

where $$A \in \mathbb{R}^{n \times n}$$ and $$b \in \mathbb{R}^{n}$$. They return a probability measure which quantifies uncertainty in the output arising from finite computational resources or stochastic input. This class unifies and generalizes probabilistic linear solvers as described in the literature. 1 2 3 4

Parameters
• policy – Policy returning actions taken by the solver.

• information_op – Information operator defining how information about the linear system is obtained given an action.

• belief_update – Belief update defining how to update the QoI beliefs given new observations.

• stopping_criterion – Stopping criterion determining when a desired terminal condition is met.

References

1

Hennig, P., Probabilistic Interpretation of Linear Solvers, SIAM Journal on Optimization, 2015, 25, 234-260

2

Cockayne, J. et al., A Bayesian Conjugate Gradient Method, Bayesian Analysis, 2019, 14, 937-1012

3

Bartels, S. et al., Probabilistic Linear Solvers: A Unifying View, Statistics and Computing, 2019

4

Wenger, J. and Hennig, P., Probabilistic Linear Solvers for Machine Learning, Advances in Neural Information Processing Systems (NeurIPS), 2020

problinsolve

Solve linear systems in a Bayesian framework.

bayescg

Solve linear systems with prior information on the solution.

Examples

Define a linear system.

>>> import numpy as np
>>> from probnum.problems import LinearSystem
>>> from probnum.problems.zoo.linalg import random_spd_matrix

>>> rng = np.random.default_rng(42)
>>> n = 100
>>> A = random_spd_matrix(rng=rng, dim=n)
>>> b = rng.standard_normal(size=(n,))
>>> linsys = LinearSystem(A=A, b=b)


Create a custom probabilistic linear solver from pre-defined components.

>>> from probnum.linalg.solvers import (
...     ProbabilisticLinearSolver,
...     beliefs,
...     information_ops,
...     policies,
...     stopping_criteria,
... )

>>> pls = ProbabilisticLinearSolver(
...     information_op=information_ops.ProjectedResidualInformationOp(),
...     stopping_criterion=(
...         stopping_criteria.MaxIterationsStoppingCriterion(100)
...         | stopping_criteria.ResidualNormStoppingCriterion(atol=1e-5, rtol=1e-5)
...     ),
... )


Define a prior over the solution.

>>> from probnum import linops, randvars
>>> prior = beliefs.LinearSystemBelief(
...     x=randvars.Normal(
...         mean=np.zeros((n,)),
...         cov=np.eye(n),
...     ),
... )


Solve the linear system using the custom solver.

>>> belief, solver_state = pls.solve(prior=prior, problem=linsys)
>>> np.linalg.norm(linsys.A @ belief.x.mean - linsys.b) / np.linalg.norm(linsys.b)
7.1886e-06


Methods Summary

 solve(prior, problem[, rng]) Solve the linear system. solve_iterator(prior, problem[, rng]) Generator implementing the solver iteration.

Methods Documentation

solve(prior, problem, rng=None)[source]

Solve the linear system.

Parameters
Returns

• belief – Posterior belief $$(\mathsf{x}, \mathsf{A}, \mathsf{H}, \mathsf{b})$$ over the solution $$x$$, the system matrix $$A$$, its (pseudo-)inverse $$H=A^\dagger$$ and the right hand side $$b$$.

• solver_state – Final state of the solver.

Return type
solve_iterator(prior, problem, rng=None)[source]

Generator implementing the solver iteration.

This function allows stepping through the solver iteration one step at a time and exposes the internal solver state.

Parameters
Yields

solver_state – State of the probabilistic linear solver.

Return type

Generator[LinearSolverState, None, None]