1#ifndef STAN_MATH_PRIM_FUN_QUANTILE_HPP
2#define STAN_MATH_PRIM_FUN_QUANTILE_HPP
29template <
typename T, require_vector_t<T>* =
nullptr,
30 require_vector_vt<std::is_arithmetic, T>* =
nullptr>
31inline double quantile(
const T& samples_vec,
const double p) {
35 const size_t n_sample = samples_vec.size();
51 const size_t nm1 = (n_sample - 1);
52 const double index = nm1 * p;
53 const size_t lo =
static_cast<size_t>(index);
55 std::nth_element(x.data(), x.data() + lo, x.data() + n_sample);
57 const double h = index - lo;
61 return (1 - h) * x.coeff(lo) + h * x.tail(nm1 - lo).minCoeff();
81template <
typename T,
typename Tp,
82 typename ReturnT = promote_scalar_t<double, Tp>,
86inline ReturnT
quantile(
const T& samples_vec,
const Tp& ps) {
90 const size_t n_sample = samples_vec.size();
91 const size_t n_ps = ps.size();
92 if (n_ps == 0 || n_sample == 0) {
99 std::sort(x.begin(), x.end());
102 const size_t nm1 = (n_sample - 1);
104 for (
size_t i = 0; i < n_ps; i++) {
105 const double sample_xi = nm1 * ps[i];
106 const size_t smpl_xi_int =
static_cast<size_t>(sample_xi);
107 const double smpl_xi_frc = sample_xi - smpl_xi_int;
108 ret[i] = (1 - smpl_xi_frc) * x[smpl_xi_int];
109 if (smpl_xi_frc != 0.0) {
110 ret[i] += smpl_xi_frc * x[smpl_xi_int + 1];
require_t< container_type_check_base< is_vector, value_type_t, TypeCheck, Check... > > require_vector_vt
Require type satisfies is_vector.
require_all_t< is_vector< std::decay_t< Types > >... > require_all_vector_t
Require all of the types satisfy is_vector.
T as_array_or_scalar(T &&v)
Returns specified input value.
void check_bounded(const char *function, const char *name, const T_y &y, const T_low &low, const T_high &high)
Check if the value is between the low and high values, inclusively.
double quantile(const T &samples_vec, const double p)
Return sample quantiles corresponding to the given probabilities.
void check_not_nan(const char *function, const char *name, const T_y &y)
Check if y is not NaN.
typename plain_type< std::decay_t< T > >::type plain_type_t
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...