[pypy-commit] extradoc extradoc: random
hakanardo
noreply at buildbot.pypy.org
Sun Aug 12 16:11:43 CEST 2012
Author: Hakan Ardo <hakan at debian.org>
Branch: extradoc
Changeset: r4524:e8282e35ff08
Date: 2012-08-12 15:48 +0200
http://bitbucket.org/pypy/extradoc/changeset/e8282e35ff08/
Log: random
diff --git a/talk/iwtc11/benchmarks/scimark.py b/talk/iwtc11/benchmarks/scimark.py
--- a/talk/iwtc11/benchmarks/scimark.py
+++ b/talk/iwtc11/benchmarks/scimark.py
@@ -1,6 +1,66 @@
from convolution.convolution import Array2D
from array import array
+class Random(object):
+ MDIG = 32
+ ONE = 1
+ m1 = (ONE << (MDIG-2)) + ((ONE << (MDIG-2) )-ONE)
+ m2 = ONE << MDIG/2
+ dm1 = 1.0 / float(m1);
+
+ def __init__(self, seed):
+ self.initialize(seed)
+ self.left = 0.0
+ self.right = 1.0
+ self.width = 1.0
+ self.haveRange = False
+
+ def initialize(self, seed):
+
+ self.seed = seed
+ seed = abs(seed)
+ jseed = min(seed, self.m1)
+ if (jseed % 2 == 0):
+ jseed -= 1
+ k0 = 9069 % self.m2;
+ k1 = 9069 / self.m2;
+ j0 = jseed % self.m2;
+ j1 = jseed / self.m2;
+ self.m = array('d', [0]) * 17
+ for iloop in xrange(17):
+ jseed = j0 * k0;
+ j1 = (jseed / self.m2 + j0 * k1 + j1 * k0) % (self.m2 / 2);
+ j0 = jseed % self.m2;
+ self.m[iloop] = j0 + self.m2 * j1;
+ self.i = 4;
+ self.j = 16;
+
+ def nextDouble(self):
+ I, J, m = self.i, self.j, self.m
+ k = m[I] - m[J];
+ if (k < 0):
+ k += self.m1;
+ self.m[J] = k;
+
+ if (I == 0):
+ I = 16;
+ else:
+ I -= 1;
+ self.i = I;
+
+ if (J == 0):
+ J = 16;
+ else:
+ J -= 1;
+ self.j = J;
+
+ if (self.haveRange):
+ return self.left + self.dm1 * float(k) * self.width;
+ else:
+ return self.dm1 * float(k);
+
+
+
def SOR_execute(omega, G, num_iterations):
for p in xrange(num_iterations):
for y in xrange(1, G.height - 1):
diff --git a/talk/iwtc11/benchmarks/test_scimark.py b/talk/iwtc11/benchmarks/test_scimark.py
--- a/talk/iwtc11/benchmarks/test_scimark.py
+++ b/talk/iwtc11/benchmarks/test_scimark.py
@@ -1,4 +1,4 @@
-from scimark import SOR_execute, Array2D
+from scimark import SOR_execute, Array2D, Random
from cffi import FFI
import os
@@ -6,7 +6,9 @@
ffi.cdef("""
typedef struct {...;} Random_struct, *Random;
Random new_Random_seed(int seed);
+ double Random_nextDouble(Random R);
double **RandomMatrix(int M, int N, Random R);
+
void SOR_execute(int M, int N,double omega, double **G, int num_iterations);
""")
C = ffi.verify("""
@@ -28,3 +30,10 @@
for x, y in b.indexes():
assert a[y][x] == b[x, y]
+def test_random():
+ rnd_C = C.new_Random_seed(7)
+ rnd_py = Random(7)
+ for i in range(100):
+ assert C.Random_nextDouble(rnd_C) == rnd_py.nextDouble()
+
+
More information about the pypy-commit
mailing list