Large Signal Model · Lean source

EllipsoidPolynomial.lean

Declared contract recorded Coverage and evidence

The cited release explicitly reports completion of its registered formal contract, under its exact hypotheses.

This viewer reads the retained source; it does not run Lean or assign new claim mappings.

Local imports (2)

KomorebiLSM/EllipsoidPolynomial.lean273 lines

Original source pathLean/KomorebiLSM/EllipsoidPolynomial.lean
Skip declarations and read code

Skip source text

1 import KomorebiLSM.OrientedEllipsoid
2 import KomorebiLSM.ContinuousRecords
3 
4 /-! Finite polynomial/SOS witnesses for the oriented quadratic certificate. -/
5 set_option autoImplicit false
6 namespace Komorebi.LSM.OrientedEllipsoid
7 open scoped BigOperators Matrix Polynomial
8 open MeasureTheory
9 variable {D : Type*} [Fintype D] [DecidableEq D]
10 
11 /-- The literal matrix action as a continuous linear map, with no extra positivity field. -/
12 noncomputable def matrixOperator : Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ →ₗ[ℝ]
13     (State D →L[ℝ] State D) :=
14   LinearMap.toContinuousLinearMap.toLinearMap.comp Matrix.toLin'.toLinearMap
15 
16 @[simp] theorem matrixOperator_apply (B : Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ) (z : State D) :
17     matrixOperator B z = B *ᵥ z := rfl
18 
19 noncomputable def matrixPolynomial {n : ℕ}
20     (B : Fin n → Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ) :
21     Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ[X] :=
22   fun i j => Polynomial.ofFn n (fun k => B k i j)
23 
24 omit [Fintype D] [DecidableEq D] in
25 theorem matrixPolynomial_eval {n : ℕ} (B : Fin n → Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ)
26     (u : ℝ) : PolynomialGram.evalMatrix (matrixPolynomial B) u = ∑ k : Fin n, u^(k:ℕ) • B k := by
27   ext i j
28   simp [matrixPolynomial,PolynomialGram.evalMatrix,UniformIntervalMoments.eval_ofFn,
29     Matrix.sum_apply,Matrix.smul_apply,mul_comm]
30 
31 noncomputable def polynomialOperator {n : ℕ}
32     (B : Fin n → Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ) : ℝ → State D →L[ℝ] State D :=
33   PolynomialGram.operatorPolynomial (fun k => matrixOperator (B k))
34 
35 theorem polynomialOperator_matrix {n : ℕ}
36     (B : Fin n → Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ) (u : ℝ) :
37     polynomialOperator B u = matrixOperator (PolynomialGram.evalMatrix (matrixPolynomial B) u) := by
38   rw [matrixPolynomial_eval,map_sum]
39   simp only [map_smul]
40   rfl
41 
42 /-- A finite check of scalar coefficients, including the coefficients above neither degree. -/
43 theorem scalar_coefficient_identity (p q : ℝ[X]) (bound : ℕ)
44     (hp : p.natDegree≤bound) (hq : q.natDegree≤bound)
45     (hc : ∀ k : Fin (bound+1),p.coeff k=q.coeff k) : p=q := by
46   ext k
47   by_cases hk : k<bound+1
48   · exact hc ⟨k,hk⟩
49   · rw [Polynomial.coeff_eq_zero_of_natDegree_lt (lt_of_le_of_lt hp (by omega)),
50       Polynomial.coeff_eq_zero_of_natDegree_lt (lt_of_le_of_lt hq (by omega))]
51 
52 noncomputable def scalarSOS {n m : ℕ} (f : Fin n → ℝ[X]) (g : Fin m → ℝ[X]) : ℝ[X] :=
53   (∑ i,(f i)^2) + (1-Polynomial.X^2)*(∑ j,(g j)^2)
54 
55 theorem scalarSOS_nonneg {n m : ℕ} (f : Fin n → ℝ[X]) (g : Fin m → ℝ[X])
56     (u : ℝ) (hu : u∈Set.Icc (-1 : ℝ) 1) : 0≤(scalarSOS f g).eval u := by
57   have hfactor : 0≤1-u^2 := by nlinarith [hu.1,hu.2]
58   simp only [scalarSOS,Polynomial.eval_add,Polynomial.eval_finsetSum,Polynomial.eval_pow,
59     Polynomial.eval_mul,Polynomial.eval_sub,Polynomial.eval_one,Polynomial.eval_X]
60   exact add_nonneg (Finset.sum_nonneg (fun i _ => sq_nonneg _))
61     (mul_nonneg hfactor (Finset.sum_nonneg (fun j _ => sq_nonneg _)))
62 
63 /-- Scalar interval SOS identities are checked by finitely many actual coefficients. -/
64 structure ScalarCertificate (p : ℝ[X]) where
65   terms0 : ℕ
66   terms1 : ℕ
67   square0 : Fin terms0 → ℝ[X]
68   square1 : Fin terms1 → ℝ[X]
69   bound : ℕ
70   degree_left : p.natDegree≤bound
71   degree_right : (scalarSOS square0 square1).natDegree≤bound
72   coefficients : ∀ k : Fin (bound+1),p.coeff k=(scalarSOS square0 square1).coeff k
73 
74 theorem ScalarCertificate.nonneg {p : ℝ[X]} (cert : ScalarCertificate p)
75     (u : ℝ) (hu : u∈Set.Icc (-1 : ℝ) 1) : 0≤p.eval u := by
76   rw [scalar_coefficient_identity p _ cert.bound cert.degree_left cert.degree_right cert.coefficients]
77   exact scalarSOS_nonneg cert.square0 cert.square1 u hu
78 
79 noncomputable def betaPolynomial (c : D → ℝ)
80     (P : Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ[X]) : ℝ[X] :=
81   P (Sum.inl ()) (Sum.inl ()) + ∑ i,Polynomial.C (c i)*P (Sum.inl ()) (Sum.inr i)
82 
83 noncomputable def dualPolynomial (H : Matrix D D ℝ)
84     (P : Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ[X]) : ℝ[X] :=
85   ∑ i,∑ j,Polynomial.C (H⁻¹ i j)*P (Sum.inl ()) (Sum.inr i)*P (Sum.inl ()) (Sum.inr j)
86 
87 omit [DecidableEq D] in
88 theorem betaPolynomial_eval (c : D → ℝ)
89     (P : Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ[X]) (u : ℝ) :
90     (betaPolynomial c P).eval u = beta c (PolynomialGram.evalMatrix P u) := by
91   simp [Polynomial.eval_finsetSum,betaPolynomial,beta,massConstant,massSpatial,PolynomialGram.evalMatrix,dotProduct,mul_comm]
92 
93 theorem dualPolynomial_eval (H : Matrix D D ℝ)
94     (P : Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ[X]) (u : ℝ) :
95     (dualPolynomial H P).eval u = massSpatial (PolynomialGram.evalMatrix P u) ⬝ᵥ
96       (H⁻¹ *ᵥ massSpatial (PolynomialGram.evalMatrix P u)) := by
97   simp only [dualPolynomial,Polynomial.eval_finsetSum,Polynomial.eval_mul,Polynomial.eval_C,
98     dotProduct,Matrix.mulVec,massSpatial,PolynomialGram.evalMatrix,Finset.mul_sum]
99   apply Finset.sum_congr rfl
100   intro i _
101   apply Finset.sum_congr rfl
102   intro j _
103   ring
104 
105 noncomputable def quadraticPolynomial (c : D → ℝ) (H : Matrix D D ℝ)
106     (P : Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ[X]) (tau : ℝ[X]) :
107     Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ[X] :=
108   P.transpose * PolynomialGram.constantMatrix (Q c H) * P -
109     tau • PolynomialGram.constantMatrix (Q c H)
110 
111 omit [Fintype D] [DecidableEq D] in
112 theorem evalMatrix_sub (P T : Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ[X]) (u : ℝ) :
113     PolynomialGram.evalMatrix (P-T) u = PolynomialGram.evalMatrix P u - PolynomialGram.evalMatrix T u := by
114   ext i j
115   change (P i j-T i j).eval u = (P i j).eval u - (T i j).eval u
116   exact Polynomial.eval_sub (P i j) (T i j) u
117 
118 theorem quadraticPolynomial_eval (c : D → ℝ) (H : Matrix D D ℝ)
119     (P : Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ[X]) (tau : ℝ[X]) (u : ℝ) :
120     PolynomialGram.evalMatrix (quadraticPolynomial c H P tau) u =
121       (PolynomialGram.evalMatrix P u).transpose * Q c H * PolynomialGram.evalMatrix P u -
122         tau.eval u • Q c H := by
123   rw [quadraticPolynomial,evalMatrix_sub,PolynomialGram.evalMatrix_mul,
124     PolynomialGram.evalMatrix_mul,PolynomialGram.evalMatrix_transpose,
125     PolynomialGram.evalMatrix_constant,PolynomialGram.evalMatrix_scalar,
126     PolynomialGram.evalMatrix_constant]
127 
128 /-- Finite scalar SOS and matrix-Gram coefficient checks certify the complete interval. -/
129 structure PolynomialCertificate (c : D → ℝ) (H : Matrix D D ℝ) {A : Type*} {n : ℕ}
130     (B : A → Fin n → Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ) (q bound : ℕ) where
131   tau : A → ℝ[X]
132   tauSOS : ∀ a,ScalarCertificate (tau a)
133   betaSOS : ∀ a,ScalarCertificate (betaPolynomial c (matrixPolynomial (B a)))
134   orientationSOS : ∀ a,ScalarCertificate
135     ((betaPolynomial c (matrixPolynomial (B a)))^2-dualPolynomial H (matrixPolynomial (B a)))
136   gram0 : A → Matrix (Fin (q+1) × (Unit ⊕ D)) (Fin (q+1) × (Unit ⊕ D)) ℝ
137   gram1 : A → Matrix (Fin q × (Unit ⊕ D)) (Fin q × (Unit ⊕ D)) ℝ
138   gram0_positive : ∀ a,(gram0 a).PosSemidef
139   gram1_positive : ∀ a,(gram1 a).PosSemidef
140   degree_left : ∀ a i j,(quadraticPolynomial c H (matrixPolynomial (B a)) (tau a) i j).natDegree≤bound
141   degree_right : ∀ a i j,(PolynomialGram.intervalGramPolynomial q (gram0 a) (gram1 a) i j).natDegree≤bound
142   coefficients : ∀ a i j (k : Fin (bound+1)),
143     (quadraticPolynomial c H (matrixPolynomial (B a)) (tau a) i j).coeff k =
144       (PolynomialGram.intervalGramPolynomial q (gram0 a) (gram1 a) i j).coeff k
145   mass_moments : ∀ a i,mass ((∑ k : Fin n,UniformIntervalMoments.moment k • matrixOperator (B a k))
146     (Pi.basisFun ℝ (Unit ⊕ D) i))=mass (Pi.basisFun ℝ (Unit ⊕ D) i)
147 
148 /-- A full polynomial-family quadratic witness constructs the literal P52 instrument. -/
149 noncomputable def polynomialDensityInstrument (c : D → ℝ) (H : Matrix D D ℝ)
150     (hH : H.PosDef) {A : Type*} {n : ℕ}
151     (B : A → Fin n → Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ)
152     (branches : ∀ a u,u∈Set.Icc (-1 : ℝ) 1 →
153       BranchCertificate c H (PolynomialGram.evalMatrix (matrixPolynomial (B a)) u))
154     (hm : ∀ a z,mass ((∑ k : Fin n,UniformIntervalMoments.moment k • matrixOperator (B a k)) z)=mass z) :
155     ContinuousInstrument.DensityInstrument (A := A) (probabilityCone c H hH)
156       UniformIntervalMoments.measure where
157   op a := polynomialOperator (B a)
158   measurable_op a := (PolynomialGram.operatorPolynomial_continuous
159     (fun k => matrixOperator (B a k))).measurable
160   integrable_op a := PolynomialGram.operatorPolynomial_integrable (fun k => matrixOperator (B a k))
161   positive a := by
162     filter_upwards [PolynomialGram.uniform_ae_interval] with u hu
163     intro z hz
164     change polynomialOperator (B a) u z∈cone c H
165     rw [polynomialOperator_matrix,matrixOperator_apply]
166     exact BranchCertificate.preserves hH (branches a u hu) hz
167   mass_preserving a z := by
168     change mass ((∫ u,PolynomialGram.operatorPolynomial (fun k => matrixOperator (B a k)) u
169       ∂UniformIntervalMoments.measure) z)=mass z
170     rw [PolynomialGram.operatorPolynomial_integral]
171     exact hm a z
172 
173 @[simp] theorem polynomialDensityInstrument_op (c : D → ℝ) (H : Matrix D D ℝ)
174     (hH : H.PosDef) {A : Type*} {n : ℕ}
175     (B : A → Fin n → Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ)
176     (branches : ∀ a u,u∈Set.Icc (-1 : ℝ) 1 →
177       BranchCertificate c H (PolynomialGram.evalMatrix (matrixPolynomial (B a)) u))
178     (hm : ∀ a z,mass ((∑ k : Fin n,UniformIntervalMoments.moment k • matrixOperator (B a k)) z)=mass z)
179     (a : A) (u : ℝ) :
180     (polynomialDensityInstrument c H hH B branches hm).op a u =
181       matrixOperator (PolynomialGram.evalMatrix (matrixPolynomial (B a)) u) :=
182   polynomialOperator_matrix (B a) u
183 
184 namespace PolynomialCertificate
185 variable {c : D → ℝ} {H : Matrix D D ℝ} {A : Type*} {n q bound : ℕ}
186   {B : A → Fin n → Matrix (Unit ⊕ D) (Unit ⊕ D) ℝ}
187   (cert : PolynomialCertificate c H B q bound)
188 include cert
189 
190 /-- Finite SOS/coefficient data imply every hypothesis at every interval point. -/
191 noncomputable def branch (a : A) (u : ℝ) (hu : u∈Set.Icc (-1 : ℝ) 1) :
192     BranchCertificate c H (PolynomialGram.evalMatrix (matrixPolynomial (B a)) u) where
193   tau := (cert.tau a).eval u
194   remainder := PolynomialGram.intervalGram q (cert.gram0 a) (cert.gram1 a) u
195   tau_nonneg := (cert.tauSOS a).nonneg u hu
196   remainder_positive := PolynomialGram.interval_gram_positive q (cert.gram0 a) (cert.gram1 a)
197     (cert.gram0_positive a) (cert.gram1_positive a) u hu
198   identity := by
199     have he := (PolynomialGram.polynomial_identity_finite
200       (quadraticPolynomial c H (matrixPolynomial (B a)) (cert.tau a))
201       (PolynomialGram.intervalGramPolynomial q (cert.gram0 a) (cert.gram1 a)) bound
202       (cert.degree_left a) (cert.degree_right a)).mpr (cert.coefficients a) u
203     rwa [quadraticPolynomial_eval,PolynomialGram.intervalGramPolynomial_eval] at he
204   beta_nonneg := by
205     simpa only [betaPolynomial_eval] using (cert.betaSOS a).nonneg u hu
206   orientation := by
207     simpa only [Polynomial.eval_sub,Polynomial.eval_pow,betaPolynomial_eval,dualPolynomial_eval]
208       using (cert.orientationSOS a).nonneg u hu
209 
210 /-- The finite basis moment checks imply the exact integrated mass functional identity. -/
211 theorem mass_preserving (a : A) (z : State D) :
212     mass ((∑ k : Fin n,UniformIntervalMoments.moment k • matrixOperator (B a k)) z)=mass z :=
213   (PolynomialGram.moment_mass_finite (Pi.basisFun ℝ (Unit ⊕ D)) mass
214     (fun k => matrixOperator (B a k))).mpr (cert.mass_moments a) z
215 
216 noncomputable def instrument (hH : H.PosDef) :
217     ContinuousInstrument.DensityInstrument (A := A) (probabilityCone c H hH)
218       UniformIntervalMoments.measure :=
219   polynomialDensityInstrument c H hH B cert.branch cert.mass_preserving
220 
221 @[simp] theorem instrument_op (hH : H.PosDef) (a : A) (u : ℝ) :
222     (cert.instrument hH).op a u = matrixOperator
223       (PolynomialGram.evalMatrix (matrixPolynomial (B a)) u) :=
224   polynomialDensityInstrument_op c H hH B cert.branch cert.mass_preserving a u
225 
226 /-- Positivity is pointwise on the entire closed interval, including its endpoints. -/
227 theorem preserves (hH : H.PosDef) (a : A) (u : ℝ) (hu : u∈Set.Icc (-1 : ℝ) 1)
228     {z : State D} (hz : z∈cone c H) : polynomialOperator (B a) u z∈cone c H := by
229   rw [polynomialOperator_matrix,matrixOperator_apply]
230   exact BranchCertificate.preserves hH (cert.branch a u hu) hz
231 
232 /-- Every literal finite product of interval observation operators stays in the actual cone. -/
233 theorem word_cone (hH : H.PosDef) (word : List (A × ℝ))
234     (hword : ∀ s∈word,s.2∈Set.Icc (-1 : ℝ) 1) {z : State D} (hz : z∈cone c H) :
235     FiniteInstruments.wordAction (fun s : A × ℝ => (polynomialOperator (B s.1) s.2).toLinearMap)
236       word z∈cone c H := by
237   induction word generalizing z with
238   | nil => exact hz
239   | cons s word ih =>
240     apply ih (fun t ht => hword t (List.mem_cons_of_mem s ht))
241     exact cert.preserves hH s.1 s.2 (hword s (List.mem_cons_self)) hz
242 
243 /-- Finite-word densities are nonnegative, without incorrectly bounding point densities by one. -/
244 theorem word_mass_nonneg (hH : H.PosDef) (word : List (A × ℝ))
245     (hword : ∀ s∈word,s.2∈Set.Icc (-1 : ℝ) 1) {z : State D} (hz : z∈cone c H) :
246     0≤mass (FiniteInstruments.wordAction
247       (fun s : A × ℝ => (polynomialOperator (B s.1) s.2).toLinearMap) word z) :=
248   (probabilityCone c H hH).mass_nonneg (cert.word_cone hH word hword hz)
249 
250 /-- The complete finite observation measures have total mass one at every horizon. -/
251 theorem observation_law_probability (hH : H.PosDef) (actions : ℕ → A)
252     (z : State D) (hz : z∈cone c H) (hm : mass z=1) (horizon : ℕ) :
253     IsProbabilityMeasure (ContinuousRecords.observationLaw (cert.instrument hH) actions z horizon) :=
254   ContinuousRecords.observationLaw_probability (cert.instrument hH) actions ⟨z,hz,hm⟩ horizon
255 
256 /-- Arbitrary common measurable randomized history policies give genuine normalized joint laws. -/
257 theorem record_law_probability [Fintype A] [MeasurableSpace A] [MeasurableSingletonClass A]
258     (hH : H.PosDef) (policy : ContinuousRecords.Policy (A := A) (Y := ℝ))
259     (z : State D) (hz : z∈cone c H) (hm : mass z=1) (horizon : ℕ) :
260     IsProbabilityMeasure (ContinuousRecords.recordLaw (cert.instrument hH) policy z horizon) :=
261   ContinuousRecords.recordLaw_probability (cert.instrument hH) policy ⟨z,hz,hm⟩ horizon
262 
263 /-- The normalized laws are the literal prefix marginals of every longer finite law. -/
264 theorem record_law_prefix [Fintype A] [MeasurableSpace A] [MeasurableSingletonClass A]
265     (hH : H.PosDef) (policy : ContinuousRecords.Policy (A := A) (Y := ℝ))
266     (z : State D) (hz : z∈cone c H) (horizon extra : ℕ) :
267     (ContinuousRecords.recordLaw (cert.instrument hH) policy z (horizon+extra)).map
268       (ContinuousRecords.truncate horizon extra)=
269       ContinuousRecords.recordLaw (cert.instrument hH) policy z horizon :=
270   ContinuousRecords.recordLaw_prefix (cert.instrument hH) policy hz horizon extra
271 end PolynomialCertificate
272 
273 end Komorebi.LSM.OrientedEllipsoid

Back to source controls

Original file and source record

This copy matches the recorded source file. Its publication here does not change the work’s review status.

SHA-256: 43f02516a2c9e408b975b2e8ae5d253d666586ce9d538e1f979eb853cec1e2d7

Original source on GitHub

Back to Large Signal Model