gpt4 book ai didi

python - scipy.weave.inline 的语法错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:47 25 4
gpt4 key购买 nike

我最近升级到最新版本的 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 调用中没有模拟。)这些数据的某些存储应该被删除的问题是否仍然存在?我该如何避免此错误?

最佳答案

我在官方找到了一些提示weave tutorial .具体来说,

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.

设置 verbose=2force=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!

关于python - scipy.weave.inline 的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30064806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com