Skip to content

Commit d041e19

Browse files
committed
refactor: redefine ProperCone as an abbrev for ClosedSubmodule (#25204)
... and derive the `ProperCone` operations from `ClosedSubmodule` too. Also rename the scalar ring from `𝕜` to `R`. From Toric
1 parent ea76012 commit d041e19

File tree

2 files changed

+78
-113
lines changed

2 files changed

+78
-113
lines changed
Lines changed: 77 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
/-
22
Copyright (c) 2022 Apurva Nakade. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Apurva Nakade
4+
Authors: Apurva Nakade, Yaël Dillies
55
-/
66
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
810

911
/-!
1012
# Proper cones
@@ -30,156 +32,119 @@ The next steps are:
3032
3133
-/
3234

33-
open ContinuousLinearMap Filter Set
35+
open ContinuousLinearMap Filter Function Set
3436

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
3646
they are equal to their double dual, see `ProperCone.dual_dual`.
3747
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
4249

4350
namespace ProperCone
4451
section Module
52+
variable {C C₁ C₂ : ProperCone R E} {r : R} {x : E}
4553

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.
5255
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
5458

55-
instance : Coe (ProperCone 𝕜 E) (PointedCone 𝕜 E) :=
56-
⟨toPointedCone⟩
59+
instance : Coe (ProperCone R E) (PointedCone R E) := ⟨toPointedCone⟩
5760

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
6063

6164
-- 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
6568

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
6970

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
7372

74-
instance instZero (K : ProperCone 𝕜 E) : Zero K := PointedCone.instZero (K.toSubmodule)
73+
@[deprecated (since := "2025-06-11")] alias mem_coe := mem_toPointedCone
7574

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
7877

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
8179

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'
8382

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
8585

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]
9088

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
9690

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
10093

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
10497

105-
end PositiveCone
98+
end T1Space
10699

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
108104

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
111106

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
115108

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
118111

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
122113

123-
@[simp, norm_cast]
124-
theorem coe_zero : ↑(0 : ProperCone 𝕜 E) = (0 : ConvexCone 𝕜 E) :=
125-
rfl
114+
variable [ContinuousAdd F] [ContinuousConstSMul R F]
126115

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.
129117
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
131121

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 _
146123

147124
@[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
151127

152128
@[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
156131

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
171133

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}
175137

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
179145

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
183148

184-
end InnerProductSpace
149+
end PositiveCone
185150
end ProperCone

Mathlib/Analysis/Convex/Cone/InnerDual.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ theorem hyperplane_separation (K : ProperCone ℝ H) {f : H →L[ℝ] F} {b : F}
250250
mp := by
251251
-- suppose `b ∈ K.map f`
252252
simp only [mem_map, PointedCone.mem_closure, PointedCone.coe_map, ContinuousLinearMap.coe_coe,
253-
mem_closure_iff_seq_limit, mem_image, SetLike.mem_coe, mem_coe, mem_dual,
253+
mem_closure_iff_seq_limit, mem_image, SetLike.mem_coe, mem_dual,
254254
ContinuousLinearMap.adjoint_inner_right, forall_exists_index, and_imp]
255255
-- there is a sequence `seq : ℕ → F` in the image of `f` that converges to `b`
256256
rintro seq hmem htends y hinner

0 commit comments

Comments
 (0)