【问题标题】:parameter limit in sympy ufuncifysympy ufuncify 中的参数限制
【发布时间】:2014-11-20 14:26:32
【问题描述】:

sympy 库有一个很酷的 ufuncify() 方法,可以将符号表达式转换为 C 代码,对其进行编译,然后输出调用该 C 方法的 lambda 函数。

我做了这个简单的演示,demo.py:

import sympy
from sympy.utilities.autowrap import ufuncify
import sys

N = int(sys.argv[1])
theta = []
values = []
for n in range(N):
    theta.append(sympy.symbols('x%s' % n))
    values.append(n)

summation = sum(theta)
f = ufuncify(theta, summation)
print f(*values)[0]

它适用于小型N

$蟒蛇演示.py 21 210.0

但对于较大的N,我收到以下错误:

$ python demo.py 22 回溯(最近一次通话最后): 文件“demo.py”,第 13 行,在 f = ufuncify(θ,求和) ufuncify 中的文件“/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py”,第 485 行 return autowrap(C.Equality(y[i], f(*args)), **kwargs) 自动包装中的文件“/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py”,第 403 行 return code_wrapper.wrap_code(routine, helpers=helps) wrap_code 中的文件“/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py”,第 139 行 self._process_files(例程) _process_files 中的文件“/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py”,第 158 行 " ".join(command), e.output)) sympy.utilities.autowrap.CodeWrapError:执行命令时出错:f2py -m wrapper_module_0 -c Wrapper_code_0.f90。命令输出为: 运行构建 运行 config_cc 统一 config_cc、config、build_clib、build_ext、构建命令 -- 编译器选项 运行 config_fc 统一 config_fc、config、build_clib、build_ext、构建命令 --fcompiler 选项 运行 build_src build_src 构建扩展“wrapper_module_0”源 f2py 选项:[] f2py:> /tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c 创建 /tmp/tmpKbJQuO 创建 /tmp/tmpKbJQuO/src.linux-x86_64-2.7 读取fortran代码... 读取文件'wrapped_code_0.f90'(格式:免费) 后期处理... 块:wrapper_module_0 块:自动函数 后处理(第 2 阶段)... 构建模块... 构建模块“wrapper_module_0”... 构造包装函数“autofunc”... y_15 = autofunc(x_16,x1,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x2,x20,x21,x3,x4,x5,x6,x7,x8,x9,[m_17 ]) 将 C/API 模块“wrapper_module_0”写入文件“/tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c” 将“/tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.c”添加到源。 将 '/tmp/tmpKbJQuO/src.linux-x86_64-2.7' 添加到 include_dirs。 复制 /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/f2py/src/fortranobject.c -> /tmp/tmpKbJQuO/src.linux-x86_64-2.7 复制 /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/f2py/src/fortranobject.h -> /tmp/tmpKbJQuO/src.linux-x86_64-2.7 build_src:构建 npy-pkg 配置文件 运行 build_ext 自定义 UnixCCompiler 使用 build_ext 自定义 UnixCCompiler 自定义 Gnu95FCompiler 找到可执行文件 /opt/user/x86_64/gcc-4.7.2/bin/gfortran 自定义 Gnu95FCompiler 使用 build_ext 自定义 Gnu95FCompiler 构建“wrapper_module_0”扩展 编译 C 源代码 C 编译器:gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC 创建 /tmp/tmpKbJQuO/tmp 创建 /tmp/tmpKbJQuO/tmp/tmpKbJQuO 创建 /tmp/tmpKbJQuO/tmp/tmpKbJQuO/src.linux-x86_64-2.7 编译选项:'-I/tmp/tmpKbJQuO/src.linux-x86_64-2.7 -I/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include -I /opt/user/x86_64/Python-2.7.3/include/python2.7 -c' gcc:/tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c 在 /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1728:0 包含的文件中, 来自/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:17, 来自 /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h:15, 来自/tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.h:13, 来自/tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c:18: /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/npy_deprecated_api.h:11:2: 警告:#warning“使用已弃用的 NumPy API,禁用通过#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] /tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c:111:12:警告:âpy_sizeâ定义但未使用 [-Wunused-function] gcc:/tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.c 在 /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1728:0 包含的文件中, 来自/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:17, 来自 /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h:15, 来自/tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.h:13, 来自/tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.c:2: /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/npy_deprecated_api.h:11:2: 警告:#warning“使用已弃用的 NumPy API,禁用通过#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp] 编译 Fortran 源代码 Fortran f77 编译器:/opt/user/x86_64/gcc-4.7.2/bin/gfortran -Wall -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops Fortran f90 编译器:/opt/user/x86_64/gcc-4.7.2/bin/gfortran -Wall -fno-second-underscore -fPIC -O3 -funroll-loops Fortran 修复编译器:/opt/user/x86_64/gcc-4.7.2/bin/gfortran -Wall -ffixed-form -fno-second-underscore -Wall -fno-second-underscore -fPIC -O3 -funroll-loops 编译选项:'-I/tmp/tmpKbJQuO/src.linux-x86_64-2.7 -I/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include -I /opt/user/x86_64/Python-2.7.3/include/python2.7 -c' gfortran:f90:wrapped_code_0.f90 Wrapped_code_0.f90:1.133: 4、x15、x16、x17、x18、x19、x2、x20、x21、x3、x4、x5、x6、x7、x8、x9、y_15 1 警告:在 (1) 处截断的行 Wrapped_code_0.f90:1.132: 14、x15、x16、x17、x18、x19、x2、x20、x21、x3、x4、x5、x6、x7、x8、x9、y_15 1 错误:(1) 的形式参数列表中出现意外的垃圾 Wrapped_code_0.f90:33.3: 结束子程序 1 错误:在 (1) 处需要 END PROGRAM 语句 错误:“wrapped_code_0.f90”中的文件意外结束 Wrapped_code_0.f90:1.133: 4、x15、x16、x17、x18、x19、x2、x20、x21、x3、x4、x5、x6、x7、x8、x9、y_15 1 警告:在 (1) 处截断的行 Wrapped_code_0.f90:1.132: 14、x15、x16、x17、x18、x19、x2、x20、x21、x3、x4、x5、x6、x7、x8、x9、y_15 1 错误:(1) 的形式参数列表中出现意外的垃圾 Wrapped_code_0.f90:33.3: 结束子程序 1 错误:在 (1) 处需要 END PROGRAM 语句 错误:“wrapped_code_0.f90”中的文件意外结束 错误:命令“/opt/user/x86_64/gcc-4.7.2/bin/gfortran -Wall -fno-second-underscore -fPIC -O3 -funroll-loops -I/tmp/tmpKbJQuO/src.linux-x86_64-2.7 -I/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include -I/opt/user/x86_64/Python-2.7.3/include/python2.7 -c -c Wrapped_code_0.f90 -o /tmp/tmpKbJQuO/wrapped_code_0.o" 失败,退出状态为 1

我怎样才能让它工作?

【问题讨论】:

  • Warning: Line truncated at (1) - 听起来一个人只能处理这么多变量。我希望这是您应该对 sympy 提出的错误。
  • 看起来像一个错误 --- 生成的 fortran 代码行太长。 ufuncify 应该包装这些,但显然它没有。

标签: python numpy sympy


【解决方案1】:

我在 sympy 邮件列表上发帖并得到了回复。这是一个已在其开发分支中修复的已知错误。这是修复:https://github.com/sympy/sympy/pull/7968

【讨论】:

    【解决方案2】:

    毫无疑问,您在 Sympy 中发现了一个错误,但您可以通过将标志传递给后端来解决它。根据http://docs.sympy.org/latest/modules/utilities/autowrap.html 的文档,ufuncify 将关键字参数传递给自动换行。 autowrapflags 关键字参数看起来很有希望。反过来,f2py(默认后端)具有允许您将标志转发给编译器的选项。

    使用 gfortran 作为编译器,我会尝试以下操作:

    f = ufuncify(theta, summation, flags='--f90flags="--ffree-line-length-none"')
    

    (目前尚未测试。)

    为清楚起见:--f90flags 是 f2py 的一个选项,可用于指定编译器的选项。 --ffree-line-length-none 标志被转发给编译器,并将指示 gfortran 永远不要截断源代码中的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多