# Warm-start

Most Krylov methods in this module accept a starting point as argument. The starting point is used as initial approximation to a solution.

```
solver = CgSolver(A, b)
cg!(solver, A, b, itmax=100)
if !issolved(solver)
cg!(solver, A, b, solver.x, itmax=100) # cg! uses the approximate solution `solver.x` as starting point
end
```

If the user has an initial guess `x0`

, it can be provided directly.

`cg(A, b, x0)`

It is also possible to use the `warm_start!`

function to feed the starting point into the solver.

```
warm_start!(solver, x0)
cg!(solver, A, b)
# the previous two lines are equivalent to cg!(solver, A, b, x0)
```

If a Krylov method doesn't have the option to warm start, it can still be done explicitly. We provide an example with `cg_lanczos!`

.

```
solver = CgLanczosSolver(A, b)
cg_lanczos!(solver, A, b)
x₀ = solver.x # Ax₀ ≈ b
r = b - A * x₀ # r = b - Ax₀
cg_lanczos!(solver, A, r)
Δx = solver.x # AΔx = r
x = x₀ + Δx # Ax = b
```

Explicit restarts cannot be avoided in certain block methods, such as TriMR, due to the preconditioners.

```
# [E A] [x] = [b]
# [Aᴴ F] [y] [c]
M = inv(E)
N = inv(F)
x₀, y₀, stats = trimr(A, b, c, M=M, N=N)
# E and F are not available inside TriMR
b₀ = b - Ex₀ - Ay
c₀ = c - Aᴴx₀ - Fy
Δx, Δy, stats = trimr(A, b₀, c₀, M=M, N=N)
x = x₀ + Δx
y = y₀ + Δy
```