71 const std::vector<T>& alpha0,
const Matrix<T>& F) {
73 "npfqn_traffic_rqt requires transcendental arithmetic");
76 const std::size_t J = lambda0.size();
78 out.
lambda.assign(J, zero);
79 out.
Gamma.assign(J, zero);
80 out.
alpha.assign(J, two);
84 for (std::size_t i = 0; i < J; ++i)
85 for (std::size_t j = 0; j < J; ++j)
86 ImFt(i, j) = T((i == j ? one : zero) - F(j, i));
88 for (std::size_t j = 0; j < J; ++j) {
90 for (std::size_t i = 0; i < J; ++i) s = T(s + Xi(j, i) * lambda0[i]);
95 const double inf = std::numeric_limits<double>::infinity();
96 std::vector<double> alpha(J);
97 for (std::size_t j = 0; j < J; ++j)
99 for (std::size_t it = 0; it < J; ++it) {
100 bool changed =
false;
101 for (std::size_t j = 0; j < J; ++j)
102 for (std::size_t i = 0; i < J; ++i)
103 if (F(i, j) > zero && out.
lambda[i] > zero && alpha[i] < alpha[j]) {
109 for (std::size_t j = 0; j < J; ++j) {
111 if (!(alpha[j] < inf)) alpha[j] = 2.0;
116 std::vector<T> p(J, two);
117 for (std::size_t j = 0; j < J; ++j) p[j] = out.
alpha[j] / (out.
alpha[j] - one);
119 for (std::size_t j = 0; j < J; ++j) {
121 if (lambda0[j] > zero && d < 1e-12 && d > -1e-12)
122 z0(j, 0) = qsys::detail::num_pow(T(lambda0[j] * Gamma0[j]), p[j]);
125 for (std::size_t i = 0; i < J; ++i)
126 for (std::size_t j = 0; j < J; ++j) {
128 const double d = alpha[j] - alpha[i];
129 if (F(j, i) > zero && d < 1e-12 && d > -1e-12) a = F(j, i);
130 ImAt(i, j) = T((i == j ? one : zero) - a);
134 for (std::size_t j = 0; j < J; ++j) {
136 if (zj < zero) zj = zero;
138 out.
Gamma[j] = qsys::detail::num_pow(zj, T(one / p[j])) / out.
lambda[j];
Dense linear algebra over the templated number type: products, identity, inverse, and powers.
TrafficRqt< T > npfqn_traffic_rqt(const std::vector< T > &lambda0, const std::vector< T > &Gamma0, const std::vector< T > &alpha0, const Matrix< T > &F)
Effective arrival processes of a network under the Robust Queueing calculus.