[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