Символьная дифференциация с использованием буст-прото

Я пытаюсь построить EDSL, который может обрабатывать символические различия. У меня проблемы с работой.

struct Derivative
: or_<
when<
terminal<unknown>
, boost::mpl::int_<1>()
>
, when<
terminal<_>
, boost::mpl::int_<0>()
>
, proto::when<
proto::function<proto::literal<function<1> >, Derivative>
, proto::_make_function(proto::_left, Derivative(proto::_right))
>
, proto::when<
proto::function<proto::literal<function<2> >, Derivative>
, proto::_make_function(proto::_left, Derivative(proto::_right))
>
, otherwise<_>
> {};

В последних частях этой структуры я собираю функции отдельно, потому что хочу иметь возможность передавать что-то другое, чем proto::_left в качестве функции, которая будет применяться.

Например. proto::literal<function<2> > соответствует функции tanh, и мой контекст оценит это как tanh. Но когда я вижу tanh в своем выражении, которое я хочу получить, в моем Derivative структура, я хочу быть в состоянии сказать

proto::when<
proto::function<proto::literal<function<2> >, Derivative>
, proto::_make_function(proto::literal<function<7> >, Derivative(proto::_right))
>

proto::literal<function<7> > соответствует градиенту tanh.

Когда я пытаюсь это сделать, мой код не компилируется.

Как я могу правильно сделать это?

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector