Conjugacy of active CG directions
ProvedVectorSpaceOpt.cg_directions_conjugate_until_stopRun the total conjugate-gradient iteration for a self-adjoint operator with a positive coercivity bound. Fix an index n and assume every stored direction through step n is nonzero, so the run has not yet entered its stuttering state. Then any two distinct active directions with indices i < j ≤ n are orthogonal in the Q inner product:
This is the central invariant established in the first half of §10.8, Theorem 1. Its premise makes the algorithm's termination boundary explicit. The result can feed the general conjugate-directions theorem or be reused directly to establish residual orthogonality and finite-dimensional exact termination.
import Definitions.Def_VectorSpaceOpt_conjugate_gradient open scoped RealInnerProductSpace
namespace VectorSpaceOpt
/-- The conjugacy invariant proved in §10.8 before the convergence estimate. -/
theorem cg_directions_conjugate_until_stop
{H : Type*} [NormedAddCommGroup H] [InnerProductSpace ℝ H]
(Q : H →L[ℝ] H) (b x₀ : H) (m M : ℝ) (hm : 0 < m)
(hself : IsRealSelfAdjoint Q) (hbounds : IsCoerciveBetween Q m M) :
∀ n : ℕ,
(∀ k ≤ n, (conjugateGradientIterate Q b x₀ k).p ≠ 0) →
∀ i j, i < j → j ≤ n →
⟪(conjugateGradientIterate Q b x₀ i).p,
Q ((conjugateGradientIterate Q b x₀ j).p)⟫ = 0 := by
sorry
end VectorSpaceOptRead-back
What the Lean code literally says, in plain math · gpt-5
Let be any real inner-product space, not assumed complete; let be continuous and real-linear; let and . Assume , assume for all , and assume for every . Write for the total conjugate-gradient iterate initialized by and using the stated stop/stutter step. Then, for every , if for every natural , every pair of natural indices satisfies . If some with is zero, the implication for that asserts nothing; for its indexed conclusion is vacuous because no exist. No conjugacy claim is made here after the stopping condition has occurred.
Confirmed by the mission captain (proposal self-audit).