Mercurial > hg > octave-avbm
changeset 287:6027a905fc06
[project @ 1994-01-13 01:41:00 by jwe]
author | jwe |
---|---|
date | Thu, 13 Jan 1994 01:42:10 +0000 |
parents | 9c74d7d76f3d |
children | f8ae4f4dc9fd |
files | configure.in liboctave/NLP.h liboctave/NPSOL.cc liboctave/NPSOL.h octMakefile.in src/Makefile.in src/builtins.cc src/builtins.h src/input.cc src/input.h src/lex.l src/npsol.cc src/octave.cc src/tc-extras.cc src/utils.cc src/utils.h |
diffstat | 16 files changed, 1024 insertions(+), 117 deletions(-) [+] |
line wrap: on
line diff
--- a/configure.in +++ b/configure.in @@ -245,6 +245,7 @@ AC_HAVE_HEADERS(sys/time.h sys/fcntl.h sys/ttold.h sys/ptem.h sys/select.h) AC_DIR_HEADER AC_HAVE_FUNCS(setvbuf getcwd bzero rindex vfprintf vsprintf) +AC_HAVE_FUNCS(strcasecmp strncasecmp) AC_STRUCT_TM AC_SETVBUF_REVERSED TERMLIBS=""
--- a/liboctave/NLP.h +++ b/liboctave/NLP.h @@ -60,6 +60,10 @@ NLP (const Vector& x, const Objective& phi, const Bounds& b, const NLConst& nlc); + ~NLP (void); + + NLP& operator = (const NLP& a); + int size (void) const; protected: @@ -101,6 +105,23 @@ const NLConst& nl) : x (xx), phi (obj), bnds (b), nlc (nl) {} +inline NLP::~NLP (void) { } + +inline NLP& +NLP::operator = (const NLP& a) +{ + if (this != &a) + { + x = a.x; + phi = a.phi; + bnds = a.bnds; + lc = a.lc; + nlc = a.nlc; + } + + return *this; +} + inline int NLP::size (void) const {
--- a/liboctave/NPSOL.cc +++ b/liboctave/NPSOL.cc @@ -26,6 +26,8 @@ #endif #include <math.h> +#include <string.h> +#include <strstream.h> #ifndef NPSOL_MISSING @@ -45,7 +47,7 @@ int *, int *, int *, double *, double *, double *, double *, double *, double *, double *, int *, int *, double *, - int *); + int *); } // XXX FIXME XXX -- would be nice to not have to have this global @@ -61,7 +63,7 @@ int npsol_objfun (int *mode, int *n, double *xx, double *objf, - double *objgrd, int *nstate) + double *objgrd, int *nstate) { int nn = *n; Vector tmp_x (nn); @@ -280,16 +282,16 @@ user_g = nlc.function (); user_jac = nlc.jacobian_function (); - // Solve the damn thing. + pass_options_to_npsol (); if (user_jac == NULL && user_grad == NULL) - F77_FCN (npoptn) ("Derivative Level = 0", 20L); + F77_FCN (npoptn) ("Derivative Level 0", 18L); else if (user_jac == NULL && user_grad != NULL) - F77_FCN (npoptn) ("Derivative Level = 1", 20L); + F77_FCN (npoptn) ("Derivative Level 1", 18L); else if (user_jac != NULL && user_grad == NULL) - F77_FCN (npoptn) ("Derivative Level = 2", 20L); + F77_FCN (npoptn) ("Derivative Level 2", 18L); else if (user_jac != NULL && user_grad != NULL) - F77_FCN (npoptn) ("Derivative Level = 3", 20L); + F77_FCN (npoptn) ("Derivative Level 3", 18L); int attempt = 0; while (attempt++ < 5) @@ -342,17 +344,409 @@ NPSOL& NPSOL::option (char *s) { - long len = strlen (s); - F77_FCN (npoptn) (s, len); + cerr << "This function no longer has any effect.\n" + << "Use the NPSOL_option class instead\n"; + + return *this; +} + +NPSOL_options::NPSOL_options (void) +{ + init (); +} + +NPSOL_options::NPSOL_options (const NPSOL_options& opt) +{ + copy (opt); +} + +NPSOL_options& +NPSOL_options::operator = (const NPSOL_options& opt) +{ + if (this != &opt) + copy (opt); + return *this; } +NPSOL_options::~NPSOL_options (void) +{ +} + +void +NPSOL_options::init (void) +{ + x_central_difference_interval = -1.0; + x_crash_tolerance = 0.1; + x_difference_interval = -1.0; + x_function_precision = pow (DBL_EPSILON, 0.9); + x_infinite_bound = 1.0e+30; + x_infinite_step = 1.0e+30; + x_linear_feasibility_tolerance = sqrt (DBL_EPSILON); + x_linesearch_tolerance = 0.9; + x_nonlinear_feasibility_tolerance = sqrt (DBL_EPSILON); + x_optimality_tolerance = pow (DBL_EPSILON, 0.8); + x_derivative_level = 0; + x_major_iteration_limit = -1; + x_minor_iteration_limit = -1; + x_major_print_level = 0; + x_minor_print_level = 0; + x_start_objective_check = 1; + x_start_constraint_check = 1; + x_stop_objective_check = -1; + x_stop_constraint_check = -1; + x_verify_level = 0; +} + +void +NPSOL_options::copy (const NPSOL_options& opt) +{ + x_central_difference_interval = opt.x_central_difference_interval; + x_crash_tolerance = opt.x_crash_tolerance; + x_difference_interval = opt.x_difference_interval; + x_function_precision = opt.x_function_precision; + x_infinite_bound = opt.x_infinite_bound; + x_infinite_step = opt.x_infinite_step; + x_linear_feasibility_tolerance = opt.x_linear_feasibility_tolerance; + x_linesearch_tolerance = opt.x_linesearch_tolerance; + x_nonlinear_feasibility_tolerance = opt.x_nonlinear_feasibility_tolerance; + x_optimality_tolerance = opt.x_optimality_tolerance; + x_derivative_level = opt.x_derivative_level; + x_major_iteration_limit = opt.x_major_iteration_limit; + x_minor_iteration_limit = opt.x_minor_iteration_limit; + x_major_print_level = opt.x_major_print_level; + x_minor_print_level = opt.x_minor_print_level; + x_start_objective_check = opt.x_start_objective_check; + x_start_constraint_check = opt.x_start_constraint_check; + x_stop_objective_check = opt.x_stop_objective_check; + x_stop_constraint_check = opt.x_stop_constraint_check; + x_verify_level = opt.x_verify_level; +} + +void +NPSOL_options::set_default_options (void) +{ + init (); +} + +/* + * Passing invalid values to the set_* functions will result in + * setting the default option. + */ + +void +NPSOL_options::set_central_difference_interval (double val) +{ + x_central_difference_interval = (val > 0.0) ? val : -1.0; +} + +void +NPSOL_options::set_crash_tolerance (double val) +{ + x_crash_tolerance = (val >= 0.0) ? val : 0.1; +} + +void +NPSOL_options::set_difference_interval (double val) +{ + x_difference_interval = (val > 0.0) ? val : -1.0; +} + +void +NPSOL_options::set_function_precision (double val) +{ + x_function_precision = (val > 0.0) ? val : pow (DBL_EPSILON, 0.9); +} + +void +NPSOL_options::set_infinite_bound (double val) +{ + x_infinite_bound = (val > 0.0) ? val : 1.0e+30; +} + +void +NPSOL_options::set_infinite_step (double val) +{ + x_infinite_step = (val > 0.0) ? val : 1.0e+30; +} + +void +NPSOL_options::set_linear_feasibility_tolerance (double val) +{ + x_linear_feasibility_tolerance = (val > 0.0) ? val : sqrt (DBL_EPSILON); +} + +void +NPSOL_options::set_linesearch_tolerance (double val) +{ + x_linesearch_tolerance = (val >= 0.0 && val < 1.0) ? val : 0.9; +} + +void +NPSOL_options::set_nonlinear_feasibility_tolerance (double val) +{ + x_nonlinear_feasibility_tolerance = (val > 0.0) ? val : sqrt (DBL_EPSILON); +} + +void +NPSOL_options::set_optimality_tolerance (double val) +{ + x_optimality_tolerance = (val > 0.0) ? val : pow (DBL_EPSILON, 0.8); +} + +void +NPSOL_options::set_derivative_level (int val) +{ + x_derivative_level = (val >= 0 && val < 4) ? val : 0; +} + +void +NPSOL_options::set_major_iteration_limit (int val) +{ + x_major_iteration_limit = (val > 0) ? val : -1; +} + +void +NPSOL_options::set_minor_iteration_limit (int val) +{ + x_minor_iteration_limit = (val > 0) ? val : -1; +} + +void +NPSOL_options::set_major_print_level (int val) +{ + x_major_print_level = (val >= 0) ? val : -1; +} + +void +NPSOL_options::set_minor_print_level (int val) +{ + x_minor_print_level = (val >= 0) ? val : -1; +} + +void +NPSOL_options::set_start_objective_check (int val) +{ + x_start_objective_check = (val >= 0) ? val : -1; +} + +void +NPSOL_options::set_start_constraint_check (int val) +{ + x_start_constraint_check = (val >= 0) ? val : -1; +} + +void +NPSOL_options::set_stop_objective_check (int val) +{ + x_stop_objective_check = (val >= 0) ? val : -1; +} + void -NPSOL::set_default_options (void) +NPSOL_options::set_stop_constraint_check (int val) +{ + x_stop_constraint_check = (val >= 0) ? val : -1; +} + +void +NPSOL_options::set_verify_level (int val) +{ + x_verify_level = ((val > -1 && val < 4) || (val > 9 && val < 14)) ? val : 0; +} + +double +NPSOL_options::central_difference_interval (void) const +{ + return x_central_difference_interval; +} + +double +NPSOL_options::crash_tolerance (void) const +{ + return x_crash_tolerance; +} + +double +NPSOL_options::difference_interval (void) const +{ + return x_difference_interval; +} + +double +NPSOL_options::function_precision (void) const +{ + return x_function_precision; +} + +double +NPSOL_options::infinite_bound (void) const +{ + return x_infinite_bound; +} + +double +NPSOL_options::infinite_step (void) const +{ + return x_infinite_step; +} + +double +NPSOL_options::linear_feasibility_tolerance (void) const +{ + return x_linear_feasibility_tolerance; +} + +double +NPSOL_options::linesearch_tolerance (void) const +{ + return x_linesearch_tolerance; +} + +double +NPSOL_options::nonlinear_feasibility_tolerance (void) const +{ + return x_nonlinear_feasibility_tolerance; +} + +double +NPSOL_options::optimality_tolerance (void) const +{ + return x_optimality_tolerance; +} + +int +NPSOL_options::derivative_level (void) const +{ + return x_derivative_level; +} + +int +NPSOL_options::major_iteration_limit (void) const +{ + return x_major_iteration_limit; +} + +int +NPSOL_options::minor_iteration_limit (void) const +{ + return x_minor_iteration_limit; +} + +int +NPSOL_options::major_print_level (void) const +{ + return x_major_print_level; +} + +int +NPSOL_options::minor_print_level (void) const +{ + return x_minor_print_level; +} + +int +NPSOL_options::start_objective_check (void) const +{ + return x_start_objective_check; +} + +int +NPSOL_options::start_constraint_check (void) const +{ + return x_start_constraint_check; +} + +int +NPSOL_options::stop_objective_check (void) const +{ + return x_stop_objective_check; +} + +int +NPSOL_options::stop_constraint_check (void) const +{ + return x_stop_constraint_check; +} + +int +NPSOL_options::verify_level (void) const +{ + return x_verify_level; +} + +void +NPSOL_options::pass_options_to_npsol (void) { F77_FCN (npoptn) ("Nolist", 6L); F77_FCN (npoptn) ("Defaults", 8L); - F77_FCN (npoptn) ("Print Level 0", 13L); + + if (x_central_difference_interval > 0.0) + set_option ("Central Difference", x_central_difference_interval); + + set_option ("Crash Tolerance", x_crash_tolerance); + + if (x_difference_interval > 0.0) + set_option ("Difference Interval", x_difference_interval); + + set_option ("Function Precision", x_function_precision); + + set_option ("Infinite Bound", x_infinite_bound); + + set_option ("Infinite Step", x_infinite_step); + + set_option ("Linear Feasibility", x_linear_feasibility_tolerance); + + set_option ("Linesearch Tolerance", x_linesearch_tolerance); + + set_option ("Nonlinear Feasibility", x_nonlinear_feasibility_tolerance); + + set_option ("Optimality Tolerance", x_optimality_tolerance); + + set_option ("Derivative Level", x_derivative_level); + + if (x_major_iteration_limit > 0) + set_option ("Major Iteration", x_major_iteration_limit); + + if (x_minor_iteration_limit > 0) + set_option ("Minor Iteration", x_minor_iteration_limit); + + set_option ("Major Print", x_major_print_level); + + set_option ("Minor Print", x_minor_print_level); + + set_option ("Start Objective", x_start_objective_check); + + set_option ("Start Constraint", x_start_constraint_check); + + if (x_stop_objective_check > 0) + set_option ("Stop Objective", x_stop_objective_check); + + if (x_stop_constraint_check > 0) + set_option ("Stop Constraint", x_stop_constraint_check); + + set_option ("Verify Level", x_verify_level); +} + +void +NPSOL_options::set_option (const char *key, int opt) +{ + ostrstream buf; + buf << key << " " << opt << ends; + char *command = buf.str (); + size_t len = strlen (command); + F77_FCN (npoptn) (command, (long) len); + delete [] command; +} + +void +NPSOL_options::set_option (const char *key, double opt) +{ + ostrstream buf; + buf << key << " " << opt << ends; + char *command = buf.str (); + size_t len = strlen (command); + F77_FCN (npoptn) (command, (long) len); + delete [] command; } #endif /* NPSOL_MISSING */
--- a/liboctave/NPSOL.h +++ b/liboctave/NPSOL.h @@ -33,48 +33,135 @@ #define Vector ColumnVector #endif -class NPSOL : public NLP +class NPSOL_options { public: - NPSOL (void) : NLP () - { set_default_options (); } + NPSOL_options (void); + NPSOL_options (const NPSOL_options& opt); + + NPSOL_options& operator = (const NPSOL_options& opt); + + ~NPSOL_options (void); + + void init (void); + void copy (const NPSOL_options& opt); + + void set_default_options (void); + + void set_central_difference_interval (double val); + void set_crash_tolerance (double val); + void set_difference_interval (double val); + void set_function_precision (double val); + void set_infinite_bound (double val); + void set_infinite_step (double val); + void set_linear_feasibility_tolerance (double val); + void set_linesearch_tolerance (double val); + void set_nonlinear_feasibility_tolerance (double val); + void set_optimality_tolerance (double val); + + void set_derivative_level (int val); + void set_major_iteration_limit (int val); + void set_minor_iteration_limit (int val); + void set_major_print_level (int val); + void set_minor_print_level (int val); + void set_start_objective_check (int val); + void set_start_constraint_check (int val); + void set_stop_objective_check (int val); + void set_stop_constraint_check (int val); + void set_verify_level (int val); + + double central_difference_interval (void) const; + double crash_tolerance (void) const; + double difference_interval (void) const; + double function_precision (void) const; + double infinite_bound (void) const; + double infinite_step (void) const; + double linear_feasibility_tolerance (void) const; + double linesearch_tolerance (void) const; + double nonlinear_feasibility_tolerance (void) const; + double optimality_tolerance (void) const; - NPSOL (const Vector& x, const Objective& phi) : NLP (x, phi) - { set_default_options (); } + int derivative_level (void) const; + int major_iteration_limit (void) const; + int minor_iteration_limit (void) const; + int major_print_level (void) const; + int minor_print_level (void) const; + int start_objective_check (void) const; + int start_constraint_check (void) const; + int stop_objective_check (void) const; + int stop_constraint_check (void) const; + int verify_level (void) const; + + protected: + + void pass_options_to_npsol (void); + + void set_option (const char *key, int opt); + void set_option (const char *key, double opt); + + private: + + double x_central_difference_interval; + double x_crash_tolerance; + double x_difference_interval; + double x_function_precision; + double x_infinite_bound; + double x_infinite_step; + double x_linear_feasibility_tolerance; + double x_linesearch_tolerance; + double x_nonlinear_feasibility_tolerance; + double x_optimality_tolerance; + int x_derivative_level; + int x_major_iteration_limit; + int x_minor_iteration_limit; + int x_major_print_level; + int x_minor_print_level; + int x_start_objective_check; + int x_start_constraint_check; + int x_stop_objective_check; + int x_stop_constraint_check; + int x_verify_level; +}; + +class NPSOL : public NLP, public NPSOL_options +{ + public: + + NPSOL (void) : NLP () { } + + NPSOL (const Vector& x, const Objective& phi) : NLP (x, phi) { } NPSOL (const Vector& x, const Objective& phi, const Bounds& b) : NLP (x, phi, b) - { set_default_options (); } + { } NPSOL (const Vector& x, const Objective& phi, const Bounds& b, const LinConst& lc) : NLP (x, phi, b, lc) - { set_default_options (); } + { } NPSOL (const Vector& x, const Objective& phi, const Bounds& b, const LinConst& lc, const NLConst& nlc) : NLP (x, phi, b, lc, nlc) - { set_default_options (); } + { } NPSOL (const Vector& x, const Objective& phi, const LinConst& lc) : NLP (x, phi, lc) - { set_default_options (); } + { } NPSOL (const Vector& x, const Objective& phi, const LinConst& lc, const NLConst& nlc) : NLP (x, phi, lc, nlc) - { set_default_options (); } + { } NPSOL (const Vector& x, const Objective& phi, const NLConst& nlc) : NLP (x, phi, nlc) - { set_default_options (); } + { } NPSOL (const Vector& x, const Objective& phi, const Bounds& b, const NLConst& nlc) : NLP (x, phi, b, nlc) - { set_default_options (); } + { } NPSOL (const NPSOL& a); - NPSOL& operator = (const NPSOL& a); - Vector minimize (void); Vector minimize (double& objf); Vector minimize (double& objf, int& inform); @@ -87,9 +174,7 @@ NPSOL& option (char *s); -private: - void set_default_options (void); - + private: }; // XXX FIXME XXX -- would be nice to not have to have this global @@ -99,23 +184,7 @@ extern int npsol_objective_error; inline NPSOL::NPSOL (const NPSOL& a) : NLP (a.x, a.phi, a.bnds, a.lc, a.nlc) - { set_default_options (); } - -inline NPSOL& -NPSOL::operator = (const NPSOL& a) -{ - x = a.x; - phi = a.phi; - bnds = a.bnds; - lc = a.lc; - nlc = a.nlc; - - cerr << "warning: NPSOL options reset to default values\n"; - - set_default_options (); - - return *this; -} + { } #endif /* NPSOL_MISSING */
--- a/octMakefile.in +++ b/octMakefile.in @@ -13,11 +13,11 @@ include Makeconf -DISTFILES = COPYING ChangeLog Makefile.in Makeconf.in NEWS README \ - README.NLP THANKS INSTALL INSTALL.OCTAVE BUGS PLOTTING \ - PROJECTS f2c-compat.sh flibs.sh configure configure.in \ - config.guess octave.sh octave-mode.el doinstall.sh mkpath.c \ - config.h.in acconfig.h +DISTFILES = BUGS COPYING ChangeLog INSTALL INSTALL.OCTAVE \ + Makefile.in Makeconf.in NEWS PLOTTING PROJECTS README \ + README.NLP SENDING-PATCHES THANKS f2c-compat.sh flibs.sh \ + configure configure.in config.guess octave.sh octave-mode.el \ + doinstall.sh mkpath.c config.h.in acconfig.h # Complete directory trees to distribute. DISTDIRS = bsd-math dld
--- a/src/Makefile.in +++ b/src/Makefile.in @@ -59,7 +59,7 @@ fi INCLUDES = arith-ops.h builtins.h dynamic-ld.h defaults.h.in \ - defaults.h f-balance.h f-chol.h f-colloc.h f-dassl.h \ + defaults.h error.h f-balance.h f-chol.h f-colloc.h f-dassl.h \ f-det.h f-eig.h f-expm.h f-fft.h f-fsolve.h f-fsqp.h f-givens.h \ f-hess.h f-ifft.h f-inv.h f-lpsolve.h f-lsode.h f-lu.h \ f-npsol.h f-qpsol.h f-qr.h f-quad.h f-qzval.h f-rand.h \ @@ -71,7 +71,7 @@ unwind-prot.h user-prefs.h utils.h variables.h version.h \ xdiv.h xpow.h SLStack.h Stack.h -SOURCES = arith-ops.cc builtins.cc dynamic-ld.cc f-chol.cc \ +SOURCES = arith-ops.cc builtins.cc dynamic-ld.cc error.cc f-chol.cc \ f-colloc.cc f-balance.cc f-dassl.cc f-det.cc f-eig.cc \ f-expm.cc f-fft.cc f-fsolve.cc f-fsqp.cc f-givens.cc \ f-hess.cc f-ifft.cc f-inv.cc f-lpsolve.cc f-lsode.cc f-lu.cc \ @@ -80,10 +80,11 @@ g-builtins.cc getopt.c getopt1.c gripes.cc help.cc \ idx-vector.cc input.cc lex.l mappers.cc octave.cc \ octave-hist.cc pager.cc parse.y pr-output.cc procstream.cc \ - sighandlers.cc symtab.cc sysdep.cc t-builtins.cc tc-assign.cc \ - tc-extras.cc tc-index.cc tc-inlines.cc token.cc tree.cc \ - tree-const.cc tree-plot.cc unwind-prot.cc user-prefs.cc \ - utils.cc variables.cc xdiv.cc xpow.cc SLStack.cc + sighandlers.cc strcasecmp.c strncase.c symtab.cc sysdep.cc \ + t-builtins.cc tc-assign.cc tc-extras.cc tc-index.cc \ + tc-inlines.cc token.cc tree.cc tree-const.cc tree-plot.cc \ + unwind-prot.cc user-prefs.cc utils.cc variables.cc xdiv.cc \ + xpow.cc SLStack.cc DEP_SOURCES_2 = $(patsubst %.l, %.cc, $(SOURCES)) DEP_SOURCES_1 = $(patsubst %.y, %.cc, $(DEP_SOURCES_2)) @@ -99,11 +100,11 @@ OBJECTS = arith-ops.o builtins.o error.o file-io.o fnmatch.o \ g-builtins.o getopt.o getopt1.o gripes.o help.o idx-vector.o \ input.o lex.o mappers.o octave.o octave-hist.o pager.o \ - parse.o pr-output.o procstream.o sighandlers.o symtab.o \ - sysdep.o t-builtins.o tc-assign.o tc-extras.o tc-index.o \ - token.o tree.o tree-const.o tree-plot.o unwind-prot.o \ - user-prefs.o utils.o variables.o xdiv.o xpow.o SLStack.o \ - @DYNAMIC_LD_OBJ@ + parse.o pr-output.o procstream.o sighandlers.o strcasecmp.o \ + strncase.o symtab.o sysdep.o t-builtins.o tc-assign.o \ + tc-extras.o tc-index.o token.o tree.o tree-const.o tree-plot.o \ + unwind-prot.o user-prefs.o utils.o variables.o xdiv.o xpow.o \ + SLStack.o @DYNAMIC_LD_OBJ@ OCTAVE_LIBS = ../liboctave.a ../libcruft.a ../libinfo.a \ ../libreadline.a @LIBDLD@
--- a/src/builtins.cc +++ b/src/builtins.cc @@ -263,7 +263,9 @@ where x, xdot, and res are vectors, and t is a scalar.", }, { "dassl_options", -1, 1, builtin_dassl_options, - "dassl_options (keyword, value): set or show options for dassl", }, + "dassl_options (keyword, value)\n\n\ + Set or show options for dassl. Keywords may be abbreviated\n\ + to the shortest match.", }, { "date", 1, 0, builtin_date, "date (): return current date in a string", }, @@ -358,7 +360,9 @@ where y and x are vectors.", }, { "fsolve_options", -1, 1, builtin_fsolve_options, - "fsolve_options (keyword, value): set or show options for fsolve", }, + "fsolve_options (keyword, value)\n\n\ + Set or show options for fsolve. Keywords may be abbreviated\n\ + to the shortest match.", }, { "fsqp", 11, 3, builtin_fsqp, #if defined (FSQP_MISSING) @@ -377,7 +381,9 @@ redistributable. For more information, read the file\n\ libcruft/fsqp/README.MISSING in the source distribution.", }, #else - "fsqp_options (keyword, value): set or show options for fsqp", }, + "fsqp_options (keyword, value)\n\n\ + Set or show options for fsqp. Keywords may be abbreviated\n\ + to the shortest match.", }, #endif { "ftell", 2, 1, builtin_ftell, @@ -426,7 +432,9 @@ "lp_solve (): solve linear programs using lp_solve.", }, { "lp_solve_options", -1, 1, builtin_lpsolve_options, - "lp_solve_options (keyword, value): set or show options for lp_solve", }, + "lp_solve_options (keyword, value)\n\n\ + Set or show options for lp_solve. Keywords may be abbreviated\n\ + to the shortest match.", }, { "lsode", 6, 1, builtin_lsode, "lsode (\"function_name\", x0, t_out, t_crit)\n\ @@ -439,7 +447,9 @@ where xdot and x are vectors and t is a scalar.\n", }, { "lsode_options", -1, 1, builtin_lsode_options, - "lsode_options (keyword, value): set or show options for lsode", }, + "lsode_options (keyword, value)\n\n\ + Set or show options for lsode. Keywords may be abbreviated\n\ + to the shortest match.", }, { "lu", 2, 3, builtin_lu, "[L, U, P] = lu (A): LU factorization", }, @@ -474,7 +484,9 @@ redistributable. For more information, read the file\n\ libcruft/npsol/README.MISSING in the source distribution.", }, #else - "npsol_options (keyword, value): set or show options for npsol", }, + "npsol_options (keyword, value)\n\n\ + Set or show options for npsol. Keywords may be abbreviated\n\ + to the shortest match.", }, #endif { "ones", 3, 1, builtin_ones, @@ -513,7 +525,9 @@ redistributable. For more information, read the file\n\ libcruft/qpsol/README.MISSING in the source distribution.", }, #else - "qpsol_options (keyword, value): set or show options for qpsol", }, + "qpsol_options (keyword, value)\n\n\ + Set or show options for qpsol. Keywords may be abbreviated\n\ + to the shortest match.", }, #endif { "qr", 2, 2, builtin_qr, @@ -535,7 +549,9 @@ at which the integrand is singular.\n", }, { "quad_options", -1, 1, builtin_quad_options, - "quad_options (keyword, value): set or show options for quad", }, + "quad_options (keyword, value)\n\n\ + Set or show options for quad. Keywords may be abbreviated\n\ + to the shortest match.", }, { "quit", 1, 0, builtin_quit, "quit (): exit Octave gracefully", }, @@ -1116,7 +1132,7 @@ } void -print_usage (const char *string) +print_usage (const char *string, int just_usage = 0) { ostrstream output_buf; @@ -1128,7 +1144,8 @@ || help_from_list (output_buf, tf_help_list, string, 1) || help_from_list (output_buf, mf_help_list, string, 1)) { - additional_help_message (output_buf); + if (! just_usage) + additional_help_message (output_buf); output_buf << ends; maybe_page_output (output_buf); }
--- a/src/builtins.h +++ b/src/builtins.h @@ -86,7 +86,7 @@ extern void additional_help_message (ostrstream& output_buf); -extern void print_usage (const char *s); +extern void print_usage (const char *s, int just_usage = 0); #endif
--- a/src/input.cc +++ b/src/input.cc @@ -130,7 +130,7 @@ * Use GNU readline to get an input line and store it in the history * list. */ -char * +static char * octave_gets (void) { if (octave_gets_line != NULL) @@ -164,10 +164,10 @@ if (echo_input) { - if (!forced_interactive) + if (! forced_interactive) cout << "+ "; - if (octave_gets_line != (char *) NULL) - cout << octave_gets_line << "\n"; + + cout << octave_gets_line << "\n"; } } return octave_gets_line; @@ -254,6 +254,14 @@ stashed_line = strsave (buf); current_input_line = stashed_line; + + if (echo_input && current_input_line && *current_input_line) + { + if (! forced_interactive) + cout << "+ "; + + cout << current_input_line << "\n"; + } } input_line_number++; return status;
--- a/src/input.h +++ b/src/input.h @@ -28,7 +28,6 @@ #include <stdio.h> -extern char *octave_gets (void); extern int octave_read (char *buf, int max_size); extern FILE *get_input_from_file (char *name, int warn = 1); extern FILE *get_input_from_stdin (void);
--- a/src/lex.l +++ b/src/lex.l @@ -627,43 +627,72 @@ } /* - * Fix things up for errors or interrupts. This could use a few - * comments now, eh? + * Fix things up for errors or interrupts. The parser is never called + * recursively, so it is always safe to reinitialize its state before + * doing any parsing. */ void reset_parser (void) { +// Start off on the right foot. BEGIN 0; error_state = 0; + +// We do want a prompt by default. promptflag = 1; - doing_set = 0; - braceflag = 0; + +// Not initially screwed by `function [...] = f (...)' syntax. maybe_screwed = 0; maybe_screwed_again = 0; + +// Not initially inside a loop or if statement. looping = 0; iffing = 0; + +// Quote marks strings intially. + quote_is_transpose = 0; + +// Next token can be identifier. + cant_be_identifier = 0; + +// No need to do comma insert or convert spaces to comma at beginning +// of input. + do_comma_insert = 0; + convert_spaces_to_comma = 1; + +// Not initially defining a function. + beginning_of_function = 0; + defining_func = 0; + +// Not initially doing any plotting or setting of plot attributes. + plotting = 0; + in_plot_range = 0; + past_plot_range = 0; + in_plot_using = 0; + in_plot_style = 0; + doing_set = 0; + +// Error may have occurred inside some parentheses or braces. + in_brace_or_paren.clear (); + +// Not initially defining a matrix list. + braceflag = 0; ml.clear (); mlnm.clear (); - defining_func = 0; - curr_sym_tab = top_level_sym_tab; - get_input_from_eval_string = 0; - quote_is_transpose = 0; - current_input_column = 1; -// Might have been reset by defining a function. - input_line_number = current_command_number - 1; - do_comma_insert = 0; - plotting = 0; - past_plot_range = 0; - in_plot_range = 0; - in_plot_using = 0; - in_plot_style = 0; - cant_be_identifier = 0; - convert_spaces_to_comma = 1; - beginning_of_function = 0; - in_brace_or_paren.clear (); + +// Clear out the stack of token info used to track line and column +// numbers. while (! token_stack.empty ()) delete token_stack.pop (); - yyrestart (stdin); + +// Can be reset by defining a function. + current_input_column = 1; + input_line_number = current_command_number - 1; + +// Only ask for input from stdin if we are expecting interactive +// input. + if (interactive && ! (reading_m_file || get_input_from_eval_string)) + yyrestart (stdin); } /* @@ -761,9 +790,14 @@ static int yywrap (void) { - return 0; + return 1; } +/* + * These are not needed with flex-2.4.6, but may be needed with + * earlier 2.4.x versions. + */ +#if 0 static void * yy_flex_alloc (int size) { @@ -781,6 +815,7 @@ { free (ptr); } +#endif /* * Tell us all what the current buffer is.
--- a/src/npsol.cc +++ b/src/npsol.cc @@ -27,12 +27,16 @@ #ifndef NPSOL_MISSING +#include <strstream.h> + #include "NPSOL.h" #include "tree-const.h" #include "variables.h" +#include "builtins.h" #include "gripes.h" #include "error.h" +#include "pager.h" #include "utils.h" #include "f-npsol.h" @@ -54,6 +58,8 @@ } #endif +static NPSOL_options npsol_opts; + double npsol_objective_function (const ColumnVector& x) { @@ -322,6 +328,7 @@ // 1. npsol (x, phi) NPSOL nlp (x, func); + nlp.copy (npsol_opts); soln = nlp.minimize (objf, inform, lambda); goto solved; @@ -332,6 +339,7 @@ // 2. npsol (x, phi, lb, ub) NPSOL nlp (x, func, bounds); + nlp.copy (npsol_opts); soln = nlp.minimize (objf, inform, lambda); goto solved; @@ -365,6 +373,7 @@ // 7. npsol (x, phi, llb, c, lub) NPSOL nlp (x, func, linear_constraints); + nlp.copy (npsol_opts); soln = nlp.minimize (objf, inform, lambda); } else @@ -372,6 +381,7 @@ // 3. npsol (x, phi, lb, ub, llb, c, lub) NPSOL nlp (x, func, bounds, linear_constraints); + nlp.copy (npsol_opts); soln = nlp.minimize (objf, inform, lambda); } goto solved; @@ -396,6 +406,7 @@ // 8. npsol (x, phi, nllb, g, nlub) NPSOL nlp (x, func, nonlinear_constraints); + nlp.copy (npsol_opts); soln = nlp.minimize (objf, inform, lambda); } else @@ -403,6 +414,7 @@ // 5. npsol (x, phi, lb, ub, nllb, g, nlub) NPSOL nlp (x, func, bounds, nonlinear_constraints); + nlp.copy (npsol_opts); soln = nlp.minimize (objf, inform, lambda); } goto solved; @@ -453,7 +465,7 @@ NPSOL nlp (x, func, linear_constraints, nonlinear_constraints); - + nlp.copy (npsol_opts); soln = nlp.minimize (objf, inform, lambda); } else @@ -462,7 +474,7 @@ NPSOL nlp (x, func, bounds, linear_constraints, nonlinear_constraints); - + nlp.copy (npsol_opts); soln = nlp.minimize (objf, inform, lambda); } goto solved; @@ -486,13 +498,243 @@ return retval; } +typedef void (NPSOL_options::*d_set_opt_mf) (double); +typedef void (NPSOL_options::*i_set_opt_mf) (int); +typedef double (NPSOL_options::*d_get_opt_mf) (void); +typedef int (NPSOL_options::*i_get_opt_mf) (void); + +#define MAX_TOKENS 5 + +struct NPSOL_OPTIONS +{ + char *keyword; + char *kw_tok[MAX_TOKENS + 1]; + int min_len[MAX_TOKENS + 1]; + int min_toks_to_match; + d_set_opt_mf d_set_fcn; + i_set_opt_mf i_set_fcn; + d_get_opt_mf d_get_fcn; + i_get_opt_mf i_get_fcn; +}; + +static NPSOL_OPTIONS npsol_option_table[] = +{ + { "central difference interval", + { "central", "difference", "interval", NULL, NULL, NULL, }, + { 2, 0, 0, 0, 0, 0, }, 1, + NPSOL_options::set_central_difference_interval, NULL, + NPSOL_options::central_difference_interval, NULL, }, + + { "crash tolerance", + { "crash", "tolerance", NULL, NULL, NULL, NULL, }, + { 2, 0, 0, 0, 0, 0, }, 1, + NPSOL_options::set_crash_tolerance, NULL, + NPSOL_options::crash_tolerance, NULL, }, + + { "derivative level", + { "derivative", "level", NULL, NULL, NULL, NULL, }, + { 1, 0, 0, 0, 0, 0, }, 1, + NULL, NPSOL_options::set_derivative_level, + NULL, NPSOL_options::derivative_level, }, + + { "difference interval", + { "difference", "interval", NULL, NULL, NULL, NULL, }, + { 3, 0, 0, 0, 0, 0, }, 1, + NPSOL_options::set_difference_interval, NULL, + NPSOL_options::difference_interval, NULL, }, + + { "function precision", + { "function", "precision", NULL, NULL, NULL, NULL, }, + { 2, 0, 0, 0, 0, 0, }, 1, + NPSOL_options::set_function_precision, NULL, + NPSOL_options::function_precision, NULL, }, + + { "infinite bound size", + { "infinite", "bound", "size", NULL, NULL, NULL, }, + { 1, 1, 0, 0, 0, 0, }, 2, + NPSOL_options::set_infinite_bound, NULL, + NPSOL_options::infinite_bound, NULL, }, + + { "infinite step size", + { "infinite", "step", "size", NULL, NULL, NULL, }, + { 1, 1, 0, 0, 0, 0, }, 2, + NPSOL_options::set_infinite_step, NULL, + NPSOL_options::infinite_step, NULL, }, + + { "linear feasibility tolerance", + { "linear", "feasibility", "tolerance", NULL, NULL, NULL, }, + { 5, 0, 0, 0, 0, 0, }, 1, + NPSOL_options::set_linear_feasibility_tolerance, NULL, + NPSOL_options::linear_feasibility_tolerance, NULL, }, + + { "linesearch tolerance", + { "linesearch", "tolerance", NULL, NULL, NULL, NULL, }, + { 5, 0, 0, 0, 0, 0, }, 1, + NPSOL_options::set_linesearch_tolerance, NULL, + NPSOL_options::linesearch_tolerance, NULL, }, + + { "major iteration limit", + { "major", "iteration", "limit", NULL, NULL, NULL, }, + { 2, 1, 0, 0, 0, 0, }, 2, + NULL, NPSOL_options::set_major_iteration_limit, + NULL, NPSOL_options::major_iteration_limit, }, + + { "minor iteration limit", + { "minor", "iteration", "limit", NULL, NULL, NULL, }, + { 2, 1, 0, 0, 0, 0, }, 2, + NULL, NPSOL_options::set_minor_iteration_limit, + NULL, NPSOL_options::minor_iteration_limit, }, + + { "major print level", + { "major", "print", "level", NULL, NULL, NULL, }, + { 2, 1, 0, 0, 0, 0, }, 2, + NULL, NPSOL_options::set_major_print_level, + NULL, NPSOL_options::major_print_level, }, + + { "minor print level", + { "minor", "print", "level", NULL, NULL, NULL, }, + { 2, 1, 0, 0, 0, 0, }, 2, + NULL, NPSOL_options::set_minor_print_level, + NULL, NPSOL_options::minor_print_level, }, + + { "nonlinear feasibility tolerance", + { "nonlinear", "feasibility", "tolerance", NULL, NULL, }, + { 1, 0, 0, 0, 0, 0, }, 1, + NPSOL_options::set_nonlinear_feasibility_tolerance, NULL, + NPSOL_options::nonlinear_feasibility_tolerance, NULL, }, + + { "optimality tolerance", + { "optimality", "tolerance", NULL, NULL, NULL, NULL, }, + { 1, 0, 0, 0, 0, 0, }, 1, + NPSOL_options::set_optimality_tolerance, NULL, + NPSOL_options::optimality_tolerance, NULL, }, + + { "start objective check at variable", + { "start", "objective", "check", "at", "variable", NULL, }, + { 3, 1, 0, 0, 0, 0, }, 2, + NULL, NPSOL_options::set_start_objective_check, + NULL, NPSOL_options::start_objective_check, }, + + { "start constraint check at variable", + { "start", "constraint", "check", "at", "variable", NULL, }, + { 3, 1, 0, 0, 0, 0, }, 2, + NULL, NPSOL_options::set_start_constraint_check, + NULL, NPSOL_options::start_constraint_check, }, + + { "stop objective check at variable", + { "stop", "objective", "check", "at", "variable", NULL, }, + { 3, 1, 0, 0, 0, 0, }, 2, + NULL, NPSOL_options::set_stop_objective_check, + NULL, NPSOL_options::stop_objective_check, }, + + { "stop constraint check at variable", + { "stop", "constraint", "check", "at", "variable", NULL, }, + { 3, 1, 0, 0, 0, 0, }, 2, + NULL, NPSOL_options::set_stop_constraint_check, + NULL, NPSOL_options::stop_constraint_check, }, + + { "verify level", + { "verify", "level", NULL, NULL, NULL, NULL, }, + { 1, 0, 0, 0, 0, 0, }, 1, + NULL, NPSOL_options::set_verify_level, + NULL, NPSOL_options::verify_level, }, + + { NULL, + { NULL, NULL, NULL, NULL, NULL, NULL, }, + { 0, 0, 0, 0, 0, 0, }, 0, + NULL, NULL, NULL, NULL, }, +}; + +static void +print_npsol_option_list (void) +{ + ostrstream output_buf; + + print_usage ("npsol_options", 1); + + output_buf << "\n" + << "Options for npsol include:\n\n" + << " keyword value\n" + << " ------- -----\n\n"; + + NPSOL_OPTIONS *list = npsol_option_table; + + char *keyword; + while ((keyword = list->keyword) != (char *) NULL) + { + output_buf.form (" %-40s ", keyword); + if (list->d_get_fcn) + { + double val = (npsol_opts.*list->d_get_fcn) (); + if (val < 0.0) + output_buf << "computed automatically"; + else + output_buf << val; + } + else + { + int val = (npsol_opts.*list->i_get_fcn) (); + if (val < 0) + output_buf << "depends on problem size"; + else + output_buf << val; + } + output_buf << "\n"; + list++; + } + + output_buf << "\n" << ends; + maybe_page_output (output_buf); +} + +static void +do_npsol_option (char *keyword, double val) +{ + NPSOL_OPTIONS *list = npsol_option_table; + + while (list->keyword != (char *) NULL) + { + if (keyword_almost_match (list->kw_tok, list->min_len, keyword, + list->min_toks_to_match, MAX_TOKENS)) + { + if (list->d_set_fcn) + (npsol_opts.*list->d_set_fcn) (val); + else + (npsol_opts.*list->i_set_fcn) (NINT (val)); + + return; + } + list++; + } + + warning ("npsol_options: no match for `%s'", keyword); +} + tree_constant * npsol_options (const tree_constant *args, int nargin, int nargout) { -// Assumes that we have been given the correct number of arguments. + tree_constant *retval = NULL_TREE_CONST; - tree_constant *retval = NULL_TREE_CONST; - error ("npsol_options: not implemented yet"); + if (nargin == 1) + { + print_npsol_option_list (); + } + else if (nargin == 3) + { + if (args[1].is_string_type ()) + { + char *keyword = args[1].string_value (); + double val = args[2].double_value (); + do_npsol_option (keyword, val); + } + else + print_usage ("npsol_options"); + } + else + { + print_usage ("npsol_options"); + } + return retval; }
--- a/src/octave.cc +++ b/src/octave.cc @@ -128,6 +128,9 @@ extern one_arg_error_handler_t set_Complex_error_handler (one_arg_error_handler_t f); +// This is from readline's paren.c: +extern int rl_blink_matching_paren; + static void octave_Complex_error_handler (const char* msg) { @@ -324,8 +327,6 @@ << " file : execute commands from named file\n" << "\n"; - cout.flush (); - exit (1); } @@ -473,7 +474,10 @@ if (infile == (FILE *) NULL) clean_up_and_exit (1); else - switch_to_buffer (create_buffer (infile)); + { + rl_blink_matching_paren = 0; + switch_to_buffer (create_buffer (infile)); + } } else { @@ -489,7 +493,10 @@ // has forced interactive behavior. if (!interactive && forced_interactive) - echo_input = 1; + { + rl_blink_matching_paren = 0; + echo_input = 1; + } if (! (interactive || forced_interactive)) using_readline = 0; @@ -502,7 +509,7 @@ << ". Copyright (C) 1992, 1993, 1994 John W. Eaton.\n" << "This is free software with ABSOLUTELY NO WARRANTY.\n" << "For details, type `warranty'.\n" - << "\n"; + << endl; } // Allow the user to interrupt us without exiting. @@ -525,8 +532,12 @@ int retval; do { + curr_sym_tab = top_level_sym_tab; + reset_parser (); + retval = yyparse (); + if (retval == 0 && global_command != NULL_TREE) { global_command->eval (1);
--- a/src/tc-extras.cc +++ b/src/tc-extras.cc @@ -1236,12 +1236,11 @@ switch_to_buffer (new_buf); unwind_protect_ptr (curr_sym_tab); - symbol_table *prev_sym_tab = curr_sym_tab; + + reset_parser (); parse_status = yyparse (); - curr_sym_tab = prev_sym_tab; - // Important to reset the idea of where input is coming from before // trying to eval the command we just parsed -- it might contain the // name of an m-file that still needs to be parsed!
--- a/src/utils.cc +++ b/src/utils.cc @@ -57,6 +57,20 @@ #include <fstream.h> #include <dirent.h> +#ifndef HAVE_STRCASECMP +extern "C" +{ +extern int strcasecmp (const char*, const char*); +} +#endif + +#ifndef HAVE_STRNCASECMP +extern "C" +{ +extern int strncasecmp (const char*, const char*, size_t); +} +#endif + #define NLENGTH(dirent) (strlen((dirent)->d_name)) extern "C" @@ -217,7 +231,7 @@ int tty_fd = STDIN_FILENO; if (! isatty (tty_fd)) { - if (interactive || forced_interactive) + if (interactive) error ("stdin is not a tty!"); return; } @@ -1271,14 +1285,107 @@ } int -almost_match (const char *std, const char *s, int min_match_len = 1) +almost_match (const char *std, const char *s, + int min_match_len = 1, int case_sens = 1) { int stdlen = strlen (std); int slen = strlen (s); return (slen <= stdlen && slen >= min_match_len - && strncmp (std, s, slen) == 0); + && (case_sens + ? (strncmp (std, s, slen) == 0) + : (strncasecmp (std, s, slen) == 0))); +} + +/* + * Ugh. + */ +int +keyword_almost_match (const char **std, int *min_len, const char *s, + int min_toks_to_match, int max_toks) +{ + int status = 0; + int tok_count = 0; + int toks_matched = 0; + + if (s == NULL || *s == '\0' || max_toks < 1) + return status; + + char *kw = strsave (s); + + char *t = kw; + while (*t != '\0') + { + if (*t == '\t') + *t = ' '; + t++; + } + + char *beg = kw; + while (*beg == ' ') + beg++; + + if (*beg == '\0') + return status; + + + char **to_match = new char * [max_toks + 1]; + char **s1 = std; + char **s2 = to_match; + + if (s1 == NULL || s2 == NULL) + goto done; + + s2[tok_count] = beg; + char *end; + while ((end = strchr (beg, ' ')) != NULL) + { + *end = '\0'; + beg = end + 1; + + while (*beg == ' ') + beg++; + + if (*beg == '\0') + break; + + tok_count++; + if (tok_count >= max_toks) + goto done; + + s2[tok_count] = beg; + } + s2[tok_count+1] = NULL; + + s2 = to_match; + + for (;;) + { + if (! almost_match (*s1, *s2, min_len[toks_matched], 0)) + goto done; + + toks_matched++; + + s1++; + s2++; + + if (! *s2) + { + status = (toks_matched >= min_toks_to_match); + goto done; + } + + if (! *s1) + goto done; + } + + done: + + delete [] kw; + delete [] to_match; + + return status; } char **
--- a/src/utils.h +++ b/src/utils.h @@ -75,7 +75,10 @@ extern int send_to_plot_stream (const char *cmd); extern void close_plot_stream (void); extern int almost_match (const char *std, const char *s, - int min_match_len = 1); + int min_match_len = 1, int case_sens = 1); +extern int keyword_almost_match (const char **std, int *min_len, + const char *s, int min_toks_to_match, + int max_toks); extern char **get_m_file_names (int& mfl_len, const char *dir, int no_suffix); extern char **get_m_file_names (int& mfl_len, int no_suffix); extern int NINT (double x);