X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Foptim-1.2.0%2Ffminunc_compat.m;fp=octave_packages%2Foptim-1.2.0%2Ffminunc_compat.m;h=93d193752e08e4fba681ffe2c8cda3bf84bbad2f;hp=0000000000000000000000000000000000000000;hb=f5f7a74bd8a4900f0b797da6783be80e11a68d86;hpb=1705066eceaaea976f010f669ce8e972f3734b05 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 index 0000000..93d1937 --- /dev/null +++ b/octave_packages/optim-1.2.0/fminunc_compat.m @@ -0,0 +1,166 @@ +## Copyright (C) 2002 Etienne Grossmann +## +## 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 . + +## [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