← ALL STATEMENTS
AcceptedCorollary · Statement with omitted proof

Preconditioned conjugate gradients for a graph Laplacian

A sparse approximate Cholesky factor gives an iteration and arithmetic-cost bound for consistent Laplacian systems.

Martinsson & Tropp ↗
Source label: cor:laplacian-solver

Formal statement. The assumptions and conclusion are explicit; the theorem proof is omitted (sorry).

01 / MATHEMATICAL STATEMENT

Meaning & conditions

Mathematical summary

A sparse approximate Cholesky factor gives an iteration and arithmetic-cost bound for consistent Laplacian systems.

T≤1+log⁡3(1/ϵ),∥x−xT∥L≤ϵ∥x∥L,cost/step=O(mlog⁡2n)T\le1+\log_3(1/\epsilon),\qquad \|x-x_T\|_L\le\epsilon\|x\|_L,\qquad {\rm cost/step}=O(m\log^2n)

Assumptions & context

  • The graph is weighted, undirected and loop-free; CCᵀ lies between L/2 and 3L/2, and C has the stated triangular structure and sparsity. The right-hand side is consistent and 0 < ε < 1.

Source

Martinsson & Tropp. Randomized numerical linear algebra: Foundations and algorithms.

Source label: cor:laplacian-solver

02 / LEAN REPRESENTATION

Formal statement

Statement with omitted proof. Expand the complete file below to read imports, local definitions and surrounding context.

theorem laplacian_pcg_solver :
    ∀ c₀ : ℝ, ∀ N₀ : ℕ, ∃ K : ℝ, 0 < K ∧ ∃ N : ℕ,
      ∀ (n : ℕ) (w : Fin n → Fin n → ℝ) (C : Matrix (Fin n) (Fin n) ℝ),
        IsWeightedLoopFreeUndirectedGraph w →
        MorallyLowerTriangular C →
        PsdLE ((1 / 2 : ℝ) • graphLaplacian w) (C * Cᵀ) →
        PsdLE (C * Cᵀ) ((3 / 2 : ℝ) • graphLaplacian w) →
        (N₀ ≤ n → (matrixNnz C : ℝ) ≤ c₀ * ((graphSparsity w : ℝ) * Real.log n ^ 2)) →
        ∀ X : Matrix (Fin n) (Fin n) ℝ, IsMoorePenroseInverse (C * Cᵀ) X →
        ∃ prog : Arithmetic.Program (n + n + n + n),
          ∀ f : Fin n → ℝ, (∃ x, graphLaplacian w *ᵥ x = f) →
          ∀ ε : ℝ, 0 < ε → ε < 1 →
            ∃ T : ℕ, (T : ℝ) ≤ 1 + Real.logb 3 (1 / ε) ∧
              (∀ x, graphLaplacian w *ᵥ x = f →
                lSeminorm (graphLaplacian w) (x - (pcgIterate (graphLaplacian w) X f T).x)
                  ≤ ε * lSeminorm (graphLaplacian w) x) ∧
              (N ≤ n → ∀ k, k < T →
                StepComputedWithin prog (graphLaplacian w) X
                  (pcgIterate (graphLaplacian w) X f k)
                  (K * ((graphSparsity w : ℝ) * Real.log n ^ 2))) := by
  sorry
Complete Lean file and local definitions
import RNLAPhaseB.B3Base
import RNLAPhaseB.Complexity

open MeasureTheory
open scoped Matrix
open scoped Matrix.Norms.L2Operator
open scoped BigOperators
open scoped ENNReal

namespace RNLAPhaseB.MT2020.LaplacianSolver

open RNLAPhaseB.Complexity

/-- Weighted, loop-free, undirected graph on `V = {1,…,n}` given by a nonnegative weight
function `w : V × V → ℝ₊` with `w i i = 0` and `w i j = w j i` (book.md:1185). -/
def IsWeightedLoopFreeUndirectedGraph {n : ℕ} (w : Fin n → Fin n → ℝ) : Prop :=
  (∀ i j, 0 ≤ w i j) ∧ (∀ i, w i i = 0) ∧ (∀ i j, w i j = w j i)

/-- Elementary Laplacian `Δ_uv = (δ_u - δ_v)(δ_u - δ_v)^*` (book.md:3327-3329). -/
noncomputable def elementaryLaplacian {n : ℕ} (u v : Fin n) : Matrix (Fin n) (Fin n) ℝ :=
  Matrix.vecMulVec (Pi.single u (1 : ℝ) - Pi.single v 1) (Pi.single u (1 : ℝ) - Pi.single v 1)

/-- Graph Laplacian `L = ∑_{e = uv} w(e) Δ_e`, each unordered edge counted once. -/
noncomputable def graphLaplacian {n : ℕ} (w : Fin n → Fin n → ℝ) : Matrix (Fin n) (Fin n) ℝ :=
  ∑ u : Fin n, ∑ v : Fin n, if u < v then w u v • elementaryLaplacian u v else 0

/-- The sparsity `m`: number of strictly positive weights `w_ij` with `i ≤ j`. -/
noncomputable def graphSparsity {n : ℕ} (w : Fin n → Fin n → ℝ) : ℕ := by
  classical
  exact (Finset.univ.filter (fun p : Fin n × Fin n => p.1 ≤ p.2 ∧ 0 < w p.1 p.2)).card

/-- Semidefinite order `A ≼ B`. -/
def PsdLE {n : ℕ} (A B : Matrix (Fin n) (Fin n) ℝ) : Prop := (B - A).PosSemidef

/-- Morally lower-triangular: a (known) permutation of the rows brings `C` into
lower-triangular form. -/
def MorallyLowerTriangular {n : ℕ} (C : Matrix (Fin n) (Fin n) ℝ) : Prop :=
  ∃ σ : Equiv.Perm (Fin n), ∀ i j : Fin n, i < j → C (σ i) j = 0

/-- Moore–Penrose relations: `X` is the pseudoinverse of `M`. -/
def IsMoorePenroseInverse {n : ℕ} (M X : Matrix (Fin n) (Fin n) ℝ) : Prop :=
  M * X * M = M ∧ X * M * X = X ∧ (M * X)ᵀ = M * X ∧ (X * M)ᵀ = X * M

/-- The seminorm `‖v‖_L = (v^* L v)^{1/2}`. -/
noncomputable def lSeminorm {n : ℕ} (L : Matrix (Fin n) (Fin n) ℝ) (v : Fin n → ℝ) : ℝ :=
  Real.sqrt (v ⬝ᵥ (L *ᵥ v))

/-- State of preconditioned conjugate gradient: iterate, residual, preconditioned
residual, search direction. -/
structure PCGState (n : ℕ) where
  x : Fin n → ℝ
  r : Fin n → ℝ
  z : Fin n → ℝ
  p : Fin n → ℝ

/-- PCG initialization with zero initial guess; `X` applies the (pseudo)inverse of the
preconditioner `CC^*`. -/
noncomputable def pcgInit {n : ℕ} (X : Matrix (Fin n) (Fin n) ℝ) (f : Fin n → ℝ) : PCGState n :=
  ⟨0, f, X *ᵥ f, X *ᵥ f⟩

/-- One standard (exact-arithmetic) PCG iteration for `L x = f` with preconditioner
inverse `X`. -/
noncomputable def pcgStep {n : ℕ} (L X : Matrix (Fin n) (Fin n) ℝ) (s : PCGState n) :
    PCGState n :=
  let α := (s.r ⬝ᵥ s.z) / (s.p ⬝ᵥ (L *ᵥ s.p))
  let x' := s.x + α • s.p
  let r' := s.r - α • (L *ᵥ s.p)
  let z' := X *ᵥ r'
  let β := (r' ⬝ᵥ z') / (s.r ⬝ᵥ s.z)
  ⟨x', r', z', z' + β • s.p⟩

/-- The state after `k` PCG iterations. -/
noncomputable def pcgIterate {n : ℕ} (L X : Matrix (Fin n) (Fin n) ℝ) (f : Fin n → ℝ)
    (k : ℕ) : PCGState n :=
  (pcgStep L X)^[k] (pcgInit X f)

/-- Encoding of a PCG state as the input vector of an arithmetic program. -/
def PCGState.toInput {n : ℕ} (s : PCGState n) : Fin (n + n + n + n) → ℝ :=
  Fin.append (Fin.append (Fin.append s.x s.r) s.z) s.p

/-- Encoding of a PCG state as an output list. -/
def PCGState.toList {n : ℕ} (s : PCGState n) : List ℝ :=
  List.ofFn s.x ++ List.ofFn s.r ++ List.ofFn s.z ++ List.ofFn s.p

/-- The arithmetic program performs the PCG iteration from state `s` exactly, using at
most `bound` arithmetic operations (+, -, *, / each cost one) in one successful run. -/
def StepComputedWithin {n : ℕ} (prog : Arithmetic.Program (n + n + n + n))
    (L X : Matrix (Fin n) (Fin n) ℝ) (s : PCGState n) (bound : ℝ) : Prop :=
  ∃ output cost, prog.run s.toInput = some (output, cost) ∧
    output = (pcgStep L X s).toList ∧ (cost : ℝ) ≤ bound

/-- mt2020 cor:laplacian-solver. If `C` satisfies eqn:approx-cholesky
(`0.5 L ≼ CC^* ≼ 1.5 L`, `C` morally lower-triangular, `nnz(C) = O(m log² n)`), then
every consistent system `L x = f` is solved to relative error `ε` in `‖·‖_L` by at most
`1 + log₃(1/ε)` PCG iterations (preconditioner `CC^*`, applied via its pseudoinverse,
zero initial guess), each costing `O(m log² n)` arithmetic operations. The Big-O
hypothesis on `nnz(C)` is a family hypothesis with constant `c₀` and threshold `N₀`;
the per-iteration Big-O constant `K` and threshold `N` may depend on them only. -/
theorem laplacian_pcg_solver :
    ∀ c₀ : ℝ, ∀ N₀ : ℕ, ∃ K : ℝ, 0 < K ∧ ∃ N : ℕ,
      ∀ (n : ℕ) (w : Fin n → Fin n → ℝ) (C : Matrix (Fin n) (Fin n) ℝ),
        IsWeightedLoopFreeUndirectedGraph w →
        MorallyLowerTriangular C →
        PsdLE ((1 / 2 : ℝ) • graphLaplacian w) (C * Cᵀ) →
        PsdLE (C * Cᵀ) ((3 / 2 : ℝ) • graphLaplacian w) →
        (N₀ ≤ n → (matrixNnz C : ℝ) ≤ c₀ * ((graphSparsity w : ℝ) * Real.log n ^ 2)) →
        ∀ X : Matrix (Fin n) (Fin n) ℝ, IsMoorePenroseInverse (C * Cᵀ) X →
        ∃ prog : Arithmetic.Program (n + n + n + n),
          ∀ f : Fin n → ℝ, (∃ x, graphLaplacian w *ᵥ x = f) →
          ∀ ε : ℝ, 0 < ε → ε < 1 →
            ∃ T : ℕ, (T : ℝ) ≤ 1 + Real.logb 3 (1 / ε) ∧
              (∀ x, graphLaplacian w *ᵥ x = f →
                lSeminorm (graphLaplacian w) (x - (pcgIterate (graphLaplacian w) X f T).x)
                  ≤ ε * lSeminorm (graphLaplacian w) x) ∧
              (N ≤ n → ∀ k, k < T →
                StepComputedWithin prog (graphLaplacian w) X
                  (pcgIterate (graphLaplacian w) X f k)
                  (K * ((graphSparsity w : ℝ) * Real.log n ^ 2))) := by
  sorry

end RNLAPhaseB.MT2020.LaplacianSolver

How to read the formalization

  • The Lean statement separates existence of a suitable arithmetic program, the iteration bound, and its asymptotic per-step cost. Error is measured in the L-seminorm.
← Back to all statements