]> Creatis software - CreaPhase.git/blobdiff - octave_packages/optim-1.2.0/fminunc_compat.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / optim-1.2.0 / fminunc_compat.m
diff --git a/octave_packages/optim-1.2.0/fminunc_compat.m b/octave_packages/optim-1.2.0/fminunc_compat.m
new file mode 100644 (file)
index 0000000..93d1937
--- /dev/null
@@ -0,0 +1,166 @@
+## Copyright (C) 2002 Etienne Grossmann <etienne@egdn.net>
+##
+## This program is free software; you can redistribute it and/or modify it under
+## the terms of the GNU General Public License as published by the Free Software
+## Foundation; either version 3 of the License, or (at your option) any later
+## version.
+##
+## This program is distributed in the hope that it will be useful, but WITHOUT
+## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+## details.
+##
+## You should have received a copy of the GNU General Public License along with
+## this program; if not, see <http://www.gnu.org/licenses/>.
+
+## [x,v,flag,out,df,d2f] = fminunc_compat (f,x,opt,...) - M*tlab-like optimization
+##
+## Imitation of m*tlab's fminunc(). The optional 'opt' argument is a struct,
+## e.g. produced by 'optimset()'. 'fminunc_compat' has been deprecated in
+## favor of 'fminunc', which is now part of core Octave. This function
+## will possibly be removed from future versions of the 'optim' package.
+##
+## Supported options
+## -----------------
+## Diagnostics, [off|on] : Be verbose
+## Display    , [off|iter|notify|final]
+##                       : Be verbose unless value is "off"
+## GradObj    , [off|on] : Function's 2nd return value is derivatives
+## Hessian    , [off|on] : Function's 2nd and 3rd return value are
+##                         derivatives and Hessian.
+## TolFun     , scalar   : Termination criterion (see 'ftol' in minimize())
+## TolX       , scalar   : Termination criterion (see 'utol' in minimize())
+## MaxFunEvals, int      : Max. number of function evaluations
+## MaxIter    , int      : Max. number of algorithm iterations
+##
+## These non-m*tlab are provided to facilitate porting code to octave:
+## -----------------------
+## "MinEquiv" , [off|on] : Don't minimize 'fun', but instead return the
+##                         option passed to minimize().
+##
+## "Backend"  , [off|on] : Don't minimize 'fun', but instead return
+##                         [backend, opt], the name of the backend
+##                         optimization function that is used and the
+##                         optional arguments that will be passed to it. See
+##                         the 'backend' option of minimize().
+##
+## This function is a front-end to minimize().
+
+function [x,fval,flag,out,df,d2f] = fminunc_compat (fun,x0,opt,varargin)
+
+  persistent warned = false;
+  if (! warned)
+    warned = true;
+    warning ("Octave:deprecated-function",
+             "`fminunc_compat' has been deprecated, and will be removed in the future. Use `fminunc' from Octave core instead.");
+  endif
+
+if nargin < 3, opt = struct (); end
+if nargin > 3, 
+  args = {x0, varargin{:}};
+else 
+  args = {x0};
+end
+
+## Do some checks ####################################################
+ws = es = "";
+
+## Check for unknown options
+## All known options
+opn = [" DerivativeCheck Diagnostics DiffMaxChange DiffMinChange",\
+       " Display GoalsExactAchieve GradConstr GradObj Hessian HessMult",\
+       " HessPattern HessUpdate Jacobian JacobMult JacobPattern",\
+       " LargeScale LevenbergMarquardt LineSearchType MaxFunEvals MaxIter",\
+       " MaxPCGIter MeritFunction MinAbsMax PrecondBandWidth TolCon",\
+       " TolFun TolPCG TolX TypicalX ",\
+       " MinEquiv Backend "];
+
+for [v,k] = opt
+  if ! findstr ([" ",k," "],opn)
+    es = [es,sprintf("Unknown option '%s'\n",k)];
+  end
+end
+## Check for ignored options
+## All ignored options
+iop = [" DerivativeCheck DiffMaxChange DiffMinChange",\
+       " Display GoalsExactAchieve GradConstr HessMult",\
+       " HessPattern HessUpdate JacobMult JacobPattern",\
+       " LargeScale LevenbergMarquardt LineSearchType",\
+       " MaxPCGIter MeritFunction MinAbsMax PrecondBandWidth TolCon",\
+       " TolPCG TypicalX "];
+for [v,k] = opt
+  if ! findstr ([" ",k," "],iop)
+    ws = [ws,sprintf("Ignoring option '%s'\n",k)];
+  end
+end
+
+if length (ws) && ! length (es), warning (ws);
+elseif              length (es), error ([ws,es]);
+end
+
+## Transform fminunc options into minimize() options
+
+opm = struct();                # minimize() options
+
+equiv = struct ("TolX"       , "utol"   , "TolFun"     , "ftol",\
+               "MaxFunEvals", "maxev"  , "MaxIter"    , "maxit",\
+               "GradObj"    , "jac"    , "Hessian"    , "hess",\
+               "Display"    , "verbose", "Diagnostics", "verbose",\
+               "Backend"    , "backend");
+
+for [v,k] = equiv
+  if isfield (opt,k)
+    opm = setfield (opm, getfield(equiv,k), getfield(opt,k));
+  end
+end
+
+                               # Transform "off" into 0, other strings into
+                               # 1.
+for [v,k] = opm
+  if ischar (v)
+    if strcmp (v,"off")
+      opm = setfield (opm, k,0);
+    else
+      opm = setfield (opm, k,1);
+    end
+  end
+end
+
+unary_opt = " hess jac backend verbose ";
+opml = {};
+for [v,k] = opm
+  if findstr ([" ",k," "], unary_opt)
+    opml(end+1) = {k};          # append k 
+  else
+    opml(end+[1,2]) = {k,v};    # append k and v 
+  end
+end
+                               # Return only options to minimize() ##
+if isfield (opt, "MinEquiv")
+  x = opml;                    
+  if nargout > 1
+    warning ("Only 1 return value is defined with the 'MinEquiv' option");
+  end
+  return
+                               # Use the backend option #############
+elseif isfield (opm, "backend")
+  [x,fval] = minimize (fun, args, opml);
+  if nargout > 2
+    warning ("Only 2 return values are defined with the 'Backend' option");
+  end
+  return
+else                           # Do the minimization ################
+  [x,fval,out] = minimize (fun, args, opml);
+  
+  if isfield (opm, "maxev")
+    flag = out(1) < getfield(opm,"maxev");
+  else
+    flag = 1;
+  end
+  
+  if nargout > 4
+    [dummy,df,d2f] = feval (fun, x, args{2:end});
+  elseif nargout > 3
+    [dummy,df] = feval (fun, x, args{2:end});
+  end
+end