Documentation

Mathlib.Geometry.Convex.Cone.Dual

The algebraic dual of a cone #

Given a bilinear pairing p between two R-modules M and N and a set s in M, we define PointedCone.dual p C to be the pointed cone in N consisting of all points y such that 0 ≤ p x y for all x ∈ s.

When the pairing is perfect, this gives us the algebraic dual of a cone. This is developed here. When the pairing is continuous and perfect (as a continuous pairing), this gives us the topological dual instead. See Mathlib/Analysis/Convex/Cone/Dual.lean for that case.

Implementation notes #

We do not provide a ConvexCone-valued version of PointedCone.dual since the dual cone of any set always contains 0, ie is a pointed cone. Furthermore, the strict version {y | ∀ x ∈ s, 0 < p x y} is a candidate to the name ConvexCone.dual.

TODO #

Deduce from dual_flip_dual_dual_flip that polyhedral cones are invariant under taking double duals

def PointedCone.dual {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] (p : M →ₗ[R] N →ₗ[R] R) (s : Set M) :

The dual cone of a set s with respect to a bilinear pairing p is the cone consisting of all points y such that for all points x ∈ s we have 0 ≤ p x y.

Equations
    Instances For
      @[simp]
      theorem PointedCone.mem_dual {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} {s : Set M} {y : N} :
      y dual p s ∀ ⦃x : M⦄, x s0 (p x) y
      @[simp]
      theorem PointedCone.dual_empty {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} :
      @[simp]
      theorem PointedCone.dual_zero {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} :
      dual p 0 =
      theorem PointedCone.dual_univ {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} (hp : Function.Injective p.flip) :
      theorem PointedCone.dual_le_dual {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} {s t : Set M} (h : t s) :
      dual p s dual p t
      theorem PointedCone.dual_singleton {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} (x : M) :
      dual p {x} = comap (p x) (positive R R)

      The inner dual cone of a singleton is given by the preimage of the positive cone under the linear map p x.

      theorem PointedCone.dual_union {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} (s t : Set M) :
      dual p (s t) = dual p sdual p t
      theorem PointedCone.dual_insert {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} (x : M) (s : Set M) :
      dual p (insert x s) = dual p {x}dual p s
      theorem PointedCone.dual_iUnion {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} {ι : Sort u_4} (f : ιSet M) :
      dual p (⋃ (i : ι), f i) = ⨅ (i : ι), dual p (f i)
      theorem PointedCone.dual_sUnion {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} (S : Set (Set M)) :
      dual p (⋃₀ S) = sInf (dual p '' S)
      theorem PointedCone.dual_eq_iInter_dual_singleton {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} (s : Set M) :
      (dual p s) = ⋂ (i : s), (dual p {i})

      The dual cone of s equals the intersection of dual cones of the points in s.

      theorem PointedCone.subset_dual_dual {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} {s : Set M} :
      s (dual p.flip (dual p s))

      Any set is a subset of its double dual cone.

      @[simp]
      theorem PointedCone.dual_dual_flip_dual {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} (s : Set M) :
      dual p (dual p.flip (dual p s)) = dual p s
      @[simp]
      theorem PointedCone.dual_flip_dual_dual_flip {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} (s : Set N) :
      dual p.flip (dual p (dual p.flip s)) = dual p.flip s
      @[simp]
      theorem PointedCone.dual_span {R : Type u_1} {M : Type u_2} {N : Type u_3} [CommRing R] [PartialOrder R] [IsOrderedRing R] [AddCommGroup M] [AddCommGroup N] [Module R M] [Module R N] {p : M →ₗ[R] N →ₗ[R] R} (s : Set M) :
      dual p (Submodule.span { c : R // 0 c } s) = dual p s