@@ -97,10 +97,15 @@ Tolerance for floating-point operations.
9797-/
9898private 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/--
101106Check 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/--
106111Check 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/--
163217Testing is done elsewhere in this file.
0 commit comments