@@ -174,6 +174,20 @@ module DafnyVMCTrait {
174
174
o := (B,V);
175
175
}
176
176
177
+ method {:verify false } DiscreteLaplaceSampleLoop' (num: pos, den: pos)
178
+ returns (o: (bool ,nat ))
179
+ modifies this
180
+ decreases *
181
+ {
182
+ var U := DiscreteLaplaceSampleLoopIn1 (num);
183
+ var v := DiscreteLaplaceSampleLoopIn2 (1, 1);
184
+ var V := v - 1;
185
+ var X := U + num * V;
186
+ var Y := X / den;
187
+ var B := BernoulliSample (1, 2);
188
+ o := (B,Y);
189
+ }
190
+
177
191
method {:verify false } DiscreteLaplaceSample (num: pos , den: pos )
178
192
returns (o: int )
179
193
modifies this
@@ -190,20 +204,50 @@ module DafnyVMCTrait {
190
204
o := Z;
191
205
}
192
206
193
- method {:verify false } DiscreteGaussianSampleLoop (num: pos , den: pos , t: pos )
207
+ method {:verify false } DiscreteLaplaceSampleOptimized (num: pos , den: pos )
208
+ returns (o: int )
209
+ modifies this
210
+ decreases *
211
+ {
212
+ var x := DiscreteLaplaceSampleLoop'(num, den);
213
+ while ! (! (x. 0 == true && x. 1 == 0))
214
+ decreases *
215
+ {
216
+ x := DiscreteLaplaceSampleLoop'(num, den);
217
+ }
218
+ var r := x;
219
+ var Z := if r. 0 == true then - (r. 1) else r. 1;
220
+ o := Z;
221
+ }
222
+
223
+ method {:verify false } DiscreteLaplaceSampleMixed (num: pos , den: pos , mix: nat )
224
+ returns (o: int )
225
+ modifies this
226
+ decreases *
227
+ {
228
+ if num <= den * mix {
229
+ var v := DiscreteLaplaceSample (num, den);
230
+ o := v;
231
+ } else {
232
+ var v := DiscreteLaplaceSampleOptimized (num, den);
233
+ o := v;
234
+ }
235
+ }
236
+
237
+ method {:verify false } DiscreteGaussianSampleLoop (num: pos , den: pos , t: pos , mix: nat )
194
238
returns (o: (int ,bool ))
195
239
modifies this
196
240
decreases *
197
241
{
198
- var Y := DiscreteLaplaceSample (t, 1);
199
- var y := (if Y < 0 then - Y else Y );
200
- var n := ((if y * t * den - num < 0 then - y * t * den - num else y * t * den - num)) * ((if y * t * den - num < 0 then - y * t * den - num else y * t * den - num));
242
+ var Y := DiscreteLaplaceSampleMixed (t, 1, mix );
243
+ var y := (if Y < 0 then - (Y) else (Y) );
244
+ var n := ((if y * t * den - num < 0 then - ( y * t * den - num) else ( y * t * den - num))) * ((if y * t * den - num < 0 then - ( y * t * den - num) else ( y * t * den - num) ));
201
245
var d := 2 * num * (t) * (t) * den;
202
246
var C := BernoulliExpNegSample (n, d);
203
247
o := (Y,C);
204
248
}
205
249
206
- method {:verify false } DiscreteGaussianSample (num: pos , den: pos )
250
+ method {:verify false } DiscreteGaussianSample (num: pos , den: pos , mix: nat )
207
251
returns (o: int )
208
252
modifies this
209
253
decreases *
@@ -212,11 +256,11 @@ module DafnyVMCTrait {
212
256
var t := ti + 1;
213
257
var num := (num) * (num);
214
258
var den := (den) * (den);
215
- var x := DiscreteGaussianSampleLoop (num, den, t);
259
+ var x := DiscreteGaussianSampleLoop (num, den, t, mix );
216
260
while ! (x. 1)
217
261
decreases *
218
262
{
219
- x := DiscreteGaussianSampleLoop (num, den, t);
263
+ x := DiscreteGaussianSampleLoop (num, den, t, mix );
220
264
}
221
265
var r := x;
222
266
o := r. 0;
0 commit comments