我最近升级到brian2
的最新版本,并在运行神经模拟时开始看到以下警告:
WARNING brian2.codegen.runtime.weave_rt.weave_rt.failed_compile_test: Cannot use weave, a test compilation failed: invalid syntax (<string>, line 1) (SyntaxError)
经过一番挖掘后,我发现此警告是由brian2
个模块中的这些行引起的错误造成的:
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)
运行此代码,我得到以下内容:
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
我注意到inline
输出的疯狂字符串是我之前运行过的模拟中的变量:例如s_gaba
。 (对inline
的调用不会引起模拟,从而引发错误。)是否存在应该删除的这些数据存储的问题仍然存在?我怎么能避免这个错误?
答案 0 :(得分:-1)
我在官方weave
tutorial找到了一些提示。具体地,
我有时会使用verbose进行调试。设置为2时,它将输出您希望运行make文件的所有信息(包括.cpp文件的名称)。如果您需要检查生成的代码以查看事情的发展方向,那么这很好。请注意,即使将详细信息设置为0,也会将来自失败编译的错误消息打印到屏幕上。
以下示例演示如何在Windows上使用gcc而不是标准的msvc编译器,使用与上面相同的代码片段。因为该示例已经编译,所以需要force = 1标志以使inline()忽略先前编译的版本并使用gcc重新编译。
设置verbose=2
和force=1
,我得到以下内容:
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
我在这里跳出的是我的主目录中存在缓存:/home/despo/dbliss/.cache/scipy/python27_compiled/sc_302644cc5257b9feebbfde0f5856848e1.cpp
。
删除此缓存中的所有内容 - 即$ rm -r ~/.cache/scipy
- 可解决此问题。不再SyntaxError
!