import AutoSamplingTheory.TechnicalLemmas.Probability.CoordinateHeatBath import AutoSamplingTheory.TechnicalLemmas.Probability.KernelMixture import AutoSamplingTheory.TechnicalLemmas.Probability.KernelInvariance namespace AutoSamplingTheory.Tests.CoordinateHeatBath open MeasureTheory ProbabilityTheory open scoped NNReal open AutoSamplingTheory.TechnicalLemmas.Probability variable {n : ℕ} (X : Fin (n + 1) → Type*) [∀ j, MeasurableSpace (X j)] -- Only the selected coordinate has the conditional-law hypotheses. example (μ : Measure (∀ j, X j)) [IsFiniteMeasure μ] (i : Fin (n + 1)) [StandardBorelSpace (X i)] [Nonempty (X i)] : IsMarkovKernel (CoordinateHeatBath.heatBath X μ i) := inferInstance example (μ : Measure (∀ j, X j)) [IsFiniteMeasure μ] (i : Fin (n + 1)) [StandardBorelSpace (X i)] [Nonempty (X i)] : (CoordinateHeatBath.heatBath X μ i).Invariant μ := CoordinateHeatBath.heatBath_invariant X μ i -- The retained marginal law needs no measurable-singleton assumption anywhere. -- This test expands the one public construction, not a second algorithm. private theorem retained_marginal (μ : Measure (∀ j, X j)) [IsFiniteMeasure μ] (i : Fin (n + 1)) [StandardBorelSpace (X i)] [Nonempty (X i)] (x : ∀ j, X j) : (CoordinateHeatBath.heatBath X μ i x).map (fun y k => y (i.succAbove k)) = Measure.dirac (fun k => x (i.succAbove k)) := by let e := (MeasurableEquiv.piFinSuccAbove X i).trans MeasurableEquiv.prodComm have hcomp : (fun y k => y (i.succAbove k)) ∘ e.symm = Prod.fst := by funext p exact congrArg Prod.fst (e.apply_symm_apply p) change (((HeatBath.heatBathSnd (μ.map e)).comap e e.measurable).map e.symm x).map (fun y k => y (i.succAbove k)) = Measure.dirac (fun k => x (i.succAbove k)) rw [Kernel.map_apply _ e.symm.measurable, Kernel.comap_apply, HeatBath.heatBathSnd_apply, Measure.map_map (measurable_pi_iff.2 fun k => measurable_pi_apply (i.succAbove k)) e.symm.measurable, hcomp, Measure.map_fst_prod] simp only [measure_univ, one_smul] rfl -- Literal equality requires singleton measurability only at this retained j. example (μ : Measure (∀ j, X j)) [IsFiniteMeasure μ] (i : Fin (n + 1)) [StandardBorelSpace (X i)] [Nonempty (X i)] (j : Fin (n + 1)) [MeasurableSingletonClass (X j)] (hji : j ≠ i) (x : ∀ j, X j) : ∀ᵐ y ∂CoordinateHeatBath.heatBath X μ i x, y j = x j := CoordinateHeatBath.heatBath_ae_apply_eq X μ i j hji x -- Simultaneous retention is a finite intersection consumer, not another API. example (μ : Measure (∀ j, X j)) [IsFiniteMeasure μ] (i : Fin (n + 1)) [StandardBorelSpace (X i)] [Nonempty (X i)] [∀ j, MeasurableSingletonClass (X j)] (x : ∀ j, X j) : ∀ᵐ y ∂CoordinateHeatBath.heatBath X μ i x, ∀ j, j ≠ i → y j = x j := by apply ae_all_iff.2 intro j exact ae_all_iff.2 (fun hji => CoordinateHeatBath.heatBath_ae_apply_eq X μ i j hji x) -- A genuine three-coordinate middle update: both other coordinates are retained. example (μ : Measure (Fin 3 → Bool)) [IsFiniteMeasure μ] (x : Fin 3 → Bool) : ∀ᵐ y ∂CoordinateHeatBath.heatBath (fun _ : Fin 3 => Bool) μ 1 x, y 0 = x 0 ∧ y 2 = x 2 := (CoordinateHeatBath.heatBath_ae_apply_eq _ μ 1 0 (by decide) x).and (CoordinateHeatBath.heatBath_ae_apply_eq _ μ 1 2 (by decide) x) -- The same behavior holds at a concrete nonconstant input, even for zero target. example : ∀ᵐ y ∂CoordinateHeatBath.heatBath (fun _ : Fin 3 => Bool) 0 1 ![false, true, false], y 0 = false ∧ y 2 = false := by exact (CoordinateHeatBath.heatBath_ae_apply_eq _ 0 1 0 (by decide) ![false, true, false]).and (CoordinateHeatBath.heatBath_ae_apply_eq _ 0 1 2 (by decide) ![false, true, false]) example : (CoordinateHeatBath.heatBath (fun _ : Fin 3 => Bool) 0 1).Invariant 0 := CoordinateHeatBath.heatBath_invariant _ 0 1 -- The first space has the indiscrete sigma-algebra on two distinct points; -- the second space is ordinary Bool. No literal first-coordinate AE equality -- is asserted here: its singleton measurability contract is unavailable. private def coarseCoordinates : Fin 2 → Type := Fin.cases (Fin 2) (fun _ => Bool) private instance (j : Fin 2) : MeasurableSpace (coarseCoordinates j) := Fin.cases (⊥ : MeasurableSpace (Fin 2)) (fun _ => inferInstanceAs (MeasurableSpace Bool)) j private instance : StandardBorelSpace (coarseCoordinates 1) := by change StandardBorelSpace Bool infer_instance private instance : Nonempty (coarseCoordinates 1) := by change Nonempty Bool infer_instance example (μ : Measure (∀ j, coarseCoordinates j)) [IsFiniteMeasure μ] : (CoordinateHeatBath.heatBath coarseCoordinates μ 1).Invariant μ := CoordinateHeatBath.heatBath_invariant coarseCoordinates μ 1 example (μ : Measure (∀ j, coarseCoordinates j)) [IsFiniteMeasure μ] (x : ∀ j, coarseCoordinates j) : (CoordinateHeatBath.heatBath coarseCoordinates μ 1 x).map (fun y k => y ((1 : Fin 2).succAbove k)) = Measure.dirac (fun k => x ((1 : Fin 2).succAbove k)) := retained_marginal coarseCoordinates μ 1 x -- Fixed random scan needs the resampling contract at every chosen coordinate. variable [∀ j, StandardBorelSpace (X j)] [∀ j, Nonempty (X j)] example (μ : Measure (∀ j, X j)) [IsFiniteMeasure μ] (w : Fin (n + 1) → ℝ≥0) (hsum : ∑ i, w i = 1) : IsMarkovKernel (KernelMixture.finiteMixture w (fun i => CoordinateHeatBath.heatBath X μ i)) := KernelMixture.finiteMixture_isMarkovKernel w (fun i => CoordinateHeatBath.heatBath X μ i) hsum example (μ : Measure (∀ j, X j)) [IsFiniteMeasure μ] (w : Fin (n + 1) → ℝ≥0) (hsum : ∑ i, w i = 1) (k : ℕ) : ((KernelMixture.finiteMixture w (fun i => CoordinateHeatBath.heatBath X μ i)) ^ k).Invariant μ := by apply KernelInvariance.invariant_pow exact KernelMixture.finiteMixture_invariant w (fun i => CoordinateHeatBath.heatBath X μ i) μ hsum (fun i => CoordinateHeatBath.heatBath_invariant X μ i) #check CoordinateHeatBath.heatBath #check CoordinateHeatBath.heatBath_isMarkovKernel #check CoordinateHeatBath.heatBath_invariant #check CoordinateHeatBath.heatBath_ae_apply_eq #print axioms CoordinateHeatBath.heatBath #print axioms CoordinateHeatBath.heatBath_isMarkovKernel #print axioms CoordinateHeatBath.heatBath_invariant #print axioms CoordinateHeatBath.heatBath_ae_apply_eq end AutoSamplingTheory.Tests.CoordinateHeatBath