2 #include "../../Algos/CacheInterface.hpp"
3 #include "../../Algos/EvcInterface.hpp"
5 #include "../../Algos/NelderMead/NMInitialization.hpp"
8 void NOMAD::NMInitialization::init()
10 _name =
"NM Initialization";
12 _nmStopReason = NOMAD::AlgoStopReasons<NOMAD::NMStopType>::get( _stopReasons );
16 bool NOMAD::NMInitialization::run()
18 bool doContinue = ! _stopReasons->checkTerminate();
24 evalTrialPoints(
this);
25 doContinue = ! _stopReasons->checkTerminate();
27 _nmStopReason->set(NOMAD::NMStopType::INITIAL_FAILED);
33 void NOMAD::NMInitialization::start()
37 if ( ! _stopReasons->checkTerminate() )
41 auto nm_opt = _runParams->getAttributeValue<
bool>(
"NM_OPTIMIZATION");
42 if ( nm_opt && ! checkCacheCanFormSimplex() )
44 generateTrialPoints();
50 bool NOMAD::NMInitialization::checkCacheCanFormSimplex()
52 size_t n = _pbParams->getAttributeValue<
size_t>(
"DIMENSION");
53 if ( NOMAD::CacheBase::getInstance()->size() < n+1 )
61 void NOMAD::NMInitialization::generateTrialPoints()
64 auto fixedVariable = getSubFixedVariable();
66 NOMAD::Point x0 = _pbParams->getAttributeValue<NOMAD::Point>(
"X0");
67 size_t n = _pbParams->getAttributeValue<
size_t>(
"DIMENSION");
69 if (!x0.isComplete() || x0.size() != n)
71 std::string err =
"Initialization: evalY0: Invalid X0 " + x0.display();
72 size_t cacheSize = NOMAD::CacheBase::getInstance()->size();
75 err +=
". Hint: Try not setting X0 so that the cache is used (";
76 err += std::to_string(cacheSize) +
" points)";
80 err +=
". Cache is empty.";
82 throw NOMAD::Exception(__FILE__, __LINE__, err);
85 NOMAD::EvalPoint evalPoint_x0(x0);
86 insertTrialPoint(evalPoint_x0);
87 AddOutputInfo(
"Using X0: " + evalPoint_x0.display());
90 const NOMAD::Double usualDelta = 0.05;
91 const NOMAD::Double zeroDelta = 0.00025;
92 for (
size_t j = 0 ; j < n ; j++ )
94 NOMAD::EvalPoint trialPoint(x0);
95 if ( trialPoint[j] != 0 )
96 trialPoint[j] *= (1 + usualDelta );
98 trialPoint[j] = zeroDelta;
100 insertTrialPoint(trialPoint);
103 NOMAD::OutputQueue::Flush();