4 #include "../Algos/EvcInterface.hpp"
5 #include "../Algos/Algorithm.hpp"
7 #include "../Math/RNG.hpp"
9 #include "../Param/AllParameters.hpp"
11 #include "../Util/fileutils.hpp"
14 void NOMAD::Algorithm::init()
17 _name =
"AGenericAlgorithmHasNoName";
21 NOMAD::MainStep::setAlgoComment(
"");
24 verifyParentNotNull();
26 if (
nullptr == _runParams)
28 throw NOMAD::Exception(__FILE__, __LINE__,
29 "A valid RunParameters must be provided to an Algorithm constructor.");
32 if (
nullptr == _pbParams)
34 throw NOMAD::Exception(__FILE__, __LINE__,
35 "A valid PbParameters must be provided to the Algorithm constructor.");
38 if (
nullptr == _stopReasons )
39 throw NOMAD::Exception(__FILE__, __LINE__,
40 "Valid stop reasons must be provided to the Algorithm constructor.");
43 _termination = std::make_unique<NOMAD::Termination>( this );
51 signal(SIGINT, userInterrupt);
56 NOMAD::Algorithm::~Algorithm()
62 void NOMAD::Algorithm::start()
67 _stopReasons->setStarted();
71 readInformationForHotRestart();
74 NOMAD::EvcInterface::getEvaluatorControl()->resetLapBbEval();
77 if (
nullptr == _megaIteration)
85 NOMAD::CacheBase::resetNbCacheHits();
87 _initialization->start();
88 _initialization->run();
89 _initialization->end();
96 auto barrier = _megaIteration->getBarrier();
100 auto bestFeasPoints = barrier->getAllXFeas();
101 auto bestInfPoints = barrier->getAllXInf();
104 if (!bestFeasPoints.empty())
106 std::transform(bestFeasPoints.begin(), bestFeasPoints.end(), std::back_inserter(x0s),
110 else if (!bestInfPoints.empty())
112 std::transform(bestInfPoints.begin(), bestInfPoints.end(), std::back_inserter(x0s),
116 _pbParams->checkAndComply();
121 void NOMAD::Algorithm::end()
125 displayBestSolutions();
130 NOMAD::EvcInterface::getEvaluatorControl()->resetLapBbEval();
131 NOMAD::EvcInterface::getEvaluatorControl()->setLapMaxBbEval(
NOMAD::INF_SIZE_T );
133 saveInformationForHotRestart();
169 void NOMAD::Algorithm::hotRestartOnUserInterrupt()
171 hotRestartBeginHelper();
189 hotRestartEndHelper();
193 void NOMAD::Algorithm::saveInformationForHotRestart()
const
205 std::string cacheFile = NOMAD::CacheBase::getInstance()->getFileName();
206 if (!cacheFile.empty())
208 NOMAD::CacheBase::getInstance()->write();
210 if ( _runParams->getAttributeValue<
bool>(
"HOT_RESTART_WRITE_FILES"))
212 std::cout <<
"Save information for hot restart." << std::endl;
213 std::cout <<
"Write hot restart file." << std::endl;
214 NOMAD::write(*
this, _runParams->getAttributeValue<std::string>(
"HOT_RESTART_FILE"));
219 void NOMAD::Algorithm::displayBestSolutions()
const
221 std::vector<NOMAD::EvalPoint> evalPointList;
227 : NOMAD::OutputLevel::LEVEL_VERY_HIGH;
228 NOMAD::OutputInfo displaySolFeas(_name, sFeas, outputLevel);
230 sFeas =
"Best feasible solution";
231 size_t nbBestFeas = NOMAD::CacheBase::getInstance()->findBestFeas(evalPointList, getSubFixedVariable());
234 sFeas +=
": Undefined.";
235 displaySolFeas.addMsg(sFeas);
237 else if (1 == nbBestFeas)
240 displaySolFeas.addMsgAndSol(sFeas, *evalPointList.begin());
245 displaySolFeas.addMsgAndSol(sFeas, *evalPointList.begin());
249 const size_t maxSolCount = 8;
252 std::vector<NOMAD::EvalPoint>::const_iterator it;
254 for (it = evalPointList.begin(); it != evalPointList.end(); ++it)
257 if (evalPointList.begin() == it)
261 displaySolFeas.addMsgAndSol(
" ",*it);
262 if (solCount >= maxSolCount)
265 displaySolFeas.addMsg(
"... A total of " + std::to_string(evalPointList.size()) +
" feasible solutions were found.");
271 NOMAD::OutputQueue::Add(std::move(displaySolFeas));
273 evalPointList.clear();
278 auto hMax = _runParams->getAttributeValue<NOMAD::Double>(
"H_MAX_0");
279 if (
nullptr != _megaIteration)
281 hMax = _megaIteration->getBarrier()->getHMax();
283 NOMAD::OutputInfo displaySolInf(_name, sInf, outputLevel);
284 sInf =
"Best infeasible solution";
285 size_t nbBestInf = NOMAD::CacheBase::getInstance()->findBestInf(evalPointList, hMax, getSubFixedVariable());
288 sInf +=
": Undefined.";
289 displaySolInf.addMsg(sInf);
291 else if (1 == nbBestInf)
294 displaySolInf.addMsgAndSol(sInf, *evalPointList.begin());
299 displaySolInf.addMsgAndSol(sInf, *evalPointList.begin());
305 std::vector<NOMAD::EvalPoint>::const_iterator it;
306 for (it = evalPointList.begin(); it != evalPointList.end(); ++it)
309 if (evalPointList.begin() == it)
313 displaySolInf.addMsgAndSol(
" ",(*it));
314 if (solCount >= maxSolCount)
317 displaySolInf.addMsg(
"... A total of " + std::to_string(evalPointList.size()) +
" infeasible solutions were found.");
323 NOMAD::OutputQueue::Add(std::move(displaySolInf));
327 void NOMAD::Algorithm::displayEvalCounts()
const
332 size_t bbEval = NOMAD::EvcInterface::getEvaluatorControl()->getBbEval();
333 size_t lapBbEval = NOMAD::EvcInterface::getEvaluatorControl()->getLapBbEval();
334 size_t nbEval = NOMAD::EvcInterface::getEvaluatorControl()->getNbEval();
335 size_t nbCacheHits = NOMAD::CacheBase::getNbCacheHits();
336 int nbEvalNoCount =
static_cast<int>(nbEval - bbEval - nbCacheHits);
337 bool showNbEvalNoCount = (nbEvalNoCount > 0);
338 bool showNbCacheHits = (nbCacheHits > 0);
339 bool showNbEval = (nbEval > bbEval);
340 bool showLapBbEval = ( bbEval > lapBbEval && lapBbEval > 0 );
342 std::string sFeedBbEval, sFeedNbEvalNoCount, sFeedCacheHits, sFeedNbEval;
345 if (showNbEvalNoCount)
348 sFeedCacheHits =
" ";
354 sFeedCacheHits =
" ";
357 std::string sLapBbEval =
"Sub-optimization blackbox evaluations: " + sFeedBbEval +
NOMAD::itos(lapBbEval);
358 std::string sBbEval =
"Total blackbox evaluations: " + sFeedBbEval +
NOMAD::itos(bbEval);
359 std::string sNbEvalNoCount =
"Total blackbox evaluation (not counting): " + sFeedNbEvalNoCount +
NOMAD::itos(nbEvalNoCount);
360 std::string sCacheHits =
"Cache hits: " + sFeedCacheHits +
NOMAD::itos(nbCacheHits);
361 std::string sNbEval =
"Total number of evaluations: " + sFeedNbEval +
NOMAD::itos(nbEval);
365 : NOMAD::OutputLevel::LEVEL_HIGH;
367 : NOMAD::OutputLevel::LEVEL_NORMAL;
369 AddOutputInfo(
"", outputLevelHigh);
371 AddOutputInfo(sLapBbEval);
372 AddOutputInfo(sBbEval, outputLevelHigh);
373 AddOutputInfo(sNbEvalNoCount, showNbEvalNoCount ? outputLevelNormal : NOMAD::OutputLevel::LEVEL_INFO);
374 AddOutputInfo(sCacheHits, showNbCacheHits ? outputLevelNormal : NOMAD::OutputLevel::LEVEL_INFO);
375 AddOutputInfo(sNbEval, showNbEval ? outputLevelNormal : NOMAD::OutputLevel::LEVEL_INFO);
379 bool NOMAD::Algorithm::isSubAlgo()
const
384 const NOMAD::Step* parentAlgo = getParentOfType<NOMAD::Algorithm*>();
385 if (
nullptr != parentAlgo)
394 void NOMAD::Algorithm::display ( std::ostream& os )
const
397 os <<
"MEGA_ITERATION " << std::endl;
398 os << *_megaIteration << std::endl;
399 os <<
"NB_EVAL " << NOMAD::EvcInterface::getEvaluatorControl()->getNbEval() << std::endl;
400 os <<
"NB_BB_EVAL " << NOMAD::EvcInterface::getEvaluatorControl()->getBbEval() << std::endl;
402 NOMAD::RNG::getPrivateSeed(x, y, z);
403 os <<
"RNG " << x <<
" " << y <<
" " << z << std::endl;
420 int nbEval = 0, nbBbEval = 0;
423 while (is >> name && is.good() && !is.eof())
425 if (
"MEGA_ITERATION" == name)
427 is >> *_megaIteration;
429 else if (
"NB_EVAL" == name)
433 else if (
"NB_BB_EVAL" == name)
437 else if (
"RNG" == name)
440 NOMAD::RNG::setPrivateSeed(x, y, z);
445 for (
unsigned i = 0; i < name.size(); i++)
453 NOMAD::EvcInterface::getEvaluatorControl()->setBbEval(nbBbEval);
454 NOMAD::EvcInterface::getEvaluatorControl()->setNbEval(nbEval);
std::string itos(const int i)
Transform an integer into a string.
std::shared_ptr< EvalPoint > EvalPointPtr
Definition for eval point pointer.
std::istream & operator>>(std::istream &is, Algorithm &algo)
Operator to read parameters used for hot restart.
std::vector< Point > ArrayOfPoint
Representation of a vector of points.
bool read(T &info, const std::string &filename)
bool write(const T &info, const std::string &filename)
std::ostream & operator<<(std::ostream &os, const Algorithm &algo)
Operator to write parameters used for hot restart.
const size_t INF_SIZE_T
The infinity for size_t.