Автоматическое дифференцирование с CoDiPack - PullRequest
0 голосов
/ 05 декабря 2018

Следующий код:

#include <codi.hpp>
...
codi::RealForward Gcodi[l];
for (int p = 0; p < l; p++) 
{
     ...
     double a = Gcodi[p];
}

дает мне ошибку компиляции:

nnBFAD.cpp: в функции 'void OptBF ()':

nnBFAD.cpp: 156: 25: ошибка: невозможно преобразовать 'codi :: RealForward {aka codi :: ActiveReal>}' в 'double' при двойной инициализации

a = Gcodi[p];

Подсказки?

1 Ответ

0 голосов
/ 05 декабря 2018

Согласно официальному документу здесь , RealForward - это тип с перегруженным оператором присваивания, поэтому вы можете присвоить его с двойным ..

, как при выполнении

codi::RealForward a = 3.0;

противоположное направление, конечно, не определено,

. Это то, почему вы не можете напрямую конвертировать codi :: RealForward в двойной, просто выполнив:

double a = Gcodi[p];

но вы можете вызвать функции для этого, то есть

double a = Gcodi[p].getGradient();

UPDATE :

, затем вы можете назначить объект RealForwardс двойным, как при выполнении

double myDouble{3.3};
RealForward a = myDouble;

, но недопустимо присваивать двойное значение непосредственно из REalForwad:

RealForward a = ...;
double myDouble = a; //not valid!

другие примеры

RealForward b = a * a; //this is ok because a * a is a double
...