Skip to content

Commit 96fc4df

Browse files
committed
trait
1 parent 9b510d4 commit 96fc4df

File tree

1 file changed

+51
-7
lines changed

1 file changed

+51
-7
lines changed

src/DafnyVMCTrait.dfy

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,20 @@ module DafnyVMCTrait {
174174
o := (B,V);
175175
}
176176

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+
177191
method {:verify false} DiscreteLaplaceSample (num: pos, den: pos)
178192
returns (o: int)
179193
modifies this
@@ -190,20 +204,50 @@ module DafnyVMCTrait {
190204
o := Z;
191205
}
192206

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)
194238
returns (o: (int,bool))
195239
modifies this
196240
decreases *
197241
{
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)));
201245
var d := 2 * num * (t) * (t) * den;
202246
var C := BernoulliExpNegSample(n, d);
203247
o := (Y,C);
204248
}
205249

206-
method {:verify false} DiscreteGaussianSample (num: pos, den: pos)
250+
method {:verify false} DiscreteGaussianSample (num: pos, den: pos, mix: nat)
207251
returns (o: int)
208252
modifies this
209253
decreases *
@@ -212,11 +256,11 @@ module DafnyVMCTrait {
212256
var t := ti + 1;
213257
var num := (num) * (num);
214258
var den := (den) * (den);
215-
var x := DiscreteGaussianSampleLoop(num, den, t);
259+
var x := DiscreteGaussianSampleLoop(num, den, t, mix);
216260
while ! (x.1)
217261
decreases *
218262
{
219-
x := DiscreteGaussianSampleLoop(num, den, t);
263+
x := DiscreteGaussianSampleLoop(num, den, t, mix);
220264
}
221265
var r := x;
222266
o := r.0;

0 commit comments

Comments
 (0)