From: <i7...@us...> - 2011-01-24 15:24:14
|
Revision: 8066 http://octave.svn.sourceforge.net/octave/?rev=8066&view=rev Author: i7tiol Date: 2011-01-24 15:24:07 +0000 (Mon, 24 Jan 2011) Log Message: ----------- Fix some indices for empty assignment. Modified Paths: -------------- trunk/octave-forge/main/optim/inst/vfzero.m Modified: trunk/octave-forge/main/optim/inst/vfzero.m =================================================================== --- trunk/octave-forge/main/optim/inst/vfzero.m 2011-01-23 22:52:28 UTC (rev 8065) +++ trunk/octave-forge/main/optim/inst/vfzero.m 2011-01-24 15:24:07 UTC (rev 8066) @@ -188,6 +188,9 @@ mba = mu * (b - a); not_ready = true (nx, 1); while (niter < maxiter && nfev < maxfev && any (not_ready)) + + ## FIXME: Make vectorization of original switch exclusive + ## itype == 1 type1idx = not_ready & itype == 1; ## The initial test. @@ -242,9 +245,9 @@ .*(c(tidx) - a(tidx))(:); pdc = a1(taidx)(:) + a2(taidx)(:).*(2*c(tidx) - a(tidx) - b(tidx))(:); tidx0 = tidx; - tidx0(tidx0) &= (p0idx = pdc == 0); + tidx0(tidx0, 1) &= (p0idx = pdc == 0); taidx0 = tidx0(idx); - tidx(tidx) &= ! p0idx; + tidx(tidx, 1) &= ! p0idx; c(tidx0) = a(tidx0)(:) - (a0(taidx0)./a1(taidx0))(:); c(tidx) = c(tidx)(:) - (pc(! p0idx)./pdc(! p0idx))(:); endfor @@ -275,6 +278,8 @@ c(nidx) = max (a(nidx) + delta(nidx), \ min (b(nidx) - delta(nidx), c(nidx))); + ## FIXME: apply not_ready + ## ## Calculate new point. x = c; fval = fc = fun (c)(:); @@ -331,9 +336,11 @@ endwhile ## Check solution for a singularity by examining slope - info(not_ready & info == 1 & (b - a) != 0 & \ - abs ((fb - fa)./(b - a) ./ slope0) > max (1e6, 0.5/(eps+tolx))) \ - = - 5; + idx = not_ready & info == 1 & (b - a) != 0; + idx(idx, 1) &= \ + abs ((fb(idx, 1) - fa(idx, 1))./(b(idx, 1) - a(idx, 1)) \ + ./ slope0(idx, 1)) > max (1e6, 0.5/(eps+tolx)); + info(idx) = - 5; output.iterations = niter; output.funcCount = nfev; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <i7...@us...> - 2011-01-25 13:43:09
|
Revision: 8073 http://octave.svn.sourceforge.net/octave/?rev=8073&view=rev Author: i7tiol Date: 2011-01-25 13:43:03 +0000 (Tue, 25 Jan 2011) Log Message: ----------- Fix vectorization of original switch and indexing in call to user function. Modified Paths: -------------- trunk/octave-forge/main/optim/inst/vfzero.m Modified: trunk/octave-forge/main/optim/inst/vfzero.m =================================================================== --- trunk/octave-forge/main/optim/inst/vfzero.m 2011-01-25 11:20:39 UTC (rev 8072) +++ trunk/octave-forge/main/optim/inst/vfzero.m 2011-01-25 13:43:03 UTC (rev 8073) @@ -127,7 +127,7 @@ niter = 0; nfev = 0; - x = fval = a = fa = b = fb = aa = c = u = fu = NaN (nx, 1); + x = fval = fc = a = fa = b = fb = aa = c = u = fu = NaN (nx, 1); bracket_ready = false (nx, 1); eps = eps (class (x0)); @@ -189,8 +189,6 @@ not_ready = true (nx, 1); while (niter < maxiter && nfev < maxfev && any (not_ready)) - ## FIXME: Make vectorization of original switch exclusive - ## itype == 1 type1idx = not_ready & itype == 1; ## The initial test. @@ -199,6 +197,7 @@ info(idx) = 1; not_ready(idx) = false; type1idx &= not_ready; + exclidx = type1idx; ## Secant step. idx = type1idx & \ (tidx = abs (fa) <= 1e3*abs (fb) & abs (fb) <= 1e3*abs (fa)); @@ -210,7 +209,8 @@ itype(type1idx) = 5; ## itype == 2 or 3 - type23idx = not_ready & (itype == 2 | itype == 3); + type23idx = not_ready & ! exclidx & (itype == 2 | itype == 3); + exclidx |= type23idx; uidx = cellfun (@ (x) length (unique (x)), \ num2cell ([fa, fb, fd, fe], 2)) == 4; oidx = sign (c - a) .* sign (c - b) > 0; @@ -254,7 +254,8 @@ itype(type23idx) += 1; ## itype == 4 - type4idx = not_ready & itype == 4; + type4idx = not_ready & ! exclidx & itype == 4; + exclidx |= type4idx; ## Double secant step. idx = type4idx; c(idx) = u(idx) - 2*(b(idx) - a(idx))./(fb(idx) - fa(idx)).*fu(idx); @@ -264,7 +265,7 @@ itype(type4idx) = 5; ## itype == 5 - type5idx = not_ready & itype == 5; + type5idx = not_ready & ! exclidx & itype == 5; ## Bisection step. idx = type5idx; c(idx) = 0.5 * (b(idx) + a(idx)); @@ -278,12 +279,16 @@ c(nidx) = max (a(nidx) + delta(nidx), \ min (b(nidx) - delta(nidx), c(nidx))); - ## FIXME: apply not_ready - ## ## Calculate new point. - x = c; - fval = fc = fun (c)(:); - niter ++; nfev ++; + idx = not_ready; + x(idx, 1) = c(idx, 1); + if (any (idx)) + c(! idx) = u(! idx); # to have some working place-holders since + # fun() might expect full-length + # argument + fval(idx, 1) = fc(idx, 1) = fun (c)(:)(idx, 1); + niter ++; nfev ++; + endif ## Modification 2: skip inverse cubic interpolation if ## nonmonotonicity is detected. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |