* Bug #13092 fixed - Optimization: check user function output 66/13166/2
Paul Bignier [Mon, 18 Nov 2013 10:01:06 +0000 (11:01 +0100)]
Change-Id: I6bf97d3067039a1384a63a8afa848a03a0fcf1d6

scilab/CHANGES_5.5.X
scilab/modules/optimization/macros/optimbase/optimbase_function.sci
scilab/modules/optimization/tests/nonreg_tests/bug_13092.dia.ref [new file with mode: 0644]
scilab/modules/optimization/tests/nonreg_tests/bug_13092.tst [new file with mode: 0644]

index fde3280..8208e43 100644 (file)
@@ -178,6 +178,8 @@ Scilab Bug Fixes
 * Bug #13071 fixed - Three unused functions in Xcos macros now specified as not mandatory
                      to write new blocks.
 
+* Bug #13092 fixed - Optimizations now check the user function output (must be a real).
+
 * Bug #13093 fixed - Removed trailing "\n" in the head_comments error message.
 
 
index 44b899d..f09e9d7 100644 (file)
@@ -123,6 +123,18 @@ function varargout = optimbase_function ( this , x , index )
             // [ f , g , index ] = costf ( x , index , a1, a2, ... )
             // [ this , f , g , index ] = optimbase_function ( this , x , index )
             [ f , g , index ] = __optimbase_f__ ( x , index , __optimbase_args__(1:$) );
+            if type(f) <> 1 | ~isreal(f) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 1);
+                error(errmsg)
+            end
+            if type(g) <> 1 | ~isreal(g) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 2);
+                error(errmsg)
+            end
+            if type(index) <> 1 | ~isreal(index) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 3);
+                error(errmsg)
+            end
             varargout(1) = this
             varargout(2) = f
             varargout(3) = g
@@ -132,6 +144,26 @@ function varargout = optimbase_function ( this , x , index )
             // [ f , g , c , gc , index ] = costf ( x , index , a1, a2, ... )
             // [ this , f , g , c , gc , index ] = optimbase_function ( this , x , index )
             [ f , g , c , gc , index ] = __optimbase_f__ ( x , index , __optimbase_args__(1:$) );
+            if type(f) <> 1 | ~isreal(f) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 1);
+                error(errmsg)
+            end
+            if type(g) <> 1 | ~isreal(g) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 2);
+                error(errmsg)
+            end
+            if type(c) <> 1 | ~isreal(c) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 3);
+                error(errmsg)
+            end
+            if type(gc) <> 1 | ~isreal(gc) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 4);
+                error(errmsg)
+            end
+            if type(index) <> 1 | ~isreal(index) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 5);
+                error(errmsg)
+            end
             varargout(1) = this
             varargout(2) = f
             varargout(3) = g
@@ -145,6 +177,14 @@ function varargout = optimbase_function ( this , x , index )
             // [ f , index ] = costf ( x , index , a1, a2, ... )
             // [ this , f , index ] = optimbase_function ( this , x , index )
             [ f , index ] = __optimbase_f__ ( x , index , __optimbase_args__(1:$) );
+            if type(f) <> 1 | ~isreal(f) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 1);
+                error(errmsg)
+            end
+            if type(index) <> 1 | ~isreal(index) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 2);
+                error(errmsg)
+            end
             varargout(1) = this
             varargout(2) = f
             varargout(3) = index
@@ -153,6 +193,18 @@ function varargout = optimbase_function ( this , x , index )
             // [ f , c , index ] = costf ( x , index , a1, a2, ... )
             // [ this , f , c , index ] = optimbase_function ( this , x , index )
             [ f , c , index ] = __optimbase_f__ ( x , index , __optimbase_args__(1:$) );
+            if type(f) <> 1 | ~isreal(f) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 1);
+                error(errmsg)
+            end
+            if type(c) <> 1 | ~isreal(c) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 2);
+                error(errmsg)
+            end
+            if type(index) <> 1 | ~isreal(index) then
+                errmsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 3);
+                error(errmsg)
+            end
             varargout(1) = this
             varargout(2) = f
             varargout(3) = c
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_13092.dia.ref b/scilab/modules/optimization/tests/nonreg_tests/bug_13092.dia.ref
new file mode 100644 (file)
index 0000000..4f4d0a9
--- /dev/null
@@ -0,0 +1,31 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- ENGLISH IMPOSED -->
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13092 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13092
+//
+// <-- Short Description -->
+// Wrong error message when user function returned a complex number
+function d = myf(x)
+    mu = 1e6
+    eVal_min = 0.4
+    A = [4*(x(1)**4 + x(2)**4), 2*x(2)**4; 2*x(2)**4, 4*x(2)**4]
+    B = [4*(x(1)**2 + x(2)**2), -3*x(2)**2; -3*x(2)**2, 4*x(2)**2]
+    eig = spec(A,B)
+    eig = gsort(eig, "g", "i")
+    eVal = eig(1)
+    d = x(1)**2 + x(2)**2 + mu * (eVal_min - eVal)**2
+endfunction
+xStart = [1 1];
+refMsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 1);
+assert_checkerror("[x, fval] = fminsearch(myf, xStart);", refMsg);
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_13092.tst b/scilab/modules/optimization/tests/nonreg_tests/bug_13092.tst
new file mode 100644 (file)
index 0000000..536ce84
--- /dev/null
@@ -0,0 +1,34 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- ENGLISH IMPOSED -->
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13092 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13092
+//
+// <-- Short Description -->
+// Wrong error message when user function returned a complex number
+
+function d = myf(x)
+    mu = 1e6
+    eVal_min = 0.4
+    A = [4*(x(1)**4 + x(2)**4), 2*x(2)**4; 2*x(2)**4, 4*x(2)**4]
+    B = [4*(x(1)**2 + x(2)**2), -3*x(2)**2; -3*x(2)**2, 4*x(2)**2]
+    eig = spec(A,B)
+    eig = gsort(eig, "g", "i")
+    eVal = eig(1)
+    d = x(1)**2 + x(2)**2 + mu * (eVal_min - eVal)**2
+endfunction
+
+xStart = [1 1];
+
+refMsg = msprintf(_("%s: Wrong type for user function output argument #%d: A real matrix expected."), "optimbase_function", 1);
+assert_checkerror("[x, fval] = fminsearch(myf, xStart);", refMsg);