52 #include "../Algos/Subproblem.hpp"
53 #include "../Output/OutputQueue.hpp"
54 #include "../Type/BBInputType.hpp"
60 void NOMAD::Subproblem::init()
62 if (
nullptr == _refPbParams)
64 throw NOMAD::Exception(__FILE__, __LINE__,
65 "A valid PbParameters must be provided to the Subproblem constructor.");
68 if (_fixedVariable.isEmpty())
70 std::string s =
"Error: Fixed variable of dimension 0";
71 throw NOMAD::Exception(__FILE__,__LINE__,s);
75 NOMAD::Point subFixedVariable = _refPbParams->getAttributeValue<NOMAD::Point>(
"FIXED_VARIABLE");
76 _dimension = subFixedVariable.size() - subFixedVariable.nbDefined();
79 setupProblemParameters();
83 NOMAD::Subproblem::~Subproblem()
88 void NOMAD::Subproblem::setupProblemParameters()
94 const size_t refDimension = _refPbParams->getAttributeValue<
size_t>(
"DIMENSION");
95 size_t n = _dimension;
97 _subPbParams = std::make_shared<NOMAD::PbParameters>(*_refPbParams);
98 _subPbParams->setAttributeValue(
"DIMENSION", n);
102 const auto refLowerBound = _refPbParams->getAttributeValue<NOMAD::ArrayOfDouble>(
"LOWER_BOUND");
103 const auto refUpperBound = _refPbParams->getAttributeValue<NOMAD::ArrayOfDouble>(
"UPPER_BOUND");
105 const auto refInitMeshSize = _refPbParams->getAttributeValue<NOMAD::ArrayOfDouble>(
"INITIAL_MESH_SIZE");
106 const auto refInitFrameSize = _refPbParams->getAttributeValue<NOMAD::ArrayOfDouble>(
"INITIAL_FRAME_SIZE");
107 const auto refMinMeshSize = _refPbParams->getAttributeValue<NOMAD::ArrayOfDouble>(
"MIN_MESH_SIZE");
108 const auto refMinFrameSize = _refPbParams->getAttributeValue<NOMAD::ArrayOfDouble>(
"MIN_FRAME_SIZE");
109 const auto refGranularity = _refPbParams->getAttributeValue<NOMAD::ArrayOfDouble>(
"GRANULARITY");
114 for (
size_t x0index = 0; x0index < refX0s.size(); x0index++)
119 NOMAD::Point subFixedVariable(n);
120 NOMAD::ArrayOfDouble lb(n), ub(n);
122 NOMAD::ArrayOfDouble initialMeshSize(n), initialFrameSize(n), minMeshSize(n), minFrameSize(n);
123 NOMAD::ArrayOfDouble granularity(n);
128 NOMAD::Point refFixedVariable = _refPbParams->getAttributeValue<NOMAD::Point>(
"FIXED_VARIABLE");
132 for (
size_t refIndex = 0; refIndex < refDimension; refIndex++)
134 if (refFixedVariable[refIndex].isDefined())
139 for (
size_t x0index = 0; x0index < refX0s.size(); x0index++)
141 auto refX0 = refX0s[x0index];
142 x0s[x0index][i] = refX0[refIndex];
144 lb[i] = refLowerBound[refIndex];
145 ub[i] = refUpperBound[refIndex];
146 bbInputType.push_back(refBBInputType[refIndex]);
147 initialMeshSize[i] = refInitMeshSize[refIndex];
148 initialFrameSize[i] = refInitFrameSize[refIndex];
149 minMeshSize[i] = refMinMeshSize[refIndex];
150 minFrameSize[i] = refMinFrameSize[refIndex];
151 granularity[i] = refGranularity[refIndex];
155 resetVariableGroupsAgainstFixedVariables(listVariableGroup, refFixedVariable);
159 _subPbParams->setAttributeValue(
"X0", x0s);
160 _subPbParams->setAttributeValue(
"FIXED_VARIABLE", subFixedVariable);
161 _subPbParams->setAttributeValue(
"LOWER_BOUND", lb);
162 _subPbParams->setAttributeValue(
"UPPER_BOUND", ub);
163 _subPbParams->setAttributeValue(
"BB_INPUT_TYPE", bbInputType);
164 _subPbParams->setAttributeValue(
"INITIAL_MESH_SIZE", initialMeshSize);
165 _subPbParams->setAttributeValue(
"INITIAL_FRAME_SIZE", initialFrameSize);
166 _subPbParams->setAttributeValue(
"MIN_MESH_SIZE", minMeshSize);
167 _subPbParams->setAttributeValue(
"MIN_FRAME_SIZE", minFrameSize);
168 _subPbParams->setAttributeValue(
"GRANULARITY", granularity);
169 _subPbParams->setAttributeValue(
"VARIABLE_GROUP", listVariableGroup);
171 _subPbParams->doNotShowWarnings();
173 _subPbParams->checkAndComply();
177 if (refFixedVariable.size() == _fixedVariable.size())
179 refFixedVariable = refFixedVariable.makeSubSpacePointFromFixed(_fixedVariable);
181 const size_t subdim1 = _fixedVariable.size() - _fixedVariable.nbDefined();
182 if (refFixedVariable.size() != subdim1)
184 std::string s =
"Expecting FIXED_VARIABLE to be of size " + std::to_string(subdim1);
185 s +=
". Current FIXED_VARIABLE is of size " + std::to_string(refFixedVariable.size());
186 s +=
": " + refFixedVariable.display();
187 throw NOMAD::Exception(__FILE__,__LINE__, s);
190 for (
size_t refIndex = 0, newIndex = 0; refIndex < _fixedVariable.size(); refIndex++)
192 if (!_fixedVariable[refIndex].isDefined())
194 _fixedVariable[refIndex] = refFixedVariable[newIndex];
200 std::string s =
"FIXED_VARIABLE set to " + _fixedVariable.display();
201 NOMAD::OutputQueue::Add(s, NOMAD::OutputLevel::LEVEL_INFO);
209 void NOMAD::Subproblem::resetVariableGroupsAgainstFixedVariables(
NOMAD::ListOfVariableGroup & lvg,
const NOMAD::Point & fixedVar)
const
211 if (lvg.empty() || !fixedVar.isDefined())
217 const size_t n = fixedVar.size();
218 std::set<size_t> indicesToRemove;
219 for (
size_t i = 0 ; i < n ; i++)
221 if (fixedVar[i].isDefined())
223 indicesToRemove.insert(i);
228 while (!indicesToRemove.empty())
231 auto itIndexBegin = indicesToRemove.begin();
237 for (
auto index : vg)
242 if (index > *itIndexBegin)
244 updatedVariableGroup.insert(index-1);
246 else if (index < *itIndexBegin)
248 updatedVariableGroup.insert(index);
253 if (!updatedVariableGroup.empty())
255 updatedLvg.push_back(updatedVariableGroup);
260 std::set<size_t> updatedIndicesToRemove;
261 for (std::set<size_t>::iterator itIndex = ++itIndexBegin; itIndex != indicesToRemove.end() ; ++itIndex)
263 updatedIndicesToRemove.insert((*itIndex)-1);
265 indicesToRemove = updatedIndicesToRemove;