boost — вызов digamma () — функция в процедуре NLOPT-оптимизации в переполнении стека

Я использую NLOPT библиотека в Visual Studio 2015 для задачи оптимизации, включающей многопараметрическую целевую функцию & градиент-вектор. Сокращенный код выглядит так:

#include "C:\C++\Boost\boost_1_55_0\boost\math\special_functions\digamma.hpp"double my_objective_function(unsigned length, const double *x, double *grad, void* dat) {

// pointer on data
double *dat_Ptr = static_cast<double*>(dat);

// objective function (shortened)
double obj = x[0]*std::tgamma(1 + 1/x[0]) + ...

// gradient-vector (shortened)
double grad[4];
grad[0] = -1.0*boost::math::digamma(1.0 + 1.0/x[0]) + ...

/*
further code
*/

С использованием NLOPT_LD_LBFGS & призвание boost::math::digamma()-функция выдает следующую ошибку: ошибка

Эта ошибка не появляется, если я изменяю boost::math::digamma(1.0 + 1.0/x[0]) в boost::math::digamma(1.0 + 1.0/5.4) и т.д. Поэтому, когда я беру параметр х [0] это работает нормально. Такая же ошибка возникает при использовании другого boost::math-функция, но не если я использую его std::-counterpart.

В: Почему я не могу подать заявку boost::math-функции к параметрам, которые оптимизируются? Есть ли другой способ включить digamma()-функция (кроме использования тейлоровского приближения)?

Спасибо за любую помощь. Я могу дать более подробную информацию, но код обширный, и я думаю, что я уже отфильтровал проблему под рукой.
РЕДАКТИРОВАТЬ: main() который вызывает функцию выше.

#include "C:\C++\Boost\boost_1_55_0\boost\math\special_functions\digamma.hpp"#include <vector>
#include "nlopt.hpp"#include "myCSV.h"      // CSV-Parser to read-in data for optimization

int main(){

// DATA IMPORT
ifstream file("C:/data.txt");
CSVRow row;
int j = 0;
double dat[50000];

while (file >> row)
dat[j] = stod(row[1]);

// OPTIMIZATION

nlopt_opt opt_object;
opt_object = nlopt_create(NLOPT_LD_LBFGS, (4));

double lb[4] = { 0.0, 0.0 , 0.0, 0.0};
nlopt_set_lower_bounds(opt_object, lb);

nlopt_set_max_objective(opt_object, my_objective_function, dat);        // Call of the function defined in my 1st post
nlopt_set_xtol_rel(opt_object, 1e-8);

double x[4] = { 1,0.5,0.5,0.5 };
double maxf;
nlopt_optimize(opt_object, x, &maxf);

printf("Result: f(%g, %g, %g, %g) = %0.10g\n", x[0], x[1], x[2], x[3], maxf);

nlopt_destroy(opt_object);
}

0

Решение

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

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

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

По вопросам рекламы [email protected]