bug 6538: check input arguments in unobs function. 05/7905/4
Cedric Delamarre [Thu, 12 Jul 2012 15:19:32 +0000 (17:19 +0200)]
Change-Id: I20e8b726dd1776e92e994a66ab8f5f6cccddbac3

scilab/CHANGES_5.4.X
scilab/modules/cacsd/macros/unobs.sci
scilab/modules/cacsd/tests/nonreg_tests/bug_6538.dia.ref [new file with mode: 0644]
scilab/modules/cacsd/tests/nonreg_tests/bug_6538.tst [new file with mode: 0644]

index c89e5a0..2ba47be 100644 (file)
@@ -56,6 +56,9 @@ Unitary tests
 Bug Fixes
 =========
 
+* Bug #6538 fixed - unobs() ignored its 'tol' argument when it was present,
+                    was always calculated its own, arbitrary, internal value.
+
 * Bug #7251 fixed - Fix an error in the qp_solve documentation.
 
 * Bug #9830 fixed - leastsq did not match the information of optim.
index 38059a5..594dafb 100644 (file)
@@ -1,22 +1,42 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA - 
-// 
+// Copyright (C) INRIA -
+// Copyright (C) 2012 - Scilab Enterprises - Cedric Delamarrre
+//
 // 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    
+// are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
 function [dim,x]=unobs(A,C,tol)
 // n first columns of x span the unobservable
 // subspace of (A,C):
-//          dim  
+//          dim
 //          [*,*]
 // X'*A*X = [0,*]
-// 
+//
 //    C*X = [0,*]
 // Copyright INRIA
-[p,p]=size(A);tol=1.d-10*norm([A;C],1);
+
+[lhs,rhs]=argn(0);
+
+if rhs < 2
+    error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected."),"unobs", 2, 3));
+end
+
+if typeof(A) <> "constant" | ~isreal(A)
+    error(msprintf(gettext("%s: Wrong type for input argument #%d: A real matrix expected."),"unobs",1));
+end
+
+if typeof(C) <> "constant" | ~isreal(C)
+    error(msprintf(gettext("%s: Wrong type for input argument #%d: A real matrix expected."),"unobs",2));
+end
+
+if rhs == 2
+    tol=1.d-10*norm([A;C],1);
+end
+
+[p,p]=size(A);
 [n,w]=contr(A',C',tol);
 x=[w(:,n+1:p),w(:,1:n)];
 dim=p-n;
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_6538.dia.ref b/scilab/modules/cacsd/tests/nonreg_tests/bug_6538.dia.ref
new file mode 100644 (file)
index 0000000..fc918ca
--- /dev/null
@@ -0,0 +1,20 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 6538 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=6538
+//
+// <-- Short Description -->
+// unobs() ignores its 'tol' argument when it is present, always calculating its ow
+a = ones(3, 3);
+b = ones(3, 3) * 2;
+c = unobs(a, b);
+assert_checkequal(c, 2);
+c = unobs(a, b, 0.8);
+assert_checkequal(c, 3);
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_6538.tst b/scilab/modules/cacsd/tests/nonreg_tests/bug_6538.tst
new file mode 100644 (file)
index 0000000..0d523ea
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 6538 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=6538
+//
+// <-- Short Description -->
+// unobs() ignores its 'tol' argument when it is present, always calculating its ow
+
+a = ones(3, 3);
+b = ones(3, 3) * 2;
+
+c = unobs(a, b);
+assert_checkequal(c, 2);
+
+c = unobs(a, b, 0.8);
+assert_checkequal(c, 3);