changeset 33327:3e2a4821f5f5 bytecode-interpreter

maint: Merge default to bytecode-interpreter.
author Nicholas R. Jankowski <jankowski.nicholas@gmail.com>
date Thu, 04 Apr 2024 18:44:23 -0400
parents 263ddd6b96f7 (current diff) 3f3d7dde7f61 (diff)
children af9c0617f9f9
files
diffstat 2 files changed, 37 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/etc/NEWS.10.md	Thu Apr 04 16:01:51 2024 -0400
+++ b/etc/NEWS.10.md	Thu Apr 04 18:44:23 2024 -0400
@@ -105,6 +105,19 @@
         shift                  | circshift
         sparse_auto_mutate     | none (see below)
 
+- `fminsearch` parameter passing:  A legacy, undocumented, and only partially
+  supported syntax for passing parameters to the minimized function `fcn`
+  called by `fminsearch` by appending them to the input argument list has
+  functioned intermittently since Octave 4.4.0.  Due to conflicts with other
+  compatibility-required input methods the documentation of this syntax was
+  removed in Octave 5.1.0, and the remaining functionality has been completely
+  removed in Octave 10, and attempts to call `fminsearch` with that syntax
+  will result in an error. The preferred, cross-platform compatible method of
+  passing parameters to any of the minimization functions (including
+  `fminsearch`, `fminbnd`, and `fminunc`) is through the use of Anonymous
+  Functions.  Specific examples of this can be found in the @ref{Minimizers}
+  section of the GNU Octave manual.
+
 ### Build system
 
 - Octave now requires a C++ compiler that is compliant with C++17 (preferably
--- a/scripts/optimization/fminsearch.m	Thu Apr 04 16:01:51 2024 -0400
+++ b/scripts/optimization/fminsearch.m	Thu Apr 04 18:44:23 2024 -0400
@@ -122,11 +122,10 @@
 ## probably better to use @code{fminbnd}.
 ## @item
 ## The legacy, undocumented syntax for passing parameters to @var{fcn} by
-## appending them to the input argument list after @var{options} is
-## discouraged and will  be completely removed in Octave 10.  The
-## preferred, cross-platform compatible method of passing parameters to
-## @var{fcn} is through use of @ref{Anonymous Functions}.  For specific
-## examples of doing so for @code{fminsearch} and other minimization
+## appending them to the input argument list after @var{options} has been
+## removed in Octave 10.  The cross-platform compatible method of passing
+## parameters to @var{fcn} is through use of @ref{Anonymous Functions}.  For
+## specific examples of doing so for @code{fminsearch} and other minimization
 ## functions see the @ref{Minimizers} section of the GNU Octave manual.
 ## @end enumerate
 ## @seealso{fminbnd, fminunc, optimset}
@@ -139,7 +138,7 @@
 
 function [x, fval, exitflag, output] = fminsearch (varargin)
 
-  if (nargin < 1)
+  if (nargin < 1 || nargin > 3)
     print_usage ();
   endif
 
@@ -188,10 +187,10 @@
     options = struct ();
   endif
 
-  [x, exitflag, output] = nmsmax (fcn, x0, options, varargin{:});
+  [x, exitflag, output] = nmsmax (fcn, x0, options);
 
   if (nargout > 1)
-    fval = feval (fcn, x, varargin{:});
+    fval = feval (fcn, x);
   endif
 
 endfunction
@@ -282,16 +281,16 @@
 
 endfunction
 
-function [x, exitflag, output] = nmsmax (fcn, x, options, varargin)
+function [x, exitflag, output] = nmsmax (fcn, x, options)
 
   [stopit, savit, dirn, trace, tol, maxiter, tol_f, outfcn] = ...
                                                     parse_options (options, x);
 
   if (strcmpi (optimget (options, "FunValCheck", "off"), "on"))
     ## Replace fcn with a guarded version.
-    fcn = @(x) guarded_eval (fcn, x, varargin{:});
+    fcn = @(x) guarded_eval (fcn, x);
   else
-    fcn = @(x) real (fcn (x, varargin{:}));
+    fcn = @(x) real (fcn (x));
   endif
 
   x0 = x(:);  # Work with column vector internally.
@@ -509,9 +508,9 @@
 endfunction
 
 ## A helper function that evaluates a function and checks for bad results.
-function y = guarded_eval (fcn, x, varargin)
+function y = guarded_eval (fcn, x)
 
-  y = fcn (x, varargin{:});
+  y = fcn (x);
 
   if (! (isreal (y)))
     error ("fminsearch:notreal", "fminsearch: non-real value encountered");
@@ -559,14 +558,6 @@
 %! c = 1.5;
 %! assert (fminsearch (@(x) x(1).^2 + c*x(2).^2, [1;1]), [0;0], 1e-4);
 
-## additional input argument
-%!test
-%! x1 = fminsearch (@(x, c) x(1).^2 + c*x(2).^2, [1;1], [], 1.5);
-%! assert (x1, [0;0], 1e-4);
-%! x1 = fminsearch (@(x, c) c(1)*x(1).^2 + c(2)*x(2).^2, [1;1], ...
-%!                  optimset ("Display", "none"), [1 1.5]);
-%! assert (x1, [0;0], 1e-4);
-
 ## all output arguments
 %!test
 %! options = optimset ("Display", "none", "TolX", 1e-4, "TolFun", 1e-7);
@@ -592,4 +583,15 @@
 
 ## Test input validation
 %!error <Invalid call> fminsearch ()
-%!error fminsearch (1)
+%!error <Invalid call> fminsearch (1, 2, 3, 4)
+%!error <PROBLEM must be a structure> fminsearch (1)
+%!test <*55742>
+%! problem.objective = @sin;
+%! problem.x0 = 3;
+%! problem.solver = "foo";
+%! fail ("fminsearch (problem)","problem.solver must be set to");
+
+## additional input argument - no longer supported.  nargin > 3 should fail.
+%!test <*55742>
+%! fail ("fminsearch (@(x, c) x(1).^2 + c*x(2).^2, [1;1], [], 1.5)", "Invalid call");
+%! fail ("fminsearch (@(x, c) c(1)*x(1).^2 + c(2)*x(2).^2, [1;1], optimset ('Display', 'none'), [1 1.5])", "Invalid call");