This is an automated email from the git hooks/post-receive script. hmmr-guest pushed a commit to branch WIP in repository cnrun.
commit f67f771f9d6028430bb46231f9ed64c6601ef45f Author: andrei zavada <[email protected]> Date: Tue Sep 30 20:24:49 2014 +0300 WIP --- upstream/{make_vesrion => make_version} | 0 upstream/src/Makefile.am | 12 -- upstream/src/cnrun/Makefile.am | 9 +- upstream/src/cnrun/cnrun.hh | 16 +- upstream/src/cnrun/interpreter.cc | 112 +---------- upstream/src/cnrun/main.cc | 226 +++------------------- upstream/src/{ => cnrun}/print_version.cc | 2 +- upstream/src/libcn/base-unit.cc | 23 ++- upstream/src/libcn/base-unit.hh | 6 +- upstream/src/libcn/hosted-synapses.cc | 8 +- upstream/src/libcn/hosted-synapses.hh | 10 +- upstream/src/libcn/model-struct.cc | 16 +- upstream/src/libcn/model.hh | 6 - upstream/src/libcn/standalone-neurons.cc | 8 +- upstream/src/libcn/standalone-neurons.hh | 2 - upstream/src/libcn/standalone-synapses.cc | 10 +- upstream/src/libcn/standalone-synapses.hh | 2 - upstream/src/libstilton/Makefile.am | 3 - upstream/src/libstilton/exprparser.cc | 311 ------------------------------ upstream/src/libstilton/exprparser.hh | 117 ----------- 20 files changed, 81 insertions(+), 818 deletions(-) diff --git a/upstream/make_vesrion b/upstream/make_version similarity index 100% rename from upstream/make_vesrion rename to upstream/make_version diff --git a/upstream/src/Makefile.am b/upstream/src/Makefile.am index 92ebb6c..884db3b 100644 --- a/upstream/src/Makefile.am +++ b/upstream/src/Makefile.am @@ -4,15 +4,3 @@ SUBDIRS = libstilton libcn cnrun if DO_TOOLS SUBDIRS += tools endif - -libicing_a_CXXFLAGS := \ - $(AM_CXXFLAGS) -DGIT_DESCRIBE_TAGS=\"$(shell git describe --tags)\" - -noinst_LIBRARIES := \ - libicing.a - -libicing_a_SOURCES := \ - print_version.cc - -print_version.o: FORCE -FORCE: diff --git a/upstream/src/cnrun/Makefile.am b/upstream/src/cnrun/Makefile.am index 8737de8..04bd11b 100644 --- a/upstream/src/cnrun/Makefile.am +++ b/upstream/src/cnrun/Makefile.am @@ -11,13 +11,16 @@ endif bin_PROGRAMS := \ cnrun cnrun_SOURCES := \ - interpreter.cc commands.cc cnrun.hh main.cc + interpreter.cc commands.cc cnrun.hh main.cc print_version.cc cnrun_LDADD := \ - $(top_srcdir)/src/libicing.a \ $(top_srcdir)/src/libcn/libcn.la \ $(top_srcdir)/src/libstilton/libstilton.la \ $(LIBCN_LIBS) \ $(LUA_LIB) -cnrun_LDFLAAGS := \ +print_version.o: CXXFLAGS = $(AM_CXXFLAGS) -DGIT_DESCRIBE_TAGS=\"$(shell ../../make_version)\" +print_version.o: FORCE +FORCE: + +cnrun_LDFLAGS := \ -shared diff --git a/upstream/src/cnrun/cnrun.hh b/upstream/src/cnrun/cnrun.hh index 3074637..86c4c0e 100644 --- a/upstream/src/cnrun/cnrun.hh +++ b/upstream/src/cnrun/cnrun.hh @@ -29,16 +29,14 @@ namespace cnrun { struct SInterpOptions : public cnrun::SModelOptions { - bool dump_params:1, - list_units:1; + bool list_units:1; string working_dir; list<string> scripts; SInterpOptions () - : dump_params (false), - list_units (false), + : list_units (false), working_dir (".") {} }; @@ -47,6 +45,8 @@ struct SInterpOptions class CInterpreterShell : public cnrun::stilton::C_verprintf { + DELETE_DEFAULT_METHODS (CInterpreterShell) + public: CInterpreterShell (const SInterpOptions& options_); ~CInterpreterShell (); @@ -58,6 +58,7 @@ class CInterpreterShell ok, file_error, compile_error, stack_error, call_error }; TScriptExecResult exec_script( const string& script_fname); + int run(); // individual commands struct SArg { char type; @@ -132,9 +133,6 @@ class CInterpreterShell map<string, CModel*> models; - const string - current_script; - lua_State *lua_state; @@ -146,9 +144,7 @@ class CInterpreterShell static list<string> list_commands(); }; -//char** cnrun_completion( const char *text, int start, int end); - -} // namespace cnrun +} #endif diff --git a/upstream/src/cnrun/interpreter.cc b/upstream/src/cnrun/interpreter.cc index 279d8d8..2f43fd0 100644 --- a/upstream/src/cnrun/interpreter.cc +++ b/upstream/src/cnrun/interpreter.cc @@ -247,118 +247,16 @@ exec_script( const string& script_fname) } -/* -#define CNRUN_HISTORY ".cnrun-history" int cnrun::CInterpreterShell:: -exec_script( const string& script_fname) +run() { - int retval = 0; - - if ( script_fname != "-" ) { - ifstream script_stream( script_fname.c_str()); - if ( !script_stream.good() ) { - vp( -1, "Failed to open script file \"%s\"", script_fname); - return -1; - } - vp( 1, "execing %s\n", script_fname.c_str()); - - current_line = 0; - string buf; - while ( getline( script_stream, buf) || script_stream.gcount() ) { - ++current_line; - if ( buf.size() ) { - - char *pp = strchr( (char*)buf.c_str(), '#'); - if ( pp ) - buf.resize( pp - buf.c_str()); - size_t buflen = buf.size(); - while ( strlen(buf.c_str()) && isspace(buf[buflen-1]) ) - buf[--buflen] = '\0'; - - char *_stmt = &buf[0], - *stmt; - while ( _stmt - &buf[0] < (int)buflen && (stmt = strtok( _stmt, ";\n")) ) { - _stmt = _stmt + strlen(_stmt)+1; - - retval = do_single_cmd( stmt, our_variables, level, script_fname, lineno); - if ( retval == CN_INTERP_EXIT || - (retval < CN_INTERP_WARN && howstrict == CN_INTRP_STRICT) ) - break; - } - } - } - } else { - if ( level == 0 ) { - using_history(); - read_history( CNRUN_HISTORY); - rl_attempted_completion_function = cnrun_completion; - rl_bind_key( '\t', rl_complete); - } - HISTORY_STATE *the_history_state = history_get_history_state(); - if ( the_history_state && the_history_state->length == 0 ) - printf( "Hit TAB for context completions\n"); - - char *buf, prompt[256]; - while ( snprintf( prompt, 255, "%s @%g%.*s ", - Model ? Model->name.c_str() : "-", - Model ? Model->model_time() : 0, - level+1, "]]]]]]]"), - (buf = readline( prompt)) ) { - - the_history_state = history_get_history_state(); - if ( the_history_state && - (the_history_state->length < 2 || - (the_history_state->length > 1 && - *buf && - strcmp( history_get( the_history_state->length)->line, buf) != 0) ) ) { - add_history( buf); - } - - char *pp = strchr( buf, '#'); - if ( pp ) - *pp = '\0'; - size_t buflen = strlen( buf); - while ( buflen && strchr( " \t", buf[buflen-1]) ) - buf[--buflen] = '\0'; - if ( !buflen ) - continue; - - char *_stmt = buf, // will hold the pointer to the next statement - *stmt; - while ( _stmt - buf < (int)buflen && (stmt = strtok( _stmt, ";\n")) ) { - _stmt += (strlen(_stmt) + 1); - - retval = do_single_cmd( stmt, our_variables, level, nullptr, -1); - if ( retval == CN_INTERP_EXIT ) { - free( buf); - goto out; - } - } - free( buf); - if ( level == 0 ) { -// rl_attempted_completion_function = cnrun_completion; - rl_bind_key( '\t', rl_complete); - } - } - out: - if ( level == 0 ) - write_history( CNRUN_HISTORY); - printf( "\n"); - } - - if ( env_export ) { - // update varlist - varlist.merge( our_variables); - varlist.sort(); - varlist.unique(); - } - current_shell_variables = &varlist; - - return retval; + for ( const auto& S : options.scripts ) + if ( exec_script(S) != TScriptExecResult::ok ) + return 1; + return 0; } -*/ // Local Variables: // Mode: c++ diff --git a/upstream/src/cnrun/main.cc b/upstream/src/cnrun/main.cc index 3ee0184..ed02e90 100644 --- a/upstream/src/cnrun/main.cc +++ b/upstream/src/cnrun/main.cc @@ -10,20 +10,20 @@ */ -#include <unistd.h> -#include <stdlib.h> -#include <argp.h> +#if HAVE_CONFIG_H && !defined(VERSION) +# include "config.h" +#endif + #include <cstdarg> +#include <cstdlib> #include <list> #include <string> +#include <unistd.h> -#include "libstilton/exprparser.hh" #include "cnrun.hh" -#if HAVE_CONFIG_H && !defined(VERSION) -# include "config.h" -#endif - +// needs to go after <algorithm> +#include <argp.h> using namespace std; using namespace cnrun; @@ -32,7 +32,7 @@ using namespace cnrun; // argparse const char - *argp_program_version = PACKAGE_STRING; + *argp_program_version = PACKAGE_STRING, *argp_program_bug_address = PACKAGE_BUGREPORT; static char doc[] = @@ -41,19 +41,8 @@ static char doc[] = namespace opt { enum TOptChar { list_units = 'U', - dump_model_units = 'u', - dir = 'C', - listen_dt = 'E', - log_spiking = 'k', - log_spiking_threshold = '\0', - log_option = 'L', - precision = 'e', - dt_max = 'M', - dt_min = 'm', - dt_xcap = '\0', - sort_units = '\0', + chdir = 'C', verbosely = 'v', - help = 'h', }; } // namespace opt, strictly to enclose enum TOptChar @@ -63,46 +52,9 @@ static struct argp_option options[] = { {"list-units", opt::list_units, NULL, 0, "List all available units and exit." }, - {"chdir", opt::dir, "DIR", 0, + {"chdir", opt::chdir, "DIR", 0, "Change to DIR before executing script."}, - {"dump-model-units", opt::dump_model_units, NULL, 0, - "Dump all unit types in the model and exit."}, - - {"listen-dt", opt::listen_dt, "MSEC", 0, - "Listen at this interval (default 1 msec; set to 0 " - "to listen every cycle, which can slow cnrun down considerably)."}, - - {"log-spiking", opt::log_spiking, "l|0", 0, - "Write a model-wide log of spiking neurons, using labels (l) " - "or unit ids (0)."}, - - {"log-spiking-threshold", opt::log_spiking_threshold, "", 0, - "Write a model-wide log of spiking neurons, using labels (l) " - "or unit ids (0)."}, - - {"log-option", opt::log_option, "1dbL", 0, - "1, only log the first variable; " - "d, defer writing to disk until done rather than write continuously; " - "b, write in native binary form rather than in ASCII; " - "L, log integrator dt."}, - - {"precision", opt::precision, "N", 0, - "Precision for floating point printed output."}, - - {"dt-max", opt::dt_max, "MSEC", 0, - "Max time step (default 0.5)."}, - {"dt-min", opt::dt_min, "MSEC", 0, - "Min time step (default 1e-5)."}, - {"dt-xcap", opt::dt_xcap, "TIMES", 0, - "Cap dt increase by current dt value x this (default 5)."}, - - {"sort-units", opt::sort_units, NULL, 0, - "Sort units in any bulk output." }, - - {"define", opt::defvar, "VAR=EXPR", 0, - "Define a variable with an initial value."}, - {"verbose", opt::verbosely, "LEVEL", 0, "Verbosity level (default 1; values up to 7 are meaningful). Use a" " negative value to show the progress percentage only," @@ -125,99 +77,16 @@ static struct argp argp = { static error_t -parse_opt( int key, const char *arg, struct argp_state *state) +parse_opt( int key, char *arg, struct argp_state *state) { - auto& Q = *(SOptions*)state->input; + auto& Q = *(cnrun::SInterpOptions*)state->input; char *endp = nullptr; switch ( key ) { - case opt::dt_max: - if ( Q.integration_dt_max = strtof( arg, &endp), *endp ) { - fprintf( stderr, "Expected a floating-point value for dt-max arg, got \"%s\"", arg); - return (error_t)ARGP_ERR_UNKNOWN; - } - break; - case opt::dt_min: - if ( Q.integration_dt_min = strtof( arg, &endp), *endp ) { - fprintf( stderr, "Expected a floating-point value for dt-min arg, got \"%s\"", arg); - return (error_t)ARGP_ERR_UNKNOWN; - } - break; - case opt::dt_xcap: - if ( Q.integration_dt_max_cap = strtof( arg, &endp), *endp ) { - fprintf( stderr, "Expected a floating-point value for dt-xcap arg, got \"%s\"", arg); - return (error_t)ARGP_ERR_UNKNOWN; - } - break; - - case opt::log_option: - if ( strchr( arg, 'd') ) - Q.listen_deferwrite = true; - if ( strchr( arg, '1') ) - Q.listen_1varonly = true; - if ( strchr( arg, 'b') ) - Q.listen_binary = true; - if ( strchr( arg, 'L') ) - Q.log_dt = true; - break; - - case opt::listen_dt: - if ( Q.listen_dt( arg, &endp), *endp ) { - fprintf( stderr, "Expected a floating-point value for listen-dt arg, got \"%s\"", arg); - return (error_t)ARGP_ERR_UNKNOWN; - } - break; - - case opt::precision: - Q.precision = strtoul( arg, &endp, 10); - if ( *endp || Q.precision > 16 ) { - fprintf( stderr, "Expected an unsigned int <= 16, got \"%s\"", arg); - return (error_t)ARGP_ERR_UNKNOWN; - } - break; - - case opt::log_spiking: - Q.log_spikers = true; - switch ( *arg ) { - case '0': Q.log_spikers_use_serial_id = true; break; - case 'l': Q.log_spikers_use_serial_id = false; break; - default: - fprintf( stderr, "Expecting a '0' or 'l' for log-spiking spec, got \"%s\"", arg); - return (error_t)ARGP_ERR_UNKNOWN; - } - break; - case opt::log_spiking_threshold: - Q.spike_threshold = strtof( arg+1, &endp); - if ( *endp ) { - fprintf( stderr, "Expecting an FP value for log-spiking-threshold, got \"%s\"", arg); - return (error_t)ARGP_ERR_UNKNOWN; - } - break; - - case opt::list_units: - Q.list_units = true; - break; - - case opt::sort_units: - Q.sort_units = true; - break; - case opt::chdir: Q.working_dir = arg; break; - case opt::defvar: - { - double unused; - CExpression - expr; - if ( expr( arg, unused, &Variables) ) { - fprintf( stderr, "Malformed variable assignment with -D"); - return CNRUN_CLPARSE_ERROR; - } - } - break; - case opt::verbosely: Q.verbosely = strtol( arg, &endp, 10); break; @@ -244,86 +113,37 @@ main( int argc, char *argv[]) { print_version( "cnrun"); - cnrun::SOptions Options; + cnrun::SInterpOptions Options; argp_parse( &argp, argc, argv, 0, NULL, (void*)&Options); // purely informational, requires no model - if ( Q.list_units ) { + if ( Options.list_units ) { cnmodel_dump_available_units(); return 0; } // cd as requested char *pwd = nullptr; - if ( Q.working_dir ) { + if ( Options.working_dir.size() ) { pwd = getcwd( nullptr, 0); - if ( chdir( Q.working_dir.c_str()) ) { - fprintf( stderr, "Failed to cd to \"%s\"", Q.working_dir.c_str()); - return -1; + if ( chdir( Options.working_dir.c_str()) ) { + fprintf( stderr, "Failed to cd to \"%s\"", Options.working_dir.c_str()); + return 2; } } - __cn_verbosely = Q.verbosely; - __cn_default_unit_precision = Q.precision; + cnrun::global::verbosely = Options.verbosely; - for ( const auto& F : Options.scripts ) - interpreter_run( - F, 0, Options, - true, true); + cnrun::CInterpreterShell Interp (Options); + int ret = Interp.run(); if ( pwd ) if ( chdir( pwd) ) fprintf( stderr, "Failed to cd back to \"%s\"", pwd); - return 0; + return ret; } - - - -// namespace { -// void -// usage( const char *argv0) -// { -// cout << "Usage: " << argv0 << "\n" << -// " -e <script_fname>\tExecute script\n" -// " -D \t\t\tDump all unit types in the model and exit\n" -// " -C <dir>\t\tWork in dir\n" -// " -s \t\t\tSort units\n" -// "\n" -// " -L[d1Lx] \t\tLogging & listeners:\n" -// " d \t\t\tdefer writing to disk until done rather than writing continuously\n" -// " 1\t\t\tonly log the first variable\n" -// " x\t\t\twrite in native binary form rather than in ASCII\n" -// " L\t\t\tlog integrator dt\n" -// " -E<double>\t\tListen at this interval (default " << Options.listen_dt << ";\n" -// "\t\t\t set to 0 to listen every cycle)\n" -// "\n" -// " -kl \t\t\tWrite a model-wide log of spiking neurons, using labels\n" -// " -k0 \t\t\t... use unit id instead\n" -// " -kS<double>\t\tSpike detection threshold (default " << Options.spike_threshold << ")\n" -// "\n" -// " -e <uint>\t\tSet precision for all output (default " << Options.precision << ")\n" -// "\n" -// " -tT <double>\t\tdt_max (default " << Options.integration_dt_max << ")\n" -// " -tt <double>\t\tdt_min (default " << Options.integration_dt_min << ")\n" -// " -tx <double>\t\tCap dt by current dt value x this (default " << Options.integration_dt_max_cap << ")\n" -// "\n" -// " -D EXPR\t\tAny valid expression, will inject whatever variables get assigned in it\n" -// "\n" -// " -v <int>\t\tSet verbosity level (default " << Options.verbosely << ")\n" -// "\t\t\t Use a negative value to show the progress percentage only,\n" -// " -v[%[-]t[-]]\t\tDisplay (with -, suppress) progress percent and/or time\n" -// "\t\t\t indented on the line at 8 x (minus) this value.\n" -// "\n" -// " -U \t\t\tList available unit types with parameter names\n" -// "\t\t\t and values, and exit\n" -// " -h \t\t\tDisplay this help\n" -// "\n"; -// } -// } // namespace - - // Local Variables: // indent-tabs-mode: nil // tab-width: 8 diff --git a/upstream/src/print_version.cc b/upstream/src/cnrun/print_version.cc similarity index 96% rename from upstream/src/print_version.cc rename to upstream/src/cnrun/print_version.cc index aea64cc..f7a7467 100644 --- a/upstream/src/print_version.cc +++ b/upstream/src/cnrun/print_version.cc @@ -21,6 +21,6 @@ print_version( const char* this_program) // Local Variables: // Mode: c++ // indent-tabs-mode: nil -// tab-width: nil +// tab-width: 8 // c-basic-offset: 8 // End: diff --git a/upstream/src/libcn/base-unit.cc b/upstream/src/libcn/base-unit.cc index b000f54..03fdd67 100644 --- a/upstream/src/libcn/base-unit.cc +++ b/upstream/src/libcn/base-unit.cc @@ -28,26 +28,29 @@ using namespace std; +using namespace cnrun; using cnrun::alg::member; +unsigned short cnrun::global::precision = 4; +int cnrun::global::verbosely = 1; cnrun::C_BaseUnit:: -C_BaseUnit (TUnitType intype, const string& inlabel, - CModel* inM, int s_mask) - : precision (cn_default_unit_precision), - _type (intype), _status (0 |/* CN_UENABLED |*/ s_mask), - M (inM), +C_BaseUnit (TUnitType type_, const string& label_, + CModel* M_, int s_mask) + : precision (global::precision), + _type (type_), _status (0 |/* CN_UENABLED |*/ s_mask), + M (M_), _binwrite_handle (-1), _listener_disk (nullptr), _listener_mem (nullptr) { memset( _label, 0, max_label_size); - if ( inlabel.size() ) - strncpy( _label, inlabel.c_str(), max_label_size); + if ( label_.size() ) + strncpy( _label, label_.c_str(), max_label_size); else snprintf( _label, max_label_size-1, "fafa%p", this); - if ( inM && inM->unit_by_label( _label) ) { - fprintf( stderr, "Model %s already has a unit labelled \"%s\"\n", inM->name.c_str(), _label); - _status |= CN_UERROR; + if ( M_ && M_->unit_by_label( label_) ) { + fprintf( stderr, "Model %s already has a unit labelled \"%s\"\n", M_->name.c_str(), label_.c_str()); + throw "Duplicate unit label"; } reset_params(); diff --git a/upstream/src/libcn/base-unit.hh b/upstream/src/libcn/base-unit.hh index fff96a3..a60f03f 100644 --- a/upstream/src/libcn/base-unit.hh +++ b/upstream/src/libcn/base-unit.hh @@ -34,8 +34,10 @@ using cnrun::stilton::str::sasprintf; namespace cnrun { -extern unsigned short cn_default_unit_precision; -extern int cn_verbosely; +namespace global { +extern unsigned short precision; +extern int verbosely; +} // for all units #define CN_UERROR (1 << 0) diff --git a/upstream/src/libcn/hosted-synapses.cc b/upstream/src/libcn/hosted-synapses.cc index ac42ed2..9cfbbf6 100644 --- a/upstream/src/libcn/hosted-synapses.cc +++ b/upstream/src/libcn/hosted-synapses.cc @@ -28,11 +28,11 @@ using namespace std; // the base synapse here cnrun::C_HostedSynapse:: -C_HostedSynapse (TUnitType intype, - C_BaseNeuron *insource, C_BaseNeuron *intarget, - double ing, CModel *inM, int s_mask, +C_HostedSynapse (const TUnitType type_, + C_BaseNeuron *source_, C_BaseNeuron *target_, + const double g_, CModel *M_, int s_mask, TIncludeOption include_option) - : C_BaseSynapse (intype, insource, intarget, ing, inM, s_mask), + : C_BaseSynapse (type_, source_, target_, g_, M_, s_mask), C_HostedAttributes() { if ( M ) diff --git a/upstream/src/libcn/hosted-synapses.hh b/upstream/src/libcn/hosted-synapses.hh index 25d8fee..b86eb6c 100644 --- a/upstream/src/libcn/hosted-synapses.hh +++ b/upstream/src/libcn/hosted-synapses.hh @@ -39,13 +39,11 @@ class C_HostedSynapse DELETE_DEFAULT_METHODS (C_HostedSynapse) protected: - C_HostedSynapse (TUnitType intype, - C_BaseNeuron *insource, C_BaseNeuron *intarget, - double ing, CModel*, int s_mask = 0, - TIncludeOption include_option = TIncludeOption::is_last); + C_HostedSynapse (TUnitType type_, + C_BaseNeuron *source_, C_BaseNeuron *target_, + double g_, CModel*, int s_mask = 0, + TIncludeOption = TIncludeOption::is_last); public: - ~C_HostedSynapse(); - void reset_vars(); double &var_value( size_t); const double &get_var_value( size_t) const; diff --git a/upstream/src/libcn/model-struct.cc b/upstream/src/libcn/model-struct.cc index 2fe4ff0..90c4fac 100644 --- a/upstream/src/libcn/model-struct.cc +++ b/upstream/src/libcn/model-struct.cc @@ -779,16 +779,12 @@ finalize_additions() for ( auto& U : hosted_synapses ) U->reset_vars(); - if ( options.sort_units ) { - units.sort( - [] (C_BaseUnit *&lv, C_BaseUnit *&rv) { - return strcmp( lv->label(), rv->label()) < 0; - }); - // hosted_neurons.sort( cmp); - // hosted_synapses.sort( cmp); - // standalone_neurons.sort( cmp); - // standalone_synapses.sort( cmp); - } + // if ( options.sort_units ) { + // units.sort( + // [] (C_BaseUnit *&lv, C_BaseUnit *&rv) { + // return strcmp( lv->label(), rv->label()) < 0; + // }); + // } _integrator->prepare(); } diff --git a/upstream/src/libcn/model.hh b/upstream/src/libcn/model.hh index faf109c..9f59be3 100644 --- a/upstream/src/libcn/model.hh +++ b/upstream/src/libcn/model.hh @@ -36,7 +36,6 @@ parameters. #include "gsl/gsl_rng.h" -#include "libstilton/exprparser.hh" #include "libstilton/misc.hh" #include "forward-decls.hh" #include "base-neuron.hh" @@ -56,7 +55,6 @@ struct SModelOptions { bool listen_1varonly:1, listen_deferwrite:1, listen_binary:1, - sort_units:1, log_dt:1, log_spikers:1, log_spikers_use_serial_id:1, @@ -76,12 +74,8 @@ struct SModelOptions { sdf_sigma; int verbosely; - list<cnrun::stilton::SVariable> - variables; - SModelOptions () : listen_1varonly (true), listen_deferwrite (false), listen_binary (false), - sort_units (true), log_dt (false), log_spikers (false), log_spikers_use_serial_id (false), log_sdf (false), diff --git a/upstream/src/libcn/standalone-neurons.cc b/upstream/src/libcn/standalone-neurons.cc index c84f2e8..b2d3e49 100644 --- a/upstream/src/libcn/standalone-neurons.cc +++ b/upstream/src/libcn/standalone-neurons.cc @@ -25,11 +25,11 @@ cnrun::C_StandaloneNeuron:: -C_StandaloneNeuron (TUnitType intype, const string& inlabel, +C_StandaloneNeuron (TUnitType type_, const string& label_, double x, double y, double z, - CModel *inM, int s_mask) - : C_BaseNeuron( intype, inlabel, x, y, z, inM, s_mask), - C_StandaloneAttributes( __CNUDT[intype].vno) + CModel *M_, int s_mask) + : C_BaseNeuron( type_, label_, x, y, z, M_, s_mask), + C_StandaloneAttributes( __CNUDT[type_].vno) { reset_vars(); if ( M ) diff --git a/upstream/src/libcn/standalone-neurons.hh b/upstream/src/libcn/standalone-neurons.hh index 7eaf700..83b7f49 100644 --- a/upstream/src/libcn/standalone-neurons.hh +++ b/upstream/src/libcn/standalone-neurons.hh @@ -38,8 +38,6 @@ class C_StandaloneNeuron CModel*, int s_mask); public: - ~C_StandaloneNeuron (); - double &var_value( size_t v) { return V[v]; } const double &get_var_value( size_t v) const { return V[v]; } void reset_vars() diff --git a/upstream/src/libcn/standalone-synapses.cc b/upstream/src/libcn/standalone-synapses.cc index e8ccb6b..565a96c 100644 --- a/upstream/src/libcn/standalone-synapses.cc +++ b/upstream/src/libcn/standalone-synapses.cc @@ -23,11 +23,11 @@ cnrun::C_StandaloneSynapse:: -C_StandaloneSynapse (TUnitType intype, - C_BaseNeuron* insource, C_BaseNeuron* intarget, - double ing, CModel* inM, int s_mask) - : C_BaseSynapse (intype, insource, intarget, ing, inM, s_mask), - C_StandaloneAttributes (__CNUDT[intype].vno) +C_StandaloneSynapse (TUnitType type_, + C_BaseNeuron* source_, C_BaseNeuron* target_, + double g_, CModel* M_, int s_mask) + : C_BaseSynapse (type_, source_, target_, g_, M_, s_mask), + C_StandaloneAttributes (__CNUDT[type_].vno) { reset_vars(); if ( M ) diff --git a/upstream/src/libcn/standalone-synapses.hh b/upstream/src/libcn/standalone-synapses.hh index 391ff6f..8a0057f 100644 --- a/upstream/src/libcn/standalone-synapses.hh +++ b/upstream/src/libcn/standalone-synapses.hh @@ -40,8 +40,6 @@ class C_StandaloneSynapse double ing, CModel*, int s_mask = 0); public: - ~C_StandaloneSynapse (); - double &var_value( size_t v) { return V[v]; } const double &get_var_value( size_t v) const { return V[v]; } double S() const { return V[0]; } diff --git a/upstream/src/libstilton/Makefile.am b/upstream/src/libstilton/Makefile.am index b7cf695..82a3a6a 100644 --- a/upstream/src/libstilton/Makefile.am +++ b/upstream/src/libstilton/Makefile.am @@ -7,8 +7,6 @@ libstilton_la_SOURCES = \ alg.hh \ containers.hh \ lang.hh \ - exprparser.hh \ - exprparser.cc \ libcommon.cc \ misc.hh @@ -22,7 +20,6 @@ BUILT_SOURCES = \ alg.hh.gch \ containers.hh.gch \ lang.hh.gch \ - exprparser.hh.gch \ misc.hh.gch CLEANFILES = $(BUILT_SOURCES) diff --git a/upstream/src/libstilton/exprparser.cc b/upstream/src/libstilton/exprparser.cc deleted file mode 100644 index f0328bc..0000000 --- a/upstream/src/libstilton/exprparser.cc +++ /dev/null @@ -1,311 +0,0 @@ -/* - * File name: libstilton/exprparser.cc - * Project: cnrun - * Author: Andrei Zavada <[email protected]> - * Initial version: 2008-12-02 - * - * Purpose: Expression parser - * - * License: GPL - */ - -#if HAVE_CONFIG_H && !defined(VERSION) -# include "config.h" -#endif - -#include <cstdlib> -#include <cstdio> -#include <array> -#include <iostream> - -#include "exprparser.hh" - - -using namespace std; - - -const char* const -cnrun::stilton::CExpression::error_strings[] = { - "", - "Missing operand", - "Unbalanced parentheses", - "Unparsable value or missing operator", - "Unary operator used as binary", - "Undefined variable", - "Non-lvalue in assignment", - "varlist is NULL", - 0, -}; - - - - -enum TOperator { - OP_VOID = -1, - OP_NEG, - OP_UNARYMINUS, - OP_MULT, - OP_DIV, - OP_ADD, - OP_SUBTRACT, - OP_LT, - OP_GT, - OP_ASSIGN, - OP_LE, - OP_GE, - OP_EQ, -}; - -struct SOp { - char literal[4]; - int prio; - bool assoc_ltr, - is_binary; - - SOp( const char *l, int p, bool a, bool b) - : prio (p), assoc_ltr (a), is_binary (b) - { strncpy( literal, l, 3); } - - bool isat( const char *where) const - { return (strncmp( where, literal, strlen( literal)) == 0); } -}; - - - -inline namespace { -const array<SOp, 12> Ops { - { - SOp("!", 1, false, false), - SOp("-", 1, false, false), - SOp("*", 3, true, true), - SOp("/", 3, true, true), - SOp("+", 5, true, true), - SOp("-", 5, true, true), - SOp("<", 7, true, true), - SOp(">", 7, true, true), - SOp("=", 9, false, true), - SOp("<=", 7, true, true), - SOp(">=", 7, true, true), - SOp("==", 7, true, true) - } -}; - -} // inline namespace - - - -cnrun::stilton::TExprParserError -cnrun::stilton::CExpression:: -_do_parse( const string& str, double& parsed, - list<cnrun::stilton::SVariable> *varlist) -{ - if ( str.empty() ) { - parsed = 0; - return status = EXPARSE_OK; - } - - parsed = NAN; - _var = ""; - - string workbuf = str; - char *p = &workbuf[0]; - - p += strspn( p, " \t"); - if ( !*p ) { - parsed = 0; - return status = EXPARSE_EMPTY; - } - - char *expr1 = p, - *expr2 = nullptr; - TExprParserError subexpr_retval; - - // determine subexpressions, if any, at top level - int level = 0; - char *tl_op_at = nullptr; - TOperator - tl_op = OP_VOID; - bool last_token_was_operator = true; - - while ( *p ) { - if ( *p == eol_comment_delim ) { - *p = '\0'; - break; - } - if ( *p == '(' ) ++level; - else if ( *p == ')' ) --level; - - if ( level < 0 ) - return status = EXPARSE_UNBALANCED; - if ( level > 0 || isspace( *p) ) - goto end_detect; - - // detect exponent (e-4) - if ( strncasecmp( p, "e-", 2) == 0 ) { - p++; - goto end_detect; - } - // serve the case of unary -: part one - if ( *p == '-' && last_token_was_operator ) { - char *pp = p; - while ( pp > &workbuf[0] && !isspace(*pp) ) - --pp; - char *tp; - if ( strtod( pp, &tp) ) - ; - if ( tp > p ) { // we have indeed read a number - p = tp - 1; - last_token_was_operator = false; - goto end_detect; - } - } - - int o; - for ( o = Ops.size()-1; o >= 0; --o ) // check for multibyte operators first (those are at end) - if ( Ops[o].isat( p) ) { - char *pp = p; - p += strlen( Ops[o].literal) - 1; // anticipate general p++ - - if ( o == OP_SUBTRACT && last_token_was_operator ) { - o = OP_UNARYMINUS; - } else - if ( !last_token_was_operator && !Ops[o].is_binary ) { - if ( !silent ) fprintf( stderr, "Unary %s used after an operand\n", Ops[o].literal); - return status = EXPARSE_UNASSOC; - } - - if ( tl_op == OP_VOID || - (Ops[o].assoc_ltr && Ops[tl_op].prio <= Ops[o].prio) || - (!Ops[o].assoc_ltr && Ops[tl_op].prio < Ops[o].prio) ) { -// cerr << "current tlop: " << Ops[o].literal << endl; - tl_op_at = pp; - tl_op = (TOperator)o; - } - last_token_was_operator = true; - goto end_detect; - } - - last_token_was_operator = false; - - end_detect: - ++p; - } - - if ( level > 0 ) { - if ( !silent ) fprintf( stderr, "Expression lacks some `)''\n"); - return status = EXPARSE_UNBALANCED; - } - - list<cnrun::stilton::SVariable>::iterator V; - - if ( tl_op != OP_VOID ) { - *tl_op_at = '\0'; - expr2 = tl_op_at + strlen( Ops[tl_op].literal); - double opd1, opd2; - -// cerr << "parsing [" << expr1 << "] "<< Ops[tl_op].literal << " [" << expr2 << "]\n"; - - // second subexpr must always be good - subexpr_retval = _do_parse( expr2, opd2, varlist); - if ( subexpr_retval ) - return status = subexpr_retval; - - // first subexpr must be empty, but only in the case of OP_NEG - subexpr_retval = _do_parse( expr1, opd1, varlist); - - switch ( subexpr_retval ) { - case EXPARSE_OK: - break; - case EXPARSE_EMPTY: - if ( !Ops[tl_op].is_binary ) { -// cerr << "was a unary op\n"; - break; - } else - return subexpr_retval; - case EXPARSE_UNDEFVAR: - if ( tl_op == OP_ASSIGN ) - break; - else { - // have it reported here (in deeper _do_parse where it is flagged), we don't know yet - // if an undefined var is going to be defined - if ( !silent ) fprintf( stderr, "Undefined variable `%s'\n", strtok( expr1, " \t")); - return status = subexpr_retval; - } - break; - default: - return subexpr_retval; - } - - switch ( tl_op ) { - case OP_VOID: break; - case OP_UNARYMINUS: parsed = -opd2; break; - case OP_ADD: parsed = opd1 + opd2; break; - case OP_SUBTRACT: parsed = opd1 - opd2; break; - case OP_MULT: parsed = opd1 * opd2; break; - case OP_DIV: parsed = opd1 / opd2; break; - case OP_LT: parsed = opd1 < opd2; break; - case OP_LE: parsed = opd1 <= opd2; break; - case OP_GT: parsed = opd1 > opd2; break; - case OP_GE: parsed = opd1 >= opd2; break; - case OP_EQ: parsed = opd1 == opd2; break; - case OP_NEG: parsed = !opd2; break; - case OP_ASSIGN: - if ( !varlist ) { - if ( !silent ) - fprintf( stderr, "Variable assignment reqires a user varlist\n"); - return status = EXPARSE_VARLISTNULL; - } - if ( _var == "" ) { - if ( !silent ) - fprintf( stderr, "Non-lvalue in assignment\n"); - return status = EXPARSE_NONLVAL; - } - parsed = opd2; - for ( V = varlist->begin(); V != varlist->end(); V++ ) - if ( strcmp( V->name, _var.c_str()) == 0 ) { // _var has been cached by a previous call to _do_parse - V->value = opd2; - toplevel_op = tl_op; - return status = EXPARSE_OK; - } - varlist->push_back( SVariable( _var.c_str(), opd2)); - break; - } - toplevel_op = tl_op; - return status = EXPARSE_OK; - } - - // single expression, possibly in parentheses - if ( *expr1 == '(' ) { - *strrchr( ++expr1, ')') = '\0'; // parentheses have been checked in the by-char parser loop above - return _do_parse( expr1, parsed, varlist); - } - - // bare expression - expr1 = strtok( expr1, " \t"); - char *tailp; - parsed = strtod( expr1, &tailp); - if ( tailp == nullptr || strspn( tailp, " \t\n\r;") == strlen( tailp) ) // digits followed by whitespace - return status = EXPARSE_OK; - - if ( tailp == expr1 && varlist ) { // no digits at front: check if that's a variable - for ( V = varlist->begin(); V != varlist->end(); V++ ) { - if ( strcmp( V->name, expr1) == 0 ) { - parsed = V->value; - _var = V->name; - return status = EXPARSE_OK; - } - } - _var = expr1; // possibly to be assigned in caller; parsed remains NAN - return status = EXPARSE_UNDEFVAR; - } - - // some digits followed by rubbish - return status = EXPARSE_BAD; -} - -// Local Variables: -// Mode: c++ -// indent-tabs-mode: nil -// tab-width: 8 -// c-basic-offset: 8 -// End: diff --git a/upstream/src/libstilton/exprparser.hh b/upstream/src/libstilton/exprparser.hh deleted file mode 100644 index f5e3630..0000000 --- a/upstream/src/libstilton/exprparser.hh +++ /dev/null @@ -1,117 +0,0 @@ -/* - * File name: libstilton/exprparser.hh - * Project: cnrun - * Author: Andrei Zavada <[email protected]> - * Initial version: 2008-12-02 - * - * Purpose: Expression parser - * - * License: GPL - */ - -#ifndef CNRUN_LIBSTILTON_EXPRPARSER_H_ -#define CNRUN_LIBSTILTON_EXPRPARSER_H_ - -#if HAVE_CONFIG_H && !defined(VERSION) -# include "config.h" -#endif - -#include <cmath> -#include <cstring> -#include <string> -#include <list> - -using namespace std; - -namespace cnrun { -namespace stilton { - - -enum TExprParserError { - EXPARSE_OK = 0, - EXPARSE_EMPTY, - EXPARSE_UNBALANCED, - EXPARSE_BAD, - EXPARSE_UNASSOC, - EXPARSE_UNDEFVAR, - EXPARSE_NONLVAL, - EXPARSE_VARLISTNULL -}; - - -#define STILTON_MAX_VAR_LEN 32 - -struct SVariable { - char name[STILTON_MAX_VAR_LEN]; - double value; - SVariable( const char *inname, double invalue = NAN) - : value (invalue) - { - strncpy( name, inname, STILTON_MAX_VAR_LEN-1); - } - bool operator== ( const SVariable &rv) const - { - return strcmp( name, rv.name /*, STILTON_MAX_VAR_LEN */ ) == 0; - } - bool operator< ( const SVariable &rv) const - { - return strcmp( name, rv.name /*, STILTON_MAX_VAR_LEN */ ) == -1; - } -}; - - -class CExpression { - - public: - TExprParserError status; - - CExpression() - : status (EXPARSE_OK), - silent (false), - eol_comment_delim ('#'), - toplevel_op (' '), - _parsed_value (NAN) - {} - const char *error_string() const - { - return error_strings[status]; - } - - double operator() ( const char *str, list<SVariable> *varlist = nullptr) - { - return ( _do_parse( str, _parsed_value, varlist) == EXPARSE_OK ) - ? _parsed_value : NAN; - } - int operator() ( const char *str, double& parsed, list<SVariable> *varlist = nullptr) - { - _do_parse( str, parsed, varlist); - return status; - } - - bool silent; - char eol_comment_delim; - char toplevel_op; - - static const char *const error_strings[]; - const char *status_s() const - { - return error_strings[status]; - } - - private: - double _parsed_value; - string _var; - TExprParserError _do_parse( const string& str, double& parsed, list<SVariable>*); -}; - -} -} - -#endif - -// Local Variables: -// Mode: c++ -// indent-tabs-mode: nil -// tab-width: 8 -// c-basic-offset: 8 -// End: -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/cnrun.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
