Передача упакованной модели класса оды в интегратор (swig)

У меня будет возможность выбрать метод интеграции в решателе ode, обернутом в swig. Я определил простой гармонический осциллятор в классе:

class HO
{
    double gamma;

public:
    HO(double gamma_) : gamma(gamma_) {}

    void operator()(const vector<double> &y, vector<double> &dydt, const double t)
    {
        dydt[0] = y[1];
        dydt[1] = -y[0] - gamma * y[1];
    }
};

и интегратор Эйлера как функцию, которая принимает std::function в качестве аргумента:

typedef std::vector<double> dim1;
typedef std::vector<vector<double>> dim2;

dim2 integrate_euler(
    std::function<void(const dim1 &, dim1 &, const double)> func,
    dim1 &y0,
    double ti,
    double tf,
    double dt);

после компиляции с помощью swig я импортирую библиотеку в python:

import odesolver
dt = 0.01
ode = odesolver.HO(0.05)
x0 = [0.5, 1.0]
s =  odesolver.integrate_euler(ode, x0, 0., 100., dt)

и я получаю следующую ошибку:

Traceback (most recent call last):
  File "runme.py", line 19, in <module>
    s =  odesolver.integrate_euler(ode, x0, 0., 100., dt)
  File "/home/ziaee/git/04_SOLVERS/ode_solver/CPP/using_operator/swig/odesolver.py", line 459, in integrate_euler
    return _odesolver.integrate_euler(func, y0, ti, tf, dt)
TypeError: in method 'integrate_euler', argument 1 of type 'std::function< void (dim1 const &,dim1 &,double const) >'

Я помещаю полный код здесь, если вы заинтересованы в тестировании Это.

Вопрос как-то похож на swi">этот вопрос, с той разницей, что я передаю std::function. Есть ли у вас какое-либо решение или идея замены?


person Abolfazl    schedule 15.06.2021    source источник
comment
Сложность здесь заключается в том, чтобы заставить SWIG понять, что законно создавать std::function из этого operator(). Я надену свою мыслящую шляпу   -  person Flexo    schedule 15.06.2021
comment
У меня есть довольно уродливый лайфхак — не могли бы вы немного подробнее прокомментировать другие виды функций, которые вы могли бы захотеть передать вintegr_euler? Будут ли они все объектами C++ с известным набором типов на момент запуска SWIG? Или вы надеетесь, что сможете написать реализацию на python? или также передавать произвольные указатели функций?   -  person Flexo    schedule 15.06.2021
comment
Все модели определены на C++ с известными типами. Эффективность для меня на первом месте.   -  person Abolfazl    schedule 16.06.2021