annotate scripts/miscellaneous/memoize.m @ 31253:a40c0b7aa376

maint: changes to follow Octave coding conventions. * NEWS.8.md: Wrap lines to 72 chars. * LSODE-opts.in: Use two spaces after sentence ending period. * LSODE.cc: Use minimum of two spaces between code and start of comment. * MemoizedFunction.m: Change copyright date to 2022 since this is the year it was accepted into core. Don't wrap error() lines to 80 chars. Use newlines to improve readability of switch statements. Use minimum of two spaces between code and start of comment. * del2.m, integral.m, interp1.m, interp2.m, griddata.m, inpolygon.m, waitbar.m, cubehelix.m, ind2x.m, importdata.m, textread.m, logm.m, lighting.m, shading.m, xticklabels.m, yticklabels.m, zticklabels.m, colorbar.m, meshc.m, print.m, __gnuplot_draw_axes__.m, struct2hdl.m, ppval.m, ismember.m, iqr.m: Use a space between comment character '#' and start of comment. Use hyphen for adjectives describing dimensions such as "1-D". * vectorize.m, ode23s.m: Use is_function_handle() instead of "isa (x, "function_handle")" for clarity and performance. * clearAllMemoizedCaches.m: Change copyright date to 2022 since this is the year it was accepted into core. Remove input validation which is done by interpreter. Use two newlines between end of code and start of BIST tests. * memoize.m: Change copyright date to 2022 since this is the year it was accepted into core. Re-wrap documentation to 80 chars. Use is_function_handle() instead of "isa (x, "function_handle")" for clarity and performance. Use two newlines between end of code and start of BIST tests. Use semicolon for assert statements within %!test block. Re-write BIST tests for input validation. * __memoize__.m: Change copyright date to 2022 since this is the year it was accepted into core. Use spaces in for statements to improve readability. * unique.m: Add FIXME note to commented BIST test * dec2bin.m: Remove stray newline at end of file. * triplequad.m: Reduce doubly-commented BIST syntax using "#%!#" to "#%!". * delaunayn.m: Use input variable names in error() statements. Use minimum of two spaces between code and start of comment. Use hyphen for describing dimensions. Use two newlines between end of code and start of BIST tests. Update BIST tests to pass.
author Rik <rik@octave.org>
date Mon, 03 Oct 2022 18:06:55 -0700
parents 3dae836c598c
children 96f751f8392c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
31245
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
1 ########################################################################
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
2 ##
31253
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
3 ## Copyright (C) 2022 The Octave Project Developers
31245
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
4 ##
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
5 ## See the file COPYRIGHT.md in the top-level directory of this
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
6 ## distribution or <https://octave.org/copyright/>.
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
7 ##
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
8 ## This file is part of Octave.
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
9 ##
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
10 ## Octave is free software: you can redistribute it and/or modify it
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
11 ## under the terms of the GNU General Public License as published by
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
12 ## the Free Software Foundation, either version 3 of the License, or
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
13 ## (at your option) any later version.
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
14 ##
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
15 ## Octave is distributed in the hope that it will be useful, but
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
16 ## WITHOUT ANY WARRANTY; without even the implied warranty of
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
18 ## GNU General Public License for more details.
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
19 ##
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
20 ## You should have received a copy of the GNU General Public License
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
21 ## along with Octave; see the file COPYING. If not, see
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
22 ## <https://www.gnu.org/licenses/>.
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
23 ##
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
24 ########################################################################
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
25
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
26 ## -*- texinfo -*-
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
27 ## @deftypefn {} {@var{mem_fcn_handle} =} memoize (@var{fcn_handle})
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
28 ##
31253
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
29 ## Create a memoized version @var{mem_fcn_handle} of function @var{fcn_handle}.
31247
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
30 ##
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
31 ## Each call to the memoized version @var{mem_fcn_handle} checks the inputs
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
32 ## against an internally maintained table, and if the inputs have occurred
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
33 ## previously, then the result of the function call is returned from the table
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
34 ## itself instead of evaluating the full function again. This speeds up the
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
35 ## execution of functions that are called with the same inputs multiple times.
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
36 ##
31253
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
37 ## For example, here we take a slow user-written function named @code{slow_fcn}
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
38 ## and memoize it to a new handle @code{cyc}. The first executions of both
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
39 ## versions take the same time, but the subsequent executions of the memoized
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
40 ## version returns the previously computed value, thus reducing 2.4 seconds of
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
41 ## runtime to only 2.4 milliseconds. The final check verifies that the same
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
42 ## result was returned from both versions.
31247
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
43 ##
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
44 ## @example
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
45 ## @group
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
46 ## >> tic; @var{p} = slow_fcn (5040); toc
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
47 ## Elapsed time is 2.41244 seconds.
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
48 ## >> tic; @var{p} = slow_fcn (5040); toc
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
49 ## Elapsed time is 2.41542 seconds.
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
50 ##
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
51 ## >> cyc = memoize (@@slow_fcn);
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
52 ## >> tic; @var{r} = cyc (5040); toc
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
53 ## Elapsed time is 2.42609 seconds.
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
54 ## >> tic; @var{r} = cyc (5040); toc
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
55 ## Elapsed time is 0.00236511 seconds.
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
56 ##
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
57 ## >> all (@var{p} == @var{r})
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
58 ## ans = 1
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
59 ## @end group
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
60 ## @end example
3dae836c598c doc: Expand and edit documentation for memoization (bug #60860)
Arun Giridhar <arungiridhar@gmail.com>
parents: 31245
diff changeset
61 ##
31245
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
62 ## @seealso{clearAllMemoizedCaches}
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
63 ## @end deftypefn
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
64
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
65 function mem_fcn_handle = memoize (fcn_handle)
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
66
31253
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
67 if (nargin != 1)
31245
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
68 print_usage ();
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
69 endif
31253
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
70
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
71 if (! is_function_handle (fcn_handle))
31245
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
72 error ("memoize: FCN_HANDLE must be a function handle");
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
73 endif
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
74
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
75 mem_fcn_handle = __memoize__ (fcn_handle);
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
76
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
77 endfunction
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
78
31253
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
79
31245
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
80 %!test
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
81 %! fcn1 = memoize (@sin);
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
82 %! assert (isa (fcn1, "matlab.lang.MemoizedFunction"));
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
83 %! fcn1 (pi);
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
84 %! fcn2 = memoize (@sin);
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
85 %! fcn2 (2*pi);
31253
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
86 %! assert (isequal (fcn1, fcn2));
31245
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
87
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
88 %!test
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
89 %! fcn = memoize (@rand);
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
90 %! a = fcn ();
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
91 %! b = fcn ();
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
92 %! assert (a, b);
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
93 %! fcn2 = memoize (@rand);
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
94 %! c = fcn2 ();
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
95 %! assert (a, c);
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
96
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
97 %!test
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
98 %! fcn = memoize (@plus);
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
99 %! fcn.stats;
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
100 %! stats (fcn);
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
101 %! clearCache (fcn);
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
102 %! fcn.clearCache;
a887ffb997a7 New function memoize to optimize repetitive function calls (bug #60860).
Guillaume Flandin <guillaume.offline@gmail.com>
parents:
diff changeset
103
31253
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
104 ## Test input validation
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
105 %!error <Invalid call> memoize ();
a40c0b7aa376 maint: changes to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 31247
diff changeset
106 %!error <FCN_HANDLE must be a function handle> memoize (1);