Correct typos in comments (#639)
* Correct typos in comments Correct comments in code on type of generated distribution. Improve Gaussian RNG to take advantage of Box Muller method * Inline Box Muller Added inline function for the Box Muller algorithm and updated code comments to be more concise * Update tensor_fill.h * Update tensor_fill.h * small changes to pass tests Co-authored-by: Haicheng Wu <haichengw@nvidia.com>
This commit is contained in:
parent
dadc881a96
commit
cb539dab78
@ -92,6 +92,25 @@ struct TensorFillFunc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Returns a pair of values of the Gaussian distribution generated by the Box Muller method
|
||||||
|
struct BoxMullerFunc {
|
||||||
|
|
||||||
|
BoxMullerFunc() {}
|
||||||
|
|
||||||
|
void operator()(
|
||||||
|
double* rnd, ///< Size-2 vector to be filled with random values
|
||||||
|
double mean = 0, ///< Mean of the Gaussian distribution
|
||||||
|
double stddev = 1, ///< Standard deviation of the Gaussian distribution
|
||||||
|
double pi = std::acos(-1)) const {
|
||||||
|
|
||||||
|
double u1 = double(std::rand()) / double(RAND_MAX);
|
||||||
|
double u2 = double(std::rand()) / double(RAND_MAX);
|
||||||
|
rnd[0] = std::sqrt(-2 * std::log(u1)) * std::cos(2 * pi * u2);
|
||||||
|
rnd[1] = std::sqrt(-2 * std::log(u1)) * std::sin(2 * pi * u2);
|
||||||
|
rnd[0] = mean + stddev * rnd[0];
|
||||||
|
rnd[1] = mean + stddev * rnd[1];
|
||||||
|
}
|
||||||
|
};
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -205,22 +224,18 @@ struct RandomGaussianFunc<complex<Element> > {
|
|||||||
|
|
||||||
Element reals[2];
|
Element reals[2];
|
||||||
|
|
||||||
for (int i = 0; i < 2; ++i) {
|
double rnd[2];
|
||||||
// Box-Muller transform to generate random numbers with Normal distribution
|
detail::BoxMullerFunc func;
|
||||||
double u1 = double(std::rand()) / double(RAND_MAX);
|
func(rnd, mean, stddev, pi);
|
||||||
double u2 = double(std::rand()) / double(RAND_MAX);
|
|
||||||
|
|
||||||
// Compute Gaussian random value
|
if (int_scale >= 0) {
|
||||||
double rnd = std::sqrt(-2 * std::log(u1)) * std::cos(2 * pi * u2);
|
rnd[0] = double(int(rnd[0] * double(1 << int_scale)));
|
||||||
rnd = mean + stddev * rnd;
|
rnd[1] = double(int(rnd[1] * double(1 << int_scale)));
|
||||||
|
reals[0] = from_real<Element>(rnd[0] / double(1 << int_scale));
|
||||||
if (int_scale >= 0) {
|
reals[1] = from_real<Element>(rnd[1] / double(1 << int_scale));
|
||||||
rnd = double(int(rnd * double(1 << int_scale)));
|
} else {
|
||||||
reals[i] = from_real<Element>(rnd / double(1 << int_scale));
|
reals[0] = from_real<Element>(rnd[0]);
|
||||||
}
|
reals[1] = from_real<Element>(rnd[1]);
|
||||||
else {
|
|
||||||
reals[i] = from_real<Element>(rnd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return complex<Element>(reals[0], reals[1]);
|
return complex<Element>(reals[0], reals[1]);
|
||||||
@ -255,22 +270,27 @@ struct RandomGaussianFunc<Quaternion<Element> > {
|
|||||||
|
|
||||||
Element reals[4];
|
Element reals[4];
|
||||||
|
|
||||||
for (int i = 0; i < 4; ++i) {
|
double rnd1[2];
|
||||||
// Box-Muller transform to generate random numbers with Normal distribution
|
double rnd2[2];
|
||||||
double u1 = double(std::rand()) / double(RAND_MAX);
|
detail::BoxMullerFunc func;
|
||||||
double u2 = double(std::rand()) / double(RAND_MAX);
|
func(rnd1, mean, stddev, pi);
|
||||||
|
func(rnd2, mean, stddev, pi);
|
||||||
|
|
||||||
// Compute Gaussian random value
|
if (int_scale >= 0) {
|
||||||
double rnd = std::sqrt(-2 * std::log(u1)) * std::cos(2 * pi * u2);
|
rnd1[0] = double(int(rnd1[0] * double(1 << int_scale)));
|
||||||
rnd = mean + stddev * rnd;
|
rnd1[1] = double(int(rnd1[1] * double(1 << int_scale)));
|
||||||
|
rnd2[0] = double(int(rnd2[0] * double(1 << int_scale)));
|
||||||
|
rnd2[1] = double(int(rnd2[1] * double(1 << int_scale)));
|
||||||
|
|
||||||
if (int_scale >= 0) {
|
reals[0] = from_real<Element>(rnd1[0] / double(1 << int_scale));
|
||||||
rnd = double(int(rnd * double(1 << int_scale)));
|
reals[1] = from_real<Element>(rnd1[1] / double(1 << int_scale));
|
||||||
reals[i] = from_real<Element>(rnd / double(1 << int_scale));
|
reals[2] = from_real<Element>(rnd2[0] / double(1 << int_scale));
|
||||||
}
|
reals[3] = from_real<Element>(rnd2[1] / double(1 << int_scale));
|
||||||
else {
|
} else {
|
||||||
reals[i] = from_real<Element>(rnd);
|
reals[0] = from_real<Element>(rnd1[0]);
|
||||||
}
|
reals[1] = from_real<Element>(rnd1[1]);
|
||||||
|
reals[2] = from_real<Element>(rnd2[0]);
|
||||||
|
reals[3] = from_real<Element>(rnd2[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Quaternion<Element>(reals[0], reals[1], reals[2], reals[3]);
|
return Quaternion<Element>(reals[0], reals[1], reals[2], reals[3]);
|
||||||
@ -311,7 +331,7 @@ struct TensorFillGaussianFunc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Computes a random Gaussian distribution
|
/// Computes a random Gaussian distribution for a rank-2 tensor
|
||||||
template <
|
template <
|
||||||
typename Element, ///< Element type
|
typename Element, ///< Element type
|
||||||
typename Layout> ///< Layout function
|
typename Layout> ///< Layout function
|
||||||
@ -404,7 +424,7 @@ void TensorFillRandomGaussian(
|
|||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
/// Fills a tensor with random values with a Gaussian distribution.
|
/// Fills the upper or lower part of a symmetric rank-2 tensor with random values of a Gaussian distribution.
|
||||||
template <
|
template <
|
||||||
typename Element, ///< Element type
|
typename Element, ///< Element type
|
||||||
typename Layout> ///< Layout function
|
typename Layout> ///< Layout function
|
||||||
@ -434,7 +454,7 @@ void TensorFillSymmetricRandomGaussian(
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/// Fills a tensor with random values with a Gaussian distribution.
|
/// Fills a tensor with random values of a Gaussian distribution.
|
||||||
template <
|
template <
|
||||||
typename Element ///< Element type
|
typename Element ///< Element type
|
||||||
>
|
>
|
||||||
@ -614,7 +634,7 @@ struct RandomUniformFunc<Quaternion<Element> > {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Computes a random Gaussian distribution
|
/// Computes a random uniform distribution
|
||||||
template <
|
template <
|
||||||
typename Element, ///< Element type
|
typename Element, ///< Element type
|
||||||
typename Layout> ///< Layout function
|
typename Layout> ///< Layout function
|
||||||
@ -633,7 +653,7 @@ struct TensorFillRandomUniformFunc {
|
|||||||
// Methods
|
// Methods
|
||||||
//
|
//
|
||||||
|
|
||||||
/// Construction of Gaussian RNG functor.
|
/// Construction of uniform RNG functor.
|
||||||
TensorFillRandomUniformFunc(
|
TensorFillRandomUniformFunc(
|
||||||
TensorView view_ = TensorView(),
|
TensorView view_ = TensorView(),
|
||||||
RandomUniformFunc<Element> func_ = RandomUniformFunc<Element>()
|
RandomUniformFunc<Element> func_ = RandomUniformFunc<Element>()
|
||||||
@ -649,7 +669,7 @@ struct TensorFillRandomUniformFunc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Computes a random Gaussian distribution
|
/// Fills the upper or lower part of a symmetric rank-2 tensor with random values of a uniform distribution.
|
||||||
template <
|
template <
|
||||||
typename Element, ///< Element type
|
typename Element, ///< Element type
|
||||||
typename Layout> ///< Layout function
|
typename Layout> ///< Layout function
|
||||||
@ -669,7 +689,7 @@ struct TensorFillSymmetricRandomUniformFunc {
|
|||||||
// Methods
|
// Methods
|
||||||
//
|
//
|
||||||
|
|
||||||
/// Construction of Gaussian RNG functor.
|
/// Construction of uniform RNG functor.
|
||||||
TensorFillSymmetricRandomUniformFunc(
|
TensorFillSymmetricRandomUniformFunc(
|
||||||
TensorView view_ = TensorView(),
|
TensorView view_ = TensorView(),
|
||||||
RandomUniformFunc<Element> func_ = RandomUniformFunc<Element>(),
|
RandomUniformFunc<Element> func_ = RandomUniformFunc<Element>(),
|
||||||
@ -715,7 +735,7 @@ struct TensorFillPadDiagonalRandomUniformFunc {
|
|||||||
// Methods
|
// Methods
|
||||||
//
|
//
|
||||||
|
|
||||||
/// Construction of Gaussian RNG functor.
|
/// Construction of uniform RNG functor.
|
||||||
TensorFillPadDiagonalRandomUniformFunc(
|
TensorFillPadDiagonalRandomUniformFunc(
|
||||||
TensorView view_ = TensorView(),
|
TensorView view_ = TensorView(),
|
||||||
RandomUniformFunc<Element> func_ = RandomUniformFunc<Element>(),
|
RandomUniformFunc<Element> func_ = RandomUniformFunc<Element>(),
|
||||||
@ -747,7 +767,7 @@ struct TensorFillPadDiagonalRandomUniformFunc {
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/// Fills a tensor with random values with a uniform random distribution.
|
/// Fills a tensor with random values of a uniform random distribution.
|
||||||
template <
|
template <
|
||||||
typename Element, ///< Element type
|
typename Element, ///< Element type
|
||||||
typename Layout> ///< Layout function
|
typename Layout> ///< Layout function
|
||||||
@ -772,7 +792,7 @@ void TensorFillRandomUniform(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fills a tensor with random values with a uniform random distribution.
|
/// Fills a tensor with random values of a uniform random distribution.
|
||||||
template <
|
template <
|
||||||
typename Element, ///< Element type
|
typename Element, ///< Element type
|
||||||
typename Layout> ///< Layout function
|
typename Layout> ///< Layout function
|
||||||
|
Loading…
Reference in New Issue
Block a user