From 9fcbbe3656ea031993ca19c983b2e84b02d8cef4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mattias=20F=C3=A4lt?= <mattiasf@control.lth.se>
Date: Tue, 1 Dec 2015 18:00:25 +0100
Subject: [PATCH] Avoid extra allocation in sobol generation

---
 src/sobol.jl | 85 +++++++++++++++++++++++++---------------------------
 1 file changed, 40 insertions(+), 45 deletions(-)

diff --git a/src/sobol.jl b/src/sobol.jl
index 5ab9290..db027c0 100644
--- a/src/sobol.jl
+++ b/src/sobol.jl
@@ -28,69 +28,64 @@ function sobol(dim::Int64, N::Int64)
     X = Array(Float64,(N,dim))
     MeM = InitSobol(dim)
 
-    for j = 1:N
-        X[j,:], nextseed, MeM  = getNewSobolVector(dim, nextseed, MeM)
-    end
+    nextseed  = getNewSobolArray!(dim, nextseed, MeM, X, N)
 
     return X, nextseed, MeM
 end
 
-function sobol(X, nextseed, MeM)
+function sobol!(X, nextseed, MeM)
     (N,dim) = size(X)
-    for j = 1:N
-        X[j,:], nextseed, MeM  = getNewSobolVector(dim, nextseed, MeM)
-    end
+    nextseed = getNewSobolArray!(dim, nextseed, MeM, X, N)
 
-    return X, nextseed, MeM
+    return nextseed
 end
 
-function getNewSobolVector(dim, seed, MeM)
-
-    seed::Int64 = max(floor(seed),0)
-
-    if  seed == 0
-        l = 1
-        MeM.lastq = zeros(1,dim)
-    elseif  seed == MeM.seed_save + 1
-        l = smallest0bit(seed)
-    elseif  seed <= MeM.seed_save
-        MeM.seed_save = 0
-        l = 1
-        MeM.lastq[1:dim] = 0
+function getNewSobolArray!(dim, seed, MeM, X, N)
+    for j = 1:N
+        seed::Int64 = max(floor(seed),0)
+        if  seed == 0
+            l = 1
+            MeM.lastq = zeros(1,dim)
+        elseif  seed == MeM.seed_save + 1
+            l = smallest0bit(seed)
+        elseif  seed <= MeM.seed_save
+            MeM.seed_save = 0
+            l = 1
+            MeM.lastq[1:dim] = 0
 
-        for seed_temp = MeM.seed_save:seed-1
-            l = smallest0bit(seed_temp)
-            for i = 1:dim
-                MeM.lastq[i] = MeM.lastq[i] $ MeM.v[i,l] # bitxor
+            for seed_temp = MeM.seed_save:seed-1
+                l = smallest0bit(seed_temp)
+                for i = 1:dim
+                    MeM.lastq[i] = MeM.lastq[i] $ MeM.v[i,l] # bitxor
+                end
             end
-        end
 
-        l = smallest0bit(seed)
+            l = smallest0bit(seed)
 
-    elseif (MeM.seed_save + 1) < seed
+        elseif (MeM.seed_save + 1) < seed
 
-        for seed_temp = (MeM.seed_save + 1):(seed - 1)
-            l = smallest0bit(seed_temp)
-            for i = 1:dim
-                MeM.lastq[i] = MeM.lastq[i] $ MeM.v[i,l] # bitxor
+            for seed_temp = (MeM.seed_save + 1):(seed - 1)
+                l = smallest0bit(seed_temp)
+                for i = 1:dim
+                    MeM.lastq[i] = MeM.lastq[i] $ MeM.v[i,l] # bitxor
+                end
             end
-        end
 
-        l = smallest0bit(seed)
-
-    end
+            l = smallest0bit(seed)
 
-    qrv = Array(Float64,dim)
+        end
 
-    for i = 1 : dim
-        qrv[i] = MeM.lastq[i] * MeM.recipd;
-        MeM.lastq[i] =  MeM.lastq[i] $ MeM.v[i,l]  # bitxor
-    end
+        #qrv = Array(Float64,dim)
 
-    MeM.seed_save = seed;
-    nextseed = seed + 1;
+        for i = 1 : dim
+            X[j,i] = MeM.lastq[i] * MeM.recipd; #qrv[i] = MeM.lastq[i] * MeM.recipd;
+            MeM.lastq[i] =  MeM.lastq[i] $ MeM.v[i,l]  # bitxor
+        end
 
-    return qrv, nextseed, MeM
+        MeM.seed_save = seed;
+        seed = seed + 1;
+    end
+    return seed
 end
 
 function smallest0bit(b)
@@ -211,4 +206,4 @@ function test_sobol()
     plot(X[:,1],X[:,2],".m")
 
     display(pp)
-end
\ No newline at end of file
+end
-- 
GitLab