Программа занимает (много) больше времени, чем нужно из-за вызова функции, который никогда не запускается

В настоящее время я использую байесовскую оптимизацию, написанную на c ++. Я использую инструментарий вызова Байесопта от Рубена Мартинеса-Кантина (http://rmcantin.bitbucket.org/html/). Я делаю тезис о Байесовской оптимизации (https://en.wikipedia.org/wiki/Bayesian_optimization).

Ранее я экспериментировал с этим набором инструментов, и на этой неделе я заметил, что код работает намного медленнее, чем я помнил. Стоит отметить, что я написал некоторый код, который работает с этим набором инструментов.

Я решил попытаться понять, почему это происходит, и я стал свидетелем того, что код работает намного медленнее, чем следовало бы.

Чтобы попытаться понять, была ли это ошибка моего кода или нет, я попробовал пример, в котором не используется мой код.

Рассмотрим следующий пример:

#include <iostream>
#include <bayesopt.hpp>class ExampleMichalewicz: public bayesopt::ContinuousModel
{
public:
ExampleMichalewicz(bopt_params par);

double evaluateSample(const vectord& x);
bool checkReachability(const vectord &query) {return true;};

void printOptimal();

private:
double mExp;
};ExampleMichalewicz::ExampleMichalewicz(bopt_params par):
ContinuousModel(10,par)
{
mExp = 10;
}

double ExampleMichalewicz::evaluateSample(const vectord& x)
{
size_t dim = x.size();
double sum = 0.0;

for(size_t i = 0; i<dim; ++i)
{
double frac = x(i)*x(i)*(i+1);
frac /= M_PI;
sum += std::sin(x(i)) * std::pow(std::sin(frac),2*mExp);
}
return -sum;
}

void ExampleMichalewicz::printOptimal()
{
std::cout << "Solutions: " << std::endl;
std::cout << "f(x)=-1.8013 (n=2)"<< std::endl;
std::cout << "f(x)=-4.687658 (n=5)"<< std::endl;
std::cout << "f(x)=-9.66015 (n=10);" << std::endl;
}

int main(int nargs, char *args[])
{
bopt_params par = initialize_parameters_to_default();
par.n_iterations = 20;
par.n_init_samples = 30;
par.random_seed = 0;
par.verbose_level = 1;
par.noise = 1e-10;
par.kernel.name        = "kMaternARD5";
par.crit_name          = "cBEI";
par.crit_params[0] =   1;
par.crit_params[1] =   0.1;
par.n_crit_params  =   2;
par.epsilon        =   0.0;
par.force_jump     =   0.000;
par.verbose_level  =   1;
par.n_iter_relearn     =     1; // Number of samples before relearn kernel
par.init_method        =     1; // Sampling method for initial set 1-LHS, 2-Sobol (if available),
par.l_type             = L_MCMC; // Type of learning for the kernel paramsExampleMichalewicz michalewicz(par);
vectord result(10);

michalewicz.optimize(result);
std::cout << "Result: " << result << "->"<< michalewicz.evaluateSample(result) << std::endl;
michalewicz.printOptimal();

return 0;
}

Если я скомпилирую этот пример в одиночку, время выполнения составит около 23 секунд.

С этим файлом cmake

PROJECT ( myDemo )

ADD_EXECUTABLE(myDemo ./main.cpp)

find_package( Boost REQUIRED )
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
else(Boost_FOUND)
find_library(Boost boost PATHS /opt/local/lib)
include_directories(${Boost_LIBRARY_PATH})
endif()

include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories("../bayesopt/include")
include_directories("../bayesopt/utils")

set(CMAKE_CXX_FLAGS " -Wall -std=c++11 -lpthread -Wno-unused-local-typedefs -DNDEBUG -DBOOST_UBLAS_NDEBUG")

target_link_libraries(myDemo libbayesopt.a libnlopt.a)

Теперь рассмотрим тот же основной пример, но я добавил три дополнительных файла в мой проект cmake (без включения их в main.cpp). Эти три файла являются частью всего моего кода.

PROJECT ( myDemo )

ADD_EXECUTABLE(myDemo ./iCubSimulator.cpp ./src/DatasetDist.cpp ./src/MeanModelDist.cpp ./src/TGPNode.cpp)

find_package( Boost REQUIRED )
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
else(Boost_FOUND)
find_library(Boost boost PATHS /opt/local/lib)
include_directories(${Boost_LIBRARY_PATH})
endif()

include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories("../bayesopt/include")
include_directories("../bayesopt/utils")

set(CMAKE_CXX_FLAGS " -Wall -std=c++11 -lpthread -Wno-unused-local-typedefs -DNDEBUG -DBOOST_UBLAS_NDEBUG")

target_link_libraries(myDemo libbayesopt.a libnlopt.a)

На этот раз время выполнения составляет около 3 минут. Это важно в моей работе, так как если я увеличу par.n_iterations это имеет тенденцию становиться намного хуже.

Далее я пришел к выводу, что если я прокомментирую строку в TGPNode.cpp

utils::cholesky_decompose(K,L); (NOTICE THAT THIS LINE IS NEVER CALLED).

Я получаю 23 секунды. Эта функция принадлежит файлу: ublas_cholesky.hpp из набора инструментов bayesopt.

Также важно отметить, что та же функция также вызывается в коде панели инструментов. Эта строка не комментируется и работает во время michalewicz.optimize(result);,

У кого-нибудь есть идеи, почему это происходит? Было бы очень полезно, если у кого-то есть понимание этого предмета.

Высоко ценится.

Пожалуйста, Хосе Ногейра

0

Решение

Это не вернется.

Это будет бесконечно повторяться (до переполнения стека).

Вот как выглядит код:

bopt_params initialize_parameters_to_default(void)
{
bayesopt::Parameters par;
return par.generate_bopt_params();

А также generate_bopt_params:

bopt_params Parameters::generate_bopt_params(){
bopt_params c_params = initialize_parameters_to_default();

Похоже, что кто-то пытался удалить дублирование кода, фактически не проверяя вещи. Совсем. Вы можете восстановить закомментированное тело первой функции

1

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

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

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