dshin
dshin

Reputation: 2398

parameter limit in sympy ufuncify

The sympy library has this cool ufuncify() method that converts a symbolic expression into C code, compiles it, and then outputs a lambda function that calls that C method.

I made this simple demo, 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]

It works for small N:

$ python demo.py 21
210.0

But for larger N, I get the following error:

$ python demo.py 22
Traceback (most recent call last):
  File "demo.py", line 13, in 
    f = ufuncify(theta, summation)
  File "/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py", line 485, in ufuncify
    return autowrap(C.Equality(y[i], f(*args)), **kwargs)
  File "/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py", line 403, in autowrap
    return code_wrapper.wrap_code(routine, helpers=helps)
  File "/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py", line 139, in wrap_code
    self._process_files(routine)
  File "/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py", line 158, in _process_files
    " ".join(command), e.output))
sympy.utilities.autowrap.CodeWrapError: Error while executing command: f2py -m wrapper_module_0 -c wrapped_code_0.f90. Command output is:
running build
running config_cc
unifing config_cc, config, build_clib, build_ext, build commands --compiler options
running config_fc
unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options
running build_src
build_src
building extension "wrapper_module_0" sources
f2py options: []
f2py:> /tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c
creating /tmp/tmpKbJQuO
creating /tmp/tmpKbJQuO/src.linux-x86_64-2.7
Reading fortran codes...
        Reading file 'wrapped_code_0.f90' (format:free)
Post-processing...
        Block: wrapper_module_0
                        Block: autofunc
Post-processing (stage 2)...
Building modules...
        Building module "wrapper_module_0"...
                Constructing wrapper function "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])
        Wrote C/API module "wrapper_module_0" to file "/tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c"
  adding '/tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.c' to sources.
  adding '/tmp/tmpKbJQuO/src.linux-x86_64-2.7' to include_dirs.
copying /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
copying /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: building npy-pkg config files
running build_ext
customize UnixCCompiler
customize UnixCCompiler using build_ext
customize Gnu95FCompiler
Found executable /opt/user/x86_64/gcc-4.7.2/bin/gfortran
customize Gnu95FCompiler
customize Gnu95FCompiler using build_ext
building 'wrapper_module_0' extension
compiling C sources
C compiler: gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC

creating /tmp/tmpKbJQuO/tmp
creating /tmp/tmpKbJQuO/tmp/tmpKbJQuO
creating /tmp/tmpKbJQuO/tmp/tmpKbJQuO/src.linux-x86_64-2.7
compile options: '-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
In file included from /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1728:0,
                 from /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:17,
                 from /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h:15,
                 from /tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.h:13,
                 from /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: #warning "Using deprecated NumPy API, disable it by #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: warning: âpy_sizeâefined but not used [-Wunused-function]
gcc: /tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.c
In file included from /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1728:0,
                 from /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:17,
                 from /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h:15,
                 from /tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.h:13,
                 from /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: #warning "Using deprecated NumPy API, disable it by #defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
compiling Fortran sources
Fortran f77 compiler: /opt/user/x86_64/gcc-4.7.2/bin/gfortran -Wall -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops
Fortran f90 compiler: /opt/user/x86_64/gcc-4.7.2/bin/gfortran -Wall -fno-second-underscore -fPIC -O3 -funroll-loops
Fortran fix compiler: /opt/user/x86_64/gcc-4.7.2/bin/gfortran -Wall -ffixed-form -fno-second-underscore -Wall -fno-second-underscore -fPIC -O3 -funroll-loops
compile options: '-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
Warning: Line truncated at (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
Error: Unexpected junk in formal argument list at (1)
wrapped_code_0.f90:33.3:

end subroutine
   1
Error: Expecting END PROGRAM statement at (1)
Error: Unexpected end of file in '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
Warning: Line truncated at (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
Error: Unexpected junk in formal argument list at (1)
wrapped_code_0.f90:33.3:

end subroutine
   1
Error: Expecting END PROGRAM statement at (1)
Error: Unexpected end of file in 'wrapped_code_0.f90'
error: Command "/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" failed with exit status 1

How can I get this to work?

Upvotes: 2

Views: 507

Answers (2)

dshin
dshin

Reputation: 2398

I posted on the sympy mailing list and got a reply. This is a known bug that has been fixed in their development branch. Here is the fix: https://github.com/sympy/sympy/pull/7968

Upvotes: 1

Ø. Jensen
Ø. Jensen

Reputation: 993

There is no doubt that you found a bug in Sympy, but you might work around it by passing flags to the backend. According to the documentation at http://docs.sympy.org/latest/modules/utilities/autowrap.html, ufuncify passes keyword arguments on to autowrap. The flags keyword argument of autowrap looks promising. In turn, f2py (the default backend) has options that let you forward flags to the compiler.

Using gfortran as the compiler, I'd try the following:

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

(This is currently not tested.)

For clarity: --f90flags is an option of f2py, which can be used to specify options for the compiler. The --ffree-line-length-none flag is forwarded to the compiler, and will instruct gfortran to never truncate the lines in the source code.

Upvotes: 0

Related Questions