* Bug #8098 fixed - cumsum did not apply to rational matrices. 51/11851/2
Adeline CARNIS [Mon, 1 Jul 2013 11:52:42 +0000 (13:52 +0200)]
Change-Id: Ic39d06fe29a08503159b0063402ed0220297c86a

scilab/CHANGES_5.5.X
scilab/modules/elementary_functions/tests/unit_tests/cumsum.dia.ref
scilab/modules/elementary_functions/tests/unit_tests/cumsum.tst
scilab/modules/overloading/macros/%r_cumsum.sci [new file with mode: 0644]
scilab/modules/overloading/tests/nonreg_tests/bug_8098.dia.ref [new file with mode: 0644]
scilab/modules/overloading/tests/nonreg_tests/bug_8098.tst [new file with mode: 0644]

index e2b6690..fa0d97f 100644 (file)
@@ -212,6 +212,8 @@ Bug fixes
 
 * Bug #7927 fixed - Output "flag" in qmr function was not well documented.
 
+* Bug #8098 fixed - cumsum could not be applied to rational matrices.
+
 * Bug #8162 fixed - Area of stability of plzr was wrong for continuous systems (+unit test added).
 
 * Bug #8234 fixed - strtod did not return an empty matrix when input argument was an empty matrix.
index d7815d6..4aa9826 100644 (file)
@@ -91,6 +91,17 @@ for typ=T
   assert_checkequal(cumsum(p,5,typ(:)), p);
 end
 //=======================================================================
+//Matrices of rationals
+s=%s;r=1.0 ./[s s+1;s^2 1];
+T=list(list(),list('native'),list('double'));
+for typ=T
+  assert_checkequal(cumsum(r,typ(:)), [1,1+2*s+2*s^2;1+s,1+2*s+3*s^2+s^3]./[s,s^2+s^3;s^2,s^2+s^3]);
+  assert_checkequal(cumsum(r,'*',typ(:)), [1,1+2*s+2*s^2;1+s,1+2*s+3*s^2+s^3]./[s,s^2+s^3;s^2,s^2+s^3]);
+  assert_checkequal(cumsum(r,1,typ(:)), [1,1;1+s,2+s]./[s,1+s;s^2,1+s]);
+  assert_checkequal(cumsum(r,2,typ(:)), [1,1+2*s;1,1+s^2]./[s,s+s^2;s^2,s^2]);
+  assert_checkequal(cumsum(r,3,typ(:)), r);
+end
+//=======================================================================
 ///Matrices of boolean
 b=[%t %t;%f %t];
 for typ=list(list(),list('double'));
index 030082b..f4fe2a8 100644 (file)
@@ -103,6 +103,18 @@ for typ=T
 end
 
 //=======================================================================
+//Matrices of rationals
+s=%s;r=1.0 ./[s s+1;s^2 1];
+T=list(list(),list('native'),list('double'));
+for typ=T
+  assert_checkequal(cumsum(r,typ(:)), [1,1+2*s+2*s^2;1+s,1+2*s+3*s^2+s^3]./[s,s^2+s^3;s^2,s^2+s^3]);
+  assert_checkequal(cumsum(r,'*',typ(:)), [1,1+2*s+2*s^2;1+s,1+2*s+3*s^2+s^3]./[s,s^2+s^3;s^2,s^2+s^3]);
+  assert_checkequal(cumsum(r,1,typ(:)), [1,1;1+s,2+s]./[s,1+s;s^2,1+s]);
+  assert_checkequal(cumsum(r,2,typ(:)), [1,1+2*s;1,1+s^2]./[s,s+s^2;s^2,s^2]);
+  assert_checkequal(cumsum(r,3,typ(:)), r);
+end
+
+//=======================================================================
 ///Matrices of boolean
 
 b=[%t %t;%f %t];
diff --git a/scilab/modules/overloading/macros/%r_cumsum.sci b/scilab/modules/overloading/macros/%r_cumsum.sci
new file mode 100644 (file)
index 0000000..54a1fc7
--- /dev/null
@@ -0,0 +1,79 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+function a=%r_cumsum(a, orient, typ)
+    // cumulative sum for rational matrics
+    rhs = argn(2);
+    select rhs
+    case 1
+        orient = "*";
+    case 2
+        if or(orient == ["native", "double"]) then
+            orient = "*";
+        end
+    case 3
+        if and(typ <> ["native", "double"]) then
+            error(msprintf(_("%s: Wrong value for input argument #%d: ""%s"" or ""%s"" expected.\n"),"cumsum", 2, "native", "double"));
+        end
+    end
+
+    if size(orient, "*") <> 1 then
+        if type(orient) == 10 then
+            error(msprintf(_("%s: Wrong size for input argument #%d: A string expected.\n"),"cumsum", 2));
+        else
+            error(msprintf(_("%s: Wrong size for input argument #%d: A scalar expected.\n"),"cumsum", 2));
+        end
+    end
+
+    dims = size(a);
+
+    if type(orient) == 10 then
+        orient = find(orient == ["m","*","r","c"]);
+        if isempty(orient) then
+            error(msprintf(_("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"),..
+            "cumsum",2,"""*"",""r"",""c"",""m"",1:"+string(size(dims,"*"))));
+        end
+        orient=orient-2;
+    end
+
+    if orient == -1 then //'m'
+        orient = find(dims > 1, 1);
+        if isempty(orient) then
+            orient = 0;
+        end
+    end
+    if orient<0 then
+        error(msprintf(_("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"),..
+        "cumsum",2,"""*"",""r"",""c"",""m"",1:"+string(ndims(a))));
+    end
+    
+    select orient
+    case 0 then // case "*"
+        a = tril(ones(size(a,"*"), size(a, "*"))) * matrix(a, -1, 1);
+        if simp_mode() then
+            a = simp(a);
+        end
+        a = matrix(a, dims(1), dims(2));
+    case 1 then // case 1 or 'r'
+        a = [tril(ones(dims(1), dims(1))) zeros(dims(2), dims(2)); zeros(dims(1), dims(1)) tril(ones(dims(2), dims(2)))] * matrix(a, -1, 1);
+        if simp_mode() then
+            a = simp(a);
+        end
+        a = matrix(a, dims(1), dims(2));
+    case 2 then // case 2 or 'c"
+        a = [eye(dims(1), dims(1)) zeros(dims(2), dims(2)); eye(dims(1), dims(1)) eye(dims(2), dims(2))] * matrix(a, -1, 1);
+        if simp_mode() then
+            a = simp(a);
+        end
+        a = matrix(a, dims(1), dims(2));
+    else
+        a=a
+    end
+
+endfunction
diff --git a/scilab/modules/overloading/tests/nonreg_tests/bug_8098.dia.ref b/scilab/modules/overloading/tests/nonreg_tests/bug_8098.dia.ref
new file mode 100644 (file)
index 0000000..b813442
--- /dev/null
@@ -0,0 +1,50 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 8098 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8098
+//
+// <-- Short Description -->
+//    cumsum() did not apply to rational matrices.
+// =============================================================================
+s = poly(0, "s");
+r = [1/s 1/s; 1/s^2 1];
+assert_checkequal(cumsum(r), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r,"*"), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r, 1), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, 2), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "r"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, "c"), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "m"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r,"native"), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r,"double"), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r,"*", "native"), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r, 1, "native"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, 2, "native"), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "r", "native"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, "c", "native"), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "m", "native"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r,"*", "double"), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r, 1, "double"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, 2, "double"), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "r", "double"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, "c", "double"), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "m", "double"), [1 1;1+s 1+s]./[s s;s^2 s]);
+// Check error
+assert_checkfalse(execstr("cumsum(r, ""toto"")"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"),..
+            "cumsum",2,"""*"",""r"",""c"",""m"",1:2");
+assert_checkerror("cumsum(r, ""toto"")", refMsg);
+assert_checkfalse(execstr("cumsum(r, ""*"", ""toto"")"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong value for input argument #%d: ""%s"" or ""%s"" expected.\n"),"cumsum", 2, "native", "double");
+assert_checkerror("cumsum(r, ""*"", ""toto"")", refMsg);
+a = cumsum([1/%z %z/(1+2*%z)]);
+assert_checkequal(a, [1/%z (1+2*%z+%z^2)/(%z+2*%z^2)]);
+a = cumsum([1/%z %z/(1+2*%z)]');
+assert_checkequal(a, [1/%z (1+2*%z+%z^2)/(%z+2*%z^2)]');
diff --git a/scilab/modules/overloading/tests/nonreg_tests/bug_8098.tst b/scilab/modules/overloading/tests/nonreg_tests/bug_8098.tst
new file mode 100644 (file)
index 0000000..3091abd
--- /dev/null
@@ -0,0 +1,58 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 8098 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8098
+//
+// <-- Short Description -->
+//    cumsum() did not apply to rational matrices.
+// =============================================================================
+
+s = poly(0, "s");
+r = [1/s 1/s; 1/s^2 1];
+
+assert_checkequal(cumsum(r), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r,"*"), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r, 1), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, 2), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "r"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, "c"), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "m"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r,"native"), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r,"double"), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r,"*", "native"), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r, 1, "native"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, 2, "native"), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "r", "native"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, "c", "native"), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "m", "native"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r,"*", "double"), [1 1+2*s;1+s 1+2*s+s^2]./[s s^2;s^2 s^2]);
+assert_checkequal(cumsum(r, 1, "double"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, 2, "double"), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "r", "double"), [1 1;1+s 1+s]./[s s;s^2 s]);
+assert_checkequal(cumsum(r, "c", "double"), [1 2;1 1+s^2]./[s s;s^2 s^2]);
+assert_checkequal(cumsum(r, "m", "double"), [1 1;1+s 1+s]./[s s;s^2 s]);
+
+// Check error
+assert_checkfalse(execstr("cumsum(r, ""toto"")"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"),..
+            "cumsum",2,"""*"",""r"",""c"",""m"",1:2");
+assert_checkerror("cumsum(r, ""toto"")", refMsg);
+
+assert_checkfalse(execstr("cumsum(r, ""*"", ""toto"")"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong value for input argument #%d: ""%s"" or ""%s"" expected.\n"),"cumsum", 2, "native", "double");
+assert_checkerror("cumsum(r, ""*"", ""toto"")", refMsg);
+
+a = cumsum([1/%z %z/(1+2*%z)]);
+assert_checkequal(a, [1/%z (1+2*%z+%z^2)/(%z+2*%z^2)]);
+
+a = cumsum([1/%z %z/(1+2*%z)]');
+assert_checkequal(a, [1/%z (1+2*%z+%z^2)/(%z+2*%z^2)]');