最近,我升级到最新版本的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的调用不涉及引发错误的模拟。)这些本应被删除的数据的存储是否仍然存在的问题?如何避免此错误?
发布于 2015-05-07 02:44:14
我在官方的 tutorial上找到了一些提示。具体来说,
我有时使用详细的调试。当设置为2时,它将输出运行make文件时所期望的所有信息(包括.cpp文件的名称)。如果您需要检查生成的代码,看看事情进展如何,这是很好的。请注意,即使详细设置为0,也会将失败编译的错误消息打印到屏幕上。 下面的示例演示如何使用gcc,而不是使用上面相同的代码片段在windows上使用标准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了!
https://stackoverflow.com/questions/30064806
复制相似问题