110 const T& Np, std::size_t nstar,
double alpha,
113 "sim_quest_heuristic_ci: t quantiles and square roots, so exact arithmetic is "
115 const std::size_t K = bqe.size();
117 throw InputError(
"sim_quest_heuristic_ci: the heuristic interval needs at least 3 batch "
120 throw InputError(
"sim_quest_heuristic_ci: nstar must be positive");
121 if (!(alpha > 0.0) || !(alpha < 1.0))
122 throw InputError(
"sim_quest_heuristic_ci: alpha must be a real scalar in (0,1)");
124 const double Kd =
static_cast<double>(K);
129 const T half = detail::max_omitnan(T(tK * detail::num_sqrt(T(Ap / nst))),
130 T(tKm1 * detail::num_sqrt(T(Np / nst))));
133 for (std::size_t i = 0; i < K; ++i)
sum += bqe[i];
138 for (std::size_t i = 0; i < K; ++i) {
139 const T d = T(bqe[i] - bqeBar);
140 const T dt = T(bqe[i] - centre);
144 const T S2 = T(s2 / Km1);
145 const T S2tilde = T(s2t / Km1);
148 ci.
lower = std::min(T(centre - half), T(bqeBar - half));
149 ci.
upper = std::max(T(centre + half), T(bqeBar + half));
152 const T sdev = detail::num_sqrt(S2);
154 for (std::size_t i = 0; i < K; ++i) {
155 const T z = T(T(bqe[i] - bqeBar) / sdev);
156 cube += T(z * z * z);
164 for (std::size_t i = 0; i + 1 < K; ++i)
165 lag += T(T(bqe[i] - bqeBar) * T(bqe[i + 1] - bqeBar));
166 const T phi1 = T(lag / T(Km1 * S2));
169 const T v = detail::num_sqrt(T(T(one + phi1) / T(one - phi1)));
170 varphi = v < one ? one : v;
176 static_cast<long>(K)))));
177 const T G1 = T(detail::willink_g(tq, gamma) * scale);
178 const T G2 = T(detail::willink_g(T(-tq), gamma) * scale);
180 const T armA = T(centre - G1);
181 const T armB = T(centre - G2);
182 ci.
lower = std::min(ci.
lower, std::min(armA, armB));
183 ci.
upper = std::max(ci.
upper, std::max(armA, armB));
QuestInterval< T > sim_quest_heuristic_ci(const std::vector< T > &bqe, const T ¢re, const T &Ap, const T &Np, std::size_t nstar, double alpha, bool useAutocorr)
Fallback interval used when a QUEST stage test fails.