From: <i7...@us...> - 2011-01-16 17:46:34
|
Revision: 8057 http://octave.svn.sourceforge.net/octave/?rev=8057&view=rev Author: i7tiol Date: 2011-01-16 17:46:28 +0000 (Sun, 16 Jan 2011) Log Message: ----------- Base on optimset mechanism if Octave version >= 3.3.55 Modified Paths: -------------- trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m trunk/octave-forge/main/optim/inst/nonlin_residmin.m Modified: trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m =================================================================== --- trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m 2011-01-16 17:42:02 UTC (rev 8056) +++ trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m 2011-01-16 17:46:28 UTC (rev 8057) @@ -25,8 +25,11 @@ function [p, resid, cvg, outp] = \ __nonlin_residmin__ (f, pin, settings, hook) - ## The optimset mechanism is broken in Octave 3.2.4. - optimget = @ __optimget__; + if (compare_versions (version (), "3.3.55", "<")) + ## optimset mechanism was fixed for option names with underscores + ## sometime in 3.3.54+, if I remember right + optimget = @ __optimget__; + endif ## some scalar defaults; some defaults are backend specific, so ## lacking elements in respective constructed vectors will be set to Modified: trunk/octave-forge/main/optim/inst/nonlin_residmin.m =================================================================== --- trunk/octave-forge/main/optim/inst/nonlin_residmin.m 2011-01-16 17:42:02 UTC (rev 8056) +++ trunk/octave-forge/main/optim/inst/nonlin_residmin.m 2011-01-16 17:46:28 UTC (rev 8057) @@ -37,16 +37,9 @@ ## @var{pin}: real column vector of initial parameters. ## ## @var{settings}: structure whose fields stand for optional settings -## refered to below; at the moment, the fields cannot be set by -## @code{optimset()} due to two bugs in Octaves current optimset -## mechanism, but must be directly set as structure-fields in the -## correct case. (With some effort one can fix this for oneself: from -## Octave Forges svn repository, manually install the functions in -## extra/optimset-fix/inst/ _instead_ of the corresponding Octave -## functions, _(re)start_ Octave, and remove the internal redirection of -## optimget in the installed file __nonlin_residmin__ of the optim -## package; there is no other way save waiting for a new Octave version -## with the submitted fix applied). +## referred to below. The fields can be set by @code{optimset()} with +## Octave versions 3.3.55 or greater; with older Octave versions, the +## fields must be set directly as structure-fields in the correct case. ## ## The returned values are the column vector of final parameters ## @var{p}, the final array of residuals @var{resid}, an integer This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <i7...@us...> - 2011-10-13 07:32:46
|
Revision: 8735 http://octave.svn.sourceforge.net/octave/?rev=8735&view=rev Author: i7tiol Date: 2011-10-13 07:32:39 +0000 (Thu, 13 Oct 2011) Log Message: ----------- Replace calls to 'arefields'. Modified Paths: -------------- trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m trunk/octave-forge/main/optim/inst/__residmin_stat__.m Modified: trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m =================================================================== --- trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m 2011-10-12 21:43:57 UTC (rev 8734) +++ trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m 2011-10-13 07:32:39 UTC (rev 8735) @@ -153,7 +153,7 @@ endif endif pord = pord(:); - if (pin_struct && ! all (arefields (pin, pord))) + if (pin_struct && ! all (isfield (pin, pord))) error ("some initial parameters lacking"); endif if ((nnames = rows (unique (pord))) < rows (pord)) @@ -234,7 +234,7 @@ endif ## supplement parameter names lacking in param_config - nidx = ! arefields (pconf, pord); + nidx = ! isfield (pconf, pord); pconf = cell2fields ({struct()}(ones (1, sum (nidx))), \ pord(nidx), 2, pconf); @@ -543,7 +543,7 @@ ## linear inequality constraints if (mc_struct) - idx = arefields (mc, pord); + idx = isfield (mc, pord); if (rows (fieldnames (mc)) > sum (idx)) error ("unknown fields in structure of linear inequality constraints"); endif @@ -554,7 +554,7 @@ ## linear equality constraints if (emc_struct) - idx = arefields (emc, pord); + idx = isfield (emc, pord); if (rows (fieldnames (emc)) > sum (idx)) error ("unknown fields in structure of linear equality constraints"); endif Modified: trunk/octave-forge/main/optim/inst/__residmin_stat__.m =================================================================== --- trunk/octave-forge/main/optim/inst/__residmin_stat__.m 2011-10-12 21:43:57 UTC (rev 8734) +++ trunk/octave-forge/main/optim/inst/__residmin_stat__.m 2011-10-13 07:32:39 UTC (rev 8735) @@ -122,7 +122,7 @@ endif endif pord = pord(:); - if (p_struct && ! all (arefields (pfin, pord))) + if (p_struct && ! all (isfield (pfin, pord))) error ("some parameters lacking"); endif if ((nnames = rows (unique (pord))) < rows (pord)) @@ -205,7 +205,7 @@ endif ## supplement parameter names lacking in param_config - nidx = ! arefields (pconf, pord); + nidx = ! isfield (pconf, pord); pconf = cell2fields ({struct()}(ones (1, sum (nidx))), \ pord(nidx), 2, pconf); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <i7...@us...> - 2011-11-01 07:55:31
|
Revision: 8903 http://octave.svn.sourceforge.net/octave/?rev=8903&view=rev Author: i7tiol Date: 2011-11-01 07:55:22 +0000 (Tue, 01 Nov 2011) Log Message: ----------- Move private functions into private/. Add corresponding workarounds for bug #31484 (Octave <= 3.2.3). Modified Paths: -------------- trunk/octave-forge/main/optim/inst/leasqr.m Added Paths: ----------- trunk/octave-forge/main/optim/inst/private/__collect_constraints__.m trunk/octave-forge/main/optim/inst/private/__dfdp__.m trunk/octave-forge/main/optim/inst/private/__lm_svd__.m trunk/octave-forge/main/optim/inst/private/__nonlin_residmin__.m trunk/octave-forge/main/optim/inst/private/__plot_cmds__.m trunk/octave-forge/main/optim/inst/private/__residmin_stat__.m Removed Paths: ------------- trunk/octave-forge/main/optim/inst/__collect_constraints__.m trunk/octave-forge/main/optim/inst/__dfdp__.m trunk/octave-forge/main/optim/inst/__lm_svd__.m trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m trunk/octave-forge/main/optim/inst/__plot_cmds__.m trunk/octave-forge/main/optim/inst/__residmin_stat__.m Deleted: trunk/octave-forge/main/optim/inst/__collect_constraints__.m =================================================================== --- trunk/octave-forge/main/optim/inst/__collect_constraints__.m 2011-10-31 17:24:06 UTC (rev 8902) +++ trunk/octave-forge/main/optim/inst/__collect_constraints__.m 2011-11-01 07:55:22 UTC (rev 8903) @@ -1,85 +0,0 @@ -## Copyright (C) 2010, 2011 Olaf Till <ola...@un...> -## -## 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/>. - -function [mc, vc, f_gencstr, df_gencstr, user_df] = \ - __collect_constraints__ (cstr) - - mc = vc = f_gencstr = df_gencstr = []; - user_df = false; - - if (isempty (cstr)) return; endif - - if (ismatrix (tp = cstr{1}) || isstruct (tp)) - mc = tp; - vc = cstr{2}; - if ((tp = length (cstr)) > 2) - f_genstr = cstr{3}; - if (tp > 3) - df_gencstr = cstr{4}; - user_df = true; - endif - endif - else - lid = 0; # no linear constraints - f_gencstr = cstr{1}; - if ((len = length (cstr)) > 1) - if (ismatrix (c = cstr{2}) || isstruct (c)) - lid = 2; - else - df_gencstr = c; - user_df = true; - if (len > 2) - lid = 3; - endif - endif - endif - if (lid) - mc = cstr{lid}; - vc = cstr{lid + 1}; - endif - endif - - if (! isempty (f_gencstr)) - if (ischar (f_gencstr)) - f_gencstr = str2func (f_gencstr); - endif - f_gencstr = @ (varargin) \ - tf_gencstr (f_gencstr, varargin{:}); - - if (user_df) - if (ischar (df_gencstr)) - df_gencstr = str2func (df_gencstr); - endif - df_gencstr = @ (p, func, idx, hook) \ - df_gencstr (p, idx, hook); - else - df_gencstr = @ (p, func, idx, hook) __dfdp__ (p, func, hook); - endif - endif - -endfunction - -function ret = tf_gencstr (f, varargin) # varargin: p[, idx[, info]] - - ## necessary since user function f_gencstr might return [] or a row - ## vector - - if (isempty (ret = f (varargin{:}))) - ret = zeros (0, 1); - elseif (columns (ret) > 1) - ret = ret(:); - endif - -endfunction Deleted: trunk/octave-forge/main/optim/inst/__dfdp__.m =================================================================== --- trunk/octave-forge/main/optim/inst/__dfdp__.m 2011-10-31 17:24:06 UTC (rev 8902) +++ trunk/octave-forge/main/optim/inst/__dfdp__.m 2011-11-01 07:55:22 UTC (rev 8903) @@ -1,156 +0,0 @@ -%% Copyright (C) 1992-1994 Richard Shrager -%% Copyright (C) 1992-1994 Arthur Jutan -%% Copyright (C) 1992-1994 Ray Muzic -%% Copyright (C) 2010, 2011 Olaf Till <ola...@un...> -%% -%% 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 2 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/>. - -function prt = __dfdp__ (p, func, hook) - - %% Meant to be called by interfaces 'dfxpdp.m' and 'dfpdp.m', see there. - - - if (nargin > 2 && isfield (hook, 'f')) - f = hook.f; - else - f = func (p); - f = f(:); - end - - m = length (f); - n = length (p); - - if (nargin > 2) - - if (isfield (hook, 'fixed')) - fixed = hook.fixed; - else - fixed = false (n, 1); - end - - if (isfield (hook, 'diffp')) - diffp = hook.diffp; - else - diffp = .001 * ones (n, 1); - end - - if (isfield (hook, 'diff_onesided')) - diff_onesided = hook.diff_onesided; - else - diff_onesided = false (n, 1); - end - - if (isfield (hook, 'lbound')) - lbound = hook.lbound; - else - lbound = - Inf (n, 1); - end - - if (isfield (hook, 'ubound')) - ubound = hook.ubound; - else - ubound = Inf (n, 1); - end - - if (isfield (hook, 'plabels')) - plabels = hook.plabels; - else - plabels = num2cell (num2cell ((1:n).')); - end - - else - fixed = false (n, 1); - diff_onesided = fixed; - diffp = .001 * ones (n, 1); - lbound = - Inf (n, 1); - ubound = Inf (n, 1); - plabels = num2cell (num2cell ((1:n).')); - end - - prt = zeros (m, n); % initialise Jacobian to Zero - del = diffp .* p; - idxa = p == 0; - del(idxa) = diffp(idxa); - del(diff_onesided) = - del(diff_onesided); % keep course of - % optimization of previous versions - absdel = abs (del); - idxd = ~(diff_onesided | fixed); % double sided interval - p1 = zeros (n, 1); - p2 = p1; - idxvs = false (n, 1); - idx1g2w = idxvs; - idx1le2w = idxvs; - - %% p may be slightly out of bounds due to inaccuracy, or exactly at - %% the bound -> single sided interval - idxvl = p <= lbound; - idxvg = p >= ubound; - p1(idxvl) = min (p(idxvl, 1) + absdel(idxvl, 1), ubound(idxvl, 1)); - idxd(idxvl) = false; - p1(idxvg) = max (p(idxvg, 1) - absdel(idxvg, 1), lbound(idxvg, 1)); - idxd(idxvg) = false; - idxs = ~(fixed | idxd); % single sided interval - - idxnv = ~(idxvl | idxvg); % current paramters within bounds - idxnvs = idxs & idxnv; % within bounds, single sided interval - idxnvd = idxd & idxnv; % within bounds, double sided interval - %% remaining single sided intervals - p1(idxnvs) = p(idxnvs) + del(idxnvs); % don't take absdel, this could - % change course of optimization without - % bounds with respect to previous - % versions - %% remaining single sided intervals, violating a bound -> take largest - %% possible direction of single sided interval - idxvs(idxnvs) = p1(idxnvs, 1) < lbound(idxnvs, 1) | ... - p1(idxnvs, 1) > ubound(idxnvs, 1); - del1 = p(idxvs, 1) - lbound(idxvs, 1); - del2 = ubound(idxvs, 1) - p(idxvs, 1); - idx1g2 = del1 > del2; - idx1g2w(idxvs) = idx1g2; - idx1le2w(idxvs) = ~idx1g2; - p1(idx1g2w) = max (p(idx1g2w, 1) - absdel(idx1g2w, 1), ... - lbound(idx1g2w, 1)); - p1(idx1le2w) = min (p(idx1le2w, 1) + absdel(idx1le2w, 1), ... - ubound(idx1le2w, 1)); - %% double sided interval - p1(idxnvd) = min (p(idxnvd, 1) + absdel(idxnvd, 1), ... - ubound(idxnvd, 1)); - p2(idxnvd) = max (p(idxnvd, 1) - absdel(idxnvd, 1), ... - lbound(idxnvd, 1)); - - del(idxs) = p1(idxs) - p(idxs); - del(idxd) = p1(idxd) - p2(idxd); - - info.f = f; - info.parallel = false; - - for j = 1:n - if (~fixed(j)) - info.plabels = plabels(j, :); - ps = p; - ps(j) = p1(j); - if (idxs(j)) - info.side = 0; % onesided interval - tp1 = func (ps, info); - prt(:, j) = (tp1(:) - f) / del(j); - else - info.side = 1; % centered interval, side 1 - tp1 = func (ps, info); - ps(j) = p2(j); - info.side = 2; % centered interval, side 2 - tp2 = func (ps, info); - prt(:, j) = (tp1(:) - tp2(:)) / del(j); - end - end - end Deleted: trunk/octave-forge/main/optim/inst/__lm_svd__.m =================================================================== --- trunk/octave-forge/main/optim/inst/__lm_svd__.m 2011-10-31 17:24:06 UTC (rev 8902) +++ trunk/octave-forge/main/optim/inst/__lm_svd__.m 2011-11-01 07:55:22 UTC (rev 8903) @@ -1,504 +0,0 @@ -%% Copyright (C) 1992-1994 Richard Shrager -%% Copyright (C) 1992-1994 Arthur Jutan -%% Copyright (C) 1992-1994 Ray Muzic -%% Copyright (C) 2010, 2011 Olaf Till <ola...@un...> -%% -%% 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 2 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/>. - -function [p, resid, cvg, outp] = __lm_svd__ (F, pin, hook) - - %% This is a backend for optimization. This code was originally - %% contained in leasqr.m, which is now a frontend. - - %% some backend specific defaults - fract_prec_default = 0; - max_fract_step_default = Inf; - - %% needed for some anonymous functions - if (exist ('ifelse') ~= 5) - ifelse = @ scalar_ifelse; - end - - %% passed constraints - mc = hook.mc; % matrix of linear constraints - vc = hook.vc; % vector of linear constraints - f_cstr = hook.f_cstr; % function of all constraints - df_cstr = hook.df_cstr; % function of derivatives of all constraints - n_gencstr = hook.n_gencstr; % number of non-linear constraints - eq_idx = hook.eq_idx; % logical index of equality constraints in all - % constraints - lbound = hook.lbound; % bounds, subset of linear inequality - ubound = hook.ubound; % constraints in mc and vc - - %% passed values of constraints for initial parameters - pin_cstr = hook.pin_cstr; - - %% passed return value of F for initial parameters - f_pin = hook.f_pin; - - %% passed derivative of residual function - dfdp = hook.dfdp; - - %% passed function for complementary pivoting - cpiv = hook.cpiv; - - %% passed options - maxstep = hook.max_fract_change; - maxstep(isna (maxstep)) = max_fract_step_default; - pprec = hook.fract_prec; - pprec(isna (pprec)) = fract_prec_default; - stol = hook.TolFun; - niter = hook.MaxIter; - if (isempty (niter)) niter = 20; end - wt = hook.weights; - fixed = hook.fixed; - verbose = strcmp (hook.Display, 'iter'); - - %% only preliminary, for testing - if (isfield (hook, 'testing')) - testing = hook.testing; - else - testing = false; - end - if (isfield (hook, 'new_s')) - new_s = hook.new_s; - else - new_s = false; - end - - %% some useful variables derived from passed variables - n_lcstr = size (vc, 1); - have_constraints_except_bounds = ... - n_lcstr + n_gencstr > ... - sum (lbound ~= -Inf) + sum (ubound ~= Inf); - n = length (pin); - wtl = wt(:); - - nz = 20 * eps; % This is arbitrary. Constraint function will be - % regarded as <= zero if less than nz. - - %% backend-specific checking of options and constraints - if (have_constraints_except_bounds) - if (any (pin_cstr.inequ.lin_except_bounds < 0) || ... - (n_gencstr > 0 && any (pin_cstr.inequ.gen < 0))) - warning ('initial parameters violate inequality constraints'); - end - if (any (abs (pin_cstr.equ.lin) >= nz) || ... - (n_gencstr > 0 && any (abs (pin_cstr.equ.gen) >= nz))) - warning ('initial parameters violate equality constraints'); - end - end - idx = lbound == ubound; - if (any (idx)) - warning ('lower and upper bounds identical for some parameters, fixing the respective parameters'); - fixed(idx) = true; - end - if (all (fixed)) - error ('no free parameters'); - end - lidx = pin < lbound; - uidx = pin > ubound; - if (any (lidx | uidx) && have_constraints_except_bounds) - warning ('initial parameters outside bounds, not corrected since other constraints are given'); - else - if (any (lidx)) - warning ('some initial parameters set to lower bound'); - pin(lidx, 1) = lbound(lidx, 1); - end - if (any (uidx)) - warning ('some initial parameters set to upper bound'); - pin(uidx, 1) = ubound(uidx, 1); - end - end - if (n_gencstr > 0 && any (~isinf (maxstep))) - warning ('setting both a maximum fractional step change of parameters and general constraints may result in inefficiency and failure'); - end - - %% fill constant fields of hook for derivative-functions; some fields - %% may be backend-specific - dfdp_hook.fixed = fixed; % this may be handled by the frontend, but - % the backend still may add to it - - %% set up for iterations - %% - p = pin; - f = f_pin; fbest=f; pbest=p; - m = prod (size (f)); - r = wt .* f; - r = r(:); - if (~isreal (r)) error ('weighted residuals are not real'); end - ss = r.' * r; - sbest=ss; - chgprev=Inf*ones(n,1); - cvg=0; - epsLlast=1; - epstab=[.1, 1, 1e2, 1e4, 1e6]; - ac_idx = true (n_lcstr + n_gencstr, 1); % all constraints - nc_idx = false (n_lcstr + n_gencstr, 1); % non of all constraints - gc_idx = cat (1, false (n_lcstr, 1), true (n_gencstr, 1)); % gen. constr. - lc_idx = ~gc_idx; - - %% do iterations - %% - for iter = 1:niter - deb_printf (testing, '\nstart outer iteration\n'); - v_cstr = f_cstr (p, ac_idx); - %% index of active constraints - c_act = v_cstr < nz | eq_idx; # equality constraints might be - # violated at start - if (any (c_act)) - if (n_gencstr > 0) - dct = df_cstr (p, ac_idx, ... - setfield (dfdp_hook, 'f', v_cstr)); - dct(:, fixed) = 0; % for user supplied dfdp; necessary? - dc = dct.'; - dcat = dct(c_act, :); - else - dcat = df_cstr (p, c_act, ... - setfield (dfdp_hook, 'f', v_cstr)); - dcat(:, fixed) = 0; % for user supplied dfdp; necessary? - end - dca = dcat.'; - end - nrm = zeros (1, n); - pprev=pbest; - prt = dfdp (p, setfield (dfdp_hook, 'f', fbest(:))); - prt(:, fixed) = 0; % for user supplied dfdp; necessary? - r = wt .* -fbest; - r = r(:); - if (~isreal (r)) error ('weighted residuals are not real'); end - sprev=sbest; - sgoal=(1-stol)*sprev; - msk = ~fixed; - prt(:, msk) = prt(:, msk) .* wtl(:, ones (1, sum (msk))); - nrm(msk) = sumsq (prt(:, msk), 1); - msk = nrm > 0; - nrm(msk) = 1 ./ sqrt (nrm(msk)); - prt = prt .* nrm(ones (1, m), :); - nrm = nrm.'; - [prt,s,v]=svd(prt,0); - s=diag(s); - g = prt.' * r; - for jjj=1:length(epstab) - deb_printf (testing, '\nstart inner iteration\n'); - epsL = max(epsLlast*epstab(jjj),1e-7); - %% printf ('epsL: %e\n', epsL); % for testing - - %% Usage of this 'ser' later is equivalent to pre-multiplying the - %% gradient with a positive-definit matrix, but not with a - %% diagonal matrix, at epsL -> Inf; so there is a fallback to - %% gradient descent, but not in general to descent for each - %% gradient component. Using the commented-out 'ser' ((1 / (1 + - %% epsL^2)) * (1 ./ se + epsL * s)) would be equivalent to using - %% Marquardts diagonal of the Hessian-approximation for epsL -> - %% Inf, but currently this gives no advantages in tests, even with - %% constraints. -%%% ser = 1 ./ sqrt((s.*s)+epsL); - se = sqrt ((s.*s) + epsL); - if (new_s) - %% for testing - ser = (1 / (1 + epsL^2)) * (1 ./ se + epsL * s); - else - ser = 1 ./ se; - end - tp1 = (v * (g .* ser)) .* nrm; - if (any (c_act)) - deb_printf (testing, 'constraints are active:\n'); - deb_printf (testing, '%i\n', c_act); - %% calculate chg by 'quadratic programming' - nrme= diag (nrm); - ser2 = diag (ser .* ser); - mfc1 = nrme * v * ser2 * v.' * nrme; - tp2 = mfc1 * dca; - a_eq_idx = eq_idx(c_act); - [lb, bidx, ridx, tbl] = cpiv (dcat * tp1, dcat * tp2, a_eq_idx); - chg = tp1 + tp2(:, bidx) * lb; % if a parameter is 'fixed', - % the respective component of chg should - % be zero too, even here (with active - % constraints) - deb_printf (testing, 'change:\n'); - deb_printf (testing, '%e\n', chg); - deb_printf (testing, '\n'); - %% indices for different types of constraints - c_inact = ~c_act; % inactive constraints - c_binding = nc_idx; - c_binding(c_act) = bidx; % constraints selected binding - c_unbinding = nc_idx; - c_unbinding(c_act) = ridx; % constraints unselected binding - c_nonbinding = c_act & ~(c_binding | c_unbinding); % constraints - % selected non-binding - else - %% chg is the Levenberg/Marquardt step - chg = tp1; - %% indices for different types of constraints - c_inact = ac_idx; % inactive constraints consist of all - % constraints - c_binding = nc_idx; - c_unbinding = nc_idx; - c_nonbinding = nc_idx; - end - %% apply constraints to step width (since this is a - %% Levenberg/Marquardt algorithm, no line-search is performed - %% here) - k = 1; - c_tp = c_inact(1:n_lcstr); - mcit = mc(:, c_tp).'; - vci = vc(c_tp); - hstep = mcit * chg; - idx = hstep < 0; - if (any (idx)) - k = min (1, min (- (vci(idx) + mcit(idx, :) * pprev) ./ ... - hstep(idx))); - end - if (k < 1) - deb_printf (testing, 'stepwidth: linear constraints\n'); - end - if (n_gencstr > 0) - c_tp = gc_idx & (c_nonbinding | c_inact); - if (any (c_tp) && any (f_cstr (pprev + k * chg, c_tp) < 0)) - [k, fval, info] = ... - fzero (@ (x) min (cat (1, ... - f_cstr (pprev + x * chg, c_tp), ... - k - x, ... - ifelse (x < 0, -Inf, Inf))), ... - 0); - if (info ~= 1 || abs (fval) >= nz) - error ('could not find stepwidth to satisfy inactive and non-binding general inequality constraints'); - end - deb_printf (testing, 'general constraints limit stepwidth\n'); - end - end - chg = k * chg; - - if (any (gc_idx & c_binding)) % none selected binding => - % none unselected binding - deb_printf (testing, 'general binding constraints must be regained:\n'); - %% regain binding constraints and one of the possibly active - %% previously inactive or non-binding constraints - ptp1 = pprev + chg; - - tp = true; - nt_nosuc = true; - lim = 20; - while (nt_nosuc && lim >= 0) - deb_printf (testing, 'starting from new value of p in regaining:\n'); - deb_printf (testing, '%e\n', ptp1); - %% we keep d_p.' * inv (mfc1) * d_p minimal in each step of - %% the inner loop; this is both sensible (this metric - %% considers a guess of curvature of sum of squared residuals) - %% and convenient (we have useful matrices available for it) - c_tp0 = c_inact | c_nonbinding; - c_tp1 = c_inact | (gc_idx & c_nonbinding); - btbl = tbl(bidx, bidx); - c_tp2 = c_binding; - if (any (tp)) % if none before, does not get true again - tp = f_cstr (ptp1, c_tp1) < nz; - if (any (tp)) % could be less clumsy, but ml-compatibility.. - %% keep only the first true entry in tp - tp(tp) = logical (cat (1, 1, zeros (sum (tp) - 1, 1))); - %% supplement binding index with one (the first) getting - %% binding in c_tp1 - c_tp2(c_tp1) = tp; - %% gradient of this added constraint - caddt = dct(c_tp2 & ~c_binding, :); - cadd = caddt.'; - C = dct(c_binding, :) * mfc1 * cadd; - Ct = C.'; - G = [btbl, btbl * C; ... - -Ct * btbl, caddt * mfc1 * cadd - Ct * btbl * C]; - btbl = gjp (G, size (G, 1)); - end - end - dcbt = dct(c_tp2, :); - mfc = - mfc1 * dcbt.' * btbl; - deb_printf (testing, 'constraints to regain:\n'); - deb_printf (testing, '%i\n', c_tp2); - - ptp2 = ptp1; - nt_niter_start = 100; - nt_niter = nt_niter_start; - while (nt_nosuc && nt_niter >= 0) - hv = f_cstr (ptp2, c_tp2); - if (all (abs (hv) < nz)) - nt_nosuc = false; - chg = ptp2 - pprev; - else - ptp2 = ptp2 + mfc * hv; % step should be zero for each - % component for which the parameter is - % 'fixed' - end - nt_niter = nt_niter - 1; - end - deb_printf (testing, 'constraints after regaining:\n'); - deb_printf (testing, '%e\n', hv); - if (nt_nosuc || ... - any (abs (chg) > abs (pprev .* maxstep)) || ... - any (f_cstr (ptp2, c_tp0) < -nz)) - if (nt_nosuc) - deb_printf (testing, 'regaining did not converge\n'); - else - deb_printf (testing, 'regaining violated type 3 and 4\n'); - end - nt_nosuc = true; - ptp1 = (pprev + ptp1) / 2; - end - if (~nt_nosuc) - tp = f_cstr (ptp2, c_unbinding); - if (any (tp) < 0) % again ml-compatibility clumsyness.. - [discarded, id] = min(tp); - tid = find (ridx); - id = tid(id); % index within active constraints - unsuccessful_exchange = false; - if (abs (tbl(id, id)) < nz) % Bard: not absolute value - %% exchange this unselected binding constraint against a - %% binding constraint, but not against an equality - %% constraint - tbidx = bidx & ~a_eq_idx; - if (~any (tbidx)) - unsuccessful_exchange = true; - else - [discarded, idm] = max (abs (tbl(tbidx, id))); - tid = find (tbidx); - idm = tid(idm); % -> index within active constraints - tbl = gjp (tbl, idm); - bidx(idm) = false; - ridx(idm) = true; - end - end - if (unsuccessful_exchange) - %% It probably doesn't look good now; this desperate - %% last attempt is not in the original algortithm, since - %% that didn't account for equality constraints. - ptp1 = (pprev + ptp1) / 2; - else - tbl = gjp (tbl, id); - bidx(id) = true; - ridx(id) = false; - c_binding = nc_idx; - c_binding(c_act) = bidx; - c_unbinding = nc_idx; - c_unbinding(c_act) = ridx; - end - nt_nosuc = true; - deb_printf (testing, 'regaining violated type 2\n'); - end - end - if (~nt_nosuc) - deb_printf (testing, 'regaining successful, converged with %i iterations:\n', ... - nt_niter_start - nt_niter); - deb_printf (testing, '%e\n', ptp2); - end - lim = lim - 1; - end - if (nt_nosuc) - error ('could not regain binding constraints'); - end - else - %% check the maximal stepwidth and apply as necessary - ochg=chg; - idx = ~isinf(maxstep); - limit = abs(maxstep(idx).*pprev(idx)); - chg(idx) = min(max(chg(idx),-limit),limit); - if (verbose && any(ochg ~= chg)) - disp(['Change in parameter(s): ', ... - sprintf('%d ',find(ochg ~= chg)), 'maximal fractional stepwidth enforced']); - end - end - aprec=abs(pprec.*pbest); %--- - %% ss=scalar sum of squares=sum((wt.*f)^2). - if (any(abs(chg) > 0.1*aprec))%--- % only worth evaluating - % function if there is some non-miniscule - % change - p=chg+pprev; - %% since the projection method may have slightly violated - %% constraints due to inaccuracy, correct parameters to bounds - %% --- but only if no further constraints are given, otherwise - %% the inaccuracy in honoring them might increase by this - if (~have_constraints_except_bounds) - lidx = p < lbound; - uidx = p > ubound; - p(lidx, 1) = lbound(lidx, 1); - p(uidx, 1) = ubound(uidx, 1); - chg(lidx, 1) = p(lidx, 1) - pprev(lidx, 1); - chg(uidx, 1) = p(uidx, 1) - pprev(uidx, 1); - end - %% - f = F (p); - r = wt .* f; - r = r(:); - if (~isreal (r)) - error ('weighted residuals are not real'); - end - ss = r.' * r; - deb_printf (testing, 'sbest: %.16e\n', sbest); - deb_printf (testing, 'sgoal: %.16e\n', sgoal); - deb_printf (testing, ' ss: %.16e\n', ss); - if (ss<sbest) - pbest=p; - fbest=f; - sbest=ss; - end - if (ss<=sgoal) - break; - end - end %--- - end - %% printf ('epsL no.: %i\n', jjj); % for testing - epsLlast = epsL; - if (verbose) - hook.plot_cmd (f); - end - if (ss < eps) % in this case ss == sbest - cvg = 3; % there is no more suitable flag for this - break; - end - if (ss>sgoal) - cvg = 3; - break; - end - aprec=abs(pprec.*pbest); - %% [aprec, chg, chgprev] - if (all(abs(chg) <= aprec) && all(abs(chgprev) <= aprec)) - cvg = 2; - if (verbose) - fprintf('Parameter changes converged to specified precision\n'); - end - break; - else - chgprev=chg; - end - end - - %% set further return values - %% - p = pbest; - resid = fbest; - outp.niter = iter; - -function deb_printf (do_printf, varargin) - - %% for testing - - if (do_printf) - printf (varargin{:}) - end - -function fval = scalar_ifelse (cond, tval, fval) - - %% needed for some anonymous functions, builtin ifelse only available - %% in Octave > 3.2; we need only the scalar case here - - if (cond) - fval = tval; - end Deleted: trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m =================================================================== --- trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m 2011-10-31 17:24:06 UTC (rev 8902) +++ trunk/octave-forge/main/optim/inst/__nonlin_residmin__.m 2011-11-01 07:55:22 UTC (rev 8903) @@ -1,971 +0,0 @@ -## Copyright (C) 2010, 2011 Olaf Till <ola...@un...> -## -## 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/>. - -## Internal function, called by nonlin_residmin --- see there --- and -## others. Calling __nonlin_residmin__ indirectly hides the argument -## "hook", usable by wrappers, from users. Currently, hook can contain -## the field "observations", so that dimensions of observations and -## returned values of unchanged model function can be checked against -## each other exactly one time. - -## disabled PKG_ADD: __all_opts__ ("__nonlin_residmin__"); - -function [p, resid, cvg, outp] = \ - __nonlin_residmin__ (f, pin, settings, hook) - - if (compare_versions (version (), "3.3.55", "<")) - ## optimset mechanism was fixed for option names with underscores - ## sometime in 3.3.54+, if I remember right - optimget = @ __optimget__; - endif - - ## some scalar defaults; some defaults are backend specific, so - ## lacking elements in respective constructed vectors will be set to - ## NA here in the frontend - diffp_default = .001; - stol_default = .0001; - - if (nargin == 1 && ischar (f) && strcmp (f, "defaults")) - p = optimset ("param_config", [], \ - "param_order", [], \ - "param_dims", [], \ - "f_inequc_pstruct", false, \ - "f_equc_pstruct", false, \ - "f_pstruct", false, \ - "df_inequc_pstruct", false, \ - "df_equc_pstruct", false, \ - "dfdp_pstruct", false, \ - "lbound", [], \ - "ubound", [], \ - "dfdp", [], \ - "cpiv", @ cpiv_bard, \ - "max_fract_change", [], \ - "fract_prec", [], \ - "diffp", [], \ - "diff_onesided", [], \ - "fixed", [], \ - "inequc", [], \ - "equc", [], \ - "weights", [], \ - "TolFun", stol_default, \ - "MaxIter", [], \ - "Display", "off", \ - "Algorithm", "lm_svd_feasible", \ - "plot_cmd", @ (f) 0, \ - "debug", false, \ - "lm_svd_feasible_alt_s", false); - return; - endif - - assign = @ assign; # Is this faster in repeated calls? - - if (nargin != 4) - error ("incorrect number of arguments"); - endif - - if (ischar (f)) - f = str2func (f); - endif - - if (! (pin_struct = isstruct (pin))) - if (! isvector (pin) || columns (pin) > 1) - error ("initial parameters must be either a structure or a column vector"); - endif - endif - - #### processing of settings and consistency checks - - pconf = optimget (settings, "param_config"); - pord = optimget (settings, "param_order"); - pdims = optimget (settings, "param_dims"); - f_inequc_pstruct = optimget (settings, "f_inequc_pstruct", false); - f_equc_pstruct = optimget (settings, "f_equc_pstruct", false); - f_pstruct = optimget (settings, "f_pstruct", false); - dfdp_pstruct = optimget (settings, "dfdp_pstruct", f_pstruct); - df_inequc_pstruct = optimget (settings, "df_inequc_pstruct", \ - f_inequc_pstruct); - df_equc_pstruct = optimget (settings, "df_equc_pstruct", \ - f_equc_pstruct); - lbound = optimget (settings, "lbound"); - ubound = optimget (settings, "ubound"); - dfdp = optimget (settings, "dfdp"); - if (ischar (dfdp)) dfdp = str2func (dfdp); endif - max_fract_change = optimget (settings, "max_fract_change"); - fract_prec = optimget (settings, "fract_prec"); - diffp = optimget (settings, "diffp"); - diff_onesided = optimget (settings, "diff_onesided"); - fixed = optimget (settings, "fixed"); - - any_vector_conf = ! (isempty (lbound) && isempty (ubound) && \ - isempty (max_fract_change) && \ - isempty (fract_prec) && isempty (diffp) && \ - isempty (diff_onesided) && isempty (fixed)); - - ## collect constraints - [mc, vc, f_genicstr, df_gencstr, user_df_gencstr] = \ - __collect_constraints__ (optimget (settings, "inequc")); - [emc, evc, f_genecstr, df_genecstr, user_df_genecstr] = \ - __collect_constraints__ (optimget (settings, "equc")); - mc_struct = isstruct (mc); - emc_struct = isstruct (emc); - - ## correct "_pstruct" settings if functions are not supplied - if (isempty (dfdp)) dfdp_pstruct = false; endif - if (isempty (f_genicstr)) f_inequc_pstruct = false; endif - if (isempty (f_genecstr)) f_equc_pstruct = false; endif - if (! user_df_gencstr) df_inequc_pstruct = false; endif - if (! user_df_genecstr) df_equc_pstruct = false; endif - - ## some settings require a parameter order - if (pin_struct || ! isempty (pconf) || f_inequc_pstruct || \ - f_equc_pstruct || f_pstruct || dfdp_pstruct || \ - df_inequc_pstruct || df_equc_pstruct || mc_struct || \ - emc_struct) - if (isempty (pord)) - if (pin_struct) - if (any_vector_conf || \ - ! (f_pstruct && \ - (f_inequc_pstruct || isempty (f_genicstr)) && \ - (f_equc_pstruct || isempty (f_genecstr)) && \ - (dfdp_pstruct || isempty (dfdp)) && \ - (df_inequc_pstruct || ! user_df_gencstr) && \ - (df_equc_pstruct || ! user_df_genecstr) && \ - (mc_struct || isempty (mc)) && \ - (emc_struct || isempty (emc)))) - error ("no parameter order specified and constructing a parameter order from the structure of initial parameters can not be done since not all configuration or given functions are structure based"); - else - pord = fieldnames (pin); - endif - else - error ("given settings require specification of parameter order or initial parameters in the form of a structure"); - endif - endif - pord = pord(:); - if (pin_struct && ! all (isfield (pin, pord))) - error ("some initial parameters lacking"); - endif - if ((nnames = rows (unique (pord))) < rows (pord)) - error ("duplicate parameter names in 'param_order'"); - endif - if (isempty (pdims)) - if (pin_struct) - pdims = cellfun \ - (@ size, fields2cell (pin, pord), "UniformOutput", false); - else - pdims = num2cell (ones (nnames, 2), 2); - endif - else - pdims = pdims(:); - if (pin_struct && \ - ! all (cellfun (@ (x, y) prod (size (x)) == prod (y), \ - struct2cell (pin), pdims))) - error ("given param_dims and dimensions of initial parameters do not match"); - endif - endif - if (nnames != rows (pdims)) - error ("lengths of 'param_order' and 'param_dims' not equal"); - endif - pnel = cellfun (@ prod, pdims); - ppartidx = pnel; - if (any (pnel > 1)) - pnonscalar = true; - cpnel = num2cell (pnel); - prepidx = cat (1, cellfun \ - (@ (x, n) x(ones (1, n), 1), \ - num2cell ((1:nnames).'), cpnel, \ - "UniformOutput", false){:}); - epord = pord(prepidx, 1); - psubidx = cat (1, cellfun \ - (@ (n) (1:n).', cpnel, \ - "UniformOutput", false){:}); - else - pnonscalar = false; # some less expensive interfaces later - prepidx = (1:nnames).'; - epord = pord; - psubidx = ones (nnames, 1); - endif - else - pord = []; # spares checks for given but not needed - endif - - if (pin_struct) - np = sum (pnel); - else - np = length (pin); - if (! isempty (pord) && np != sum (pnel)) - error ("number of initial parameters not correct"); - endif - endif - - plabels = num2cell (num2cell ((1:np).')); - if (! isempty (pord)) - plabels = cat (2, plabels, num2cell (epord), \ - num2cell (num2cell (psubidx))); - endif - - ## some useful vectors - zerosvec = zeros (np, 1); - NAvec = NA (np, 1); - Infvec = Inf (np, 1); - falsevec = false (np, 1); - sizevec = [np, 1]; - - ## collect parameter-related configuration - if (! isempty (pconf)) - ## use supplied configuration structure - - ## parameter-related configuration is either allowed by a structure - ## or by vectors - if (any_vector_conf) - error ("if param_config is given, its potential items must not \ - be configured in another way"); - endif - - ## supplement parameter names lacking in param_config - nidx = ! isfield (pconf, pord); - pconf = cell2fields ({struct()}(ones (1, sum (nidx))), \ - pord(nidx), 2, pconf); - - pconf = structcat (1, fields2cell (pconf, pord){:}); - - ## in the following, use reshape with explicit dimensions (instead - ## of x(:)) so that errors are thrown if a configuration item has - ## incorrect number of elements - - lbound = - Infvec; - if (isfield (pconf, "lbound")) - idx = ! fieldempty (pconf, "lbound"); - if (pnonscalar) - lbound (idx(prepidx), 1) = \ - cat (1, cellfun (@ (x, n) reshape (x, n, 1), \ - {pconf(idx).lbound}.', \ - cpnel(idx), "UniformOutput", false){:}); - else - lbound(idx, 1) = cat (1, pconf.lbound); - endif - endif - - ubound = Infvec; - if (isfield (pconf, "ubound")) - idx = ! fieldempty (pconf, "ubound"); - if (pnonscalar) - ubound (idx(prepidx), 1) = \ - cat (1, cellfun (@ (x, n) reshape (x, n, 1), \ - {pconf(idx).ubound}.', \ - cpnel(idx), "UniformOutput", false){:}); - else - ubound(idx, 1) = cat (1, pconf.ubound); - endif - endif - - max_fract_change = fract_prec = NAvec; - - if (isfield (pconf, "max_fract_change")) - idx = ! fieldempty (pconf, "max_fract_change"); - if (pnonscalar) - max_fract_change(idx(prepidx)) = \ - cat (1, cellfun (@ (x, n) reshape (x, n, 1), \ - {pconf(idx).max_fract_change}.', \ - cpnel(idx), \ - "UniformOutput", false){:}); - else - max_fract_change(idx) = [pconf.max_fract_change]; - endif - endif - - if (isfield (pconf, "fract_prec")) - idx = ! fieldempty (pconf, "fract_prec"); - if (pnonscalar) - fract_prec(idx(prepidx)) = \ - cat (1, cellfun (@ (x, n) reshape (x, n, 1), \ - {pconf(idx).fract_prec}.', cpnel(idx), \ - "UniformOutput", false){:}); - else - fract_prec(idx) = [pconf.fract_prec]; - endif - endif - - diffp = zerosvec; - diffp(:) = diffp_default; - if (isfield (pconf, "diffp")) - idx = ! fieldempty (pconf, "diffp"); - if (pnonscalar) - diffp(idx(prepidx)) = \ - cat (1, cellfun (@ (x, n) reshape (x, n, 1), \ - {pconf(idx).diffp}.', cpnel(idx), \ - "UniformOutput", false){:}); - else - diffp(idx) = [pconf.diffp]; - endif - endif - - diff_onesided = fixed = falsevec; - - if (isfield (pconf, "diff_onesided")) - idx = ! fieldempty (pconf, "diff_onesided"); - if (pnonscalar) - diff_onesided(idx(prepidx)) = \ - logical \ - (cat (1, cellfun (@ (x, n) reshape (x, n, 1), \ - {pconf(idx).diff_onesided}.', cpnel(idx), \ - "UniformOutput", false){:})); - else - diff_onesided(idx) = logical ([pconf.diff_onesided]); - endif - endif - - if (isfield (pconf, "fixed")) - idx = ! fieldempty (pconf, "fixed"); - if (pnonscalar) - fixed(idx(prepidx)) = \ - logical \ - (cat (1, cellfun (@ (x, n) reshape (x, n, 1), \ - {pconf(idx).fixed}.', cpnel(idx), \ - "UniformOutput", false){:})); - else - fixed(idx) = logical ([pconf.fixed]); - endif - endif - else - ## use supplied configuration vectors - - if (isempty (lbound)) - lbound = - Infvec; - elseif (any (size (lbound) != sizevec)) - error ("bounds: wrong dimensions"); - endif - - if (isempty (ubound)) - ubound = Infvec; - elseif (any (size (ubound) != sizevec)) - error ("bounds: wrong dimensions"); - endif - - if (isempty (max_fract_change)) - max_fract_change = NAvec; - elseif (any (size (max_fract_change) != sizevec)) - error ("max_fract_change: wrong dimensions"); - endif - - if (isempty (fract_prec)) - fract_prec = NAvec; - elseif (any (size (fract_prec) != sizevec)) - error ("fract_prec: wrong dimensions"); - endif - - if (isempty (diffp)) - diffp = zerosvec; - diffp(:) = diffp_default; - else - if (any (size (diffp) != sizevec)) - error ("diffp: wrong dimensions"); - endif - diffp(isna (diffp)) = diffp_default; - endif - - if (isempty (diff_onesided)) - diff_onesided = falsevec; - else - if (any (size (diff_onesided) != sizevec)) - error ("diff_onesided: wrong dimensions") - endif - diff_onesided(isna (diff_onesided)) = false; - diff_onesided = logical (diff_onesided); - endif - - if (isempty (fixed)) - fixed = falsevec; - else - if (any (size (fixed) != sizevec)) - error ("fixed: wrong dimensions"); - endif - fixed(isna (fixed)) = false; - fixed = logical (fixed); - endif - endif - - ## guaranty all (lbound <= ubound) - if (any (lbound > ubound)) - error ("some lower bounds larger than upper bounds"); - endif - - #### consider whether initial parameters and functions are based on - #### parameter structures or parameter vectors; wrappers for call to - #### default function for jacobians - - ## initial parameters - if (pin_struct) - if (pnonscalar) - pin = cat (1, cellfun (@ (x, n) reshape (x, n, 1), \ - fields2cell (pin, pord), cpnel, \ - "UniformOutput", false){:}); - else - pin = cat (1, fields2cell (pin, pord){:}); - endif - endif - - ## model function - if (f_pstruct) - if (pnonscalar) - f = @ (p, varargin) \ - f (cell2struct \ - (cellfun (@ reshape, mat2cell (p, ppartidx), \ - pdims, "UniformOutput", false), \ - pord, 1), varargin{:}); - else - f = @ (p, varargin) \ - f (cell2struct (num2cell (p), pord, 1), varargin{:}); - endif - endif - f_pin = f (pin); - if (isfield (hook, "observations")) - if (any (size (f_pin) != size (obs = hook.observations))) - error ("dimensions of observations and values of model function must match"); - endif - f = @ (p) f (p) - obs; - f_pin -= obs; - endif - - ## jacobian of model function - if (isempty (dfdp)) - dfdp = @ (p, hook) __dfdp__ (p, f, hook); - endif - if (dfdp_pstruct) - if (pnonscalar) - dfdp = @ (p, hook) \ - cat (2, \ - fields2cell \ - (dfdp (cell2struct \ - (cellfun (@ reshape, mat2cell (p, ppartidx), \ - pdims, "UniformOutput", false), \ - pord, 1), hook), \ - pord){:}); - else - dfdp = @ (p, hook) \ - cat (2, \ - fields2cell \ - (dfdp (cell2struct (num2cell (p), pord, 1), hook), \ - pord){:}); - endif - endif - - ## function for general inequality constraints - if (f_inequc_pstruct) - if (pnonscalar) - f_genicstr = @ (p, varargin) \ - f_genicstr (cell2struct \ - (cellfun (@ reshape, mat2cell (p, ppartidx), \ - pdims, "UniformOutput", false), \ - pord, 1), varargin{:}); - else - f_genicstr = @ (p, varargin) \ - f_genicstr \ - (cell2struct (num2cell (p), pord, 1), varargin{:}); - endif - endif - - ## note this stage - possibly_pstruct_f_genicstr = f_genicstr; - - ## jacobian of general inequality constraints - if (df_inequc_pstruct) - if (pnonscalar) - df_gencstr = @ (p, func, idx, hook) \ - cat (2, \ - fields2cell \ - (df_gencstr \ - (cell2struct \ - (cellfun (@ reshape, mat2cell (p, ppartidx), \ - pdims, "UniformOutput", false), pord, 1), \ - func, idx, hook), \ - pord){:}); - else - df_gencstr = @ (p, func, idx, hook) \ - cat (2, \ - fields2cell \ - (df_gencstr (cell2struct (num2cell (p), pord, 1), \ - func, idx, hook), \ - pord){:}); - endif - endif - - ## function for general equality constraints - if (f_equc_pstruct) - if (pnonscalar) - f_genecstr = @ (p, varargin) \ - f_genecstr (cell2struct \ - (cellfun (@ reshape, mat2cell (p, ppartidx), \ - pdims, "UniformOutput", false), \ - pord, 1), varargin{:}); - else - f_genecstr = @ (p, varargin) \ - f_genecstr \ - (cell2struct (num2cell (p), pord, 1), varargin{:}); - endif - endif - - ## note this stage - possibly_pstruct_f_genecstr = f_genecstr; - - ## jacobian of general equality constraints - if (df_equc_pstruct) - if (pnonscalar) - df_genecstr = @ (p, func, idx, hook) \ - cat (2, \ - fields2cell \ - (df_genecstr \ - (cell2struct \ - (cellfun (@ reshape, mat2cell (p, ppartidx), \ - pdims, "UniformOutput", false), pord, 1), \ - func, idx, hook), \ - pord){:}); - else - df_genecstr = @ (p, func, idx, hook) \ - cat (2, \ - fields2cell \ - (df_genecstr (cell2struct (num2cell (p), pord, 1), \ - func, idx, hook), \ - pord){:}); - endif - endif - - ## linear inequality constraints - if (mc_struct) - idx = isfield (mc, pord); - if (rows (fieldnames (mc)) > sum (idx)) - error ("unknown fields in structure of linear inequality constraints"); - endif - smc = mc; - mc = zeros (np, rows (vc)); - mc(idx(prepidx), :) = cat (1, fields2cell (smc, pord(idx)){:}); - endif - - ## linear equality constraints - if (emc_struct) - idx = isfield (emc, pord); - if (rows (fieldnames (emc)) > sum (idx)) - error ("unknown fields in structure of linear equality constraints"); - endif - semc = emc; - emc = zeros (np, rows (evc)); - emc(idx(prepidx), :) = cat (1, fields2cell (semc, pord(idx)){:}); - endif - - ## parameter-related configuration for jacobian functions - if (dfdp_pstruct || df_inequc_pstruct || df_equc_pstruct) - if(pnonscalar) - s_diffp = cell2struct \ - (cellfun (@ reshape, mat2cell (diffp, ppartidx), \ - pdims, "UniformOutput", false), pord, 1); - s_diff_onesided = cell2struct \ - (cellfun (@ reshape, mat2cell (diff_onesided, ppartidx), \ - pdims, "UniformOutput", false), pord, 1); - s_orig_lbound = cell2struct \ - (cellfun (@ reshape, mat2cell (lbound, ppartidx), \ - pdims, "UniformOutput", false), pord, 1); - s_orig_ubound = cell2struct \ - (cellfun (@ reshape, mat2cell (ubound, ppartidx), \ - pdims, "UniformOutput", false), pord, 1); - s_plabels = cell2struct \ - (num2cell \ - (cat (2, cellfun \ - (@ (x) cellfun \ - (@ reshape, mat2cell (cat (1, x{:}), ppartidx), \ - pdims, "UniformOutput", false), \ - num2cell (plabels, 1), "UniformOutput", false){:}), \ - 2), \ - pord, 1); - s_orig_fixed = cell2struct \ - (cellfun (@ reshape, mat2cell (fixed, ppartidx), \ - pdims, "UniformOutput", false), pord, 1); - else - s_diffp = cell2struct (num2cell (diffp), pord, 1); - s_diff_onesided = cell2struct (num2cell (diff_onesided), pord, 1); - s_orig_lbound = cell2struct (num2cell (lbound), pord, 1); - s_orig_ubound = cell2struct (num2cell (ubound), pord, 1); - s_plabels = cell2struct (num2cell (plabels, 2), pord, 1); - s_orig_fixed = cell2struct (num2cell (fixed), pord, 1); - endif - endif - - #### some further values and checks - - if (any (fixed & (pin < lbound | pin > ubound))) - warning ("some fixed parameters outside bounds"); - endif - - ## dimensions of linear constraints - if (isempty (mc)) - mc = zeros (np, 0); - vc = zeros (0, 1); - endif - if (isempty (emc)) - emc = zeros (np, 0); - evc = zeros (0, 1); - endif - [rm, cm] = size (mc); - [rv, cv] = size (vc); - if (rm != np || cm != rv || cv != 1) - error ("linear inequality constraints: wrong dimensions"); - endif - [erm, ecm] = size (emc); - [erv, ecv] = size (evc); - if (erm != np || ecm != erv || ecv != 1) - error ("linear equality constraints: wrong dimensions"); - endif - - ## check weights dimensions - weights = optimget (settings, "weights", ones (size (f_pin))); - if (any (size (weights) != size (f_pin))) - error ("dimension of weights and residuals must match"); - endif - - ## note initial values of linear constraits - pin_cstr.inequ.lin_except_bounds = mc.' * pin + vc; - pin_cstr.equ.lin = emc.' * pin + evc; - - ## note number and initial values of general constraints - if (isempty (f_genicstr)) - pin_cstr.inequ.gen = []; - n_genicstr = 0; - else - n_genicstr = length (pin_cstr.inequ.gen = f_genicstr (pin)); - endif - if (isempty (f_genecstr)) - pin_cstr.equ.gen = []; - n_genecstr = 0; - else - n_genecstr = length (pin_cstr.equ.gen = f_genecstr (pin)); - endif - - #### collect remaining settings - hook.TolFun = optimget (settings, "TolFun", stol_default); - hook.MaxIter = optimget (settings, "MaxIter"); - if (ischar (hook.cpiv = optimget (settings, "cpiv", @ cpiv_bard))) - hook.cpiv = str2func (hook.cpiv); - endif - hook.Display = optimget (settings, "Display", "off"); - hook.plot_cmd = optimget (settings, "plot_cmd", @ (f) 0); - hook.testing = optimget (settings, "debug", false); - hook.new_s = optimget (settings, "lm_svd_feasible_alt_s", false); - backend = optimget (settings, "Algorithm", "lm_svd_feasible"); - backend = map_matlab_algorithm_names (backend); - backend = map_backend (backend); - - #### handle fixing of parameters - orig_lbound = lbound; - orig_ubound = ubound; - orig_fixed = fixed; - if (all (fixed)) - error ("no free parameters"); - endif - - nonfixed = ! fixed; - if (any (fixed)) - ## backend (returned values and initial parameters) - backend = @ (f, pin, hook) \ - backend_wrapper (backend, fixed, f, pin, hook); - - ## model function - f = @ (p, varargin) f (assign (pin, nonfixed, p), varargin{:}); - - ## jacobian of model function - dfdp = @ (p, hook) \ - dfdp (assign (pin, nonfixed, p), hook)(:, nonfixed); - - ## function for general inequality constraints - f_genicstr = @ (p, varargin) \ - f_genicstr (assign (pin, nonfixed, p), varargin{:}); - - ## jacobian of general inequality constraints - df_gencstr = @ (p, func, idx, hook) \ - df_gencstr (assign (pin, nonfixed, p), func, idx, hook) \ - (:, nonfixed); - - ## function for general equality constraints - f_genecstr = @ (p, varargin) \ - f_genecstr (assign (pin, nonfixed, p), varargin{:}); - - ## jacobian of general equality constraints - df_genecstr = @ (p, func, idx, hook) \ - df_genecstr (assign (pin, nonfixed, p), func, idx, hook) \ - (:, nonfixed); - - ## linear inequality constraints - vc += mc(fixed, :).' * (tp = pin(fixed)); - mc = mc(nonfixed, :); - - ## linear equality constraints - evc += emc(fixed, :).' * tp; - emc = emc(nonfixed, :); - - ## _last_ of all, vectors of parameter-related configuration, - ## including "fixed" itself - lbound = lbound(nonfixed, :); - ubound = ubound(nonfixed, :); - max_fract_change = max_fract_change(nonfixed); - fract_prec = fract_prec(nonfixed); - fixed = fixed(nonfixed); - endif - - #### supplement constants to jacobian functions - - ## jacobian of model function - if (dfdp_pstruct) - dfdp = @ (p, hook) \ - dfdp (p, cell2fields \ - ({s_diffp, s_diff_onesided, s_orig_lbound, \ - s_orig_ubound, s_plabels, \ - cell2fields(num2cell(hook.fixed), pord(nonfixed), \ - 1, s_orig_fixed)}, \ - {"diffp", "diff_onesided", "lbound", "ubound", \ - "plabels", "fixed"}, \ - 2, hook)); - else - dfdp = @ (p, hook) \ - dfdp (p, cell2fields \ - ({diffp, diff_onesided, orig_lbound, orig_ubound, \ - plabels, assign(orig_fixed, nonfixed, hook.fixed)}, \ - {"diffp", "diff_onesided", "lbound", "ubound", \ - "plabels", "fixed"}, \ - 2, hook)); - endif - - ## jacobian of general inequality constraints - if (df_inequc_pstruct) - df_gencstr = @ (p, func, idx, hook) \ - df_gencstr (p, func, idx, cell2fields \ - ({s_diffp, s_diff_onesided, s_orig_lbound, \ - s_orig_ubound, s_plabels, \ - cell2fields(num2cell(hook.fixed), pord(nonfixed), \ - 1, s_orig_fixed)}, \ - {"diffp", "diff_onesided", "lbound", "ubound", \ - "plabels", "fixed"}, \ - 2, hook)); - else - df_gencstr = @ (p, func, idx, hook) \ - df_gencstr (p, func, idx, cell2fields \ - ({diffp, diff_onesided, orig_lbound, \ - orig_ubound, plabels, \ - assign(orig_fixed, nonfixed, hook.fixed)}, \ - {"diffp", "diff_onesided", "lbound", "ubound", \ - "plabels", "fixed"}, \ - 2, hook)); - endif - - ## jacobian of general equality constraints - if (df_equc_pstruct) - df_genecstr = @ (p, func, idx, hook) \ - df_genecstr (p, func, idx, cell2fields \ - ({s_diffp, s_diff_onesided, s_orig_lbound, \ - s_orig_ubound, s_plabels, \ - cell2fields(num2cell(hook.fixed), pord(nonfixed), \ - 1, s_orig_fixed)}, \ - {"diffp", "diff_onesided", "lbound", "ubound", \ - "plabels", "fixed"}, \ - 2, hook)); - else - df_genecstr = @ (p, func, idx, hook) \ - df_genecstr (p, func, idx, cell2fields \ - ({diffp, diff_onesided, orig_lbound, \ - orig_ubound, plabels, \ - assign(orig_fixed, nonfixed, hook.fixed)}, \ - {"diffp", "diff_onesided", "lbound", "ubound", \ - "plabels", "fixed"}, \ - 2, hook)); - endif - - #### interfaces to constraints - - ## include bounds into linear inequality constraints - tp = eye (sum (nonfixed)); - lidx = lbound != - Inf; - uidx = ubound != Inf; - mc = cat (2, mc, tp(:, lidx), - tp(:, uidx)); - vc = cat (1, vc, - lbound(lidx, 1), ubound(uidx, 1)); - - ## concatenate linear inequality and equality constraints - mc = cat (2, mc, emc); - vc = cat (1, vc, evc); - n_lincstr = rows (vc); - - ## concatenate general inequality and equality constraints - if (n_genecstr > 0) - if (n_genicstr > 0) - nidxi = 1 : n_genicstr; - nidxe = n_genicstr + 1 : n_genicstr + n_genecstr; - f_gencstr = @ (p, idx, varargin) \ - cat (1, \ - f_genicstr (p, idx(nidxi), varargin{:}), \ - f_genecstr (p, idx(nidxe), varargin{:})); - df_gencstr = @ (p, idx, hook) \ - cat (1, \ - df_gencstr (p, @ (p, varargin) \ - possibly_pstruct_f_genicstr \ - (p, idx(nidxi), varargin{:}), \ - idx(nidxi), \ - setfield (hook, "f", \ - hook.f(nidxi(idx(nidxi))))), \ - df_genecstr (p, @ (p, varargin) \ - possibly_pstruct_f_genecstr \ - (p, idx(nidxe), varargin{:}), \ - idx(nidxe), \ - setfield (hook, "f", \ - hook.f(nidxe(idx(nidxe)))))); - else - f_gencstr = f_genecstr; - df_gencstr = @ (p, idx, hook) \ - df_genecstr (p, \ - @ (p, varargin) \ - possibly_pstruct_f_genecstr \ - (p, idx, varargin{:}), \ - idx, \ - setfield (hook, "f", hook.f(idx))); - endif - else - f_gencstr = f_genicstr; - df_gencstr = @ (p, idx, hook) \ - df_gencstr (p, \ - @ (p, varargin) \ - possibly_pstruct_f_genicstr (p, idx, varargin{:}), \ - idx, \ - setfield (hook, "f", hook.f(idx))); - endif - n_gencstr = n_genicstr + n_genecstr; - - ## concatenate linear and general constraints, defining the final - ## function interfaces - if (n_gencstr > 0) - nidxl = 1:n_lincstr; - nidxh = n_lincstr + 1 : n_lincstr + n_gencstr; - f_cstr = @ (p, idx, varargin) \ - cat (1, \ - mc(:, idx(nidxl)).' * p + vc(idx(nidxl), 1), \ - f_gencstr (p, idx(nidxh), varargin{:})); - df_cstr = @ (p, idx, hook) \ - cat (1, \ - mc(:, idx(nidxl)).', \ - df_gencstr (p, idx(nidxh), \ - setfield (hook, "f", \ - hook.f(nidxh)))); - else - f_cstr = @ (p, idx, varargin) mc(:, idx).' * p + vc(idx, 1); - df_cstr = @ (p, idx, hook) mc(:, idx).'; - endif - - ## define eq_idx (logical index of equality constraints within all - ## concatenated constraints - eq_idx = false (n_lincstr + n_gencstr, 1); - eq_idx(n_lincstr + 1 - rows (evc) : n_lincstr) = true; - n_cstr = n_lincstr + n_gencstr; - eq_idx(n_cstr + 1 - n_genecstr : n_cstr) = true; - - #### prepare interface hook - - ## passed constraints - hook.mc = mc; - hook.vc = vc; - hook.f_cstr = f_cstr; - hook.df_cstr = df_cstr; - hook.n_gencstr = n_gencstr; - hook.eq_idx = eq_idx; - hook.lbound = lbound; - hook.ubound = ubound; - - ## passed values of constraints for initial parameters - hook.pin_cstr = pin_cstr; - - ## passed function for derivative of model function - hook.dfdp = dfdp; - - ## passed function for complementary pivoting - ## hook.cpiv = cpiv; # set before - - ## passed value of residual function for initial parameters - hook.f_pin = f_pin; - - ## passed options - hook.max_fract_change = max_fract_change; - hook.fract_prec = fract_prec; - ## hook.TolFun = ; # set before - ## hook.MaxIter = ; # set before - hook.weights = weights; - hook.fixed = fixed; - - #### call backend - - [p, resid, cvg, outp] = backend (f, pin, hook); - - if (pin_struct) - if (pnonscalar) - p = cell2struct \ - (cellfun (@ reshape, mat2cell (p, ppartidx), \ - pdims, "UniformOutput", false), \ - pord, 1); - else - p = cell2struct (num2cell (p), pord, 1); - endif - endif - -endfunction - -function backend = map_matlab_algorithm_names (backend) - - switch (backend) - case "levenberg-marquardt" - backend = "lm_svd_feasible"; - warning ("algorithm 'levenberg-marquardt' mapped to 'lm_svd_feasible'"); - endswitch - -endfunction - -function backend = map_backend (backend) - - switch (backend) - case "lm_svd_feasible" - backend = "__lm_svd__"; - otherwise - error ("no backend implemented for algorithm '%s'", backend); - endswitch - - backend = str2func (backend); - -endfunction - -function [p, resid, cvg, outp] = backend_wrapper (backend, fixed, f, p, hook) - - [tp, resid, cvg, outp] = backend (f, p(! fixed), hook); - - p(! fixed) = tp; - -endfunction - -function lval = assign (lval, lidx, rval) - - lval(lidx) = rval; - -endfunction - -function ret = __optimget__ (s, name, default) - - if (isfield (s, name)) - ret = s.(name); - elseif (nargin > 2) - ret = default; - else - ret = []; - endif - -endfunction Deleted: trunk/octave-forge/main/optim/inst/__plot_cmds__.m =================================================================== --- trunk/octave-forge/main/optim/inst/__plot_cmds__.m 2011-10-31 17:24:06 UTC (rev 8902) +++ trunk/octave-forge/main/optim/inst/__plot_cmds__.m 2011-11-01 07:55:22 UTC (rev 8903) @@ -1,50 +0,0 @@ -%% Copyright (C) 2010, 2011 Olaf Till <ola...@un...> -%% -%% 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/>. - -function __plot_cmds__ (x, y, f) - - persistent lgnd; - persistent use_x; - if (nargin == 0) - %% reset function - lgnd = []; - return; - end - - if (length (size (f)) > 2) - return; - end - - if (isempty (lgnd)); - n = size (y, 2); - if (n == 1) - lgnd = {'data', 'fit'}; - else - id = num2str ((1:n).'); - lgnd1 = cat (2, repmat ('data ', n, 1), id); - lgnd2 = cat (2, repmat ('fit ', n, 1), id); - lgnd = cat (1, cellstr (lgnd1), cellstr (lgnd2)); - end - use_x = size (x, 1) == size (y, 1); - end - - x = x(:, 1); - if (use_x) - plot (x, y, 'marker', '+', 'linestyle', 'none', x, f); - else - plot (y, 'marker', '+', 'linestyle', 'none', f); - end - legend (lgnd); - drawnow; Deleted: trunk/octave-forge/main/optim/inst/__residmin_stat__.m =================================================================== --- trunk/octave-forge/main/optim/inst/__residmin_stat__.m 2011-10-31 17:24:06 UTC (rev 8902) +++ trunk/octave-forge/main/optim/inst/__residmin_stat__.m 2011-11-01 07:55:22 UTC (rev 8903) @@ -1,608 +0,0 @@ -## Copyright (C) 2011 Olaf Till <ola...@un...> -## -## 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/>. - -## Internal function, called by residmin_stat --- see there --- and -## others. Calling __residmin_stat__ indirectly hides the argument -## "hook", usable by wrappers, from users. Currently, hook can contain -## the field "observations". Since much uf the interface code is taken -## from __nonlin_residmin__, it may be that not everything is ideal for -## the present case; but I think it's allright to leave it so. -## -## Some general considerations while making this function: -## -## Different Functions for optimization statistics should be made for -## mere objective function optimization (to be made yet) and -## residual-derived minimization (this function), since there are -## different computing aspects. Don't put the contained functionality -## (statistics) into the respective optimization functions (or -## backends), since different optimization algorithms can share a way to -## compute statistics (e.g. even stochastic optimizers can mimize -## (weighted) squares of residuals). Also, don't use the same frontend -## for optimization and statistics, since the differences in the -## interface for both uses may be confusing otherwise, also the optimset -## options only partially overlap. - -## disabled PKG_ADD: __all_opts__ ("__residmin_stat__"); - -function ret = __residmin_stat__ (f, pfin, settings, hook) - - if (compare_versions... [truncated message content] |
From: <i7...@us...> - 2011-11-01 17:28:34
|
Revision: 8913 http://octave.svn.sourceforge.net/octave/?rev=8913&view=rev Author: i7tiol Date: 2011-11-01 17:28:27 +0000 (Tue, 01 Nov 2011) Log Message: ----------- Deprecate fminunc_compat and optimset_compat. Modified Paths: -------------- trunk/octave-forge/main/optim/inst/fminunc_compat.m trunk/octave-forge/main/optim/inst/optimset_compat.m Modified: trunk/octave-forge/main/optim/inst/fminunc_compat.m =================================================================== --- trunk/octave-forge/main/optim/inst/fminunc_compat.m 2011-11-01 17:05:29 UTC (rev 8912) +++ trunk/octave-forge/main/optim/inst/fminunc_compat.m 2011-11-01 17:28:27 UTC (rev 8913) @@ -13,7 +13,9 @@ ## [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()'. +## 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 ## ----------------- @@ -42,6 +44,8 @@ ## This function is a front-end to minimize(). function [x,fval,flag,out,df,d2f] = fminunc_compat (fun,x0,opt,varargin) + warning ("'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."); + if nargin < 3, opt = struct (); end if nargin > 3, args = {x0, varargin{:}}; Modified: trunk/octave-forge/main/optim/inst/optimset_compat.m =================================================================== --- trunk/octave-forge/main/optim/inst/optimset_compat.m 2011-11-01 17:05:29 UTC (rev 8912) +++ trunk/octave-forge/main/optim/inst/optimset_compat.m 2011-11-01 17:28:27 UTC (rev 8913) @@ -13,7 +13,9 @@ ## opt = optimset_compat (...) - manipulate m*tlab-style options structure ## ## This function returns a m*tlab-style options structure that can be used -## with the fminunc() function. +## with the fminunc() function. 'optimset_compat' has been deprecated in +## favor of 'optimset', which is now part of core Octave. This function +## will possibly be removed from future versions of the 'optim' package. ## ## INPUT : Input consist in one or more structs followed by option-value ## pairs. The option that can be passed are those of m*tlab's 'optimset'. @@ -39,6 +41,8 @@ ## Display , ["off","iter","notify","final"] ## : N/A + warning ("'optimset_compat' has been deprecated in favor of 'optimset', which is now part of core Octave. This function will possibly be removed from future versions of the 'optim' package."); + args = varargin; opt = struct (); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <i7...@us...> - 2012-05-24 07:24:42
|
Revision: 10514 http://octave.svn.sourceforge.net/octave/?rev=10514&view=rev Author: i7tiol Date: 2012-05-24 07:24:35 +0000 (Thu, 24 May 2012) Log Message: ----------- Format corrections to help. Modified Paths: -------------- trunk/octave-forge/main/optim/inst/cauchy.m trunk/octave-forge/main/optim/inst/nonlin_min.m Modified: trunk/octave-forge/main/optim/inst/cauchy.m =================================================================== --- trunk/octave-forge/main/optim/inst/cauchy.m 2012-05-24 06:50:59 UTC (rev 10513) +++ trunk/octave-forge/main/optim/inst/cauchy.m 2012-05-24 07:24:35 UTC (rev 10514) @@ -24,7 +24,7 @@ ## ## @example ## @group -## d = cauchy(16,1.5,0,@(x) exp(x)); +## d = cauchy(16, 1.5, 0, @@(x) exp(x)); ## @result{} d(2) = 1.0000 # first (2-1) derivative of function f (index starts from zero) ## @end group ## @end example Modified: trunk/octave-forge/main/optim/inst/nonlin_min.m =================================================================== --- trunk/octave-forge/main/optim/inst/nonlin_min.m 2012-05-24 06:50:59 UTC (rev 10513) +++ trunk/octave-forge/main/optim/inst/nonlin_min.m 2012-05-24 07:24:35 UTC (rev 10514) @@ -210,10 +210,10 @@ ## a way, it must return the entries (columns) of the gradient ## (jacobian) as fields of a structure under the respective parameter ## names. If the hessian function is configured in such a way, it must -## return a structure (say @code{h}) with fields e.g. as @code{h.a.b = -## value} for @{value} being the 2nd partial derivative with respect to -## @code{a} and @code{b}. There is no need to also specify the field -## @code{h.b.a} in this example. +## return a structure (say @code{h}) with fields e.g. as +## @code{h.a.b = value} for @code{value} being the 2nd partial derivative +## with respect to @code{a} and @code{b}. There is no need to also +## specify the field @code{h.b.a} in this example. ## ## Similarly, for specifying linear constraints, instead of the matrix ## (called @code{m} above), a structure containing the rows of the This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |