, В настоящее время ищем способ обойти эти проблемы, тем временем все еще рады любым предложениям или намекам на ФП.

я есть следующая проблема:

Я хочу использовать autowrap для генерации скомпилированной версии матрицы sympy с ячейками, содержащими выражения sympy. В зависимости от спецификации моей проблемы количество аргументов может быть очень большим.

Я столкнулся со следующими 2 проблемами:

Число аргументов, которые принимает autowrap, кажется ограниченным 509.

то есть это работает:

import sympy
from sympy.utilities.autowrap import autowrap

x = sympy.symbols("x:509")
exp = sum(x)
cyt = autowrap(exp, backend="cython", args=x) 

и это не в состоянии скомпилировать:

x = sympy.symbols("x:510")
exp = sum(x)
cyt = autowrap(exp, backend="cython", args=x) 

Сообщение, которое я получаю, кажется не очень убедительным:

[...] (Full output upon request)
Generating code
c:\users\[classified]\appdata\local\temp\tmp2zer8vfe_sympy_compile\wrapper_module_17.c(6293) : fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'f:\dd\vctools\compiler\utc\src\p2\hash.c', line 884)
 To work around this problem, try simplifying or changing the program near the locations listed above.
Please choose the Technical Support command on the Visual C++ 
 Help menu, or open the Technical Support help file for more information
LINK : fatal error LNK1257: code generation failed
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\link.exe' failed with exit status 1257

Есть ли способ обойти это? Я хотел бы использовать версии моей программы, которые требуют ~ 1000 входных переменных. (Я не понимаю C / cython. Это ограничение автопереноса, ограничение C ...?)

Частично связано с вышеизложенным:

Можно ли скомпилировать функции, которые принимают аргументы в виде массива.

Есть ли способ генерировать код, который принимает массив NumPy в качестве входных данных? Я специально имею в виду один массив для всех аргументов вместо предоставления аргументов в виде списка. (Аналогично lambdify с использованием DeferredVector). ufuncify поддерживает ввод массива, но, как я понимаю, только для трансляции / векторизации функции.

Я хотел бы надеяться, что массив в качестве аргумента может обойти первую вышеупомянутую проблему, которая наиболее актуальна для меня. Кроме того, я бы предпочел ввод массива в любом случае, поскольку он кажется более быстрым (нет необходимости распаковывать массив, который у меня есть в качестве ввода в список), а также более простым и естественным.

У кого-нибудь есть предложения, что я могу сделать? Кроме того, кто-нибудь может сказать мне, имеет ли f2py аналогичные ограничения? Это также будет вариант для меня, если это возможно, но я не настроил его на работу в настоящее время, и предпочел бы знать, помогает ли это вообще, прежде чем тратить время. Спасибо!

Редактировать:

Я немного поиграл с разными кандидатамиautowrap что входным аргументом будет нечто в виде массива, а не список чисел. Я запишу здесь свои шаги для потомков, а также для увеличения шансов получить некоторую информацию:

sympy.DeferredVector

Это то, что я использую с lambdify для той же цели, поэтому я решил попробовать. Тем не мение,предупреждение:

A = sympy.DeferredVector("A")
expression = A[0]+A[1]
cyt = autowrap(expression, backend="cython", args=A)

просто полностью разбил мою ОС - последнее заявление начало выполняться (без обратной связи), все стало очень медленным, то больше никаких реакций. (Можно только строить предположения, возможно, это связано с тем фактом, что у А нет информации о форме, которая, кажется, не беспокоит лямбда, но может быть проблемой здесь. В любом случае, кажется, не правильный путь.)

Все виды объектов типа массива, заполненные символами в выражении, которое нужно обернуть.

например

x0 ,x1 = sympy.symbols("x:2")
expression = x0 + x1
cyt = autowrap(expression, backend="cython", args=np.array([x0,x1]))

Все еще хочет распакованные аргументы. Замена последнего ряда на

cyt = autowrap(expression, backend="cython", args=[np.array([x0,x1])])

Дает сообщение

CodeGenArgumentListError: ("Argument list didn't specify: x0, x1 ", [InputArgument(x0), InputArgument(x1)])

Что является повторяющейся темой для этого подхода: также происходит при использовании матрицы симпози, кортежа и т. Д. В списке аргументов.

sympy.IndexedBase

Это на самом деле используется в примерах с автопереносом; однако (для меня) интуитивно, используя уравнение в качестве выражения для переноса. Кроме того, способ его использования кажется мне неосуществимым: выражение, которое я хочу цитонизировать, является матрицей, но его ячейки сами по себе являются длинными выражениями, которые я не могу получить с помощью операций индексации.

Плюс в том, что я получил минимальный пример для работы:

X = sympy.IndexedBase("X",shape=(1,1))
expression = 2*X[0,0]
cyt = autowrap(expression, backend="cython", args=[X])

фактически компилируется, и результирующая функция правильно оценивает - когда передается 2d-np.array.

Так что это кажется наиболее перспективным путем, хотя дальнейшие расширения этого подхода я продолжаю пытаться потерпеть неудачу.

Например это

X = sympy.IndexedBase("X",shape=(1,))
expression = 2*X[0]
cyt = autowrap(expression, backend="cython", args=[X])

получает меня

[...]\site-packages\sympy\printing\codeprinter.py", line 258, in _get_expression_indices " rhs indices in %s" % expr)
ValueError: lhs indices must match non-dummy rhs indices in 2*X[0]

хотя я не понимаю, как это должно отличаться от работающего выше.

То же сообщение об ошибке при выполнении двух измерений, но при увеличении размераX:

X = sympy.IndexedBase("X",shape=(2,2))
expression = 2*X[0,0]+X[0,1]+X[1,0]+X[1,1]
cyt = autowrap(expression, backend="cython", args=[X])

ValueError: lhs indices must match non-dummy rhs indices in 2*X[0, 0] + X[0, 1] + X[1, 0] + X[1, 1]

Я пытался слежу за кодом дляautowrap, но я чувствую себя немного потерянным там ...

Так что я все еще ищу решение и рад за любой вклад.

Ответы на вопрос(1)

Ваш ответ на вопрос