149 throw InputError(
"dqsys_bernoulli1: L must be a positive integer");
154 std::vector<T> boff(L + 1);
156 for (std::size_t n = 0; n <= L; ++n) boff[n] = b[0];
157 }
else if (b.size() == L + 1) {
160 throw InputError(
"dqsys_bernoulli1: the arrival probability vector must have one entry "
163 std::vector<T> pv(L);
165 for (std::size_t n = 0; n < L; ++n) pv[n] = p[0];
166 }
else if (p.size() == L) {
168 }
else if (p.size() == L + 1) {
171 pv.assign(p.begin() + 1, p.end());
173 throw InputError(
"dqsys_bernoulli1: the service probability vector must have L or L+1 "
176 for (std::size_t n = 0; n <= L; ++n) {
177 if (boff[n] < zero || boff[n] > one) {
178 throw InputError(
"dqsys_bernoulli1: arrival probabilities must lie in [0,1]");
181 for (std::size_t n = 0; n < L; ++n) {
182 if (!(pv[n] > zero) || pv[n] > one) {
183 throw InputError(
"dqsys_bernoulli1: service probabilities must lie in (0,1]");
186 std::vector<T> badm = boff;
188 for (std::size_t n = 0; n < L; ++n) {
189 if (!(badm[n] < one)) {
192 throw InputError(
"dqsys_bernoulli1: arrival probabilities below the capacity must be "
193 "strictly less than one");
202 std::vector<T> u(L + 1, zero);
203 u[0] = one / (one - badm[0]);
206 for (std::size_t n = 1; n <= L; ++n) {
207 const T q = (n >= 2) ? (one - pv[n - 2]) : one;
208 u[n] = u[n - 1] * badm[n - 1] * q / ((one - badm[n]) * pv[n - 1]);
211 for (std::size_t k = 0; k <= n; ++k) u[k] = u[k] / f;
216 for (std::size_t n = 0; n <= L; ++n) H = H + u[n];
223 for (std::size_t n = 0; n <= L; ++n) r.
pmf[n] = u[n] / H;
229 std::vector<T> v(L, zero);
230 v[0] = badm[0] / ((one - badm[0]) * (one - badm[1]));
231 for (std::size_t n = 1; n < L; ++n) {
232 v[n] = v[n - 1] * badm[n] * (one - pv[n - 1]) / ((one - badm[n + 1]) * pv[n - 1]);
235 for (std::size_t k = 0; k <= n; ++k) v[k] = v[k] / f;
239 for (std::size_t n = 0; n < L; ++n) Ha = Ha + v[n];
243 for (std::size_t n = 0; n < L; ++n) r.
arrivalPmf[n] = v[n] / Ha;
248 T q = zero, t = zero, offered = zero;
249 for (std::size_t n = 0; n <= L; ++n) {
251 offered = offered + r.
pmf[n] * boff[n];
252 if (n >= 1) t = t + r.
pmf[n] * pv[n - 1];
256 r.
lossProb = (offered > zero) ? (r.
pmf[L] * boff[L] / offered) : zero;