Mercurial > octave
diff libinterp/corefcn/daspk.cc @ 26864:041caa61ed34
use get_function_handle instead of extract_function
* cellfun.cc (Fcellfun, Farrayfun): Use get_function_handle instead of
extract_function.
* daspk.cc (daspk_fcn, daspk_jac): Now octave_value objects instead
of a pointers to octave_function objects. Change all uses.
(Fdaspk): Use get_function_handle instead of extract_function.
* dasrt.cc (dasrt_fcn, dasrt_jac, dasrt_cf): Now octave_value objects
instead of a pointers to octave_function objects. Change all uses.
(Fdasrt): Use get_function_handle instead of extract_function.
* dassl.cc (dassl_fcn, dassl_jac): Now octave_value objects instead
of a pointers to octave_function objects. Change all uses.
(Fdassl): Use get_function_handle instead of extract_function.
* lsode.cc (lsode_fcn, lsode_jac): Now octave_value objects instead
of a pointers to octave_function objects. Change all uses.
(Flsode): Use get_function_handle instead of extract_function.
* quad.cc (quad_fcn): Now an octave_value object instead of a pointer
to an octave_function object. Change all uses.
(Fquad): Use get_function_handle instead of extract_function.
New tests.
* quadcc.cc (fcn): Now an octave_value object instead of a pointer
to an octave_function object. Change all uses.
(Fquadcc): Use get_function_handle instead of extract_function.
* __eigs__.cc (eigs_fcn): Now an octave_value object instead of a pointer
to an octave_function object. Change all uses.
(F__eigs__): Use get_function_handle instead of extract_function.
New tests.
* interpreter-private.cc (get_function_handle): Don't scold users for
poor choices.
* variables.h (extract_function): Tag as deprecated.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 08 Mar 2019 06:24:34 +0000 |
parents | 00f796120a6d |
children | b442ec6dda5c |
line wrap: on
line diff
--- a/libinterp/corefcn/daspk.cc Fri Mar 08 02:49:52 2019 +0000 +++ b/libinterp/corefcn/daspk.cc Fri Mar 08 06:24:34 2019 +0000 @@ -24,6 +24,7 @@ # include "config.h" #endif +#include <list> #include <string> #include "DASPK.h" @@ -31,6 +32,7 @@ #include "defun.h" #include "error.h" #include "errwarn.h" +#include "interpreter-private.h" #include "ovl.h" #include "ov-fcn.h" #include "ov-cell.h" @@ -43,10 +45,10 @@ #include "DASPK-opts.cc" // Global pointer for user defined function required by daspk. -static octave_function *daspk_fcn; +static octave_value daspk_fcn; // Global pointer for optional user defined jacobian function. -static octave_function *daspk_jac; +static octave_value daspk_jac; // Have we warned about imaginary values returned from user function? static bool warned_fcn_imaginary = false; @@ -69,7 +71,7 @@ args(1) = xdot; args(0) = x; - if (daspk_fcn) + if (daspk_fcn.is_defined ()) { octave_value_list tmp; @@ -119,7 +121,7 @@ args(1) = xdot; args(0) = x; - if (daspk_jac) + if (daspk_jac.is_defined ()) { octave_value_list tmp; @@ -269,17 +271,19 @@ frame.protect_var (call_depth); call_depth++; - octave::symbol_table& symtab = interp.get_symbol_table (); - if (call_depth > 1) error ("daspk: invalid recursive call"); std::string fcn_name, fname, jac_name, jname; - daspk_fcn = nullptr; - daspk_jac = nullptr; + + daspk_fcn = octave_value (); + daspk_jac = octave_value (); octave_value f_arg = args(0); + std::list<std::string> fcn_param_names ({"x", "xdot", "t"}); + std::list<std::string> jac_param_names ({"x", "xdot", "t", "cj"}); + if (f_arg.iscell ()) { Cell c = f_arg.cell_value (); @@ -287,99 +291,61 @@ f_arg = c(0); else if (c.numel () == 2) { - if (c(0).is_function_handle () || c(0).is_inline_function ()) - daspk_fcn = c(0).function_value (); - else - { - fcn_name = unique_symbol_name ("__daspk_fcn__"); - fname = "function y = "; - fname.append (fcn_name); - fname.append (" (x, xdot, t) y = "); - daspk_fcn = extract_function (c(0), "daspk", fcn_name, - fname, "; endfunction"); - } + daspk_fcn = octave::get_function_handle (interp, c(0), + fcn_param_names); - if (daspk_fcn) + if (daspk_fcn.is_defined ()) { - if (c(1).is_function_handle () || c(1).is_inline_function ()) - daspk_jac = c(1).function_value (); - else - { - jac_name = unique_symbol_name ("__daspk_jac__"); - jname = "function jac = "; - jname.append (jac_name); - jname.append (" (x, xdot, t, cj) jac = "); - daspk_jac = extract_function (c(1), "daspk", jac_name, - jname, "; endfunction"); + daspk_jac = octave::get_function_handle (interp, c(1), + jac_param_names); - if (! daspk_jac) - { - if (fcn_name.length ()) - symtab.clear_function (fcn_name); - daspk_fcn = nullptr; - } - } + if (daspk_jac.is_undefined ()) + daspk_fcn = octave_value (); } } else error ("daspk: incorrect number of elements in cell array"); } - if (! daspk_fcn && ! f_arg.iscell ()) + if (daspk_fcn.is_undefined () && ! f_arg.iscell ()) { if (f_arg.is_function_handle () || f_arg.is_inline_function ()) - daspk_fcn = f_arg.function_value (); + daspk_fcn = f_arg; else { switch (f_arg.rows ()) { case 1: - do - { - fcn_name = unique_symbol_name ("__daspk_fcn__"); - fname = "function y = "; - fname.append (fcn_name); - fname.append (" (x, xdot, t) y = "); - daspk_fcn = extract_function (f_arg, "daspk", fcn_name, - fname, "; endfunction"); - } - while (0); + daspk_fcn = octave::get_function_handle (interp, f_arg, + fcn_param_names); break; case 2: { string_vector tmp = f_arg.string_vector_value (); - fcn_name = unique_symbol_name ("__daspk_fcn__"); - fname = "function y = "; - fname.append (fcn_name); - fname.append (" (x, xdot, t) y = "); - daspk_fcn = extract_function (tmp(0), "daspk", fcn_name, - fname, "; endfunction"); + daspk_fcn = octave::get_function_handle (interp, tmp(0), + fcn_param_names); - if (daspk_fcn) + if (daspk_fcn.is_defined ()) { - jac_name = unique_symbol_name ("__daspk_jac__"); - jname = "function jac = "; - jname.append (jac_name); - jname.append (" (x, xdot, t, cj) jac = "); - daspk_jac = extract_function (tmp(1), "daspk", jac_name, - jname, "; endfunction"); + daspk_jac = octave::get_function_handle (interp, tmp(1), + jac_param_names); - if (! daspk_jac) - { - if (fcn_name.length ()) - symtab.clear_function (fcn_name); - daspk_fcn = nullptr; - } + if (daspk_jac.is_undefined ()) + daspk_fcn = octave_value (); } } + break; + + default: + error ("daspk: first arg should be a string or 2-element string array"); } } } - if (! daspk_fcn) - return retval; + if (daspk_fcn.is_undefined ()) + error ("daspk: FCN argument is not a valid function name or handle"); ColumnVector state = args(1).xvector_value ("daspk: initial state X_0 must be a vector"); @@ -402,7 +368,7 @@ double tzero = out_times (0); DAEFunc func (daspk_user_function); - if (daspk_jac) + if (daspk_jac.is_defined ()) func.set_jacobian_function (daspk_user_jacobian); DASPK dae (state, deriv, tzero, func); @@ -416,11 +382,6 @@ else output = dae.integrate (out_times, deriv_output); - if (fcn_name.length ()) - symtab.clear_function (fcn_name); - if (jac_name.length ()) - symtab.clear_function (jac_name); - std::string msg = dae.error_message (); if (dae.integration_ok ())