Documentation

Tdaf.Analysis.Convex.Saddle.Defs

Saddle-functions and partial conjugacy #

A concave-convex function on U × X is concave in its first argument for each value of the second and convex in the second for each value of the first; convex-concave functions are the mirror image, and both are called saddle-functions.

Concave-convex functions are the same data as convex bifunctions. A convex bifunction F from U to X gives the bracket ⟨Fu, y⟩ = (F u)*(y), concave-convex in (u, y) and closed convex in y; conversely every such function arises this way, from F u = K (u, ·)*. The bracket is the conjugate of the graph function of F in its second variable only — one-variable conjugacy applied uniformly in a parameter.

The two partial closures are not mirror images. partialCl₂ K closes K (u, ·) as a convex function of the second argument; partialCl₁ K closes K (·, x) as a concave function of the first.

Main definitions #

Main results #

References #

[^1]: R. T. Rockafellar, Convex Analysis, Princeton University Press, 1970, §33–§34.

Three rearrangements over EReal #

The two effective domains #

def Tdaf.ConvexAnalysis.dom₁ {U : Type u_1} {X : Type u_2} (K : U × X → EReal) :
Set U

The first effective domain dom₁ K: the u at which K (u, ·) is nowhere -∞, an intersection of concave effective domains.

Equations
Instances For
    def Tdaf.ConvexAnalysis.dom₂ {U : Type u_1} {X : Type u_2} (K : U × X → EReal) :
    Set X

    The second effective domain: the x at which K (·, x) is nowhere +∞.

    Equations
    Instances For
      @[simp]
      theorem Tdaf.ConvexAnalysis.mem_dom₁ {U : Type u_1} {X : Type u_2} {K : U × X → EReal} {u : U} :
      u ∈ dom₁ K ↔ ∀ (x : X), ⊥ < K (u, x)
      @[simp]
      theorem Tdaf.ConvexAnalysis.mem_dom₂ {U : Type u_1} {X : Type u_2} {K : U × X → EReal} {x : X} :
      x ∈ dom₂ K ↔ ∀ (u : U), K (u, x) < ⊤
      theorem Tdaf.ConvexAnalysis.dom₁_eq_iInter {U : Type u_1} {X : Type u_2} (K : U × X → EReal) :
      dom₁ K = ⋂ (x : X), domConcave fun (u : U) => K (u, x)
      theorem Tdaf.ConvexAnalysis.dom₂_eq_iInter {U : Type u_1} {X : Type u_2} (K : U × X → EReal) :
      dom₂ K = ⋂ (u : U), dom fun (x : X) => K (u, x)

      Concave-convex functions #

      structure Tdaf.ConvexAnalysis.ConcaveConvexFn {U : Type u_1} {X : Type u_2} [AddCommGroup U] [Module ℝ U] [AddCommGroup X] [Module ℝ X] (K : U × X → EReal) :

      K is concave-convex: concave in the first argument, convex in the second.

      • concave_fst (x : X) : ConcaveFn fun (u : U) => K (u, x)

        K (·, x) is concave for every x.

      • convex_snd (u : U) : ConvexFn fun (x : X) => K (u, x)

        K (u, ·) is convex for every u.

      Instances For
        structure Tdaf.ConvexAnalysis.ConvexConcaveFn {U : Type u_1} {X : Type u_2} [AddCommGroup U] [Module ℝ U] [AddCommGroup X] [Module ℝ X] (K : U × X → EReal) :

        K is convex-concave: convex in the first argument, concave in the second.

        • convex_fst (x : X) : ConvexFn fun (u : U) => K (u, x)

          K (·, x) is convex for every x.

        • concave_snd (u : U) : ConcaveFn fun (x : X) => K (u, x)

          K (u, ·) is concave for every u.

        Instances For
          def Tdaf.ConvexAnalysis.SaddleFn {U : Type u_1} {X : Type u_2} [AddCommGroup U] [Module ℝ U] [AddCommGroup X] [Module ℝ X] (K : U × X → EReal) :

          A saddle-function is one of the two.

          Equations
          Instances For
            theorem Tdaf.ConvexAnalysis.ConcaveConvexFn.convexConcaveFn_neg {U : Type u_1} {X : Type u_2} [AddCommGroup U] [Module ℝ U] [AddCommGroup X] [Module ℝ X] {K : U × X → EReal} (h : ConcaveConvexFn K) :
            ConvexConcaveFn fun (p : U × X) => -K p
            theorem Tdaf.ConvexAnalysis.ConvexConcaveFn.concaveConvexFn_neg {U : Type u_1} {X : Type u_2} [AddCommGroup U] [Module ℝ U] [AddCommGroup X] [Module ℝ X] {K : U × X → EReal} (h : ConvexConcaveFn K) :
            ConcaveConvexFn fun (p : U × X) => -K p

            dom₁ of a concave-convex function is convex: it is an intersection of concave domains.

            dom₂ of a concave-convex function is convex.

            Partial conjugacy #

            noncomputable def Tdaf.ConvexAnalysis.partialConj₂ {U : Type u_1} {X : Type u_2} {Y : Type u_3} [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (f : U × X → EReal) :
            U × Y → EReal

            The conjugate of f in the second variable only: the uncurried reading of bracket, which is what partialConj₂_graphFn makes precise. Downstream code uses the curried form.

            Equations
            Instances For
              theorem Tdaf.ConvexAnalysis.partialConj₂_apply {U : Type u_1} {X : Type u_2} {Y : Type u_3} [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (f : U × X → EReal) (p : U × Y) :
              partialConj₂ Bx f p = conj Bx (fun (x : X) => f (p.1, x)) p.2

              Partial closures #

              noncomputable def Tdaf.ConvexAnalysis.partialCl₂ {U : Type u_1} {X : Type u_2} [TopologicalSpace X] (K : U × X → EReal) :
              U × X → EReal

              Rockafellar's cl₂: close in the second variable, convexly.

              Equations
              Instances For
                noncomputable def Tdaf.ConvexAnalysis.partialCl₁ {U : Type u_1} {X : Type u_2} [TopologicalSpace U] (K : U × X → EReal) :
                U × X → EReal

                Rockafellar's cl₁: close in the first variable, concavely.

                Equations
                Instances For
                  theorem Tdaf.ConvexAnalysis.partialCl₂_apply {U : Type u_1} {X : Type u_2} [TopologicalSpace X] (K : U × X → EReal) (p : U × X) :
                  partialCl₂ K p = clFn (fun (x : X) => K (p.1, x)) p.2
                  theorem Tdaf.ConvexAnalysis.partialCl₁_apply {U : Type u_1} {X : Type u_2} [TopologicalSpace U] (K : U × X → EReal) (p : U × X) :
                  partialCl₁ K p = clConcave (fun (u : U) => K (u, p.2)) p.1
                  theorem Tdaf.ConvexAnalysis.partialCl₂_slice {U : Type u_1} {X : Type u_2} [TopologicalSpace X] (K : U × X → EReal) (u : U) :
                  (fun (x : X) => partialCl₂ K (u, x)) = clFn fun (x : X) => K (u, x)
                  theorem Tdaf.ConvexAnalysis.partialCl₁_slice {U : Type u_1} {X : Type u_2} [TopologicalSpace U] (K : U × X → EReal) (x : X) :
                  (fun (u : U) => partialCl₁ K (u, x)) = clConcave fun (u : U) => K (u, x)
                  theorem Tdaf.ConvexAnalysis.partialCl₂_le {U : Type u_1} {X : Type u_2} [TopologicalSpace X] (K : U × X → EReal) :
                  theorem Tdaf.ConvexAnalysis.partialCl₂_mono {U : Type u_1} {X : Type u_2} [TopologicalSpace X] {K L : U × X → EReal} (h : K ≤ L) :
                  theorem Tdaf.ConvexAnalysis.le_partialCl₁ {U : Type u_1} {X : Type u_2} [TopologicalSpace U] (K : U × X → EReal) :
                  theorem Tdaf.ConvexAnalysis.partialCl₁_mono {U : Type u_1} {X : Type u_2} [TopologicalSpace U] {K L : U × X → EReal} (h : K ≤ L) :
                  def Tdaf.ConvexAnalysis.ConvexClosedFn {U : Type u_1} {X : Type u_2} [TopologicalSpace X] (K : U × X → EReal) :

                  K is convex-closed when it is unchanged by cl₂.

                  Equations
                  Instances For
                    def Tdaf.ConvexAnalysis.ConcaveClosedFn {U : Type u_1} {X : Type u_2} [TopologicalSpace U] (K : U × X → EReal) :

                    K is concave-closed when it is unchanged by cl₁.

                    Equations
                    Instances For
                      theorem Tdaf.ConvexAnalysis.convexClosedFn_iff {U : Type u_1} {X : Type u_2} [TopologicalSpace X] {K : U × X → EReal} :
                      ConvexClosedFn K ↔ ∀ (u : U), ClosedFn fun (x : X) => K (u, x)
                      theorem Tdaf.ConvexAnalysis.concaveClosedFn_iff {U : Type u_1} {X : Type u_2} [TopologicalSpace U] {K : U × X → EReal} :
                      ConcaveClosedFn K ↔ ∀ (x : X), ClosedConcaveFn fun (u : U) => K (u, x)

                      The bracket of a convex bifunction #

                      noncomputable def Tdaf.ConvexAnalysis.bracket {U : Type u_1} {X : Type u_2} {Y : Type u_3} [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (F : Bifun U X) :
                      U → Y → EReal

                      Rockafellar's bracket ⟨Fu, y⟩ = (F u)*(y), read as a function of (u, y).

                      Equations
                      Instances For
                        theorem Tdaf.ConvexAnalysis.bracket_apply {U : Type u_1} {X : Type u_2} {Y : Type u_3} [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (F : Bifun U X) (u : U) (y : Y) :
                        bracket Bx F u y = ⨆ (x : X), ↑((Bx x) y) - F u x
                        theorem Tdaf.ConvexAnalysis.bracket_eq_conj {U : Type u_1} {X : Type u_2} {Y : Type u_3} [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (F : Bifun U X) (u : U) :
                        bracket Bx F u = conj Bx (F u)
                        theorem Tdaf.ConvexAnalysis.partialConj₂_graphFn {U : Type u_1} {X : Type u_2} {Y : Type u_3} [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (F : Bifun U X) (p : U × Y) :
                        partialConj₂ Bx (graphFn F) p = bracket Bx F p.1 p.2

                        The bracket is the partial conjugate of the graph function.

                        theorem Tdaf.ConvexAnalysis.convexFn_bracket {U : Type u_1} {X : Type u_2} {Y : Type u_3} [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (F : Bifun U X) (u : U) :
                        ConvexFn (bracket Bx F u)

                        ⟨Fu, ·⟩ is convex, with no hypothesis on F.

                        ⟨Fu, ·⟩ is closed as well as convex.

                        The clauses that use convexity of the bifunction #

                        theorem Tdaf.ConvexAnalysis.concaveFn_bracket {U : Type u_1} {X : Type u_2} {Y : Type u_3} [AddCommGroup U] [Module ℝ U] [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] {F : Bifun U X} (hF : ConvexBifun F) (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (y : Y) :
                        ConcaveFn fun (u : U) => bracket Bx F u y

                        The clause with content: ⟨F·, y⟩ is concave in u whenever F is a convex bifunction. Its negative is the infimal projection of a jointly convex function along (u, x) ↦ u.

                        theorem Tdaf.ConvexAnalysis.concaveConvexFn_bracket {U : Type u_1} {X : Type u_2} {Y : Type u_3} [AddCommGroup U] [Module ℝ U] [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] {F : Bifun U X} (hF : ConvexBifun F) (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) :
                        ConcaveConvexFn fun (p : U × Y) => bracket Bx F p.1 p.2

                        The bracket of a convex bifunction is concave-convex.

                        The inversion formula: cl (F u) is recovered from the bracket by conjugating back. This is the Fenchel–Moreau theorem, uniformly in u.

                        The bifunction attached to a saddle-function #

                        noncomputable def Tdaf.ConvexAnalysis.bifunOfSaddle {U : Type u_1} {X : Type u_2} {Y : Type u_3} [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (K : U × Y → EReal) :
                        Bifun U X

                        The convex bifunction attached to a saddle-function: F u = K (u, ·)*, the conjugate taken over the flipped pairing.

                        Equations
                        Instances For
                          theorem Tdaf.ConvexAnalysis.bifunOfSaddle_apply {U : Type u_1} {X : Type u_2} {Y : Type u_3} [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (K : U × Y → EReal) (u : U) (x : X) :
                          bifunOfSaddle Bx K u x = ⨆ (y : Y), ↑((Bx x) y) - K (u, y)

                          The bifunction attached to a concave-convex K is convex: its graph function is a pointwise supremum of jointly convex functions.

                          The bracket of that bifunction is cl₂ K.

                          Closedness of the partial closures #

                          cl₂ preserves convexity in the second variable.

                          cl₁ preserves concavity in the first variable.

                          The concave bracket and the bridge to adjoint bifunctions #

                          noncomputable def Tdaf.ConvexAnalysis.concaveBracket {U : Type u_1} {V : Type u_2} {Y : Type u_3} [AddCommGroup U] [Module ℝ U] [AddCommGroup V] [Module ℝ V] (Bu : U →ₗ[ℝ] V →ₗ[ℝ] ℝ) (G : Bifun Y V) :
                          U → Y → EReal

                          Rockafellar's bracket for a concave bifunction. Where bracket conjugates convexly in the second variable, this one conjugates concavely in the first.

                          Equations
                          Instances For
                            theorem Tdaf.ConvexAnalysis.concaveBracket_apply {U : Type u_1} {V : Type u_2} {Y : Type u_3} [AddCommGroup U] [Module ℝ U] [AddCommGroup V] [Module ℝ V] (Bu : U →ₗ[ℝ] V →ₗ[ℝ] ℝ) (G : Bifun Y V) (u : U) (y : Y) :
                            concaveBracket Bu G u y = ⨅ (v : V), ↑((Bu u) v) - G y v
                            theorem Tdaf.ConvexAnalysis.concaveBracket_eq_concaveConj {U : Type u_1} {V : Type u_2} {Y : Type u_3} [AddCommGroup U] [Module ℝ U] [AddCommGroup V] [Module ℝ V] (Bu : U →ₗ[ℝ] V →ₗ[ℝ] ℝ) (G : Bifun Y V) (y : Y) :
                            (fun (u : U) => concaveBracket Bu G u y) = concaveConj Bu.flip (G y)
                            theorem Tdaf.ConvexAnalysis.concaveAdjointBifun_eq_conj_concaveBracket {U : Type u_1} {V : Type u_2} {X : Type u_3} {Y : Type u_4} [AddCommGroup U] [Module ℝ U] [AddCommGroup V] [Module ℝ V] [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] (Bu : U →ₗ[ℝ] V →ₗ[ℝ] ℝ) (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (G : Bifun Y V) (u : U) (x : X) :
                            concaveAdjointBifun Bu Bx G u x = conj Bx.flip (fun (y : Y) => concaveBracket Bu G u y) x

                            The concave adjoint is the conjugate of the concave bracket — the mirror of adjointBifun_eq_concaveConj_bracket, with the two conjugations in the opposite order.

                            theorem Tdaf.ConvexAnalysis.concaveFn_concaveBracket {U : Type u_1} {V : Type u_2} {Y : Type u_3} [AddCommGroup U] [Module ℝ U] [AddCommGroup V] [Module ℝ V] (Bu : U →ₗ[ℝ] V →ₗ[ℝ] ℝ) (G : Bifun Y V) (y : Y) :
                            ConcaveFn fun (u : U) => concaveBracket Bu G u y

                            For a concave bifunction, ⟨·, G y⟩ is concave, being a concave conjugate.

                            theorem Tdaf.ConvexAnalysis.convexFn_concaveBracket {U : Type u_1} {V : Type u_2} {Y : Type u_3} [AddCommGroup U] [Module ℝ U] [AddCommGroup V] [Module ℝ V] [AddCommGroup Y] [Module ℝ Y] {G : Bifun Y V} (hG : ConcaveBifun G) (Bu : U →ₗ[ℝ] V →ₗ[ℝ] ℝ) (u : U) :
                            ConvexFn fun (y : Y) => concaveBracket Bu G u y

                            For a concave bifunction, ⟨u, G ·⟩ is convex. The mirror of concaveFn_bracket, and again an infimal projection of a jointly convex function.

                            theorem Tdaf.ConvexAnalysis.concaveConvexFn_concaveBracket {U : Type u_1} {V : Type u_2} {Y : Type u_3} [AddCommGroup U] [Module ℝ U] [AddCommGroup V] [Module ℝ V] [AddCommGroup Y] [Module ℝ Y] {G : Bifun Y V} (hG : ConcaveBifun G) (Bu : U →ₗ[ℝ] V →ₗ[ℝ] ℝ) :
                            ConcaveConvexFn fun (p : U × Y) => concaveBracket Bu G p.1 p.2

                            The concave bracket of a concave bifunction is concave-convex.

                            theorem Tdaf.ConvexAnalysis.adjointBifun_eq_concaveConj_bracket {U : Type u_1} {V : Type u_2} {X : Type u_3} {Y : Type u_4} [AddCommGroup U] [Module ℝ U] [AddCommGroup V] [Module ℝ V] [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] (Bu : U →ₗ[ℝ] V →ₗ[ℝ] ℝ) (Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ) (F : Bifun U X) (y : Y) (v : V) :
                            adjointBifun Bu Bx F y v = concaveConj Bu (fun (u : U) => bracket Bx F u y) v

                            The adjoint is the concave conjugate of the bracket. ⟨Fu, y⟩ and F* are the two halves of one conjugation of the graph function: first convexly in x, then concavely in u. This is what makes ⟨u, F* y⟩ = cl₁ ⟨Fu, y⟩ a case of concave Fenchel–Moreau.

                            The adjoint against the two partial closures #

                            theorem Tdaf.ConvexAnalysis.concaveConj_adjointBifun_eq_partialCl₁ {U : Type u_1} {V : Type u_2} {X : Type u_3} {Y : Type u_4} [AddCommGroup U] [Module ℝ U] [AddCommGroup V] [Module ℝ V] [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] [TopologicalSpace U] [IsTopologicalAddGroup U] [ContinuousSMul ℝ U] [LocallyConvexSpace ℝ U] {Bu : U →ₗ[ℝ] V →ₗ[ℝ] ℝ} [IsCompatiblePairing Bu] {Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ} {F : Bifun U X} (hF : ConvexBifun F) (y : Y) :
                            (concaveConj Bu.flip fun (v : V) => adjointBifun Bu Bx F y v) = fun (u : U) => partialCl₁ (fun (p : U × Y) => bracket Bx F p.1 p.2) (u, y)

                            ⟨u, F* y⟩ = cl₁ ⟨Fu, y⟩. Once adjointBifun_eq_concaveConj_bracket identifies F* y with concaveConj Bu ⟨F·, y⟩, this is concave Fenchel–Moreau applied to the concavity of ⟨F·, y⟩.

                            theorem Tdaf.ConvexAnalysis.concaveBracket_adjointBifun_eq_partialCl₁ {U : Type u_1} {V : Type u_2} {X : Type u_3} {Y : Type u_4} [AddCommGroup U] [Module ℝ U] [AddCommGroup V] [Module ℝ V] [AddCommGroup X] [Module ℝ X] [AddCommGroup Y] [Module ℝ Y] [TopologicalSpace U] [IsTopologicalAddGroup U] [ContinuousSMul ℝ U] [LocallyConvexSpace ℝ U] {Bu : U →ₗ[ℝ] V →ₗ[ℝ] ℝ} [IsCompatiblePairing Bu] {Bx : X →ₗ[ℝ] Y →ₗ[ℝ] ℝ} {F : Bifun U X} (hF : ConvexBifun F) (y : Y) :
                            (fun (u : U) => concaveBracket Bu (adjointBifun Bu Bx F) u y) = fun (u : U) => partialCl₁ (fun (p : U × Y) => bracket Bx F p.1 p.2) (u, y)

                            ⟨u, F* y⟩ = cl₁ ⟨Fu, y⟩, in bracket notation.

                            The general form in which the second equation is proved: for a concave bifunction G, the bracket of G* is the convex closure in y of the concave bracket of G. Fenchel–Moreau on Y, uniformly in u.

                            cl₂ ⟨u, F* y⟩ = ⟨(cl F) u, y⟩. The adjoint of F is concave with no hypothesis on F, so this is the concave form at F* followed by the biconjugation identity F** = cl F.

                            The clauses that need the correspondence #

                            The clause that is not pointwise: cl₂ K is again concave-convex. It is a bracket, and brackets are concave-convex.