Documentation

EconCSLib.Math.Minimax.Loomis

EconCSLib.Math.Minimax.Loomis #

LRS-style direct induction proof of the general (positive-B) Loomis theorem [MFoGT, Theorem 2.5.1]:

For matrices A, B : IJ with B entrywise positive there exist x : Δ(I), y : Δ(J), and v : with xAv · xB and Ayv · By.

This file begins with the scaffolding layer: positivity of the aggregates xB and By, the ratio-form auxiliaries lamB.aux and muB.aux, and the Loomis scalars lamB0, muB0.

Subsequent layers (continuity / attainment / weak duality / induction / packaged theorem) build on that scaffolding. The simplified-Loomis (von Neumann minimax) MinimaxLoomis.lam0 = MinimaxLoomis.mu0 is re-derived as the B = 𝟙 corollary minmax_from_general at the end of this file.

Blueprint #

Attribution #

Structurally parallel to EconCSLib.Math.Minimax.MinimaxLoomis (ported from math-xmum/gametheory's GameTheory/Zerosum.lean), with B factors threaded through where the simplified-Loomis route had 1.

Entrywise positivity predicate #

def Loomis.IsPositive {I : Type u_1} {J : Type u_2} (B : IJ) :

A matrix B : IJ is entrywise positive if every entry is > 0. This is the hypothesis driving the general Loomis theorem, and the only property of B the proof needs.

Equations
Instances For
    theorem Loomis.IsPositive.one {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] :
    IsPositive fun (x : I) (x_1 : J) => 1

    The all-ones matrix is positive; the simplified-Loomis specialisation plugs B := fun _ _ => 1 into the general theorem.

    Vector aggregates: xA, xB, Ay, By, and their positivity #

    The generic positivity lemma wsum_pos lives in Math.Simplex; the Loomis-flavored aggregates below are one-line applications of it.

    noncomputable def Loomis.xA {I : Type u_1} {J : Type u_2} [Fintype I] (A : IJ) (x : (stdSimplex I)) (j : J) :

    Row-vector product (xA)_j = ∑ᵢ xᵢ Aᵢⱼ.

    Equations
    Instances For
      noncomputable def Loomis.xB {I : Type u_1} {J : Type u_2} [Fintype I] (B : IJ) (x : (stdSimplex I)) (j : J) :

      Row-vector product (xB)_j = ∑ᵢ xᵢ Bᵢⱼ.

      Equations
      Instances For
        noncomputable def Loomis.Ay {I : Type u_1} {J : Type u_2} [Fintype J] (A : IJ) (y : (stdSimplex J)) (i : I) :

        Column-vector product (Ay)_i = ∑ⱼ Aᵢⱼ yⱼ.

        Equations
        Instances For
          noncomputable def Loomis.By {I : Type u_1} {J : Type u_2} [Fintype J] (B : IJ) (y : (stdSimplex J)) (i : I) :

          Column-vector product (By)_i = ∑ⱼ Bᵢⱼ yⱼ.

          Equations
          Instances For
            theorem Loomis.xB_pos {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] {B : IJ} (hB : IsPositive B) (x : (stdSimplex I)) (j : J) :
            0 < xB B x j

            Positivity of the row aggregate when B is entrywise positive.

            theorem Loomis.By_pos {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] {B : IJ} (hB : IsPositive B) (y : (stdSimplex J)) (i : I) :
            0 < By B y i

            Positivity of the column aggregate when B is entrywise positive.

            theorem Loomis.xBy_pos {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] {B : IJ} (hB : IsPositive B) (x : (stdSimplex I)) (y : (stdSimplex J)) :
            0 < wsum x fun (i : I) => By B y i

            Positivity of the bilinear pairing xBy = ∑ᵢⱼ xᵢ Bᵢⱼ yⱼ.

            Loomis ratios and the scalars lamB0, muB0 #

            noncomputable def Loomis.colRatio {I : Type u_1} {J : Type u_2} [Fintype I] (A B : IJ) (x : (stdSimplex I)) (j : J) :

            Row player's per-column Loomis ratio (xA)_j / (xB)_j.

            Equations
            Instances For
              noncomputable def Loomis.rowRatio {I : Type u_1} {J : Type u_2} [Fintype J] (A B : IJ) (y : (stdSimplex J)) (i : I) :

              Column player's per-row Loomis ratio (Ay)_i / (By)_i.

              Equations
              Instances For
                noncomputable def Loomis.lamB.aux {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty J] (A B : IJ) (x : (stdSimplex I)) :

                Player I's guaranteed Loomis ratio under mixed strategy x: infimum over pure columns.

                Equations
                Instances For
                  noncomputable def Loomis.muB.aux {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] (A B : IJ) (y : (stdSimplex J)) :

                  Player II's Loomis-ratio cap under mixed strategy y: supremum over pure rows.

                  Equations
                  Instances For
                    noncomputable def Loomis.lamB0 {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty J] (A B : IJ) :

                    Maxmin Loomis scalar λ₀ = sup_x λ_aux(x).

                    Equations
                    Instances For
                      noncomputable def Loomis.muB0 {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] (A B : IJ) :

                      Minmax Loomis scalar μ₀ = inf_y μ_aux(y).

                      Equations
                      Instances For
                        theorem Loomis.lamB.aux_gt_iff_gt {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] (A B : IJ) (c : ) (x : (stdSimplex I)) :
                        c < aux A B x ∀ (j : J), c < colRatio A B x j

                        Characterisation: lamB.aux A B x > c iff every column ratio exceeds c.

                        theorem Loomis.muB.aux_lt_iff_lt {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] (A B : IJ) (c : ) (y : (stdSimplex J)) :
                        aux A B y < c ∀ (i : I), rowRatio A B y i < c

                        Characterisation: muB.aux A B y < c iff every row ratio is below c.

                        Continuity, boundedness, and attainment #

                        The Loomis ratios are continuous on the compact simplex (positive denominators by xB_pos / By_pos), so the inf'/sup' aggregates are continuous and their extrema lamB0 / muB0 are attained.

                        theorem Loomis.colRatio.continuous {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] {A B : IJ} (hB : IsPositive B) (j : J) :
                        Continuous fun (x : (stdSimplex I)) => colRatio A B x j

                        Each column ratio (xA)_j / (xB)_j is continuous on Δ(I).

                        theorem Loomis.rowRatio.continuous {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] {A B : IJ} (hB : IsPositive B) (i : I) :
                        Continuous fun (y : (stdSimplex J)) => rowRatio A B y i

                        Each row ratio (Ay)_i / (By)_i is continuous on Δ(J).

                        theorem Loomis.lamB.aux.continuous {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] {A B : IJ} (hB : IsPositive B) :

                        lamB.aux A B is continuous on the simplex.

                        theorem Loomis.muB.aux.continuous {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] {A B : IJ} (hB : IsPositive B) :

                        muB.aux A B is continuous on the simplex.

                        theorem Loomis.lamB.aux.bddAbove {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] {A B : IJ} (hB : IsPositive B) :
                        ∃ (C : ), ∀ (x : (stdSimplex I)), aux A B x C

                        lamB.aux A B is bounded above on the simplex (continuous function on a compact set).

                        theorem Loomis.muB.aux.bddBelow {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] {A B : IJ} (hB : IsPositive B) :
                        ∃ (C : ), ∀ (y : (stdSimplex J)), C aux A B y

                        muB.aux A B is bounded below on the simplex.

                        theorem Loomis.lamB.aux.le_lamB0 {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] {A B : IJ} (hB : IsPositive B) (x : (stdSimplex I)) :
                        aux A B x lamB0 A B

                        Every lamB.aux value is bounded by the supremum lamB0.

                        theorem Loomis.muB.aux.ge_muB0 {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] {A B : IJ} (hB : IsPositive B) (y : (stdSimplex J)) :
                        muB0 A B aux A B y

                        Every muB.aux value dominates the infimum muB0.

                        theorem Loomis.exists_xx_lamB0 {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] (A B : IJ) (hB : IsPositive B) :
                        ∃ (xx : (stdSimplex I)), ∀ (j : J), lamB0 A B * xB B xx j xA A xx j

                        Attainment of lamB0: there exists a mixed strategy xx with (xA xx)_j ≥ lamB0 · (xB xx)_j for every column.

                        theorem Loomis.exists_yy_muB0 {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] (A B : IJ) (hB : IsPositive B) :
                        ∃ (yy : (stdSimplex J)), ∀ (i : I), Ay A yy i muB0 A B * By B yy i

                        Attainment of muB0: there exists a mixed strategy yy with (Ay yy)_i ≤ muB0 · (By yy)_i for every row.

                        Weak duality lamB0muB0 #

                        theorem Loomis.lamB0_le_muB0 {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] (A B : IJ) (hB : IsPositive B) :
                        lamB0 A B muB0 A B

                        Weak duality for the Loomis scalars: lamB0muB0.

                        Base case |I| + |J| = 2 #

                        theorem Loomis.loomis_value_IJ_2 {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] (Hn : 2 = Fintype.card I + Fintype.card J) {A B : IJ} (_hB : IsPositive B) :
                        lamB0 A B = muB0 A B

                        Base case of the Loomis induction: a 1×1 matrix pair has the single ratio A i₀ j₀ / B i₀ j₀ as the common Loomis value.

                        Induction step #

                        We linearise the Loomis inequalities by introducing the offset functionals G(x, j) := (xA)_j - λ₀ · (xB)_j and H(y, i) := μ₀ · (By)_i - (Ay)_i, turning the inequalities xA ≥ λ₀ · xB and Ayμ₀ · By into nonneg conditions on functions linear in their simplex argument. Convex combinations then reduce to the constant-c = 0 linear_comb_* and mix_*_nbh lemmas from Core.Simplex.

                        Equivalence of the ratio form and the offset form #

                        Column / row extension to the unrestricted simplex #

                        The strong induction loomis_value_eq #

                        theorem Loomis.loomis_value_eq {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] (A B : IJ) (hB : IsPositive B) :
                        lamB0 A B = muB0 A B

                        Loomis scalar equality: every finite positive-B matrix pair over has equal maxmin and minmax Loomis ratios.

                        Packaged Loomis theorem #

                        theorem Loomis.loomis_theorem {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] (A B : IJ) (hB : IsPositive B) :
                        ∃ (x : (stdSimplex I)) (y : (stdSimplex J)) (v : ), (∀ (j : J), v * xB B x j xA A x j) ∀ (i : I), Ay A y i v * By B y i

                        Loomis Theorem [MFoGT, Theorem 2.5.1].

                        For any pair of matrices A B : IJ with B entrywise positive, there exist mixed strategies x : Δ(I), y : Δ(J) and a value v : such that for every column jJ and every row iI, $$ v \cdot (xB)_j \le (xA)_j, \qquad (Ay)_i \le v \cdot (By)_i. $$ The common value v = lamB0 A B = muB0 A B.

                        Corollary: simplified Loomis = B = 1 specialisation #

                        The simplified-Loomis development in MinimaxLoomis proves lam0 A = mu0 A directly by inlining the B = 𝟙 specialisation of the induction. This section re-derives that statement from the general positive-B Loomis theorem above, validating the minimax_from_loomis blueprint node's "all-ones specialisation" claim.

                        theorem Loomis.lamB0_one {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] (A : IJ) :
                        (lamB0 A fun (x : I) (x_1 : J) => 1) = MinimaxLoomis.lam0 A
                        theorem Loomis.muB0_one {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] (A : IJ) :
                        (muB0 A fun (x : I) (x_1 : J) => 1) = MinimaxLoomis.mu0 A
                        theorem Loomis.minmax_from_general {I : Type u_1} {J : Type u_2} [Fintype I] [Fintype J] [Nonempty I] [Nonempty J] (A : IJ) :

                        Simplified Loomis as a corollary of the general theorem: the finite von Neumann minimax MinimaxLoomis.lam0 A = MinimaxLoomis.mu0 A follows by instantiating loomis_value_eq at the all-ones matrix B = 𝟙.

                        This is the canonical "B = 𝟙 specialisation" route recorded by the [[minimax_from_loomis]] blueprint node, and the sole route to the finite von Neumann minimax: MinimaxLoomis keeps only the shared foundational layer (aggregates, attainment, weak duality, drop/extend infra), and its scalar equality is exported here rather than re-proved by a standalone induction.