Skip to content

Commit 3e62adb

Browse files
committed
Added efficiency tests
1 parent 7e91a84 commit 3e62adb

File tree

2 files changed

+62
-19
lines changed

2 files changed

+62
-19
lines changed

analysis/markov/src/Linleios/Metrics.lean

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ import Lean.Data.Json.FromToJson
44

55
import Linleios.Types
66

7-
import Linleios.Probability
8-
import Linleios.Evolve
9-
107
open Lean (Json)
118
open Lean.ToJson (toJson)
129
open Std (HashMap)
@@ -75,11 +72,3 @@ def efficiency (states : Probabilities) : Float :=
7572
let ebSize := 12.0
7673
let ρ := ebSize / rbSize
7774
(rb * (1 - eb) + ρ * eb) / (1 + ρ)
78-
79-
80-
#eval ebEfficiency (simulate {(default : Environment) with pLate := 0.1} default 0 30)
81-
#eval (0.95^13 * 0.9)
82-
83-
#eval makeEnvironment 1 4 7 0.05 600 0.75 1 1 0 0.1
84-
#eval ebEfficiency (simulate (makeEnvironment 1 4 7 0.05 600 0.75 1 1 0 0.1) default 0 30)
85-
#eval (0.95^13 * 0.9)

analysis/markov/src/LinleiosTest.lean

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,15 @@ Tolerance for floating-point operations.
9797
-/
9898
private def ε := 1e-6
9999

100+
/--
101+
Check that a probability is near a specified value.
102+
-/
103+
private def nearValue (value x : Float) : Bool := (x - value).abs < ε
104+
100105
/--
101106
Check that a probability is close to unity.
102107
-/
103-
private def nearUnity (x : Float) : Bool := (x - 1).abs < ε
108+
private def nearUnity : Float Bool := nearValue 1
104109

105110
/--
106111
Check that the total outcome is near unity.
@@ -121,43 +126,92 @@ private def outcomeNearUnity (os : Outcomes) : Bool :=
121126
)
122127
$ check "Stake fractions sum to unity" (
123128
∀ nPools : RangedNat 500 5000,
124-
(nearUnity $ (stakeDistribution nPools.value).sum)
129+
nearUnity $ (stakeDistribution nPools.value).sum
125130
)
126131
)
127132
$ group "Quorum" (
128133
check "All voters vote and all votes are received" (
129134
∀ τ : RangedFloat 0.51 0.80,
130135
∀ committeeSize : RangedNat 100 800,
131-
(nearUnity $ pQuorum 1 committeeSize.value.toFloat τ.value)
136+
nearUnity $ pQuorum 1 committeeSize.value.toFloat τ.value
132137
)
133138
)
134139
$ group "Conservation of probability" (
135140
check "Forging RB" (
136141
∀ env : Environment,
137142
∀ state : State,
138-
(outcomeNearUnity $ @forgeRb env state)
143+
outcomeNearUnity $ @forgeRb env state
139144
)
140145
$ check "Certifying" (
141146
∀ env : Environment,
142147
∀ state : State,
143-
(outcomeNearUnity $ @certify env state)
148+
outcomeNearUnity $ @certify env state
144149
)
145150
$ check "Forging EB" (
146151
∀ env : Environment,
147152
∀ state : State,
148-
(outcomeNearUnity $ @forgeEb env state)
153+
outcomeNearUnity $ @forgeEb env state
149154
)
150155
$ check "Voting" (
151156
∀ env : Environment,
152157
∀ state : State,
153-
(outcomeNearUnity $ @vote env state)
158+
outcomeNearUnity $ @vote env state
154159
)
155160
$ check "Simulation" (
156161
∀ env : Environment,
157162
∀ steps : RangedNat 0 30,
158-
(nearUnity ∘ totalProbability $ simulate env default 0 steps.value)
163+
nearUnity ∘ totalProbability $ simulate env default 0 steps.value
159164
)
160165
)
166+
$ group "EB distribution" (
167+
check "Total probability is unity" (
168+
∀ env : Environment,
169+
∀ steps : RangedNat 0 30,
170+
let states := simulate env default 0 steps.value
171+
let ebDist := ebDistribution states
172+
nearUnity $ ebDist.values.sum
173+
)
174+
)
175+
$ group "Efficiency" (
176+
group "RB efficiency" (
177+
check "Honest environment" (
178+
∀ steps : RangedNat 1 30,
179+
let states := simulate default default 0 steps.value
180+
nearUnity $ rbEfficiency states
181+
)
182+
$ check "Adversarial environment" (
183+
∀ fAdversary : RangedFloat 0.01 0.49,
184+
let env := {(default : Environment) with fAdversary := fAdversary.value}
185+
let states := simulate env default 0 30
186+
nearValue (1 - fAdversary.value) $ rbEfficiency states
187+
)
188+
)
189+
$ group "EB efficiency" (
190+
check "Ideal environment" (
191+
let states := simulate default default 0 30
192+
nearValue (0.95^13) $ ebEfficiency states
193+
)
194+
$ check "Quorum failure" (
195+
∀ τ : RangedFloat 0.90 1.00,
196+
let env := makeEnvironment 1 4 7 0.05 600 τ.value 1 1 0 0
197+
let states := simulate env default 0 30
198+
nearValue (0.95^13 * env.pQuorum) $ ebEfficiency states
199+
)
200+
$ check "Late EB validation" (
201+
∀ pLate : RangedFloat 0.01 0.99,
202+
let env := {(default : Environment) with pLate := pLate.value}
203+
let states := simulate env default 0 30
204+
nearValue (0.95^13 * (1 - pLate.value)) $ ebEfficiency states
205+
)
206+
$ check "Adversarial environment" (
207+
∀ fAdversary : RangedFloat 0.01 0.49,
208+
let env := {(default : Environment) with fAdversary := fAdversary.value}
209+
let states := simulate env default 0 30
210+
nearValue (0.95^13 * (1 - fAdversary.value)^2) $ ebEfficiency states
211+
)
212+
)
213+
)
214+
161215

162216
/--
163217
Testing is done elsewhere in this file.

0 commit comments

Comments
 (0)