NOMAD Source  Version 4.0.0 Beta
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MadsInitialization.cpp
Go to the documentation of this file.
1 
2 #include "../../Algos/CacheInterface.hpp"
3 #include "../../Algos/EvcInterface.hpp"
4 
5 #include "../../Algos/Mads/GMesh.hpp"
6 #include "../../Algos/Mads/MadsInitialization.hpp"
7 
8 
9 void NOMAD::MadsInitialization::init()
10 {
11  _name = "MadsInitialization";
12 
13 }
14 
15 
16 bool NOMAD::MadsInitialization::run()
17 {
18  bool doContinue = ! _stopReasons->checkTerminate();
19 
20  if (doContinue)
21  {
22  eval_x0s();
23  doContinue = ! _stopReasons->checkTerminate();
24  }
25  return doContinue;
26 }
27 
28 
29 void NOMAD::MadsInitialization::validateX0s() const
30 {
31  auto x0s = _pbParams->getAttributeValue<NOMAD::ArrayOfPoint>("X0");
32  size_t n = _pbParams->getAttributeValue<size_t>("DIMENSION");
33  bool validX0available = false;
34  std::string err;
35 
36  for (size_t x0index = 0; x0index < x0s.size(); x0index++)
37  {
38  auto x0 = x0s[x0index];
39  if (!x0.isComplete() || x0.size() != n)
40  {
41  err += "Initialization: eval_x0s: Invalid X0 " + x0.display() + ".";
42  }
43  else
44  {
45  validX0available = true;
46  }
47  }
48  if (validX0available)
49  {
50  if (!err.empty())
51  {
52  // Show invalid X0s
53  AddOutputWarning(err);
54  }
55  }
56  else
57  {
58  // No valid X0 available. Throw exception.
59  size_t cacheSize = NOMAD::CacheBase::getInstance()->size();
60  if (cacheSize > 0)
61  {
62  err += " Hint: Try not setting X0 so that the cache is used (";
63  err += std::to_string(cacheSize) + " points)";
64  }
65  else
66  {
67  err += ". Cache is empty.";
68  }
69  throw NOMAD::Exception(__FILE__, __LINE__, err);
70  }
71 
72 }
73 
74 
75 bool NOMAD::MadsInitialization::eval_x0s()
76 {
77  bool evalOk = false;
78 
79  auto x0s = _pbParams->getAttributeValue<NOMAD::ArrayOfPoint>("X0");
80 
81  validateX0s();
82 
83  // Add X0s that need evaluation to eval queue
84  NOMAD::CacheInterface cacheInterface(this);
85  NOMAD::EvcInterface evcInterface(this);
86  evcInterface.getEvaluatorControl()->lockQueue();
87 
88  NOMAD::EvalPointSet evalPointSet;
89  for (size_t x0index = 0; x0index < x0s.size(); x0index++)
90  {
91  auto x0 = x0s[x0index];
92  NOMAD::EvalPoint evalPoint_x0(x0);
93  evalPointSet.insert(evalPoint_x0);
94  }
95 
96  // Add points to the eval queue.
97  // Convert to full dimension if needed.
98  // Note: Queue is already locked - it needs to be locked to add points.
99  evcInterface.keepPointsThatNeedEval(evalPointSet, false); // false: no mesh
100 
101  // Enforce no opportunism.
102  auto evcParams = evcInterface.getEvaluatorControl()->getEvaluatorControlParams();
103  auto previousOpportunism = evcParams->getAttributeValue<bool>("OPPORTUNISTIC_EVAL");
104  evcParams->setAttributeValue("OPPORTUNISTIC_EVAL", false);
105  evcParams->checkAndComply();
106 
107  evcInterface.getEvaluatorControl()->unlockQueue(false); // false: do not sort eval queue
108 
109  // Evaluate all x0s. Ignore returned success type.
110  // Note: EvaluatorControl would not be able to compare/compute success since there is no barrier.
111  evcInterface.startEvaluation();
112 
113  // Reset opportunism to previous values.
114  evcInterface.getEvaluatorControl()->lockQueue();
115  evcParams->setAttributeValue("OPPORTUNISTIC_EVAL", previousOpportunism);
116  evcParams->checkAndComply();
117  evcInterface.getEvaluatorControl()->unlockQueue(false); // false: do not sort eval queue
118 
119  for (auto x0 : x0s)
120  {
121  NOMAD::EvalPoint evalPoint_x0(x0);
122  cacheInterface.find(x0, evalPoint_x0);
123  if (evalPoint_x0.isEvalOk())
124  {
125  // evalOk is true if at least one evaluation is Ok
126  evalOk = true;
127  AddOutputInfo("Using X0: " + evalPoint_x0.display());
128  }
129  else
130  {
131  auto madsStopReason = NOMAD::AlgoStopReasons<NOMAD::MadsStopType>::get( _stopReasons );
132  madsStopReason->set ( NOMAD::MadsStopType::X0_FAIL );
133 
134  AddOutputError("X0 evaluation failed for X0 = " + x0.display());
135  }
136  }
137 
138  NOMAD::OutputQueue::Flush();
139 
140  return evalOk;
141 }
std::set< EvalPoint, EvalPointCompare > EvalPointSet
Definition for EvalPointSet.
Definition: EvalPoint.hpp:311
std::vector< Point > ArrayOfPoint
Representation of a vector of points.