53 #include "../Math/Direction.hpp"
54 #include "../Math/RNG.hpp"
57 NOMAD::Direction& NOMAD::Direction::operator=(
const NOMAD::Direction& dir)
59 NOMAD::ArrayOfDouble::operator=(dir);
66 const NOMAD::Double NOMAD::Direction::squaredL2Norm()
const
68 NOMAD::Double sqL2 = 0;
70 for (
size_t i = 0; i < size(); i++)
72 sqL2 += _array[i] * _array[i];
83 const NOMAD::Double NOMAD::Direction::norm(
NOMAD::NormType normType)
const
85 NOMAD::Double retNorm = 0;
89 case NOMAD::NormType::L1:
90 for (
size_t i = 0; i < size(); i++)
92 retNorm += _array[i].abs();
95 case NOMAD::NormType::L2:
97 retNorm = this->squaredL2Norm();
98 retNorm = sqrt(retNorm.todouble());
100 case NOMAD::NormType::LINF:
101 for (
size_t i = 0; i < size(); i++)
103 retNorm =
NOMAD::max(retNorm, _array[i].abs());
113 const NOMAD::Double NOMAD::Direction::infiniteNorm()
const
119 const NOMAD::Double NOMAD::Direction::dotProduct(
const NOMAD::Direction& dir1,
120 const NOMAD::Direction& dir2)
122 NOMAD::Double dot = 0.0;
124 size_t size = dir1.size();
125 if (size != dir2.size())
127 std::string err =
"Dot product: vectors are not of the same size: \n";
128 err += dir1.display() +
"\n";
129 err += dir2.display();
130 throw NOMAD::Exception(__FILE__, __LINE__, err);
133 for (
size_t i = 0; i < size; i++)
135 dot += dir1[i] * dir2[i];
142 const NOMAD::Double NOMAD::Direction::cos(
const NOMAD::Direction& dir1,
143 const NOMAD::Direction& dir2)
145 NOMAD::Double cos = 0.0;
147 double norm1 = dir1.norm().todouble();
148 double norm2 = dir2.norm().todouble();
149 if (0.0 == norm1 || 0.0 == norm2)
151 std::string err =
"Cosine: a vector is of size 0";
152 throw NOMAD::Exception(__FILE__, __LINE__, err);
155 cos = dotProduct(dir1, dir2) / (norm1 * norm2);
164 void NOMAD::Direction::computeDirOnUnitSphere(NOMAD::Direction &randomDir)
167 NOMAD::Double norm, d;
168 size_t n = randomDir.size();
170 for (i = 0; i < n; ++i)
172 randomDir[i] = NOMAD::RNG::normalRand(0,1);
175 norm = randomDir.norm();
179 std::string err(
"Cannot compute a random direction on unit sphere");
180 throw NOMAD::Exception(__FILE__, __LINE__, err);
183 for (i = 0; i < n; ++i)
185 randomDir[i] /= norm;
197 void NOMAD::Direction::householder(
const NOMAD::Direction &dir,
199 NOMAD::Direction ** H)
201 size_t n = dir.size();
203 const NOMAD::Double norm2 = dir.squaredL2Norm();
204 NOMAD::Double v, h2i;
206 for (
size_t i = 0 ; i < n ; ++i)
209 for (
size_t j = 0 ; j < n ; ++j)
212 (*
H[i])[j] = v = (i == j) ? norm2 - h2i * dir[j] : - h2i * dir[j];
226 out << dir.display();