简体   繁体   中英

SyntaxError with scipy.weave.inline

I recently upgraded to the newest version of brian2 , and began to see the following warning when running neural simulations:

WARNING  brian2.codegen.runtime.weave_rt.weave_rt.failed_compile_test: Cannot use weave, a test compilation failed: invalid syntax (<string>, line 1) (SyntaxError)

After some digging, I found that this warning is due to an error raised by these lines in one of brian2 's modules:

compiler, extra_compile_args = get_compiler_and_args()
weave.inline('int x=0;', [],
             compiler=compiler,
             headers=['<algorithm>', '<limits>'],
             extra_compile_args=extra_compile_args,
             verbose=0)

Running this code, I get the following:

In [11]: from scipy import weave

In [12]: compiler
Out[12]: 'gcc'

In [13]: extra_compile_args 
Out[13]: ['-w', '-O3']

In [14]: weave.inline('int x=0;', [], compiler=compiler, headers=['<algorithm>', '<limits>'], extra_compile_args=extra_compile_args, verbose=0)
  File "<string>", line 1
    '\t\t\t\t// SUPPORT CODE\n\t//static py::object _namespace_numpy_rand;\n\t//#define BUFFER_SIZE 1024\n\t//// A rand() function that returns a single random number. Internally\n\t//// it asks numpy\'s rand function for BUFFER_SIZE\n\t//// random numbers at a time and then returns one number from this\n\t//// buffer.\n\t//// It needs a reference to the numpy_rand object (the original numpy\n\t//// function), because this is otherwise only available in\n\t//// compiled_function (where is is automatically handled by weave).\n\t////\n\t//double _rand(const int _vectorisation_idx) {\n\t//    // the _vectorisation_idx argument is unused for now, it could in\n\t//    // principle be used to get reproducible random numbers when using\n\t//    // OpenMP etc.\n\t//    static PyArrayObject *rand_buffer = NULL;\n\t//    static double *buf_pointer = NULL;\n\t//    static npy_int curbuffer = 0;\n\t//    if(curbuffer==0)\n\t//    {\n\t//        if(rand_buffer) Py_DECREF(rand_buffer);\n\t//        py::tuple args(1);\n\t//        args[0] = BUFFER_SIZE;\n\t//        rand_buffer = (PyArrayObject *)PyArray_FromAny(_namespace_numpy_rand.call(args),\n\t//                                                       NULL, 1, 1, 0, NULL);\n\t//        buf_pointer = (double*)PyArray_GETPTR1(rand_buffer, 0);\n\t//    }\n\t//    double number = buf_pointer[curbuffer];\n\t//    curbuffer = curbuffer+1;\n\t//    if (curbuffer == BUFFER_SIZE)\n\t//        // This seems to be safer then using (curbuffer + 1) % BUFFER_SIZE, we might run into\n\t//        // an integer overflow for big networks, otherwise.\n\t//        curbuffer = 0;\n\t//    return number;\n\t//}\n\n\n\t\t\t//// HANDLE DENORMALS ////\n\t\n\n\n\t\t\t//// HASH DEFINES ////\n\t\n\n\n\t\t\t//// POINTERS ////\n\tint* __restrict  _ptr_array_synapses_4_N_incoming = _array_synapses_4_N_incoming;\n\tint* __restrict  _ptr_array_poissongroup_i = _array_poissongroup_i;\n\tint* __restrict  _ptr_array_neurongroup_i = _array_neurongroup_i;\n\tint* __restrict  _ptr_array_synapses_4__synaptic_post = _array_synapses_4__synaptic_post;\n\tint* __restrict  _ptr_array_synapses_4_N_outgoing = _array_synapses_4_N_outgoing;\n\tint* __restrict  _ptr_array_synapses_4__synaptic_pre = _array_synapses_4__synaptic_pre;\n\t_namespace_numpy_rand = _numpy_rand;\n\n\n\n    srand((unsigned int)time(NULL));\n    const int _buffer_size = 1024;\n    int *const _prebuf = new int[_buffer_size];\n    int *const _postbuf = new int[_buffer_size];\n    int *const _synprebuf = new int[1];\n    int *const _synpostbuf = new int[1];\n    int _curbuf = 0;\n\n    // scalar code\n\tconst intrray_neurongroup_1_s_ext;\n\tdouble* __restrict  _ptr_array_neurongroup_1_s_gaba = _array_neurongroup_1_s_gaba;\n\tdouble* __restrict  _ptr_array_neurongroup_1_v = _array_neurongroup_1_v;\n\tdouble* __restrict  _ptr_array_neurongroup_1_s_tot_ampa = _array_neurongroup_1_s_tot_ampa;\n\n\n\n\t//// MAIN CODE ////////////\n\n\t// scalar code\n\tconst int _vectorisation_idx = 1;\n \t\n const double _lio_const_1 = - dt;\n const double _lio_const_2 = - G_ampa;\n const double _lio_const_3 = - E_ampa;\n const double _lio_const_4 = - E_gaba;\n const double _lio_const_5 = - E_nmda;\n const double _lio_const_6 = - a;\n const double _lio_const_7 = - El_i;\n\n\n\tfor(int _idx=0; _idx<N; _idx++)\n\t{\n\t    // vector code\n\t\tconst int _vectorisation_idx = _idx;\n      \t\t    \n      const double s_tot_ampa = _ptr_array_neurongroup_1_s_tot_ampa[_idx];\n      double s_ext = _ptr_array_neurongroup_1_s_ext[_idx];\n      double s_gaba = _ptr_array_neurongroup_1_s_gaba[_idx];\n      const double s_tot_nmda = _ptr_array_neurongroup_1_s_tot_nmda[_idx];\n      double v = _ptr_array_neurongroup_1_v[_idx];\n      const double lastspike = _ptr_array_neurongroup_1_lastspike[_idx];\n      bool not_refractory = _ptr_array_neurongroup_1_not_refractory[_idx];\n      not_refractory = (t - lastspike) > tr_i;\n      const double __k_s_ext = (_lio_const_1 * s_ext) / t_ampa;\n      const double __k_s_gaba = (_lio_const_1 * s_gaba) / t_gaba;\n      const double __k_v = ((dt * ((((((_lio_const_2 * s_tot_ampa) * (_lio_const_3 + v)) - ((G_ext * s_ext) * (_lio_const_3 + v))) - ((G_gaba * s_gaba) * (_lio_const_4 + v))) - (((G_nmda * s_tot_nmda) * (_lio_const_5 + v)) / ((b * exp(_lio_const_6 * v)) + 1.0))) - (gl_i * (_lio_const_7 + v)))) * int_(not_refractory)) / C_m;\n      const double _s_ext = ((_lio_const_1 * ((0.5 * __k_s_ext) + s_ext)) / t_ampa) + s_ext;\n      const double _s_gaba = ((_lio_const_1 * ((0.5 * __k_s_gaba) + s_gaba)) / t_gaba) + s_gaba;\n      const double _v = v + (((dt * ((((((_lio_const_2 * s_tot_ampa) * ((_lio_const_3 + (0.5 * __k_v)) + v)) - ((G_ext * ((0.5 * __k_s_ext) + s_ext)) * ((_lio_const_3 + (0.5 * __k_v)) + v))) - ((G_gaba * ((0.5 * __k_s_gaba) + s_gaba)) * ((_lio_const_4 + (0.5 * __k_v)) + v))) - (((G_nmda * s_tot_nmda) * ((_lio_const_5 + (0.5 * __k_v)) + v)) / ((b * exp(_lio_const_6 * ((0.5 * __k_v) + v))) + 1.0))) - (gl_i * ((_lio_const_7 + (0.5 * __k_v)) + v)))) * int_(not_refractory)) / C_m);\n      s_ext = _s_ext;\n      s_gaba = _s_gaba;\n      if(not_refractory)\n          v = _v;\n      _ptr_array_neurongroup_1_s_gaba[_idx] = s_gaba;\n      _ptr_array_neurongroup_1_v[_idx] = v;\n      _ptr_array_neurongroup_1_s_ext[_idx] = s_ext;\n      _ptr_array_neurongroup_1_not_refractory[_idx] = not_refractory;\n\n\n\t}\n\n/*\nThe following code is just compiler options for the call to weave.inline.\nBy including them here, we force a recompile if the compiler options change,\nwhich is a good thing (e.g. switching -ffast-math on and off).\n\nsupport_code:\n  \t\t\n  int int_(const bool value)\n  {\n      return value ? 1 : 0;\n  }\n\n\n\n\ncompiler:\ngcc\n\nextra_compile_args:\n['-w', '-O3']\n\ninclude_dirs:\n['/usr/local/anaconda/include']\n*/\n        ", (119808, 66)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ^
SyntaxError: invalid syntax

What I notice in that crazy string that inline outputs are variables from a previous simulation I've run: eg, s_gaba . (No simulation is involved in the call to inline that raises the error.) Is the problem that some store of these data that should have been deleted is still hanging around? How might I avoid this error?

I found some tips in the official weave tutorial . Specifically,

I use verbose sometimes for debugging. When set to 2, it'll output all the information (including the name of the .cpp file) that you'd expect from running a make file. This is nice if you need to examine the generated code to see where things are going haywire. Note that error messages from failed compiles are printed to the screen even if verbose is set to 0.

The following example demonstrates using gcc instead of the standard msvc compiler on windows using same code fragment as above. Because the example has already been compiled, the force=1 flag is needed to make inline() ignore the previously compiled version and recompile using gcc.

Setting verbose=2 and force=1 , I got the following:

In [3]: weave.inline('int x=0;', [], compiler='gcc', headers=

['<algorithm>', '<limits>'], extra_compile_args=['-w', '-03'], verbose=2, force=1)
<weave: compiling>
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b
running build_ext
running build_src
build_src
building extension "sc_302644cc5257b9feebbfde0f5856848e1" sources
build_src: building npy-pkg config files
customize UnixCCompiler
customize UnixCCompiler using build_ext
customize UnixCCompiler
customize UnixCCompiler using build_ext
building 'sc_302644cc5257b9feebbfde0f5856848e1' extension
compiling C++ sources
C compiler: g++ -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -fPIC

creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo/dbliss
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo/dbliss/.cache
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo/dbliss/.cache/scipy
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo/dbliss/.cache/scipy/python27_compiled
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7/site-packages
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7/site-packages/scipy
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7/site-packages/scipy/weave
creating /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7/site-packages/scipy/weave/scxx
compile options: '-I/usr/local/anaconda/lib/python2.7/site-packages/scipy/weave -I/usr/local/anaconda/lib/python2.7/site-packages/scipy/weave/scxx -I/usr/local/anaconda/lib/python2.7/site-packages/numpy/core/include -I/usr/local/anaconda-1.9.2/include/python2.7 -c'
extra options: '-w -03'
g++: /home/despo/dbliss/.cache/scipy/python27_compiled/sc_302644cc5257b9feebbfde0f5856848e1.cpp
g++: unrecognized option '-03'
g++: /usr/local/anaconda/lib/python2.7/site-packages/scipy/weave/scxx/weave_imp.cpp
g++: unrecognized option '-03'
g++ -pthread -shared /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/home/despo/dbliss/.cache/scipy/python27_compiled/sc_302644cc5257b9feebbfde0f5856848e1.o /tmp/scipy-dbliss-wzdMj_/python27_intermediate/compiler_0129f738e3db7528dd918ff316c8b91b/usr/local/anaconda/lib/python2.7/site-packages/scipy/weave/scxx/weave_imp.o -L/usr/local/anaconda-1.9.2/lib -lpython2.7 -o /home/despo/dbliss/.cache/scipy/python27_compiled/sc_302644cc5257b9feebbfde0f5856848e1.so
  File "<string>", line 1
    '\t\t\t\t// SUPPORT CODE\n\t//static py::object _namespace_numpy_rand;\n\t//#define BUFFER_SIZE 1024\n\t//// A rand() function that returns a single random number. Internally\n\t//// it asks numpy\'s rand function for BUFFER_SIZE\n\t//// random numbers at a time and then returns one number from this\n\t//// buffer.\n\t//// It needs a reference to the numpy_rand object (the original numpy\n\t//// function), because this is otherwise only available in\n\t//// compiled_function (where is is automatically handled by weave).\n\t////\n\t//double _rand(const int _vectorisation_idx) {\n\t//    // the _vectorisation_idx argument is unused for now, it could in\n\t//    // principle be used to get reproducible random numbers when using\n\t//    // OpenMP etc.\n\t//    static PyArrayObject *rand_buffer = NULL;\n\t//    static double *buf_pointer = NULL;\n\t//    static npy_int curbuffer = 0;\n\t//    if(curbuffer==0)\n\t//    {\n\t//        if(rand_buffer) Py_DECREF(rand_buffer);\n\t//        py::tuple args(1);\n\t//        args[0] = BUFFER_SIZE;\n\t//        rand_buffer = (PyArrayObject *)PyArray_FromAny(_namespace_numpy_rand.call(args),\n\t//                                                       NULL, 1, 1, 0, NULL);\n\t//        buf_pointer = (double*)PyArray_GETPTR1(rand_buffer, 0);\n\t//    }\n\t//    double number = buf_pointer[curbuffer];\n\t//    curbuffer = curbuffer+1;\n\t//    if (curbuffer == BUFFER_SIZE)\n\t//        // This seems to be safer then using (curbuffer + 1) % BUFFER_SIZE, we might run into\n\t//        // an integer overflow for big networks, otherwise.\n\t//        curbuffer = 0;\n\t//    return number;\n\t//}\n\n\n\t\t\t//// HANDLE DENORMALS ////\n\t\n\n\n\t\t\t//// HASH DEFINES ////\n\t\n\n\n\t\t\t//// POINTERS ////\n\tint* __restrict  _ptr_array_synapses_4_N_incoming = _array_synapses_4_N_incoming;\n\tint* __restrict  _ptr_array_poissongroup_i = _array_poissongroup_i;\n\tint* __restrict  _ptr_array_neurongroup_i = _array_neurongroup_i;\n\tint* __restrict  _ptr_array_synapses_4__synaptic_post = _array_synapses_4__synaptic_post;\n\tint* __restrict  _ptr_array_synapses_4_N_outgoing = _array_synapses_4_N_outgoing;\n\tint* __restrict  _ptr_array_synapses_4__synaptic_pre = _array_synapses_4__synaptic_pre;\n\t_namespace_numpy_rand = _numpy_rand;\n\n\n\n    srand((unsigned int)time(NULL));\n    const int _buffer_size = 1024;\n    int *const _prebuf = new int[_buffer_size];\n    int *const _postbuf = new int[_buffer_size];\n    int *const _synprebuf = new int[1];\n    int *const _synpostbuf = new int[1];\n    int _curbuf = 0;\n\n    // scalar code\n\tconst intrray_neurongroup_1_s_ext;\n\tdouble* __restrict  _ptr_array_neurongroup_1_s_gaba = _array_neurongroup_1_s_gaba;\n\tdouble* __restrict  _ptr_array_neurongroup_1_v = _array_neurongroup_1_v;\n\tdouble* __restrict  _ptr_array_neurongroup_1_s_tot_ampa = _array_neurongroup_1_s_tot_ampa;\n\n\n\n\t//// MAIN CODE ////////////\n\n\t// scalar code\n\tconst int _vectorisation_idx = 1;\n \t\n const double _lio_const_1 = - dt;\n const double _lio_const_2 = - G_ampa;\n const double _lio_const_3 = - E_ampa;\n const double _lio_const_4 = - E_gaba;\n const double _lio_const_5 = - E_nmda;\n const double _lio_const_6 = - a;\n const double _lio_const_7 = - El_i;\n\n\n\tfor(int _idx=0; _idx<N; _idx++)\n\t{\n\t    // vector code\n\t\tconst int _vectorisation_idx = _idx;\n      \t\t    \n      const double s_tot_ampa = _ptr_array_neurongroup_1_s_tot_ampa[_idx];\n      double s_ext = _ptr_array_neurongroup_1_s_ext[_idx];\n      double s_gaba = _ptr_array_neurongroup_1_s_gaba[_idx];\n      const double s_tot_nmda = _ptr_array_neurongroup_1_s_tot_nmda[_idx];\n      double v = _ptr_array_neurongroup_1_v[_idx];\n      const double lastspike = _ptr_array_neurongroup_1_lastspike[_idx];\n      bool not_refractory = _ptr_array_neurongroup_1_not_refractory[_idx];\n      not_refractory = (t - lastspike) > tr_i;\n      const double __k_s_ext = (_lio_const_1 * s_ext) / t_ampa;\n      const double __k_s_gaba = (_lio_const_1 * s_gaba) / t_gaba;\n      const double __k_v = ((dt * ((((((_lio_const_2 * s_tot_ampa) * (_lio_const_3 + v)) - ((G_ext * s_ext) * (_lio_const_3 + v))) - ((G_gaba * s_gaba) * (_lio_const_4 + v))) - (((G_nmda * s_tot_nmda) * (_lio_const_5 + v)) / ((b * exp(_lio_const_6 * v)) + 1.0))) - (gl_i * (_lio_const_7 + v)))) * int_(not_refractory)) / C_m;\n      const double _s_ext = ((_lio_const_1 * ((0.5 * __k_s_ext) + s_ext)) / t_ampa) + s_ext;\n      const double _s_gaba = ((_lio_const_1 * ((0.5 * __k_s_gaba) + s_gaba)) / t_gaba) + s_gaba;\n      const double _v = v + (((dt * ((((((_lio_const_2 * s_tot_ampa) * ((_lio_const_3 + (0.5 * __k_v)) + v)) - ((G_ext * ((0.5 * __k_s_ext) + s_ext)) * ((_lio_const_3 + (0.5 * __k_v)) + v))) - ((G_gaba * ((0.5 * __k_s_gaba) + s_gaba)) * ((_lio_const_4 + (0.5 * __k_v)) + v))) - (((G_nmda * s_tot_nmda) * ((_lio_const_5 + (0.5 * __k_v)) + v)) / ((b * exp(_lio_const_6 * ((0.5 * __k_v) + v))) + 1.0))) - (gl_i * ((_lio_const_7 + (0.5 * __k_v)) + v)))) * int_(not_refractory)) / C_m);\n      s_ext = _s_ext;\n      s_gaba = _s_gaba;\n      if(not_refractory)\n          v = _v;\n      _ptr_array_neurongroup_1_s_gaba[_idx] = s_gaba;\n      _ptr_array_neurongroup_1_v[_idx] = v;\n      _ptr_array_neurongroup_1_s_ext[_idx] = s_ext;\n      _ptr_array_neurongroup_1_not_refractory[_idx] = not_refractory;\n\n\n\t}\n\n/*\nThe following code is just compiler options for the call to weave.inline.\nBy including them here, we force a recompile if the compiler options change,\nwhich is a good thing (e.g. switching -ffast-math on and off).\n\nsupport_code:\n  \t\t\n  int int_(const bool value)\n  {\n      return value ? 1 : 0;\n  }\n\n\n\n\ncompiler:\ngcc\n\nextra_compile_args:\n['-w', '-O3']\n\ninclude_dirs:\n['/usr/local/anaconda/include']\n*/\n        ", (119808, 66)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ^
SyntaxError: invalid syntax

What jumps out at me here is the existence of a cache in my home directory: /home/despo/dbliss/.cache/scipy/python27_compiled/sc_302644cc5257b9feebbfde0f5856848e1.cpp .

Removing everything in this cache -- ie, $ rm -r ~/.cache/scipy -- resolves the issue. No more SyntaxError !

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM