Slater's theorem: strong duality with dual attainment
ProvedConvexOptimization.slater_strong_dualitySlater's theorem: strong duality with dual attainment.
Consider the standard problem on with objective , inequality constraints and equality constraints , and assume
- and every are convex on ;
- the vectors are linearly independent (the full-rank condition on the equality constraints);
- Slater's condition: there is a point with for every and for every ;
- the optimal value is finite (the objective is bounded below on the feasible set).
Then the dual optimum is attained and the duality gap is zero: there exist with and such that
Strong duality is the deepest result of the chapter, and attainment is the part that matters here: the theorem does not merely close the gap in the limit, it produces an actual multiplier pair, and those multipliers are exactly the appearing in the KKT conditions. Slater's condition cannot simply be dropped — without an interior feasible point the gap can be strictly positive.
Formalization Note appears as sInf (f₀ '' feasibleSet fc a b) and the boundedness hypothesis BddBelow is what makes that infimum meaningful rather than a junk value; the conclusion equates the EReal-valued dual function with the coercion of that real number, which also asserts finiteness of . Source: B&V §5.3.2, pp. 234–236, the book's separating-hyperplane proof.
import Mathlib import Definitions.Def_ConvexOptimization_lagrangeDuality open scoped RealInnerProductSpace ENNReal open MeasureTheory
theorem ConvexOptimization.slater_strong_duality {n mm p : ℕ}
(f₀ : EuclideanSpace ℝ (Fin n) → ℝ) (hf₀ : ConvexOn ℝ Set.univ f₀)
(fc : Fin mm → EuclideanSpace ℝ (Fin n) → ℝ)
(hfc : ∀ i, ConvexOn ℝ Set.univ (fc i))
(a : Fin p → EuclideanSpace ℝ (Fin n)) (ha : LinearIndependent ℝ a)
(b : Fin p → ℝ)
(xs : EuclideanSpace ℝ (Fin n)) (hxs_ineq : ∀ i, fc i xs < 0)
(hxs_eq : ∀ j, ⟪a j, xs⟫ = b j)
(hbdd : BddBelow (f₀ '' feasibleSet fc a b)) :
∃ (lam : Fin mm → ℝ) (nu : Fin p → ℝ), (∀ i, 0 ≤ lam i) ∧
dualFunction f₀ fc a b lam nu =
((sInf (f₀ '' feasibleSet fc a b) : ℝ) : EReal) := by
sorry