This is an automated email from the git hooks/post-receive script.

hmmr-guest pushed a commit to branch WIP
in repository cnrun.

commit 5699a22a5268dd570e9a490f71c8c8bdcdc8c0b0
Author: andrei zavada <[email protected]>
Date:   Tue Jul 8 15:44:47 2014 +0300

    WIP
---
 upstream/configure.ac           |   2 +-
 upstream/src/cnrun/main.cc      | 516 +++++++++++++++++++++++-----------------
 upstream/src/cnrun/runner.hh    | 207 +++++++---------
 upstream/src/libcn/base-unit.cc |  10 -
 upstream/src/libcn/model.hh     |  77 ++++--
 5 files changed, 455 insertions(+), 357 deletions(-)

diff --git a/upstream/configure.ac b/upstream/configure.ac
index ccdd2f3..b5b3dfc 100644
--- a/upstream/configure.ac
+++ b/upstream/configure.ac
@@ -1,7 +1,7 @@
 AC_COPYRIGHT([Copyright (c) 2008-14 Andrei Zavada <[email protected]>])
 
 AC_INIT([cnrun], [1.1.15_rc], [[email protected]])
-AC_CONFIG_SRCDIR([src/cnrun/runner-main.cc])
+AC_CONFIG_SRCDIR([src/cnrun/main.cc])
 AC_CONFIG_MACRO_DIR([m4])
 AC_PREREQ(2.61)
 
diff --git a/upstream/src/cnrun/main.cc b/upstream/src/cnrun/main.cc
index 1d2dd2c..5047c4e 100644
--- a/upstream/src/cnrun/main.cc
+++ b/upstream/src/cnrun/main.cc
@@ -1,17 +1,21 @@
 /*
- * Author: Andrei Zavada <[email protected]>
+ *       File name:  cnrun/main.cc
+ *         Project:  cnrun
+ *          Author:  Andrei Zavada <[email protected]>
+ * Initial version:  2008-09-02
  *
- * License: GPL-2+
+ *         Purpose:  function main
  *
- * Initial version: 2008-09-02
- *
- * CNModel runner (main, cmdline parser)
+ *         License:  GPL
  */
 
 
-#include <cstdarg>
 #include <unistd.h>
+#include <stdlib.h>
+#include <argp.h>
+#include <cstdarg>
 #include <list>
+#include <string>
 
 #include "libstilton/exprparser.hh"
 #include "runner.hh"
@@ -25,234 +29,320 @@ using namespace std;
 using namespace cnrun;
 
 
+
+// argparse
+
+const char
+        *argp_program_version = PACKAGE_STRING;
+        *argp_program_bug_address = PACKAGE_BUGREPORT;
+
+static char doc[] =
+       PACKAGE " -- a neuronal network model runner";
+
+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,
+        verbosely             = 'v',
+        help                  = 'h',
+};
+}  // namespace opt, strictly to enclose enum TOptChar
+
+#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+#pragma GCC diagnostic push
+static struct argp_option options[] = {
+        {"list-units",       opt::list_units, NULL,         0,
+         "List all available units and exit." },
+
+        {"chdir",            opt::dir,        "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,"
+         " indented on the line at -8 x this value."},
+
+        { 0 }
+};
+#pragma GCC diagnostic pop
+
+static char args_doc[] = "SCRIPTFILE(S)";
+
+static error_t parse_opt( int, char*, struct argp_state*);
+
+static struct argp argp = {
+        options,
+        parse_opt,
+        args_doc,
+        doc
+};
+
+
+static error_t
+parse_opt( int key, const char *arg, struct argp_state *state)
+{
+        auto& Q = *(SOptions*)state->input;
+
+        char *endp = nullptr;
+        switch ( key ) {
+        case opt::dt_max:
+                if ( Q.integration_dt_max = strtof( arg, &endp), *endp ) {
+                        fprintf( stderr, "Expected an FP 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 an FP 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 an FP 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 an FP 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;
+
+        case ARGP_KEY_ARG:
+                Q.scripts.emplace_back(arg);
+                break;
+
+        default:
+                return (error_t)ARGP_ERR_UNKNOWN;
+        }
+
+        return (error_t)0;
+}
+
+
 void
 cnrun::
-lprintf( int level, const char* fmt, ...)
+lprintf( int level, int verbosely, const char* fmt, ...)
 {
-       if ( level > Options.verbosely ) {
-               va_list ap;
-               va_start (ap, fmt);
-               vprintf( fmt, ap);
-               va_end (ap);
+        if ( level > verbosely ) {
+                va_list ap;
+                va_start (ap, fmt);
+                vprintf( fmt, ap);
+                va_end (ap);
        }
 }
 
 
-CModel *cnrun::Model;
-
-
-SCNRunnerOptions cnrun::Options;
-const char *ScriptFileName = ""; // CNRUN_DEFAULT_SCRIPT;
-
-
-
-#define CNRUN_CLPARSE_HELP_REQUEST     -1
-#define CNRUN_CLPARSE_ERROR            -2
-#define CNRUN_DUMP_PARAMS              -3
-
-namespace {
-static int parse_options( int argc, char **argv, list<SVariable>&);
-static void usage( const char *argv0);
-}
-
-#define CNRUN_EARGS            -1
-#define CNRUN_ESETUP           -2
-#define CNRUN_ETRIALFAIL       -3
 
 
 
+// #include "print-version.hh"
 void print_version( const char* appname);
 
 int
 main( int argc, char *argv[])
 {
-       print_version( "cnrun");
-
-       int retval = 0;
-
-       list<SVariable> Variables;
-       switch ( parse_options( argc, argv, Variables) ) {
-       case CNRUN_CLPARSE_ERROR:
-               fprintf( stderr, "Problem parsing command line or sanitising 
values; try -h for help\n");
-               return CNRUN_EARGS;
-       case CNRUN_CLPARSE_HELP_REQUEST:
-               usage( argv[0]);
-               return 0;
-       }
+        print_version( "cnrun");
+
+        cnrun::SOptions Options;
+        argp_parse( &argp, argc, argv, 0, NULL, (void*)&Options);
 
       // purely informational, requires no model
-       if ( Options.list_units ) {
-               cnmodel_dump_available_units();
-               return 0;
-       }
+        if ( Q.list_units ) {
+                cnmodel_dump_available_units();
+                return 0;
+        }
 
       // cd as requested
-       char *pwd = nullptr;
-       if ( Options.working_dir ) {
-               pwd = getcwd( nullptr, 0);
-               if ( chdir( Options.working_dir) ) {
-                       fprintf( stderr, "Failed to cd to \"%s\"", 
Options.working_dir);
-                       return CNRUN_EARGS;
-               }
-       }
-
-       __cn_verbosely = Options.verbosely;
-       __cn_default_unit_precision = Options.precision;
-
-       interpreter_run( ScriptFileName, 0, Options.interp_howstrict,
-                        true, true, Variables);
-
-       delete Model;
-
-       if ( pwd )
-               if ( chdir( pwd) )
-                       ;
-
-       return retval;
-}
-
-
-
-
-namespace {
-int
-parse_options( int argc, char **argv, list<SVariable>& Variables)
-{
-       int     c;
-
-       while ( (c = getopt( argc, argv, "e:t::L:E:g:k:UsC:n:D:v:h")) != -1 )
-               switch ( c ) {
-
-               case 'e':       ScriptFileName = optarg;                        
                break;
-
-               case 't':       switch ( optarg[0] ) {
-                               case 'T':       if ( sscanf( optarg+1, "%lg", 
&Options.integration_dt_max) != 1 ) {
-                                                       fprintf( stderr, "-tT 
takes a double");
-                                                       return 
CNRUN_CLPARSE_ERROR;
-                                               }                               
                break;
-                               case 't':       if ( sscanf( optarg+1, "%lg", 
&Options.integration_dt_min) != 1 ) {
-                                                       fprintf( stderr, "-tt 
takes a double");
-                                                       return 
CNRUN_CLPARSE_ERROR;
-                                               }                               
                break;
-                               case 'x':       if ( sscanf( optarg+1, "%lg", 
&Options.integration_dt_max_cap) != 1 ) {
-                                                       fprintf( stderr, "-tx 
takes a double");
-                                                       return 
CNRUN_CLPARSE_ERROR;
-                                               }                               
                break;
-                               default:        fprintf( stderr, "Unrecognised 
option modifier for -i");
-                                                       return 
CNRUN_CLPARSE_ERROR;
-                               }                                               
                break;
-
-               case 'L':       if ( strchr( optarg, 'd') != nullptr )
-                                       Options.listen_deferwrite = true;
-                               if ( strchr( optarg, '1') != nullptr )
-                                       Options.listen_1varonly = true;
-                               if ( strchr( optarg, 'b') != nullptr )
-                                       Options.listen_binary = true;
-                               if ( strchr( optarg, 'L') != nullptr )
-                                       Options.log_dt = true;                  
        break;
-
-               case 'E':       if ( sscanf( optarg, "%g", &Options.listen_dt) 
!= 1 ) {
-                                       fprintf( stderr, "-E takes a double");
-                                       return CNRUN_CLPARSE_ERROR;
-                               }                                               
break;
-               case 'g':       if ( sscanf( optarg, "%u", &Options.precision) 
!= 1 ) {
-                                       fprintf( stderr, "-g takes a short 
unsigned int");
-                                       return CNRUN_CLPARSE_ERROR;
-                               }                                               
break;
-
-               case 'n':       if ( optarg && *optarg == 'c' )
-                                       Options.dont_coalesce = true;           
break;
-
-               case 'k':       Options.log_spikers = true;
-                               switch ( *optarg ) {
-                               case '0':       
Options.log_spikers_use_serial_id = true;       break;
-                               case 'l':       
Options.log_spikers_use_serial_id = false;      break;
-                               case 'S':       if ( sscanf( optarg+1, "%g", 
&Options.spike_threshold) != 1 ) {
-                                                       fprintf( stderr, "-kS 
takes a double");
-                                                       return 
CNRUN_CLPARSE_ERROR;
-                                               }
-                               default:        fprintf( stderr, "Expecting 0, 
l, or S<double> after -k");
-                                               return CNRUN_CLPARSE_ERROR;
-                               }                                               
break;
-
-               case 'U':       Options.list_units = true;                      
break;
-
-
-               case 's':       Options.sort_units = true;                      
break;
-
-
-               case 'C':       Options.working_dir = optarg;                   
break;
-
-               case 'D':       {
-                                       double  unused;
-                                       CExpression expr;
-                                       if ( expr( optarg, unused, &Variables) 
) {
-                                               fprintf( stderr, "Malformed 
variable assignment with -D");
-                                               return CNRUN_CLPARSE_ERROR;
-                                       }
-                               }
-
-               case 'v':       Options.verbosely = strtol( optarg, nullptr, 
10);
-                               {       char *p;
-                                       if ( (p = strchr( optarg, '%')) )
-                                               
Options.display_progress_percent = (*(p+1) != '-');
-                                       if ( (p = strchr( optarg, 't')) )
-                                               Options.display_progress_time   
 = (*(p+1) != '-');
-                               }
-                                                                               
break;
-               case 'h':
-                       return CNRUN_CLPARSE_HELP_REQUEST;
-               case '?':
-               default:
-                       return CNRUN_CLPARSE_ERROR;
-               }
-
-       return 0;
+        char *pwd = nullptr;
+        if ( Q.working_dir ) {
+                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;
+                }
+        }
+
+        __cn_verbosely = Q.verbosely;
+        __cn_default_unit_precision = Q.precision;
+
+        for ( const auto& F : Options.scripts )
+                interpreter_run(
+                        F, 0, Options,
+                        true, true);
+
+        if ( pwd )
+                if ( chdir( pwd) )
+                        fprintf( stderr, "Failed to cd back to \"%s\"", pwd);
+
+        return 0;
 }
 
 
 
 
-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
-
-
-// EOF
+// 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
+// c-basic-offset: 8
+// End:
diff --git a/upstream/src/cnrun/runner.hh b/upstream/src/cnrun/runner.hh
index a98488b..123d8d3 100644
--- a/upstream/src/cnrun/runner.hh
+++ b/upstream/src/cnrun/runner.hh
@@ -1,19 +1,19 @@
 /*
- * Author: Andrei Zavada <[email protected]>
+ *       File name:  cnrun/runner.hh
+ *         Project:  cnrun
+ *          Author:  Andrei Zavada <[email protected]>
+ * Initial version:  2008-11-04
  *
- * License: GPL-2+
+ *         Purpose:  interpreter
  *
- * Initial version: 2008-11-04
- *
- * CNModel runner
+ *         License:  GPL
  */
 
-#ifndef CN_RUNNER_H
-#define CN_RUNNER_H
+#ifndef CN_CNRUN_RUNNER_H_
+#define CN_CNRUN_RUNNER_H_
 
-#include <vector>
 #include <list>
-#include <iostream>
+#include <string>
 
 #include "libstilton/exprparser.hh"
 
@@ -26,120 +26,97 @@
 
 namespace cnrun {
 
-enum {
-       CN_INTRP_STRICT,
-       CN_INTRP_LOOSE
+struct SInitOptions
+  : public cnrun::SModelOptions {
+        bool    dump_params:1,
+                list_units:1;
+        string  working_dir;
+
+        list<string>
+                scripts;
+
+        SInitOptions ()
+              : dump_params(false), list_units (false)
+                working_dir (".")
+                {}
 };
 
-struct SCNRunnerOptions {
-       bool    listen_1varonly:1,
-               listen_deferwrite:1,
-               listen_binary:1,
-               dump_params:1,
-               list_units:1,
-               sort_units:1,
-               log_dt:1,
-               log_spikers:1,
-               log_spikers_use_serial_id:1,
-               log_sdf:1,
-               display_progress_percent:1,
-               display_progress_time:1,
-               dont_coalesce:1;
-       const char *working_dir;
-       unsigned precision;
-       float   spike_threshold,
-               spike_lapse,
-               listen_dt;
-       double  //discrete_dt,
-               integration_dt_max,
-               integration_dt_min,
-               integration_dt_max_cap;
-       float   sxf_start_delay,
-               sxf_sample,
-               sdf_sigma;
-       int     interp_howstrict,
-               verbosely;
-
-       SCNRunnerOptions()
-             : listen_1varonly (true), listen_deferwrite (false), 
listen_binary (false),
-               dump_params(false), list_units (false),
-               sort_units (false),
-               log_dt (false),
-               log_spikers (false), log_spikers_use_serial_id (false),
-               log_sdf (false),
-               display_progress_percent (true),
-               display_progress_time (false),
-               dont_coalesce (false),
-               working_dir ("."),
-               precision (8),
-               spike_threshold (0.), spike_lapse (3.),
-               listen_dt(1.),
-               //discrete_dt(.5),
-               integration_dt_max (.5), integration_dt_min (1e-5), 
integration_dt_max_cap (5.),
-               sxf_start_delay (0.), sxf_sample (0.), sdf_sigma (0.),
-               interp_howstrict (CN_INTRP_LOOSE),
-               verbosely (1)
-               {}
+
+enum class TInterpStrictness {
+        strict,
+        loose
 };
 
-#define CNRUN_DEFAULT_SCRIPT "./Default.cnsh"
-
-extern SCNRunnerOptions Options;
-
-
-
-extern CModel *Model;
-
-int interpreter_run( const char *script_fname, int level, int howstrict,
-                    bool env_import, bool env_export, list<cnrun::SVariable> 
&varlist);
-
-
-enum {
-       CNCMD__noop = -1,
-       CNCMD_new_model = 0,
-       CNCMD_load_nml,
-       CNCMD_merge_nml,
-       CNCMD_add_neuron,
-       CNCMD_add_synapse,
-       CNCMD_reset,
-       CNCMD_reset_revert_params,
-       CNCMD_reset_state_units,
-       CNCMD_advance_until,
-       CNCMD_advance,
-       CNCMD_putout,
-       CNCMD_decimate,
-       CNCMD_start_listen,
-       CNCMD_stop_listen,
-       CNCMD_listen_dt,
-       CNCMD_listen_mode,
-       CNCMD_integration_dt_min,
-       CNCMD_integration_dt_max,
-       CNCMD_integration_dt_cap,
-       CNCMD_start_log_spikes,
-       CNCMD_stop_log_spikes,
-       CNCMD_set_sxf_params,
-       CNCMD_new_source,
-       CNCMD_show_sources,
-       CNCMD_connect_source,
-       CNCMD_disconnect_source,
-       CNCMD_set_parm_neuron,
-       CNCMD_set_parm_synapse,
-       CNCMD_cull_deaf_synapses,
-       CNCMD_describe_model,
-       CNCMD_show_units,
-       CNCMD_exec,
-       CNCMD_verbosity,
-       CNCMD_show_vars,
-       CNCMD_clear_vars,
-       CNCMD_pause,
-       CNCMD_exit
+class CInterpreter : public SOptions {
+        CModel* model;
+
+    public:
+        CState ()
+              : CModel (nullptr)
+                {}
+       ~CState ()
+                {
+                        if ( model )
+                                delete model;
+                }
+
+    private:
+        bool    regenerate_unit_labels,
+                regenerate_var_names,
+                regenerate_source_ids;
 };
 
+
+
+
 extern const char* const cnrun_cmd[];
 
-extern bool regenerate_unit_labels;
-extern bool regenerate_var_names;
-extern bool regenerate_source_ids;
+int interpreter_run( const char *script_fname, const SOptions&,
+                     bool env_import, bool env_export);
+
+
+enum class TInterpCommand {
+        noop,
+        new_model,
+        load_nml,
+        merge_nml,
+        add_neuron,
+        add_synapse,
+        reset,
+        reset_revert_params,
+        reset_state_units,
+        advance_until,
+        advance,
+        putout,
+        decimate,
+        start_listen,
+        stop_listen,
+        listen_dt,
+        listen_mode,
+        integration_dt_min,
+        integration_dt_max,
+        integration_dt_cap,
+        start_log_spikes,
+        stop_log_spikes,
+        set_sxf_params,
+        new_source,
+        show_sources,
+        connect_source,
+        disconnect_source,
+        set_parm_neuron,
+        set_parm_synapse,
+        cull_deaf_synapses,
+        describe_model,
+        show_units,
+        exec,
+        verbosity,
+        show_vars,
+        clear_vars,
+        pause,
+        exit
+};
+
+
 
 char** cnrun_completion( const char *text, int start, int end);
 
diff --git a/upstream/src/libcn/base-unit.cc b/upstream/src/libcn/base-unit.cc
index 56ec66d..92bdf36 100644
--- a/upstream/src/libcn/base-unit.cc
+++ b/upstream/src/libcn/base-unit.cc
@@ -29,16 +29,6 @@ using namespace std;
 
 
 
-double cnrun::__cn_dummy_double;
-
-unsigned short cnrun::__cn_default_unit_precision = 8;
-
-int cnrun::__cn_verbosely = 2;
-
-
-
-// mind that child
-
 cnrun::C_BaseUnit::
 C_BaseUnit( TUnitType intype, const char *inlabel,
            CModel* inM, int s_mask)
diff --git a/upstream/src/libcn/model.hh b/upstream/src/libcn/model.hh
index 2dd17a8..a1b2926 100644
--- a/upstream/src/libcn/model.hh
+++ b/upstream/src/libcn/model.hh
@@ -20,8 +20,8 @@ parameters.
 --------------------------------------------------------------------------*/
 
 
-#ifndef LIBCN_MODEL_H
-#define LIBCN_MODEL_H
+#ifndef CN_LIBCN_MODEL_H_
+#define CN_LIBCN_MODEL_H_
 
 #include <csignal>
 #include <list>
@@ -49,29 +49,66 @@ parameters.
 using namespace std;
 namespace cnrun {
 
-// CModel _status bits
-#define CN_MDL_LOGDT           (1 << 0)
-#define CN_MDL_LOGSPIKERS      (1 << 1)
-#define CN_MDL_LOGUSINGID      (1 << 2)
-#define CN_MDL_SORTUNITS       (1 << 3)
-#define CN_MDL_ALLOWNOISE      (1 << 4)
-#define CN_MDL_NOTREADY                (1 << 5)
-#define CN_MDL_DISKLESS                (1 << 6)
-#define CN_MDL_HAS_DDTB_UNITS  (1 << 7)
-#define CN_MDL_DISPLAY_PROGRESS_PERCENT        (1 << 8)
-#define CN_MDL_DISPLAY_PROGRESS_TIME   (1 << 9)
-#define CN_MDL_DONT_COALESCE           (1 << 10)
+
+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,
+                log_sdf:1,
+                display_progress_percent:1,
+                display_progress_time:1;
+        int     precision;
+        float   spike_threshold,
+                spike_lapse,
+                listen_dt;
+        double  //discrete_dt,
+                integration_dt_max,
+                integration_dt_min,
+                integration_dt_max_cap;
+        float   sxf_start_delay,
+                sxf_sample,
+                sdf_sigma;
+        int     verbosely;
+
+        list<SVariable>
+                variables;
+
+        SOptions ()
+              : 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),
+                display_progress_percent (true),
+                display_progress_time (false),
+                dont_coalesce (false),
+                precision (8),
+                spike_threshold (0.), spike_lapse (3.),
+                listen_dt(1.),
+                //discrete_dt(.5),
+                integration_dt_max (.5), integration_dt_min (1e-5), 
integration_dt_max_cap (5.),
+                sxf_start_delay (0.), sxf_sample (0.), sdf_sigma (0.),
+                verbosely (1)
+                {}
+};
 
 
 class CModel {
 
     public:
-       string  name;
+        string name;
 
     private:
-       int     _status;
+        int    _status;
     public:
-       int status()    { return _status; }
+        int status() const
+                {
+                        return _status;
+                }
 
       // structure ------
     friend class C_BaseSynapse;
@@ -708,4 +745,8 @@ CSynapseMxMap::preadvance()
 
 #endif
 
-// EOF
+// Local Variables:
+// 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

Reply via email to