Generic utilities#
A number of utilities to compute quantities that are of general relevance.
-
template<typename Rng>
inline double pagmo::uniform_real_from_range(double lb, double ub, Rng &r_engine)# Generate a random real number within some lower and upper bounds.
This function will create a random real number within a half-open range. If both the lower and upper bounds are finite numbers, then the generated value \( x \) will be such that \(lb \le x < ub\). If \(lb = ub\), then \(lb\) is returned.
Example:
std::mt19937 r_engine(32u); auto x = uniform_real_from_range(3,5,r_engine); // a random real in the [3, 5) range. auto x = uniform_real_from_range(2,2,r_engine); // the value 2.
- Parameters
lb – lower bound
ub – upper bound
r_engine – a C++ random engine
- Throws
std::invalid_argument – if:
the bounds are not finite,
\( lb > ub \),
\( ub - lb \) is larger than an implementation-defined value.
- Returns
a random floating-point value
-
template<typename Rng>
inline double pagmo::uniform_integral_from_range(double lb, double ub, Rng &r_engine)# Generate a random integral number within some lower and upper bounds.
This function will create a random integral number within a closed range. If both the lower and upper bounds are finite numbers, then the generated value \( x \) will be such that \(lb \le x \le ub\).
Example:
std::mt19937 r_engine(32u); auto x = uniform_integral_from_range(3,5,r_engine); // one of [3, 4, 5]. auto x = uniform_integral_from_range(2,2,r_engine); // the value 2.
Note
The return value is created internally via an integral random number generator based on the
long longtype, and then cast back todouble. Thus, if the absolute values of the lower/upper bounds are large enough, any of the following may happen:the conversion of the lower/upper bounds to
long longmay produce an overflow error,the conversion of the randomly-generated
long longinteger back todoublemay yield an inexact result.
In practice, on modern mainstream computer architectures, this function will produce uniformly-distributed integral values as long as the absolute values of the bounds do not exceed \(2^{53}\).
- Parameters
lb – lower bound
ub – upper bound
r_engine – a C++ random engine
- Throws
std::invalid_argument – if:
the bounds are not finite,
\( lb > ub \),
\( lb \) and/or \( ub \) are not integral values,
\( lb \) and/or \( ub \) are not within the bounds of the
long longtype.
- Returns
a random integral value
-
template<typename Rng>
inline vector_double pagmo::random_decision_vector(const problem &prob, Rng &r_engine)# Generate a random decision vector compatible with a problem.
This function will generate a decision vector whose values are randomly chosen with uniform probability within the input problem’s bounds.
For the continuous part of the decision vector, the values will be generated via pagmo::uniform_real_from_range().
For the discrete part of the decision vector, the values will be generated via pagmo::uniform_integral_from_range().
- Parameters
prob – the input pagmo::problem
r_engine – a C++ random engine
- Throws
unspecified – any exception thrown by pagmo::uniform_real_from_range() or pagmo::uniform_integral_from_range().
- Returns
a pagmo::vector_double containing a random decision vector
-
template<typename Rng>
inline vector_double pagmo::batch_random_decision_vector(const problem &prob, vector_double::size_type n, Rng &r_engine)# Generate a batch of random decision vectors compatible with a problem.
This function will generate
ndecision vectors whose values are randomly chosen with uniform probability within the input problem’s bounds. The decision vectors are laid out contiguously in the return value: for a problem with dimension \( d \), the first decision vector in the return value occupies the index range \( \left[0, d\right) \), the second decision vector occupies the range \( \left[d, 2d\right) \), and so on.For the continuous parts of the decision vectors, the values will be generated via pagmo::uniform_real_from_range().
For the discrete parts of the decision vectors, the values will be generated via pagmo::uniform_integral_from_range().
- Parameters
prob – the input pagmo::problem
n – how many decision vectors will be generated
r_engine – a C++ random engine
- Throws
std::overflow_error – in case of (unlikely) overflow errors.
unspecified – any exception thrown by pagmo::uniform_real_from_range() or pagmo::uniform_integral_from_range().
- Returns
a pagmo::vector_double containing
nrandom decision vectors
-
double pagmo::binomial_coefficient(vector_double::size_type n, vector_double::size_type k)#
Binomial coefficient.
An implementation of the binomial coefficient using gamma functions
- Parameters
n – first parameter \(n\)
k – second parameter \(k\)
- Returns
the binomial coefficient \( n \choose k \)
-
std::vector<std::vector<vector_double::size_type>> pagmo::kNN(const std::vector<vector_double> &points, std::vector<vector_double>::size_type k)#
K-Nearest Neighbours.
Computes the indexes of the k nearest neighbours (euclidean distance) to each of the input points. The algorithm complexity (naive implementation) is \( O(MN^2)\) where \(N\) is the number of points and \(M\) their dimensionality
Example:
auto res = kNN({{1, 1}, {2, 2}, {3.1, 3.1}, {5, 5}}, 2u);- Parameters
points – the \(N\) points having dimension \(M\)
k – number of neighbours to detect
- Throws
std::invalid_argument – If the points do not all have the same dimension.
- Returns
An
std::vector<std::vector<population::size_type> >containing the indexes of the k nearest neighbours sorted by distance