From: <ha...@us...> - 2010-02-26 06:47:24
|
Revision: 6962 http://octave.svn.sourceforge.net/octave/?rev=6962&view=rev Author: hauberg Date: 2010-02-26 06:47:18 +0000 (Fri, 26 Feb 2010) Log Message: ----------- Move 'cg_min' example scripts into demo blocks Modified Paths: -------------- trunk/octave-forge/main/optim/inst/cg_min.m Removed Paths: ------------- trunk/octave-forge/main/optim/inst/cg_min_example_1.m trunk/octave-forge/main/optim/inst/cg_min_example_2.m trunk/octave-forge/main/optim/inst/cg_min_example_3.m Modified: trunk/octave-forge/main/optim/inst/cg_min.m =================================================================== --- trunk/octave-forge/main/optim/inst/cg_min.m 2010-02-26 05:13:52 UTC (rev 6961) +++ trunk/octave-forge/main/optim/inst/cg_min.m 2010-02-26 06:47:18 UTC (rev 6962) @@ -200,3 +200,94 @@ endfunction +%!demo +%! P = 15; # Number of parameters +%! R = 20; # Number of observations (must have R >= P) +%! +%! obsmat = randn (R, P); +%! truep = randn (P, 1); +%! xinit = randn (P, 1); +%! obses = obsmat * truep; +%! +%! msq = @(x) mean (x (!isnan(x)).^2); +%! ff = @(x) msq (obses - obsmat * x{1}) + 1; +%! dff = @(x) 2 / rows (obses) * obsmat.' * (-obses + obsmat * x{1}); +%! +%! tic; +%! [xlev,vlev,nlev] = cg_min (ff, dff, xinit) ; +%! toc; +%! +%! printf (" Costs : init=%8.3g, final=%8.3g, best=%8.3g\n", ... +%! ff ({xinit}), vlev, ff ({truep})); +%! +%! if (max (abs (xlev-truep)) > 100*sqrt (eps)) +%! printf ("Error is too big : %8.3g\n", max (abs (xlev-truep))); +%! else +%! printf ("All tests ok\n"); +%! endif + +%!demo +%! N = 1 + floor (30 * rand ()); +%! truemin = randn (N, 1); +%! offset = 100 * randn (); +%! metric = randn (2 * N, N); +%! metric = metric.' * metric; +%! +%! if (N > 1) +%! [u,d,v] = svd (metric); +%! d = (0.1+[0:(1/(N-1)):1]).^2; +%! metric = u * diag (d) * u.'; +%! endif +%! +%! testfunc = @(x) sum((x{1}-truemin)'*metric*(x{1}-truemin)) + offset; +%! dtestf = @(x) metric' * 2*(x{1}-truemin); +%! +%! xinit = 10 * randn (N, 1); +%! +%! [x, v, niter] = cg_min (testfunc, dtestf, xinit); +%! +%! if (any (abs (x-truemin) > 100 * sqrt(eps))) +%! printf ("NOT OK 1\n"); +%! else +%! printf ("OK 1\n"); +%! endif +%! +%! if (v-offset > 1e-8) +%! printf ("NOT OK 2\n"); +%! else +%! printf ("OK 2\n"); +%! endif +%! +%! printf ("nev=%d N=%d errx=%8.3g errv=%8.3g\n",... +%! niter (1), N, max (abs (x-truemin)), v-offset); + +%!demo +%! P = 2; # Number of parameters +%! R = 3; # Number of observations +%! +%! obsmat = randn (R, P); +%! truep = randn (P, 1); +%! xinit = randn (P, 1); +%! +%! obses = obsmat * truep; +%! +%! msq = @(x) mean (x (!isnan(x)).^2); +%! ff = @(xx) msq (xx{3} - xx{2} * xx{1}) + 1; +%! dff = @(xx) 2 / rows(xx{3}) * xx{2}.' * (-xx{3} + xx{2}*xx{1}); +%! +%! tic; +%! x = {xinit, obsmat, obses}; +%! [xlev, vlev, nlev] = cg_min (ff, dff, x); +%! toc; +%! +%! xinit_ = {xinit, obsmat, obses}; +%! xtrue_ = {truep, obsmat, obses}; +%! printf (" Costs : init=%8.3g, final=%8.3g, best=%8.3g\n", ... +%! ff (xinit_), vlev, ff (xtrue_)); +%! +%! if (max (abs(xlev-truep)) > 100*sqrt (eps)) +%! printf ("Error is too big : %8.3g\n", max (abs (xlev-truep))); +%! else +%! printf ("All tests ok\n"); +%! endif + Deleted: trunk/octave-forge/main/optim/inst/cg_min_example_1.m =================================================================== --- trunk/octave-forge/main/optim/inst/cg_min_example_1.m 2010-02-26 05:13:52 UTC (rev 6961) +++ trunk/octave-forge/main/optim/inst/cg_min_example_1.m 2010-02-26 06:47:18 UTC (rev 6962) @@ -1,84 +0,0 @@ -## -## ok = test_conjgrad_min - Test that conjgrad_min works -## -## Defines some simple functions and verifies that calling -## -## conjgrad_min on them returns the correct minimum. -## -## Sets 'ok' to 1 if success, 0 otherwise - -## The name of the optimizing function - - -optim_func = "cg_min"; - -ok = 1; - -if ! exist ("verbose"), verbose = 0; end - -if 0, - P = 10+floor(30*rand(1)) ; # Nparams - R = P+floor(30*rand(1)) ; # Nobses -else - P = 15; - R = 20; # must have R >= P -end - -noise = 0 ; -global obsmat ; -obsmat = randn(R,P) ; -global truep ; -truep = randn(P,1) ; -xinit = randn(P,1) ; - -global obses ; -obses = obsmat*truep ; -if noise, obses = adnois(obses,noise); end - -function s = msq(x) - try - s = mean(x(find(!isnan(x))).^2); - catch - s = nan; - end -endfunction - -function v = ff(x) - global obsmat; - global obses; - v = msq( obses - obsmat*x{1} ) + 1 ; -endfunction - - -function dv = dff(x) - global obsmat; - global obses; - er = -obses + obsmat*x{1} ; - dv = 2*er'*obsmat / rows(obses) ; - dv = dv'; - ## dv = 2*er'*obsmat ; -endfunction - -printf("gonna test : %s\n",optim_func); -if verbose, - printf ("Nparams = P = %i, Nobses = R = %i\n",P,R); -end - - -tic; -[xlev,vlev,nlev] = feval(optim_func, "ff", "dff", xinit) ; -toc; - - -if max (abs(xlev-truep)) > 100*sqrt (eps), - if verbose, - printf ("Error is too big : %8.3g\n", max (abs (xlev-truep))); - end - ok = 0; -end -if verbose, - printf (" Costs : init=%8.3g, final=%8.3g, best=%8.3g\n",\ - ff(xinit), vlev, ff(truep)); -end -if (ok) printf("All tests ok\n"); endif - Deleted: trunk/octave-forge/main/optim/inst/cg_min_example_2.m =================================================================== --- trunk/octave-forge/main/optim/inst/cg_min_example_2.m 2010-02-26 05:13:52 UTC (rev 6961) +++ trunk/octave-forge/main/optim/inst/cg_min_example_2.m 2010-02-26 06:47:18 UTC (rev 6962) @@ -1,57 +0,0 @@ - - -## -## Test conjgrad_min -optim_func = "cg_min"; -printf("gonna test : %s\n",optim_func); - - -N = 1+floor(30*rand(1)) ; -global truemin ; -truemin = randn(N,1) ; -global offset ; -offset = 100*randn(1) ; -global metric ; -metric = randn(2*N,N) ; -metric = metric'*metric ; - -if N>1, - [u,d,v] = svd(metric); - d = (0.1+[0:(1/(N-1)):1]).^2 ; - metric = u*diag(d)*u' ; -end - -function v = testfunc(x) - global offset ; - global truemin ; - global metric ; - v = sum((x{1}-truemin)'*metric*(x{1}-truemin)) + offset ; -end - -function df = dtestf(x) - global truemin ; - global metric ; - df = metric' * 2*(x{1}-truemin); -end - -xinit = 10*randn(N,1); - -[x,v,niter] = feval(optim_func, "testfunc","dtestf", xinit) ; -## [x,v,niter] = conjgrad_min("testfunc","dtestf",xinit) ; -printf("test_conjgrad_min\n"); - -if any(abs( x-truemin ) > 100*sqrt(eps) ) , - printf("NOT OK 1\n"); -else - printf("OK 1\n"); -end - -if v-offset > 1e-8 , - printf("NOT OK 2\n"); -else - printf("OK 2\n"); -end - -printf("nev=%d N=%d errx=%8.3g errv=%8.3g\n",... - niter(1),N,max(abs( x-truemin )),v-offset); - Deleted: trunk/octave-forge/main/optim/inst/cg_min_example_3.m =================================================================== --- trunk/octave-forge/main/optim/inst/cg_min_example_3.m 2010-02-26 05:13:52 UTC (rev 6961) +++ trunk/octave-forge/main/optim/inst/cg_min_example_3.m 2010-02-26 06:47:18 UTC (rev 6962) @@ -1,110 +0,0 @@ - -## ok = test_conjgrad_min - Test that conjgrad_min works with extra -## arguments -## -## Defines some simple functions and verifies that calling -## -## conjgrad_min on them returns the correct minimum. -## -## Sets 'ok' to 1 if success, 0 otherwise - -## The name of the optimizing function -optim_func = "cg_min"; - -ok = 1; -verbose = true; - -if ! exist ("verbose"), verbose = 0; end - -if 0, - P = 10+floor(30*rand(1)) ; # Nparams - R = P+floor(30*rand(1)) ; # Nobses -else - P = 2; - R = 3; -end - -noise = 0 ; -obsmat = randn(R,P) ; - -truep = randn(P,1) ; -xinit = randn(P,1) ; - -global obses ; -obses = obsmat*truep ; - -function [v,stddev] = addnoise(u,db) - - if ! isfinite (db), v = u; stddev = 0; return; end - - if prod(size(u)) == 0, - error("adnois called with void signal"); - end - n = randn(size(u)); - - dbn = 1; - - ## dbu = cov(u(:)); - dbu = msq( u(:) ) - mean( u(find(!isnan(u(:)))) )^2 ; - - stddev = 10^(-db/20)*sqrt(dbu) ; - - v = u+n*stddev; - % noislev(u,v) -endfunction - -if noise, obses = addnoise(obses,noise); end - -extra = list (obsmat, obses); - -function v = ff( xx ) - x = xx{1}; - obsmat = xx{2}; - obses = xx{3}; - v = msq( obses - obsmat*x ) + 1 ; -endfunction - - -function dv = dff( xx ) - x = xx{1}; - obsmat = xx{2}; - obses = xx{3}; - er = -obses + obsmat*x ; - dv = 2*er'*obsmat / rows(obses) ; - dv = dv'; - ## dv = 2*er'*obsmat ; -endfunction - - -printf( "gonna test : %s\n",optim_func); -if verbose, - printf ("Nparams = P = %i, Nobses = R = %i\n",P,R); -end - - -tic; -## [xlev,vlev,nlev] = feval (optim_func, "ff", "dff", xinit, "extra", extra) ; -x = {xinit, obsmat, obses}; -[xlev,vlev,nlev] = feval \ - (optim_func, "ff", "dff", x); -toc; - - -if max (abs(xlev-truep)) > 100*sqrt (eps), - if verbose, - printf ("Error is too big : %8.3g\n", max (abs (xlev-truep))); - end - ok = 0; -end - -if verbose, - xinit_ = {xinit,obsmat,obses}; - xtrue_ = {truep,obsmat,obses}; - printf (" Costs : init=%8.3g, final=%8.3g, best=%8.3g\n",\ - ff(xinit_), vlev, ff(xtrue_)); -end - -if (ok) - printf("All tests ok\n"); -endif - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |