1
1
/-
2
2
Copyright (c) 2022 Apurva Nakade. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
- Authors: Apurva Nakade
4
+ Authors: Apurva Nakade, Yaël Dillies
5
5
-/
6
6
import Mathlib.Analysis.Convex.Cone.Closure
7
- import Mathlib.Analysis.InnerProductSpace.Defs
7
+ import Mathlib.Topology.Algebra.Module.ClosedSubmodule
8
+ import Mathlib.Topology.Algebra.Order.Module
9
+ import Mathlib.Topology.Order.OrderClosed
8
10
9
11
/-!
10
12
# Proper cones
@@ -30,156 +32,119 @@ The next steps are:
30
32
31
33
-/
32
34
33
- open ContinuousLinearMap Filter Set
35
+ open ContinuousLinearMap Filter Function Set
34
36
35
- /-- A proper cone is a pointed cone `K` that is closed. Proper cones have the nice property that
37
+ variable {R E F G : Type *} [Semiring R] [PartialOrder R] [IsOrderedRing R]
38
+ variable [AddCommMonoid E] [TopologicalSpace E] [Module R E]
39
+ variable [AddCommMonoid F] [TopologicalSpace F] [Module R F]
40
+ variable [AddCommMonoid G] [TopologicalSpace G] [Module R G]
41
+
42
+ local notation "R≥0" => {r : R // 0 ≤ r}
43
+
44
+ variable (R E) in
45
+ /-- A proper cone is a pointed cone `C` that is closed. Proper cones have the nice property that
36
46
they are equal to their double dual, see `ProperCone.dual_dual`.
37
47
This makes them useful for defining cone programs and proving duality theorems. -/
38
- structure ProperCone (𝕜 : Type *) (E : Type *)
39
- [Semiring 𝕜] [PartialOrder 𝕜] [IsOrderedRing 𝕜] [AddCommMonoid E]
40
- [TopologicalSpace E] [Module 𝕜 E] extends Submodule {c : 𝕜 // 0 ≤ c} E where
41
- isClosed' : IsClosed (carrier : Set E)
48
+ abbrev ProperCone := ClosedSubmodule R≥0 E
42
49
43
50
namespace ProperCone
44
51
section Module
52
+ variable {C C₁ C₂ : ProperCone R E} {r : R} {x : E}
45
53
46
- variable {𝕜 : Type *} [Semiring 𝕜] [PartialOrder 𝕜] [IsOrderedRing 𝕜]
47
- variable {E : Type *} [AddCommMonoid E] [TopologicalSpace E] [Module 𝕜 E]
48
-
49
- /-- A `PointedCone` is defined as an alias of submodule. We replicate the abbreviation here and
50
- define `toPointedCone` as an alias of `toSubmodule`. -/
51
- abbrev toPointedCone (C : ProperCone 𝕜 E) := C.toSubmodule
54
+ /-- Any proper cone can be seen as a pointed cone.
52
55
53
- attribute [coe] toPointedCone
56
+ This is an alias of `ClosedSubmodule.toSubmodule` for convenience and discoverability. -/
57
+ @[coe] abbrev toPointedCone (C : ProperCone R E) : PointedCone R E := C.toSubmodule
54
58
55
- instance : Coe (ProperCone 𝕜 E) (PointedCone 𝕜 E) :=
56
- ⟨toPointedCone⟩
59
+ instance : Coe (ProperCone R E) (PointedCone R E) := ⟨toPointedCone⟩
57
60
58
- theorem toPointedCone_injective : Function. Injective ((↑) : ProperCone 𝕜 E → PointedCone 𝕜 E) :=
59
- fun S T h => by cases S; cases T; congr
61
+ lemma toPointedCone_injective : Injective ((↑) : ProperCone R E → PointedCone R E) :=
62
+ ClosedSubmodule.toSubmodule_injective
60
63
61
64
-- TODO: add `ConvexConeClass` that extends `SetLike` and replace the below instance
62
- instance : SetLike (ProperCone 𝕜 E) E where
63
- coe K := K .carrier
64
- coe_injective' _ _ h := ProperCone.toPointedCone_injective ( SetLike.coe_injective h)
65
+ instance : SetLike (ProperCone R E) E where
66
+ coe C := C .carrier
67
+ coe_injective' _ _ h := ProperCone.toPointedCone_injective <| SetLike.coe_injective h
65
68
66
- @[ext]
67
- theorem ext {S T : ProperCone 𝕜 E} (h : ∀ x, x ∈ S ↔ x ∈ T) : S = T :=
68
- SetLike.ext h
69
+ @[ext] lemma ext (h : ∀ x, x ∈ C₁ ↔ x ∈ C₂) : C₁ = C₂ := SetLike.ext h
69
70
70
- @[simp]
71
- theorem mem_coe {x : E} {K : ProperCone 𝕜 E} : x ∈ (K : PointedCone 𝕜 E) ↔ x ∈ K :=
72
- Iff.rfl
71
+ @[simp] lemma mem_toPointedCone : x ∈ C.toPointedCone ↔ x ∈ C := .rfl
73
72
74
- instance instZero (K : ProperCone 𝕜 E) : Zero K := PointedCone.instZero (K.toSubmodule)
73
+ @[deprecated (since := "2025-06-11")] alias mem_coe := mem_toPointedCone
75
74
76
- protected theorem nonempty (K : ProperCone 𝕜 E) : (K : Set E).Nonempty :=
77
- ⟨ 0 , by { simp_rw [SetLike.mem_coe, ← ProperCone.mem_coe, Submodule.zero_mem] }⟩
75
+ lemma pointed_toConvexCone (C : ProperCone R E) : (C : ConvexCone R E).Pointed :=
76
+ C.toPointedCone.pointed_toConvexCone
78
77
79
- protected theorem isClosed (K : ProperCone 𝕜 E) : IsClosed (K : Set E) :=
80
- K.isClosed'
78
+ @[deprecated (since := "2025-06-11")] protected alias pointed := pointed_toConvexCone
81
79
82
- end Module
80
+ protected lemma nonempty (C : ProperCone R E) : (C : Set E).Nonempty := C.toSubmodule.nonempty
81
+ protected lemma isClosed (C : ProperCone R E) : IsClosed (C : Set E) := C.isClosed'
83
82
84
- section PositiveCone
83
+ protected nonrec lemma smul_mem (C : ProperCone R E) (hx : x ∈ C) (hr : 0 ≤ r) : r • x ∈ C :=
84
+ C.smul_mem ⟨r, hr⟩ hx
85
85
86
- variable (𝕜 E)
87
- variable [Semiring 𝕜] [PartialOrder 𝕜] [IsOrderedRing 𝕜]
88
- [AddCommGroup E] [PartialOrder E] [IsOrderedAddMonoid E] [Module 𝕜 E] [OrderedSMul 𝕜 E]
89
- [TopologicalSpace E] [OrderClosedTopology E]
86
+ section T1Space
87
+ variable [T1Space E]
90
88
91
- /-- The positive cone is the proper cone formed by the set of nonnegative elements in an ordered
92
- module. -/
93
- def positive : ProperCone 𝕜 E where
94
- toSubmodule := PointedCone.positive 𝕜 E
95
- isClosed' := isClosed_Ici
89
+ lemma mem_bot : x ∈ (⊥ : ProperCone R E) ↔ x = 0 := .rfl
96
90
97
- @[simp]
98
- theorem mem_positive {x : E} : x ∈ positive 𝕜 E ↔ 0 ≤ x :=
99
- Iff.rfl
91
+ @[simp, norm_cast] lemma coe_bot : (⊥ : ProperCone R E) = ({0 } : Set E) := rfl
92
+ @[simp, norm_cast] lemma toPointedCone_bot : (⊥ : ProperCone R E).toPointedCone = ⊥ := rfl
100
93
101
- @[simp]
102
- theorem coe_positive : ↑(positive 𝕜 E) = ConvexCone.positive 𝕜 E :=
103
- rfl
94
+ @[deprecated (since := "2025-06-11")] alias mem_zero := mem_bot
95
+ @[deprecated (since := "2025-06-11")] alias coe_zero := coe_bot
96
+ @[deprecated (since := "2025-06-11")] alias pointed_zero := pointed_toConvexCone
104
97
105
- end PositiveCone
98
+ end T1Space
106
99
107
- section Module
100
+ /-- The closure of image of a proper cone under a `R`-linear map is a proper cone. We
101
+ use continuous maps here so that the comap of f is also a map between proper cones. -/
102
+ abbrev comap (f : E →L[R] F) (C : ProperCone R F) : ProperCone R E :=
103
+ ClosedSubmodule.comap (f.restrictScalars R≥0 ) C
108
104
109
- variable {𝕜 : Type *} [Semiring 𝕜] [PartialOrder 𝕜] [IsOrderedRing 𝕜]
110
- variable {E : Type *} [AddCommMonoid E] [TopologicalSpace E] [T1Space E] [Module 𝕜 E]
105
+ @[simp] lemma comap_id (C : ProperCone R F) : C.comap (.id _ _) = C := rfl
111
106
112
- instance : Zero (ProperCone 𝕜 E) :=
113
- ⟨{ toSubmodule := 0
114
- isClosed' := isClosed_singleton }⟩
107
+ @[simp] lemma coe_comap (f : E →L[R] F) (C : ProperCone R F) : (C.comap f : Set E) = f ⁻¹' C := rfl
115
108
116
- instance : Inhabited (ProperCone 𝕜 E) :=
117
- ⟨ 0 ⟩
109
+ lemma comap_comap (g : F →L[R] G) (f : E →L[R] F) (C : ProperCone R G) :
110
+ (C.comap g).comap f = C.comap (g.comp f) := rfl
118
111
119
- @[simp]
120
- theorem mem_zero (x : E) : x ∈ (0 : ProperCone 𝕜 E) ↔ x = 0 :=
121
- Iff.rfl
112
+ lemma mem_comap {C : ProperCone R F} {f : E →L[R] F} : x ∈ C.comap f ↔ f x ∈ C := .rfl
122
113
123
- @[simp, norm_cast]
124
- theorem coe_zero : ↑(0 : ProperCone 𝕜 E) = (0 : ConvexCone 𝕜 E) :=
125
- rfl
114
+ variable [ContinuousAdd F] [ContinuousConstSMul R F]
126
115
127
- theorem pointed_zero : ((0 : ProperCone 𝕜 E) : ConvexCone 𝕜 E).Pointed := by
128
- simp [ConvexCone.pointed_zero]
116
+ /-- The closure of image of a proper cone under a linear map is a proper cone.
129
117
130
- end Module
118
+ We use continuous maps here to match `ProperCone.comap`. -/
119
+ abbrev map (f : E →L[R] F) (C : ProperCone R E) : ProperCone R F :=
120
+ ClosedSubmodule.map (f.restrictScalars R≥0 ) C
131
121
132
- section InnerProductSpace
133
-
134
- variable {E : Type *} [NormedAddCommGroup E] [InnerProductSpace ℝ E]
135
- variable {F : Type *} [NormedAddCommGroup F] [InnerProductSpace ℝ F]
136
- variable {G : Type *} [NormedAddCommGroup G] [InnerProductSpace ℝ G]
137
-
138
- protected theorem pointed (K : ProperCone ℝ E) : (K : ConvexCone ℝ E).Pointed :=
139
- zero_mem K.toPointedCone
140
-
141
- /-- The closure of image of a proper cone under a continuous `ℝ`-linear map is a proper cone. We
142
- use continuous maps here so that the comap of f is also a map between proper cones. -/
143
- noncomputable def map (f : E →L[ℝ] F) (K : ProperCone ℝ E) : ProperCone ℝ F where
144
- toSubmodule := PointedCone.closure (PointedCone.map (f : E →ₗ[ℝ] F) ↑K)
145
- isClosed' := isClosed_closure
122
+ @[simp] lemma map_id (C : ProperCone R F) : C.map (.id _ _) = C := ClosedSubmodule.map_id _
146
123
147
124
@[simp, norm_cast]
148
- theorem coe_map (f : E →L[ℝ] F) (K : ProperCone ℝ E) :
149
- ↑(K.map f) = (PointedCone.map (f : E →ₗ[ℝ] F) ↑K).closure :=
150
- rfl
125
+ lemma coe_map (f : E →L[R] F) (C : ProperCone R E) :
126
+ C.map f = (C.toPointedCone.map (f : E →ₗ[R] F)).closure := rfl
151
127
152
128
@[simp]
153
- theorem mem_map {f : E →L[ℝ] F} {K : ProperCone ℝ E} {y : F} :
154
- y ∈ K.map f ↔ y ∈ (PointedCone.map (f : E →ₗ[ℝ] F) ↑K).closure :=
155
- Iff.rfl
129
+ lemma mem_map {f : E →L[R] F} {C : ProperCone R E} {y : F} :
130
+ y ∈ C.map f ↔ y ∈ (C.toPointedCone.map (f : E →ₗ[R] F)).closure := .rfl
156
131
157
- @[simp]
158
- theorem map_id (K : ProperCone ℝ E) : K.map (ContinuousLinearMap.id ℝ E) = K :=
159
- ProperCone.toPointedCone_injective <| by simpa using IsClosed.closure_eq K.isClosed
160
-
161
- /-- The preimage of a proper cone under a continuous `ℝ`-linear map is a proper cone. -/
162
- noncomputable def comap (f : E →L[ℝ] F) (S : ProperCone ℝ F) : ProperCone ℝ E where
163
- toSubmodule := PointedCone.comap (f : E →ₗ[ℝ] F) S
164
- isClosed' := by
165
- rw [PointedCone.comap]
166
- apply IsClosed.preimage f.2 S.isClosed
167
-
168
- @[simp]
169
- theorem coe_comap (f : E →L[ℝ] F) (S : ProperCone ℝ F) : (S.comap f : Set E) = f ⁻¹' S :=
170
- rfl
132
+ end Module
171
133
172
- @[simp]
173
- theorem comap_id (S : ConvexCone ℝ E) : S.comap LinearMap.id = S :=
174
- SetLike.coe_injective preimage_id
134
+ section PositiveCone
135
+ variable {E : Type *} [AddCommGroup E] [TopologicalSpace E] [Module R E] [PartialOrder E]
136
+ [IsOrderedAddMonoid E] [OrderedSMul R E] [OrderClosedTopology E] {x : E}
175
137
176
- theorem comap_comap (g : F →L[ℝ] G) (f : E →L[ℝ] F) (S : ProperCone ℝ G) :
177
- (S.comap g).comap f = S.comap (g.comp f) :=
178
- SetLike.coe_injective <| by congr
138
+ variable (R E) in
139
+ /-- The positive cone is the proper cone formed by the set of nonnegative elements in an ordered
140
+ module. -/
141
+ @[simps!]
142
+ def positive : ProperCone R E where
143
+ toSubmodule := PointedCone.positive R E
144
+ isClosed' := isClosed_Ici
179
145
180
- @[simp]
181
- theorem mem_comap {f : E →L[ℝ] F} {S : ProperCone ℝ F} {x : E} : x ∈ S.comap f ↔ f x ∈ S :=
182
- Iff.rfl
146
+ @[simp] lemma mem_positive : x ∈ positive R E ↔ 0 ≤ x := .rfl
147
+ @[simp] lemma toPointedCone_positive : (positive R E).toPointedCone = .positive R E := rfl
183
148
184
- end InnerProductSpace
149
+ end PositiveCone
185
150
end ProperCone
0 commit comments