* Bug #8511 fixed - sprand used rand and grand functions, and internal state of the... 41/11341/5
Charlotte HECQUET [Fri, 19 Apr 2013 12:35:30 +0000 (14:35 +0200)]
                    generator was changed.

Change-Id: I666a2cbf73e6e47bbcf6f7d4e29ccd795c49c975

scilab/CHANGES_5.5.X
scilab/modules/sparse/help/en_US/matrixmanip/sprand.xml
scilab/modules/sparse/macros/sprand.sci
scilab/modules/sparse/tests/nonreg_tests/bug_8511.dia.ref [new file with mode: 0644]
scilab/modules/sparse/tests/nonreg_tests/bug_8511.tst [new file with mode: 0644]
scilab/modules/sparse/tests/unit_tests/sprand.dia.ref
scilab/modules/sparse/tests/unit_tests/sprand.tst

index 1cd19ca..5163071 100644 (file)
@@ -151,13 +151,13 @@ Bug fixes
 
 * Bug #7206 fixed - If the second input argument of meanf function was an hypermat, this function 
                     returned an error.
+                    
+* Bug #7296 fixed - Enabled %nan, %inf and -%inf for the cdf* functions.
 
 * Bug #7486 fixed - DGELSY and ZGELSY closer to the upstream, to propose our modifications to LAPACK.
 
 * Bug #7655 fixed - An example added in help page of type, for type(X)=11 and type(X)=13.
 
-* Bug #7296 fixed - Enabled %nan, %inf and -%inf for the cdf* functions.
-
 * Bug #7684 fixed - Introduction demo splitted in subsections.
 
 * Bug #7781 fixed - The second parameter of iqr function had not effect.
@@ -176,6 +176,9 @@ Bug fixes
 
 * Bug #8319 fixed - dbphi(hypermat) and phasemag(hypermat) returned a matrix instead of a hypermatrix.
 
+* Bug #8511 fixed - sprand used rand and grand functions, and internal state of the random
+                    generator was changed.
+
 * Bug #8597 fixed - Uncontrolled message of grand/clcg4 should be displayed as warning.
 
 * Bug #8607 fixed - Some error messages in modules/overloading/macros were not standard and not localized.
index 5ebefe7..d7d263a 100644 (file)
             function, where the parameter of the distribution function is 
             computed accordingly.
         </para>
-        <para>
-            As a side effect, the states of the random number generators <literal>rand</literal>
-            and <literal>grand</literal> are modified by this
-            function. 
-            The indices of the nonzeros entries are computed from an
-            exponential distribution function and the grand function. The values of
-            the matrix are computed from the distribution function given by the user
-            (i.e. uniform or normal) and the rand function.
-        </para>
     </refsection>
     <refsection>
         <title>Examples</title>
index 8f5bc93..ab55429 100644 (file)
@@ -18,17 +18,22 @@ function a=sprand(m,n,density,typ)
     end
 
     if ( rhs < 4 ) then
-        typ="uniform";
+        typ="def";
     end
 
     if type(typ)<>10 then
         error(msprintf(gettext("%s: Wrong type for input argument #%d: A string expected.\n"),"sprand",4));
     end
 
-    if and(typ<>["u";"n";"uniform";"normal"]) then
+    if and(typ<>["u";"n";"uniform";"normal";"def";"nor"]) then
         error(msprintf(gettext("%s: Wrong value for input argument #%d: ''%s'' or ''%s'' expected.\n"),"sprand",4,"uniform","normal"));
     end
-
+    if typ == "u" | typ == "uniform" then //"uniform" is the syntax for uniform distribution with rand, the equivalent with grand is "def"
+        typ = "def";
+    elseif typ == "n" | typ == "normal" then //"normal" is the syntax for normal distribution with rand, the equivalent with grand is "nor"
+        typ = "nor";
+    end
+    
     density=max(min(density,1),0);
 
     nel=m*n*density; //the objective number of non zero elements
@@ -58,7 +63,12 @@ function a=sprand(m,n,density,typ)
 
     //----  generates the random non zeros elements --------------------
     //according to the requested law and create the sparse matrix
-    a=sparse(ij,rand(nel1,1,typ),[m,n]);
+    if typ == "nor" then // Because of the syntax of grand, we have two cases, one with "def" and one with "nor"
+        a=sparse(ij,grand(nel1,1,typ,0,1),[m,n]);
+    elseif typ == "def" then
+        a=sparse(ij,grand(nel1,1,typ),[m,n]);
+    end
+    
 
 endfunction
 
diff --git a/scilab/modules/sparse/tests/nonreg_tests/bug_8511.dia.ref b/scilab/modules/sparse/tests/nonreg_tests/bug_8511.dia.ref
new file mode 100644 (file)
index 0000000..1c04098
--- /dev/null
@@ -0,0 +1,20 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 8511 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8511
+//
+// <-- Short Description -->
+// sprand uses rand and grand functions, and internal state of the random number
+// generator is changed
+grand("setsd",0);
+state1=rand("seed");
+A = sprand(5,5,.05);
+state2=rand("seed");
+assert_checkequal(state1,state2);
diff --git a/scilab/modules/sparse/tests/nonreg_tests/bug_8511.tst b/scilab/modules/sparse/tests/nonreg_tests/bug_8511.tst
new file mode 100644 (file)
index 0000000..9d95384
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 8511 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8511
+//
+// <-- Short Description -->
+// sprand uses rand and grand functions, and internal state of the random number
+// generator is changed
+
+grand("setsd",0);
+state1=rand("seed");
+A = sprand(5,5,.05);
+state2=rand("seed");
+assert_checkequal(state1,state2);
index 94f8037..97da5c6 100644 (file)
@@ -39,7 +39,7 @@ assert_checkequal ( nnzs > 10000 , %t );
 assert_checkequal ( min(values) < -3 , %t );
 assert_checkalmostequal ( mean(values) , 0 , [] , 1.e-2 );
 assert_checkequal ( max(values) > 3 , %t );
-assert_checkalmostequal ( variance(values) , 1 , 1.e-3 );
+assert_checkalmostequal ( variance(values) , 1 , 1.e-2 );
 rand("seed",0);
 grand("setsd",0);
 typ = "uniform";
index 4affd47..2ded8e7 100644 (file)
@@ -45,7 +45,7 @@ assert_checkequal ( nnzs > 10000 , %t );
 assert_checkequal ( min(values) < -3 , %t );
 assert_checkalmostequal ( mean(values) , 0 , [] , 1.e-2 );
 assert_checkequal ( max(values) > 3 , %t );
-assert_checkalmostequal ( variance(values) , 1 , 1.e-3 );
+assert_checkalmostequal ( variance(values) , 1 , 1.e-2 );
 
 rand("seed",0);
 grand("setsd",0);