Convex Analysis (Rockafellar, 1970) -- Chapter 04 -- Section 19 -- Part 14
open scoped BigOperatorsopen scoped Pointwiseopen Topologysection Chap19section Section19
Helper for Theorem 19.7: for nonempty C, adjoining 0 to the cone hull does not change
the closure.
lemma helperForTheorem_19_7_closure_convexConeGenerated_eq_closure_hull
{n : β} {C : Set (Fin n β β)}
(hCne : C.Nonempty) :
closure (convexConeGenerated n C) =
closure ((ConvexCone.hull β C : Set (Fin n β β))) := by
have hzero_rec : (0 : Fin n β β) β Set.recessionCone C := by
intro x hx t ht
simpa [zero_smul, add_zero] using hx
have hzero_mem_closure_hull :
(0 : Fin n β β) β closure ((ConvexCone.hull β C : Set (Fin n β β))) :=
helperForTheorem_19_6_recessionDirection_mem_closure_convexConeHull_of_nonempty
(d := n) (C := C) hCne hzero_rec
have hKdef :
convexConeGenerated n C =
({0} : Set (Fin n β β)) βͺ (ConvexCone.hull β C : Set (Fin n β β)) := by
ext x
constructor
Β· intro hx
have hx' : x = 0 β¨ x β (ConvexCone.hull β C : Set (Fin n β β)) := by
simpa [convexConeGenerated, Set.mem_insert_iff] using hx
rcases hx' with hx0 | hxHull
Β· have hx0_singleton : x β ({0} : Set (Fin n β β)) := by
simpa [Set.mem_singleton_iff] using hx0
exact Or.inl hx0_singleton
Β· exact Or.inr hxHull
Β· intro hx
rcases hx with hx0 | hxHull
Β· have hx0' : x = 0 := by simpa [Set.mem_singleton_iff] using hx0
exact (Set.mem_insert_iff).2 (Or.inl hx0')
Β· exact (Set.mem_insert_iff).2 (Or.inr hxHull)
calc
closure (convexConeGenerated n C)
= closure (({0} : Set (Fin n β β)) βͺ (ConvexCone.hull β C : Set (Fin n β β))) := by
simp [hKdef]
_ = closure ({0} : Set (Fin n β β)) βͺ closure ((ConvexCone.hull β C : Set (Fin n β β))) := by
simpa using
(closure_union
(s := ({0} : Set (Fin n β β)))
(t := (ConvexCone.hull β C : Set (Fin n β β))))
_ = closure ((ConvexCone.hull β C : Set (Fin n β β))) := by
apply Set.union_eq_right.mpr
intro x hx
have hx0 : x = 0 := by
have hx' : x β ({0} : Set (Fin n β β)) := by
simpa [closure_singleton] using hx
simpa [Set.mem_singleton_iff] using hx'
simpa [hx0] using hzero_mem_closure_hullHelper for Theorem 19.7: the Euclidean-coordinate transport of the recession cone term equals the ambient-space recession cone.
lemma helperForTheorem_19_7_recessionCone_transport_eq
{n : β} {C : Set (Fin n β β)} :
let e := (EuclideanSpace.equiv (π := β) (ΞΉ := Fin n))
Set.image e (Set.recessionCone (Set.image e.symm C)) = Set.recessionCone C := by
intro e
have hrec :
Set.recessionCone (Set.image e.symm C) = Set.image e.symm (Set.recessionCone C) := by
simpa using (recessionCone_image_linearEquiv (e := e.symm.toLinearEquiv) (C := C))
calc
Set.image e (Set.recessionCone (Set.image e.symm C))
= Set.image e (Set.image e.symm (Set.recessionCone C)) := by
simp [hrec]
_ = Set.recessionCone C := by
simp [Set.image_image]Helper for Theorem 19.7: rewriting the positive-scaling union from nested existential indices to a subtype index.
lemma helperForTheorem_19_7_iUnion_pos_subtype_rewrite
{n : β} {C : Set (Fin n β β)} :
(β (t : β), β (_ : 0 < t), t β’ C) =
β (lam : {lam : β // 0 < lam}), (lam : β) β’ C := by
ext x
constructor
Β· intro hx
rcases Set.mem_iUnion.1 hx with β¨t, htβ©
rcases Set.mem_iUnion.1 ht with β¨htpos, hxtβ©
exact Set.mem_iUnion.2 β¨β¨t, htposβ©, hxtβ©
Β· intro hx
rcases Set.mem_iUnion.1 hx with β¨lam, hxlβ©
exact Set.mem_iUnion.2 β¨(lam : β), Set.mem_iUnion.2 β¨lam.property, hxlβ©β©
Helper for Theorem 19.7: if 0 β C = mixedConvexHull Sβ Sβ, then every direction generator
belongs to C.
lemma helperForTheorem_19_7_originMem_directions_subset_carrier
{n : β} {C Sβ Sβ : Set (Fin n β β)}
(hCeq : C = mixedConvexHull (n := n) Sβ Sβ)
(hC0 : (0 : Fin n β β) β C) :
Sβ β C := by
intro dir hdir
have hdir_rec_mixed : dir β Set.recessionCone (mixedConvexHull (n := n) Sβ Sβ) :=
helperForTheorem_19_6_directions_subset_recessionCone_mixedConvexHull
(d := n) (Sβ := Sβ) (Sβ := Sβ) hdir
have hdir_rec : dir β Set.recessionCone C := by
simpa [hCeq] using hdir_rec_mixed
have h1nonneg : (0 : β) β€ 1 := by
norm_num
have hmem : (0 : Fin n β β) + (1 : β) β’ dir β C :=
hdir_rec (x := (0 : Fin n β β)) hC0 (t := (1 : β)) h1nonneg
simpa using hmemHelper for Theorem 19.7: if the origin belongs to C, then every recession direction of C lies in C.
lemma helperForTheorem_19_7_recessionCone_subset_of_origin_mem
{n : β} {C : Set (Fin n β β)}
(hC0 : (0 : Fin n β β) β C) :
Set.recessionCone C β C := by
intro dir hdir
have h1nonneg : (0 : β) β€ 1 := by
norm_num
have hmem : (0 : Fin n β β) + (1 : β) β’ dir β C :=
hdir (x := (0 : Fin n β β)) hC0 (t := (1 : β)) h1nonneg
simpa using hmem
Helper for Theorem 19.7: with finite mixed-hull data and 0 β C, the generated cone of C
coincides with the finite cone generated by points and directions.
lemma helperForTheorem_19_7_originMem_convexConeGenerated_eq_finiteCone
{n : β} {C Sβ Sβ : Set (Fin n β β)}
(hCeq : C = mixedConvexHull (n := n) Sβ Sβ)
(hSβfin : Set.Finite Sβ)
(hSβfin : Set.Finite Sβ)
(hC0 : (0 : Fin n β β) β C) :
convexConeGenerated n C = cone n (Sβ βͺ Sβ) := by
have hCne : C.Nonempty := β¨0, hC0β©
have hMixed_nonempty : (mixedConvexHull (n := n) Sβ Sβ).Nonempty := by
refine β¨0, ?_β©
simpa [hCeq] using hC0
have hSβne : Sβ.Nonempty :=
helperForTheorem_19_5_pointsNonempty_of_nonempty_mixedConvexHull
(n := n) (Sβ := Sβ) (Sβ := Sβ) hMixed_nonempty
have hclosure_hull_eq_cone :
closure ((ConvexCone.hull β C : Set (Fin n β β))) = cone n (Sβ βͺ Sβ) := by
calc
closure ((ConvexCone.hull β C : Set (Fin n β β)))
= closure ((ConvexCone.hull β (mixedConvexHull (n := n) Sβ Sβ) : Set (Fin n β β))) := by
simp [hCeq]
_ = cone n (Sβ βͺ Sβ) :=
helperForTheorem_19_6_closure_convexConeHull_eq_cone_of_finiteMixedData
(d := n) (Sβ := Sβ) (Sβ := Sβ) hSβfin hSβfin hSβne
have hclosureK_eq_cone :
closure (convexConeGenerated n C) = cone n (Sβ βͺ Sβ) := by
calc
closure (convexConeGenerated n C)
= closure ((ConvexCone.hull β C : Set (Fin n β β))) :=
helperForTheorem_19_7_closure_convexConeGenerated_eq_closure_hull
(n := n) (C := C) hCne
_ = cone n (Sβ βͺ Sβ) := hclosure_hull_eq_cone
have hSβ_subset_C : Sβ β C := by
intro x hx
have hxMixed : x β mixedConvexHull (n := n) Sβ Sβ :=
helperForTheorem_19_6_points_subset_mixedConvexHull
(d := n) (Sβ := Sβ) (Sβ := Sβ) hx
simpa [hCeq] using hxMixed
have hSβ_subset_C : Sβ β C :=
helperForTheorem_19_7_originMem_directions_subset_carrier
(n := n) (C := C) (Sβ := Sβ) (Sβ := Sβ) hCeq hC0
have hUnion_subset_C : Sβ βͺ Sβ β C := by
intro x hx
rcases hx with hx0 | hx1
Β· exact hSβ_subset_C hx0
Β· exact hSβ_subset_C hx1
have hUnion_subset_hullC : Sβ βͺ Sβ β (ConvexCone.hull β C : Set (Fin n β β)) := by
intro x hx
exact ConvexCone.subset_hull (hUnion_subset_C hx)
have hHull_subset :
(ConvexCone.hull β (Sβ βͺ Sβ) : Set (Fin n β β)) β (ConvexCone.hull β C : Set (Fin n β β)) :=
ConvexCone.hull_min (s := Sβ βͺ Sβ) (C := ConvexCone.hull β C) hUnion_subset_hullC
have hcone_subset_K : cone n (Sβ βͺ Sβ) β convexConeGenerated n C := by
intro x hx
have hx' : x β convexConeGenerated n (Sβ βͺ Sβ) := by
simpa [cone_eq_convexConeGenerated (n := n) (Sβ := Sβ βͺ Sβ)] using hx
have hx'' : x = 0 β¨ x β (ConvexCone.hull β (Sβ βͺ Sβ) : Set (Fin n β β)) := by
simpa [convexConeGenerated, Set.mem_insert_iff] using hx'
rcases hx'' with hx0 | hxHull
Β· subst hx0
exact Set.mem_insert (0 : Fin n β β) (ConvexCone.hull β C : Set (Fin n β β))
Β· have hxHullC : x β (ConvexCone.hull β C : Set (Fin n β β)) := hHull_subset hxHull
have hxK : x = 0 β¨ x β (ConvexCone.hull β C : Set (Fin n β β)) := Or.inr hxHullC
simpa [convexConeGenerated, Set.mem_insert_iff] using hxK
have hK_subset_cone : convexConeGenerated n C β cone n (Sβ βͺ Sβ) := by
intro x hx
have hxcl : x β closure (convexConeGenerated n C) := subset_closure hx
simpa [hclosureK_eq_cone] using hxcl
exact Set.Subset.antisymm hK_subset_cone hcone_subset_K
Theorem 19.7: Let C be a non-empty polyhedral convex set, and let K be the closure of the
convex cone generated by C. Then K is a polyhedral convex cone, and
.
theorem polyhedralConvexCone_closure_convexConeGenerated
(n : β) (C : Set (Fin n β β)) :
C.Nonempty β
IsPolyhedralConvexSet n C β
IsPolyhedralConvexSet n (closure (convexConeGenerated n C)) β§
IsConeSet n (closure (convexConeGenerated n C)) β§
closure (convexConeGenerated n C) =
(β (lam : {lam : β // 0 < lam}), (lam : β) β’ C) βͺ Set.recessionCone C := by
intro hCne hCpoly
have hCconv : Convex β C :=
helperForTheorem_19_1_polyhedral_isConvex (n := n) (C := C) hCpoly
have hCclosed : IsClosed C :=
(helperForTheorem_19_1_polyhedral_imp_closed_finiteFaces
(n := n) (C := C) hCpoly).1
have hpolyClosureHull :
IsPolyhedralConvexSet n (closure ((ConvexCone.hull β C : Set (Fin n β β)))) :=
helperForTheorem_19_6_polyhedral_closure_convexConeHull_of_polyhedral
(d := n) (S := C) hCne hCpoly
have hclosure_eq_hull :
closure (convexConeGenerated n C) =
closure ((ConvexCone.hull β C : Set (Fin n β β))) :=
helperForTheorem_19_7_closure_convexConeGenerated_eq_closure_hull
(n := n) (C := C) hCne
have hpolyK : IsPolyhedralConvexSet n (closure (convexConeGenerated n C)) := by
simpa [hclosure_eq_hull] using hpolyClosureHull
have hconeBase : IsConeSet n (convexConeGenerated n C) :=
(isConvexCone_convexConeGenerated (n := n) (Sβ := C)).1
have hconeClosure : IsConeSet n (closure (convexConeGenerated n C)) :=
cor11_7_2_isConeSet_closure (n := n) (K := convexConeGenerated n C) hconeBase
have hrepr :
closure (convexConeGenerated n C) =
(β (lam : {lam : β // 0 < lam}), (lam : β) β’ C) βͺ Set.recessionCone C := by
by_cases hC0 : (0 : Fin n β β) β C
Β· have hTFAE :
[IsPolyhedralConvexSet n C,
(IsClosed C β§ {C' : Set (Fin n β β) | IsFace (π := β) C C'}.Finite),
IsFinitelyGeneratedConvexSet n C].TFAE :=
polyhedral_closed_finiteFaces_finitelyGenerated_equiv (n := n) (C := C) hCconv
have hCfg : IsFinitelyGeneratedConvexSet n C := (hTFAE.out 0 2).1 hCpoly
rcases hCfg with β¨Sβ, Sβ, hSβfin, hSβfin, hCeqβ©
have hK_eq_cone :
convexConeGenerated n C = cone n (Sβ βͺ Sβ) :=
helperForTheorem_19_7_originMem_convexConeGenerated_eq_finiteCone
(n := n) (C := C) (Sβ := Sβ) (Sβ := Sβ) hCeq hSβfin hSβfin hC0
have hcone_poly : IsPolyhedralConvexSet n (cone n (Sβ βͺ Sβ)) :=
helperForTheorem_19_1_cone_polyhedral_of_finite_generators
(m := n) (T := Sβ βͺ Sβ) (hSβfin.union hSβfin)
have hcone_closed : IsClosed (cone n (Sβ βͺ Sβ)) :=
(helperForTheorem_19_1_polyhedral_imp_closed_finiteFaces
(n := n) (C := cone n (Sβ βͺ Sβ)) hcone_poly).1
have hclosureK : closure (convexConeGenerated n C) = convexConeGenerated n C := by
calc
closure (convexConeGenerated n C)
= closure (cone n (Sβ βͺ Sβ)) := by
simp [hK_eq_cone]
_ = cone n (Sβ βͺ Sβ) :=
(closure_eq_iff_isClosed (s := cone n (Sβ βͺ Sβ))).2 hcone_closed
_ = convexConeGenerated n C := by
simp [hK_eq_cone]
have hrec_subset_C : Set.recessionCone C β C :=
helperForTheorem_19_7_recessionCone_subset_of_origin_mem
(n := n) (C := C) hC0
have hC_subset_K : C β convexConeGenerated n C := by
intro x hx
have hxHull : x β (ConvexCone.hull β C : Set (Fin n β β)) :=
ConvexCone.subset_hull hx
have hxK : x = 0 β¨ x β (ConvexCone.hull β C : Set (Fin n β β)) := Or.inr hxHull
simpa [convexConeGenerated, Set.mem_insert_iff] using hxK
have hrec_subset_K : Set.recessionCone C β convexConeGenerated n C :=
hrec_subset_C.trans hC_subset_K
have hrec0 : (0 : Fin n β β) β Set.recessionCone C := by
intro x hx t ht
simpa [zero_smul, add_zero] using hx
have hK_union :
convexConeGenerated n C βͺ Set.recessionCone C =
(β (t : β), β (_ : 0 < t), t β’ C) βͺ Set.recessionCone C := by
simpa using
(convexConeGenerated_union_recession_eq_iUnion_pos (C := C) hCconv
(recC := Set.recessionCone C) hrec0)
have hK_eq_union :
convexConeGenerated n C =
(β (t : β), β (_ : 0 < t), t β’ C) βͺ Set.recessionCone C := by
calc
convexConeGenerated n C = convexConeGenerated n C βͺ Set.recessionCone C := by
symm
exact Set.union_eq_left.mpr hrec_subset_K
_ = (β (t : β), β (_ : 0 < t), t β’ C) βͺ Set.recessionCone C := hK_union
calc
closure (convexConeGenerated n C) = convexConeGenerated n C := hclosureK
_ = (β (t : β), β (_ : 0 < t), t β’ C) βͺ Set.recessionCone C := hK_eq_union
_ = (β (lam : {lam : β // 0 < lam}), (lam : β) β’ C) βͺ Set.recessionCone C := by
rw [helperForTheorem_19_7_iUnion_pos_subtype_rewrite (n := n) (C := C)]
Β· let e := (EuclideanSpace.equiv (π := β) (ΞΉ := Fin n))
let C' : Set (EuclideanSpace β (Fin n)) := Set.image e.symm C
let recC : Set (Fin n β β) := Set.image e (Set.recessionCone C')
let K : Set (Fin n β β) := convexConeGenerated n C
have hcore :
closure K = K βͺ recC β§
K βͺ recC = (β (t : β), β (_ : 0 < t), t β’ C) βͺ recC := by
simpa [e, C', recC, K] using
(closure_convexConeGenerated_eq_union_recessionCone
(C := C) hCne hCclosed hCconv hC0)
have hrec_transport : recC = Set.recessionCone C := by
simpa [e, C', recC] using
(helperForTheorem_19_7_recessionCone_transport_eq (n := n) (C := C))
calc
closure (convexConeGenerated n C) = K βͺ recC := by
simpa [K] using hcore.1
_ = (β (t : β), β (_ : 0 < t), t β’ C) βͺ recC := hcore.2
_ = (β (lam : {lam : β // 0 < lam}), (lam : β) β’ C) βͺ recC := by
rw [helperForTheorem_19_7_iUnion_pos_subtype_rewrite (n := n) (C := C)]
_ = (β (lam : {lam : β // 0 < lam}), (lam : β) β’ C) βͺ Set.recessionCone C := by
simp [hrec_transport]
exact β¨hpolyK, hconeClosure, hreprβ©Helper for Corollary 19.7.1: a polyhedral convex set is finitely generated.
lemma helperForCorollary_19_7_1_finitelyGenerated_of_polyhedral
{n : β} {C : Set (Fin n β β)}
(hCpoly : IsPolyhedralConvexSet n C) :
IsFinitelyGeneratedConvexSet n C := by
have hCconv : Convex β C :=
helperForTheorem_19_1_polyhedral_isConvex (n := n) (C := C) hCpoly
have hTFAE :
[IsPolyhedralConvexSet n C,
(IsClosed C β§ {C' : Set (Fin n β β) | IsFace (π := β) C C'}.Finite),
IsFinitelyGeneratedConvexSet n C].TFAE :=
polyhedral_closed_finiteFaces_finitelyGenerated_equiv (n := n) (C := C) hCconv
exact (hTFAE.out 0 2).1 hCpoly
Corollary 19.7.1: If C is a polyhedral convex set containing the origin, the convex cone
generated by C is polyhedral.
theorem polyhedral_convexConeGenerated_of_origin_mem
(n : β) (C : Set (Fin n β β)) :
IsPolyhedralConvexSet n C β
(0 : Fin n β β) β C β
IsPolyhedralConvexSet n (convexConeGenerated n C) := by
intro hCpoly hC0
have hCfg : IsFinitelyGeneratedConvexSet n C :=
helperForCorollary_19_7_1_finitelyGenerated_of_polyhedral
(n := n) (C := C) hCpoly
rcases hCfg with β¨Sβ, Sβ, hSβfin, hSβfin, hCeqβ©
have hK_eq_cone :
convexConeGenerated n C = cone n (Sβ βͺ Sβ) :=
helperForTheorem_19_7_originMem_convexConeGenerated_eq_finiteCone
(n := n) (C := C) (Sβ := Sβ) (Sβ := Sβ) hCeq hSβfin hSβfin hC0
have hcone_poly : IsPolyhedralConvexSet n (cone n (Sβ βͺ Sβ)) :=
helperForTheorem_19_1_cone_polyhedral_of_finite_generators
(m := n) (T := Sβ βͺ Sβ) (hSβfin.union hSβfin)
simpa [hK_eq_cone] using hcone_polyend Section19end Chap19