Mercurial > octave
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 |
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); |