47 #include "../../Algos/EvcInterface.hpp"
48 #include "../../Algos/NelderMead/NMInitialization.hpp"
49 #include "../../Algos/SubproblemManager.hpp"
52 void NOMAD::NMInitialization::init()
54 _name = getAlgoName() +
"Initialization";
56 _nmStopReason = NOMAD::AlgoStopReasons<NOMAD::NMStopType>::get( _stopReasons );
60 bool NOMAD::NMInitialization::runImp()
62 bool doContinue = ! _stopReasons->checkTerminate();
68 evalTrialPoints(
this);
69 doContinue = ! _stopReasons->checkTerminate();
71 _nmStopReason->set(NOMAD::NMStopType::INITIAL_FAILED);
77 void NOMAD::NMInitialization::startImp()
80 if ( ! _stopReasons->checkTerminate() )
84 auto nm_opt = _runParams->getAttributeValue<
bool>(
"NM_OPTIMIZATION");
85 if ( nm_opt && ! checkCacheCanFormSimplex() )
87 generateTrialPoints();
94 void NOMAD::NMInitialization::endImp()
98 if (_trialPoints.size() > 0)
100 std::vector<NOMAD::EvalPoint> evalPointList;
101 std::copy(_trialPoints.begin(), _trialPoints.end(),
102 std::back_inserter(evalPointList));
103 auto hMax = _runParams->getAttributeValue<NOMAD::Double>(
"H_MAX_0");
104 _barrier = std::make_shared<NOMAD::Barrier>(hMax, NOMAD::SubproblemManager::getSubFixedVariable(
this), NOMAD::EvcInterface::getEvaluatorControl()->getEvalType(), evalPointList);
109 bool NOMAD::NMInitialization::checkCacheCanFormSimplex()
112 size_t n = _pbParams->getAttributeValue<
size_t>(
"DIMENSION");
113 if ( NOMAD::CacheBase::getInstance()->size() < n+1 )
120 void NOMAD::NMInitialization::generateTrialPoints()
122 NOMAD::Point x0 = _pbParams->getAttributeValue<NOMAD::Point>(
"X0");
123 size_t n = _pbParams->getAttributeValue<
size_t>(
"DIMENSION");
125 if (!x0.isComplete() || x0.size() != n)
127 std::string err =
"Initialization: evalY0: Invalid X0 " + x0.display();
128 size_t cacheSize = NOMAD::CacheBase::getInstance()->size();
131 err +=
". Hint: Try not setting X0 so that the cache is used (";
132 err += std::to_string(cacheSize) +
" points)";
136 err +=
". Cache is empty.";
138 throw NOMAD::Exception(__FILE__, __LINE__, err);
141 NOMAD::EvalPoint evalPoint_x0(x0);
142 insertTrialPoint(evalPoint_x0);
144 AddOutputInfo(
"Using X0: " + evalPoint_x0.display());
148 const NOMAD::Double usualDelta = 0.05;
149 const NOMAD::Double zeroDelta = 0.00025;
150 for (
size_t j = 0 ; j < n ; j++ )
152 NOMAD::EvalPoint trialPoint(x0);
153 if ( trialPoint[j] != 0 )
154 trialPoint[j] *= (1 + usualDelta );
156 trialPoint[j] = zeroDelta;
158 insertTrialPoint(trialPoint);
162 NOMAD::OutputQueue::Flush();