47 #include "../../Algos/Mads/LHSearchMethod.hpp"
48 #include "../../Algos/Mads/MadsIteration.hpp"
49 #include "../../Math/LHS.hpp"
50 #include "../../Type/LHSearchType.hpp"
52 void NOMAD::LHSearchMethod::init()
54 _name =
"Latin Hypercube Search Method";
57 auto lhSearch = _runParams->getAttributeValue<NOMAD::LHSearchType>(
"LH_SEARCH");
58 setEnabled(lhSearch.isEnabled());
62 void NOMAD::LHSearchMethod::generateTrialPointsImp()
65 if (
nullptr == _iterAncestor)
67 throw NOMAD::Exception(__FILE__,__LINE__,
"LHSearchMethod: must have an iteration ancestor");
69 auto mesh = _iterAncestor->getMesh();
72 throw NOMAD::Exception(__FILE__,__LINE__,
"LHSearchMethod: must have a mesh");
74 auto frameCenter = _iterAncestor->getFrameCenter();
75 if (
nullptr == frameCenter)
77 throw NOMAD::Exception(__FILE__,__LINE__,
"LHSearchMethod: must have a frameCenter");
80 auto lhSearch = _runParams->getAttributeValue<NOMAD::LHSearchType>(
"LH_SEARCH");
81 size_t n = _pbParams->getAttributeValue<
size_t>(
"DIMENSION");
82 size_t p = (0 == _iterAncestor->getK()) ? lhSearch.getNbInitial() : lhSearch.getNbIteration();
83 auto lowerBound = _pbParams->getAttributeValue<NOMAD::ArrayOfDouble>(
"LOWER_BOUND");
84 auto upperBound = _pbParams->getAttributeValue<NOMAD::ArrayOfDouble>(
"UPPER_BOUND");
92 NOMAD::ArrayOfDouble deltaFrameSize = mesh->getDeltaFrameSize();
95 for (
size_t i = 0; i < n; i++)
97 if (!lowerBound[i].isDefined())
99 lowerBound[i] = (*frameCenter)[i] - 10.0 * deltaFrameSize[i] * scaleFactor;
101 if (!upperBound[i].isDefined())
103 upperBound[i] = (*frameCenter)[i] + 10.0 * deltaFrameSize[i] * scaleFactor;
108 NOMAD::LHS lhs(n, p, lowerBound, upperBound);
109 auto pointVector = lhs.Sample();
112 for (
auto point : pointVector)
115 insertTrialPoint(NOMAD::EvalPoint(point));