47 #include "../Math/LHS.hpp"
48 #include "../Math/RNG.hpp"
49 #include "../Math/RandomPickup.hpp"
50 #include "../Util/Exception.hpp"
56 NOMAD::LHS::LHS(
size_t n,
58 NOMAD::ArrayOfDouble lowerBound,
59 NOMAD::ArrayOfDouble upperBound)
62 _lowerBound(lowerBound),
63 _upperBound(upperBound)
65 if (!_lowerBound.isComplete())
67 std::string s =
"LHS Lower bound needs to be completely defined. Values given: ";
68 s += lowerBound.display();
69 throw NOMAD::Exception(__FILE__, __LINE__, s);
71 if (!_upperBound.isComplete())
73 std::string s =
"LHS Upper bound needs to be completely defined. Values given: ";
74 s += upperBound.display();
75 throw NOMAD::Exception(__FILE__, __LINE__, s);
82 std::vector<NOMAD::Point> NOMAD::LHS::Sample()
const
84 std::vector<NOMAD::Point> samplepoints;
90 std::vector<std::vector<size_t>> Pi;
91 for (
size_t i = 0; i < _n; i++)
93 std::vector<size_t> v = Permutation(_p);
98 for (
size_t j = 0; j < _p; j++)
101 for (
size_t i = 0; i < _n; i++)
104 NOMAD::Double l_i = _lowerBound[i];
105 NOMAD::Double Pi_ij( Pi[i][j] );
106 NOMAD::Double pdouble( _p );
107 NOMAD::Double u_i( _upperBound[i] );
109 NOMAD::Double x_ij = l_i + (Pi_ij - r_ij) / pdouble * (u_i - l_i);
113 samplepoints.push_back(point);
122 std::vector<size_t> NOMAD::LHS::Permutation(
const size_t p)
124 NOMAD::RandomPickup rp(p);
126 std::vector<size_t> v;
127 for (
size_t j = 0; j < p ; j++)
129 v.push_back(rp.pickup()+1);