Skip to content

Commit 327c788

Browse files
committed
Refactored file structure
1 parent 58cf21f commit 327c788

File tree

4 files changed

+110
-99
lines changed

4 files changed

+110
-99
lines changed

analysis/markov/Linleios/Evolve.lean

Lines changed: 2 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -2,107 +2,10 @@
22
import Std.Data.HashMap
33
import Batteries.Lean.HashMap
44

5-
open Std (HashMap)
6-
7-
8-
private partial def erf (x : Float) : Float :=
9-
if x < 0
10-
then - erf (- x)
11-
else
12-
let p := 0.3275911
13-
let a₁ := 0.254829592
14-
let a₂ := -0.284496736
15-
let a₃ := 1.421413741
16-
let a₄ := -1.453152027
17-
let a₅ := 1.061405429
18-
let t := 1 / (1 + p * x)
19-
1 - (a₁ * t + a₂ * t^2 + a₃ * t^3 + a₄ * t^4 + a₅ * t^5) * Float.exp (- x^2)
20-
21-
private def cdfGaussian (x μ σ : Float) : Float :=
22-
(1 + erf ((x - μ) / σ / Float.sqrt 2)) / 2
23-
24-
private def bisectionSearch (f : Float → Float) (low high : Float) (ε : Float) (maxIter : Nat) : Float :=
25-
match maxIter with
26-
| 0 => (low + high) / 2
27-
| maxIter' + 1 =>
28-
let mid := (low + high) / 2
29-
let fmid := f mid
30-
if high - low < ε || Float.abs fmid < ε then
31-
mid
32-
else if f low * fmid < 0 then
33-
bisectionSearch f low mid ε maxIter'
34-
else
35-
bisectionSearch f mid high ε maxIter'
36-
termination_by maxIter
37-
38-
39-
abbrev Probability := Float
40-
41-
42-
def nPools : Nat := 2500
43-
44-
def stakeDistribution (nPools : Nat) : List Float :=
45-
(List.range nPools).map (fun k => ((k + 1).toFloat / nPools.toFloat)^10 - (k.toFloat / nPools.toFloat)^10)
46-
47-
private def calibrateCommittee(committeeSize : Float) : Float :=
48-
let stakes : List Float := stakeDistribution nPools
49-
let f (m : Float) : Float :=
50-
let ps : List Float := stakes.map (fun s => 1 - Float.exp (- m * s))
51-
ps.sum - committeeSize
52-
bisectionSearch f committeeSize nPools.toFloat 0.5 10
53-
54-
private def committeeDistribution (pSuccessfulVote committeeSize : Float) : Float × Float :=
55-
let stakes : List Float := stakeDistribution nPools
56-
let m := calibrateCommittee committeeSize
57-
let ps : List Float := stakes.map (fun s => pSuccessfulVote * (1 - Float.exp (- m * s)))
58-
let μ := ps.sum
59-
let σ := (ps.map (fun p => p * (1 - p))).sum.sqrt
60-
⟨ μ , σ ⟩
5+
import Linleios.Types
616

62-
def pQuorum (pSuccessfulVote committeeSize τ : Float) : Float :=
63-
let ⟨ μ , σ ⟩ := committeeDistribution pSuccessfulVote committeeSize
64-
1 - cdfGaussian (τ * committeeSize) μ σ
657

66-
67-
structure Environment where
68-
activeSlotCoefficient : Probability
69-
Lheader : Nat
70-
Lvote : Nat
71-
Ldiff : Nat
72-
pSpacingOkay : Probability
73-
pQuorum : Probability
74-
75-
def makeEnvironment (activeSlotCoefficient pRbHeaderArrives pEbValidates committeeSize τ : Float) (Lheader Lvote Ldiff : Nat) : Environment :=
76-
{
77-
activeSlotCoefficient := activeSlotCoefficient
78-
Lheader := Lheader
79-
Lvote := Lvote
80-
Ldiff := Ldiff
81-
pSpacingOkay := (1 - activeSlotCoefficient).pow (3 * Lheader + Lvote + Ldiff - 1).toFloat
82-
pQuorum := pQuorum (pRbHeaderArrives * pEbValidates) committeeSize τ
83-
}
84-
85-
86-
structure State where
87-
rbCount : Nat
88-
ebCount : Nat
89-
canCertify : Bool
90-
deriving Repr, BEq, Hashable, Inhabited
91-
92-
theorem genesis : (default : State).rbCount = 0 ∧ (default : State).ebCount = 0 := by
93-
constructor
94-
rfl
95-
rfl
96-
97-
98-
def Probabilities := HashMap State Probability
99-
deriving Repr, EmptyCollection
100-
101-
instance : Inhabited Probabilities where
102-
default := (∅ : Probabilities).insert Inhabited.default 1
103-
104-
105-
abbrev Outcomes := List (State × Probability)
8+
open Std (HashMap)
1069

10710

10811
def certify {env : Environment} (state : State) : Outcomes :=
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
2+
import Linleios.Util
3+
4+
5+
def nPools : Nat := 2500
6+
7+
def stakeDistribution (nPools : Nat) : List Float :=
8+
(List.range nPools).map (fun k => ((k + 1).toFloat / nPools.toFloat)^10 - (k.toFloat / nPools.toFloat)^10)
9+
10+
private def calibrateCommittee(committeeSize : Float) : Float :=
11+
let stakes : List Float := stakeDistribution nPools
12+
let f (m : Float) : Float :=
13+
let ps : List Float := stakes.map (fun s => 1 - Float.exp (- m * s))
14+
ps.sum - committeeSize
15+
bisectionSearch f committeeSize nPools.toFloat 0.5 10
16+
17+
private def committeeDistribution (pSuccessfulVote committeeSize : Float) : Float × Float :=
18+
let stakes : List Float := stakeDistribution nPools
19+
let m := calibrateCommittee committeeSize
20+
let ps : List Float := stakes.map (fun s => pSuccessfulVote * (1 - Float.exp (- m * s)))
21+
let μ := ps.sum
22+
let σ := (ps.map (fun p => p * (1 - p))).sum.sqrt
23+
⟨ μ , σ ⟩
24+
25+
def pQuorum (pSuccessfulVote committeeSize τ : Float) : Float :=
26+
let ⟨ μ , σ ⟩ := committeeDistribution pSuccessfulVote committeeSize
27+
1 - cdfGaussian (τ * committeeSize) μ σ
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import Std.Data.HashMap
2+
import Batteries.Lean.HashMap
3+
4+
import Linleios.Probability
5+
6+
7+
open Std (HashMap)
8+
9+
10+
abbrev Probability := Float
11+
12+
13+
structure Environment where
14+
activeSlotCoefficient : Probability
15+
Lheader : Nat
16+
Lvote : Nat
17+
Ldiff : Nat
18+
pSpacingOkay : Probability
19+
pQuorum : Probability
20+
21+
def makeEnvironment (activeSlotCoefficient pRbHeaderArrives pEbValidates committeeSize τ : Float) (Lheader Lvote Ldiff : Nat) : Environment :=
22+
{
23+
activeSlotCoefficient := activeSlotCoefficient
24+
Lheader := Lheader
25+
Lvote := Lvote
26+
Ldiff := Ldiff
27+
pSpacingOkay := (1 - activeSlotCoefficient).pow (3 * Lheader + Lvote + Ldiff - 1).toFloat
28+
pQuorum := pQuorum (pRbHeaderArrives * pEbValidates) committeeSize τ
29+
}
30+
31+
32+
structure State where
33+
rbCount : Nat
34+
ebCount : Nat
35+
canCertify : Bool
36+
deriving Repr, BEq, Hashable, Inhabited
37+
38+
theorem genesis : (default : State).rbCount = 0 ∧ (default : State).ebCount = 0 := by
39+
constructor
40+
rfl
41+
rfl
42+
43+
44+
def Probabilities := HashMap State Probability
45+
deriving Repr, EmptyCollection
46+
47+
instance : Inhabited Probabilities where
48+
default := (∅ : Probabilities).insert Inhabited.default 1
49+
50+
51+
abbrev Outcomes := List (State × Probability)

analysis/markov/Linleios/Util.lean

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
2+
partial def erf (x : Float) : Float :=
3+
if x < 0
4+
then - erf (- x)
5+
else
6+
let p := 0.3275911
7+
let a₁ := 0.254829592
8+
let a₂ := -0.284496736
9+
let a₃ := 1.421413741
10+
let a₄ := -1.453152027
11+
let a₅ := 1.061405429
12+
let t := 1 / (1 + p * x)
13+
1 - (a₁ * t + a₂ * t^2 + a₃ * t^3 + a₄ * t^4 + a₅ * t^5) * Float.exp (- x^2)
14+
15+
def cdfGaussian (x μ σ : Float) : Float :=
16+
(1 + erf ((x - μ) / σ / Float.sqrt 2)) / 2
17+
18+
def bisectionSearch (f : Float → Float) (low high : Float) (ε : Float) (maxIter : Nat) : Float :=
19+
match maxIter with
20+
| 0 => (low + high) / 2
21+
| maxIter' + 1 =>
22+
let mid := (low + high) / 2
23+
let fmid := f mid
24+
if high - low < ε || Float.abs fmid < ε then
25+
mid
26+
else if f low * fmid < 0 then
27+
bisectionSearch f low mid ε maxIter'
28+
else
29+
bisectionSearch f mid high ε maxIter'
30+
termination_by maxIter

0 commit comments

Comments
 (0)