5#ifndef LINE_API_AOI_TYPES_H
6#define LINE_API_AOI_TYPES_H
41using Lst = std::function<T(
const T&)>;
70inline T num_exp(
const T& v) {
77inline void require_positive(
const T& v,
const char* fn,
const char* what) {
79 throw InputError(std::string(fn) +
": " + what +
" must be positive");
84inline void require_stable(
const T& rho,
const char* fn) {
85 if (rho >= num_traits<T>::from_int(1))
86 throw NumericError(std::string(fn) +
": unstable system, rho >= 1");
100inline T lst_derivative(
const Lst<T>& f,
const T& s) {
101 const T one = num_traits<T>::from_int(1);
102 const T mag = s < num_traits<T>::from_int(0) ? T(-s) : s;
103 const T scale = mag > one ? mag : one;
104 const T h = num_traits<T>::from_double(1e-6) * scale;
105 return (f(T(s + h)) - f(T(s - h))) / (num_traits<T>::from_int(2) * h);
117inline T lst_second_derivative(
const Lst<T>& f,
const T& s) {
118 const T one = num_traits<T>::from_int(1);
119 const T mag = s < num_traits<T>::from_int(0) ? T(-s) : s;
120 const T scale = mag > one ? mag : one;
121 const T h = num_traits<T>::from_double(5e-3) * scale;
122 const T two = num_traits<T>::from_int(2);
123 const T num = T(-f(T(s + two * h)) + num_traits<T>::from_int(16) * f(T(s + h)) -
124 num_traits<T>::from_int(30) * f(s) + num_traits<T>::from_int(16) * f(T(s - h)) -
126 return num / (num_traits<T>::from_int(12) * h * h);
137template <
class T,
class F>
138inline T bisect(
const F& f, T lo, T hi,
const char* fn,
unsigned max_iter = 200) {
139 const T zero = num_traits<T>::from_int(0);
142 if ((flo > zero && fhi > zero) || (flo < zero && fhi < zero))
143 throw NumericError(std::string(fn) +
": the root is not bracketed by [0.001, 0.999]");
144 for (
unsigned it = 0; it < max_iter; ++it) {
145 const T mid = (lo + hi) / num_traits<T>::from_int(2);
146 if (mid == lo || mid == hi)
break;
148 if (fm == zero)
return mid;
149 if ((fm > zero) == (flo > zero)) { lo = mid; flo = fm; }
152 return (lo + hi) / num_traits<T>::from_int(2);
160inline T gim1_sigma(
const Lst<T>& Y_lst,
const T& mu,
const char* fn) {
161 return bisect<T>([&](
const T& s) {
return T(Y_lst(T(mu - mu * s)) - s); },
162 num_traits<T>::from_double(0.001), num_traits<T>::from_double(0.999), fn);
NumericError(const std::string &what)
The exception types the port throws.
std::function< T(const T &)> Lst
A Laplace-Stieltjes transform evaluated at real arguments.
Conservation laws of a layered queueing network, enumerated from its structure.
Number-type abstraction for the templated API port.
[meanAoI, lstAoI, peakAoI], mirroring jline.api.aoi.AoiLstResult.
[meanAoI, varAoI, peakAoI], mirroring jline.api.aoi.AoiResult.