Swig: директор C++/Python и Eigen::VectorXdPython

Программы на Python
Ответить
Anonymous
 Swig: директор C++/Python и Eigen::VectorXd

Сообщение Anonymous »

У меня есть виртуальный класс C++, который я хочу расширить в Python.
Этот класс содержит несколько вычислительных функций, которые необходимо перегрузить.
Например:
< pre class="lang-cpp Prettyprint-override">

Код: Выделить всё

class myCppClass
{
public:
myCppClass(){}
virtual Eigen::vectorXd compute_things();
void update_class()
{
// ... do things
toto = compute_things();
// ... do other things
}

protected:
Eigen::vectorXd _toto;

};
Идея состоит в том, что пользователи реализуют свой собственный метод Compute_things в Python. Этот метод вызывается внутри метода update_class.
Чтобы добиться этого, я использую функцию директора SWIG вместе с картами типов Eigen, разработанными в этом репозитории.
Вот что мой файл .i выглядит так:

Код: Выделить всё

%module(package="example", directors="1", allprotected="1", "threads"=1) My_Example

%{
#include 
}

%import 
%include 
%include 
%import "numpy.i"

%feature("director") myCppClass;

%include 
Затем в Python:

Код: Выделить всё

class myPythonClass(myCppClass):

def __init__(self):
super().__init__()

def compute_things(self):
return np.array([2.0, 1.0])

myclass = myPythonClass()
myclass.upadate_class()
Когда я запускаю этот код, я получаю следующую ошибку:
"TypeError: несоответствие типа директора SWIG в выходном значении типа 'Eigen::VectorXd'"
Однако, если я вызываю метод Compute_things напрямую, он работает без каких-либо проблем.
Некоторый дополнительный контекст:
  • В моем полном коде экземпляр myPythonClass disown(), но я не могу поделиться здесь полной реализацией.
  • Если я заменю Eigen::VectorXd с более «стандартными» типами, такими как std::vector, int или double, все работает нормально.
  • I попробовал добавить операторы отладочной печати во все карты типов Eigen. Кажется, что TypeError возникает до того, как срабатывают карты типов, поэтому я не уверен, в чем заключается проблема.
Это ограничение SWIG-Eigen интеграция или я что-то делаю не так? Будем очень признательны за любую помощь!
Большое спасибо!
также опубликовано здесь: https://github.com/swig/swig/ обсуждения/3080

Подробнее здесь: https://stackoverflow.com/questions/792 ... envectorxd
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»