Mercurial > hg > octave-terminal
changeset 4776:adf8d68d7143 ss-2-1-54
[project @ 2004-02-16 20:32:20 by jwe]
author | jwe |
---|---|
date | Mon, 16 Feb 2004 20:32:20 +0000 |
parents | 88b638195bd1 |
children | 279c255672ee |
files | src/ChangeLog src/DLD-FUNCTIONS/fft_wisdom.cc src/DLD-FUNCTIONS/fftw_wisdom.cc src/Makefile.in src/defaults.cc src/defaults.h.in |
diffstat | 6 files changed, 235 insertions(+), 218 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -3,6 +3,26 @@ * version.h (OCTAVE_VERSION): Now 2.1.54. (OCTAVE_API_VERSION): Now api-v5. + * Makefile.in (DLD_XSRC): Always include fftw_wisdom.cc. + + * DLD-FUNCTIONS/fftw_wisdom.cc: + Rename from DLD-FUNCTIONS/fft_wisdom.cc. + (Vfftw_wisdom_prog): Delete extern decl. + (Ffftw_wisdom): Rename from Ffft_wisdom. + Use Vfftw_wisdom_prog instead of Vwisdom_prog. + Always define function. Signal error if not configured to use FFTW3. + + * defaults.cc (symbols_of_defaults): Rename WISDOM_PROGRAM to be + FFTW_WISDOM_PROGRAM. + (Vfftw_wisdom_prog): Rename from Vwisdom_prog. + (fftw_wisdom_program): Rename from wisdom_program. + For simplicity, always define FFTW_WISDOM_PROGRAM even when not + using fftw3. + (set_default_wisdom_prog): Look for OCTAVE_FFTW_WISDOM_PROGRAM in + the environment instead of OCTAVE_WISDOM_PROGRAM. + (set_default_fftw_wisdom_prog): Rename from set_default_wisdom_prog. + * defaults.h.in (Vfftw_wisdom_prog): Provide extern decl. + 2004-02-16 David Bateman <dbateman@free.fr> * DLD-FUNCTIONS/fft.cc: Adapt for Nd arrays, combine with ifft.cc.
deleted file mode 100644 --- a/src/DLD-FUNCTIONS/fft_wisdom.cc +++ /dev/null @@ -1,190 +0,0 @@ -/* - -Copyright (C) 2004 David Bateman - -This file is part of Octave. - -Octave 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, or (at your option) any -later version. - -Octave 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 Octave; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <fftw3.h> - -#include "file-ops.h" -#include "lo-sstream.h" -#include "oct-env.h" -#include "defaults.h" -#include "lo-mappers.h" -#include "defun-dld.h" -#include "error.h" -#include "gripes.h" -#include "oct-obj.h" -#include "utils.h" -#include "sighandlers.h" - -// Name of the FFTW wisdom program we'd like to use. -extern std::string Vwisdom_prog; - -DEFUN_DLD (fft_wisdom, args, , - "-*- texinfo -*-\n\ -@deftypefn {Loadable Function} {} fft_wisdom (@var{file}, @var{ow})\n\ -@deftypefnx {Loadable Function} {} fft_wisdom (@var{n})\n\ -\n\ -This function is used to manipulate the FFTW wisdom data. It can\n\ -be used to load previously stored wisdom from a file, create wisdom\n\ -needed by Octave and to save the current wisdom to a file. Wisdom\n\ -data can be used to significantly accelerate the calculation of the FFTs,\n\ -but is only profitable if the same FFT is called many times due to the\n\ -overhead in calculating the wisdom data.\n\ -\n\ -Called with a single string argument, @code{fft_wisdom (@var{file})}\n\ -will load the wisdom data found in @var{file}. If @var{file} does\n\ -not exist, then the current wisdom used by FFTW is saved to this\n\ -file. If the flag @var{ow} is non-zero, then even if @var{file}\n\ -exists, it will be overwritten.\n\ -\n\ -It is assumed that each row of @var{n} represents the size of a FFT for\n\ -which it is desired to pre-calculate the wisdom needed to accelerate it.\n\ -Any value of the matrix that is less than 1, is assumed to indicate an\n\ -absent dimension. That is\n\ -\n\ -@example\n\ -fftw_wisdom ([102, 0, 0; 103, 103, 0; 102, 103, 105]);\n\ -a = fft (rand (1,102));\n\ -b = fft (rand (103,103));\n\ -c = fftn (rand ([102, 103, 105]));\n\ -@end example\n\ -\n\ -calculates the wisdom necessary to accelerate the 103, 102x102 and\n\ -the 102x103x105 FFTs. Note that calculated wisdom will be lost when\n\ -when restarting Octave. However, if it is saved as discussed above, it\n\ -can be reloaded. Also, any system-wide wisdom file that has been found\n\ -will also be used. Saved wisdom files should not be used on different\n\ -platforms since they will not be efficient and the point of calculating\n\ -the wisdom is lost.\n\ -\n\ -Note that the program @code{fftw-wisdom} supplied with FFTW can equally\n\ -be used to create a file containing wisdom that can be imported into\n\ -Octave.\n\ -@end deftypefn\n\ -@seealso {fft, ifft, fft2, ifft2, fftn, ifftn}") -{ - octave_value retval; - int nargin = args.length(); - - if (nargin < 1 || nargin > 2) - { - print_usage ("fft_wisdom"); - return retval; - } - - if (args(0).is_string ()) - { - bool overwrite = false; - - if (nargin != 1) - { - double dval = args (1).double_value (); - if (NINT (dval) != 0) - overwrite = true; - } - - std::string wisdom = octave_env::make_absolute - (Vload_path_dir_path.find_first_of (args(0).string_value ().c_str ()), - octave_env::getcwd ()); - - if (wisdom.empty () || overwrite) - { - FILE *ofile = fopen (wisdom.c_str (), "wb"); - fftw_export_wisdom_to_file (ofile); - fclose (ofile); - } - else - { - FILE *ifile = fopen (wisdom.c_str (), "r"); - if (! fftw_import_wisdom_from_file (ifile)) - error ("fft_wisdom: can not import wisdom from file"); - fclose (ifile); - } - - } - else - { - Matrix m = args (0).matrix_value (); - - if (error_state) - { - error ("fft_wisdom: argument must be a matrix or a string"); - return retval; - } - - std::string name = file_ops::tempnam ("", "oct-"); - - if (name.empty ()) - { - error ("fft_wisdom: can not open temporary file"); - return retval; - } - - OSSTREAM cmd_buf; - cmd_buf << Vwisdom_prog << " -n -o \"" << name << "\""; - - for (int k = 0; k < m.rows (); k++) - { - bool first = true; - - cmd_buf << " "; - - // Note reversal of dimensions for column major storage in FFTW - for (int j = m.columns()-1; j >= 0; j--) - if (NINT(m(k,j)) > 0) - { - if (first) - first = false; - else - cmd_buf << "x"; - cmd_buf << NINT(m(k,j)) ; - } - } - - cmd_buf << OSSTREAM_ENDS; - - volatile octave_interrupt_handler old_interrupt_handler - = octave_ignore_interrupts (); - - int status = system (OSSTREAM_C_STR (cmd_buf)); - - OSSTREAM_FREEZE (cmd_buf); - - octave_set_interrupt_handler (old_interrupt_handler); - - if (WIFEXITED (status)) - { - FILE *ifile = fopen (name.c_str (), "r"); - if (! fftw_import_wisdom_from_file (ifile)) - error ("fft_wisdom: can not import wisdom from temporary file"); - fclose (ifile); - } - else - error ("fft_wisdom: error running %s", Vwisdom_prog.c_str ()); - - } - - return retval; -}
new file mode 100644 --- /dev/null +++ b/src/DLD-FUNCTIONS/fftw_wisdom.cc @@ -0,0 +1,198 @@ +/* + +Copyright (C) 2004 David Bateman + +This file is part of Octave. + +Octave 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, or (at your option) any +later version. + +Octave 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 Octave; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#if defined (HAVE_FFTW3) +#include <fftw3.h> +#endif + +#include "defaults.h" +#include "defun-dld.h" +#include "error.h" +#include "file-ops.h" +#include "gripes.h" +#include "lo-mappers.h" +#include "lo-sstream.h" +#include "oct-env.h" +#include "oct-obj.h" +#include "sighandlers.h" +#include "utils.h" + +DEFUN_DLD (fftw_wisdom, args, , + "-*- texinfo -*-\n\ +@deftypefn {Loadable Function} {} fftw_wisdom (@var{file}, @var{ow})\n\ +@deftypefnx {Loadable Function} {} fftw_wisdom (@var{n})\n\ +\n\ +This function is used to manipulate the FFTW wisdom data. It can\n\ +be used to load previously stored wisdom from a file, create wisdom\n\ +needed by Octave and to save the current wisdom to a file. Wisdom\n\ +data can be used to significantly accelerate the calculation of the FFTs,\n\ +but is only profitable if the same FFT is called many times due to the\n\ +overhead in calculating the wisdom data.\n\ +\n\ +Called with a single string argument, @code{fftw_wisdom (@var{file})}\n\ +will load the wisdom data found in @var{file}. If @var{file} does\n\ +not exist, then the current wisdom used by FFTW is saved to this\n\ +file. If the flag @var{ow} is non-zero, then even if @var{file}\n\ +exists, it will be overwritten.\n\ +\n\ +It is assumed that each row of @var{n} represents the size of a FFT for\n\ +which it is desired to pre-calculate the wisdom needed to accelerate it.\n\ +Any value of the matrix that is less than 1, is assumed to indicate an\n\ +absent dimension. That is\n\ +\n\ +@example\n\ +fftw_wisdom ([102, 0, 0; 103, 103, 0; 102, 103, 105]);\n\ +a = fft (rand (1,102));\n\ +b = fft (rand (103,103));\n\ +c = fftn (rand ([102, 103, 105]));\n\ +@end example\n\ +\n\ +calculates the wisdom necessary to accelerate the 103, 102x102 and\n\ +the 102x103x105 FFTs. Note that calculated wisdom will be lost when\n\ +when restarting Octave. However, if it is saved as discussed above, it\n\ +can be reloaded. Also, any system-wide wisdom file that has been found\n\ +will also be used. Saved wisdom files should not be used on different\n\ +platforms since they will not be efficient and the point of calculating\n\ +the wisdom is lost.\n\ +\n\ +Note that the program @code{fftw-wisdom} supplied with FFTW can equally\n\ +be used to create a file containing wisdom that can be imported into\n\ +Octave.\n\ +@end deftypefn\n\ +@seealso {fft, ifft, fft2, ifft2, fftn, ifftn}") +{ + octave_value retval; + +#if defined (HAVE_FFTW3) + + int nargin = args.length(); + + if (nargin < 1 || nargin > 2) + { + print_usage ("fftw_wisdom"); + return retval; + } + + if (args(0).is_string ()) + { + bool overwrite = false; + + if (nargin != 1) + { + double dval = args (1).double_value (); + if (NINT (dval) != 0) + overwrite = true; + } + + std::string wisdom = octave_env::make_absolute + (Vload_path_dir_path.find_first_of (args(0).string_value ().c_str ()), + octave_env::getcwd ()); + + if (wisdom.empty () || overwrite) + { + FILE *ofile = fopen (wisdom.c_str (), "wb"); + fftw_export_wisdom_to_file (ofile); + fclose (ofile); + } + else + { + FILE *ifile = fopen (wisdom.c_str (), "r"); + if (! fftw_import_wisdom_from_file (ifile)) + error ("fftw_wisdom: can not import wisdom from file"); + fclose (ifile); + } + + } + else + { + Matrix m = args (0).matrix_value (); + + if (error_state) + { + error ("fftw_wisdom: argument must be a matrix or a string"); + return retval; + } + + std::string name = file_ops::tempnam ("", "oct-"); + + if (name.empty ()) + { + error ("fftw_wisdom: can not open temporary file"); + return retval; + } + + OSSTREAM cmd_buf; + cmd_buf << Vfftw_wisdom_prog << " -n -o \"" << name << "\""; + + for (int k = 0; k < m.rows (); k++) + { + bool first = true; + + cmd_buf << " "; + + // Note reversal of dimensions for column major storage in FFTW + for (int j = m.columns()-1; j >= 0; j--) + if (NINT(m(k,j)) > 0) + { + if (first) + first = false; + else + cmd_buf << "x"; + cmd_buf << NINT(m(k,j)) ; + } + } + + cmd_buf << OSSTREAM_ENDS; + + volatile octave_interrupt_handler old_interrupt_handler + = octave_ignore_interrupts (); + + int status = system (OSSTREAM_C_STR (cmd_buf)); + + OSSTREAM_FREEZE (cmd_buf); + + octave_set_interrupt_handler (old_interrupt_handler); + + if (WIFEXITED (status)) + { + FILE *ifile = fopen (name.c_str (), "r"); + if (! fftw_import_wisdom_from_file (ifile)) + error ("fftw_wisdom: can not import wisdom from temporary file"); + fclose (ifile); + } + else + error ("fftw_wisdom: error running %s", Vfftw_wisdom_prog.c_str ()); + + } + +#else + + error ("fftw_wisdom: this copy of Octave was not configured to use FFTW3"); + +#endif + + return retval; +}
--- a/src/Makefile.in +++ b/src/Makefile.in @@ -43,13 +43,9 @@ OPT_HANDLERS := DASPK-opts.cc DASRT-opts.cc DASSL-opts.cc \ LSODE-opts.cc NLEqn-opts.cc ODESSA-opts.cc Quad-opts.cc -ifneq ($(FFTW_LIBS), ) - DLD_WISDOM := fft_wisdom.cc -endif - DLD_XSRC := balance.cc besselj.cc betainc.cc chol.cc colloc.cc \ daspk.cc dasrt.cc dassl.cc det.cc eig.cc expm.cc fft.cc fft2.cc \ - fftn.cc $(DLD_WISDOM) filter.cc find.cc fsolve.cc gammainc.cc \ + fftn.cc fftw_wisdom.cc filter.cc find.cc fsolve.cc gammainc.cc \ getgrent.cc getpwent.cc getrusage.cc givens.cc hess.cc \ inv.cc kron.cc lpsolve.cc lsode.cc lu.cc minmax.cc \ odessa.cc pinv.cc qr.cc quad.cc qz.cc rand.cc schur.cc \
--- a/src/defaults.cc +++ b/src/defaults.cc @@ -92,10 +92,8 @@ std::string Vlocal_site_defaults_file; std::string Vsite_defaults_file; -#ifdef HAVE_FFTW3 -// Name of the FFTW wisdom program -std::string Vwisdom_prog; -#endif +// Name of the FFTW wisdom program. +std::string Vfftw_wisdom_prog; // Each element of A and B should be directory names. For each // element of A not in the list B, execute SCRIPT_FILE in that @@ -315,18 +313,16 @@ Vinfo_prog = std::string (oct_info_prog); } -#ifdef HAVE_FFTW3 static void -set_default_wisdom_prog (void) +set_default_fftw_wisdom_prog (void) { - std::string oct_wisdom_prog = octave_env::getenv ("OCTAVE_WISDOM_PROGRAM"); + std::string oct_wisdom_prog = octave_env::getenv ("OCTAVE_FFTW_WISDOM_PROGRAM"); if (oct_wisdom_prog.empty ()) - Vwisdom_prog = "fftw-wisdom"; + Vfftw_wisdom_prog = "fftw-wisdom"; else - Vwisdom_prog = std::string (oct_wisdom_prog); + Vfftw_wisdom_prog = std::string (oct_wisdom_prog); } -#endif static void set_default_editor (void) @@ -418,9 +414,7 @@ set_default_info_prog (); -#ifdef HAVE_FFTW3 - set_default_wisdom_prog (); -#endif + set_default_fftw_wisdom_prog (); set_default_editor (); @@ -506,25 +500,23 @@ return status; } -#ifdef HAVE_FFTW3 static int -wisdom_prog (void) +fftw_wisdom_prog (void) { int status = 0; - std::string s = builtin_string_variable ("WISDOM_PROGRAM"); + std::string s = builtin_string_variable ("FFTW_WISDOM_PROGRAM"); if (s.empty ()) { - gripe_invalid_value_specified ("WISDOM_PROGRAM"); + gripe_invalid_value_specified ("FFTW_WISDOM_PROGRAM"); status = -1; } else - Vwisdom_prog = s; + Vfftw_wisdom_prog = s; return status; } -#endif static int default_exec_path (void) @@ -629,17 +621,15 @@ @code{\"emacs\"}.\n\ @end defvr"); -#ifdef HAVE_FFTW3 - DEFVAR (WISDOM_PROGRAM, Vwisdom_prog, wisdom_prog, + DEFVAR (FFTW_WISDOM_PROGRAM, Vfftw_wisdom_prog, fftw_wisdom_prog, "-*- texinfo -*-\n\ -@defvr {Built-in Variable} WISDOM_PROGRAM\n\ +@defvr {Built-in Variable} FFTW_WISDOM_PROGRAM\n\ A string naming the FFTW wisdom program to use to create wisdom data\n\ to accelerate Fourier transforms. If the environment variable\n\ @code{OCTAVE_WISDOM_PROGRAM} is set when Octave starts, its value is used\n\ as the default. Otherwise, @code{WISDOM_PROGRAM} is set to\n\ @code{\"fftw-wisdom\"}.\n\ @end defvr"); -#endif DEFVAR (EXEC_PATH, Vexec_path, exec_path, "-*- texinfo -*-\n\
--- a/src/defaults.h.in +++ b/src/defaults.h.in @@ -194,6 +194,9 @@ extern std::string Vlocal_site_defaults_file; extern std::string Vsite_defaults_file; +// Name of the FFTW wisdom program. +extern std::string Vfftw_wisdom_prog; + extern void execute_default_pkg_add_files (void); extern std::string maybe_add_default_load_path (const std::string& pathstring);