LINE Solver (C++)
Templated C++ port of the LINE queueing solver
Loading...
Searching...
No Matches
pfqn_qzgblow.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012-2026, QORE Lab, Imperial College London
3 * All rights reserved.
4 */
5#ifndef LINE_API_PFQN_PFQN_QZGBLOW_H
6#define LINE_API_PFQN_PFQN_QZGBLOW_H
7
8/**
9 * @file
10 * @ingroup api_pfqn
11 * Geometric-bound lower bound on the queue length at station i.
12 *
13 * Templated port of matlab/src/api/pfqn/pfqn_qzgblow.m. Single-class model: L is the
14 * per-station demand vector, N the population, Z the think time.
15 *
16 * All operations stay in the field, so the bound is exact in rational
17 * arithmetic: a bound computed exactly is worth having, since a bound violated
18 * only by rounding is indistinguishable from a real violation.
19 */
20
21#include <algorithm>
22#include <vector>
23
24#include "line/num/number.h"
25#include "line/util/error.h"
26#include "line/util/matrix.h"
27
28namespace line {
29namespace pfqn {
30
31/** Qgb = y/(1-y) - y^(N+1)/(1-y) with y = N L_i / (Z + sum(L) + Lmax N). */
32template <class T>
33T pfqn_qzgblow(const std::vector<T>& L, const T& N, const T& Z, std::size_t i) {
34 if (i >= L.size()) throw InputError("pfqn_qzgblow: station index out of range");
35 T Ltot = num_traits<T>::from_int(0), Lmax = L[0];
36 for (const T& d : L) {
37 Ltot += d;
38 if (d > Lmax) Lmax = d;
39 }
40 const T yi = N * L[i] / (Z + Ltot + Lmax * N);
41 const T one = num_traits<T>::from_int(1);
42 if (yi == one) throw NumericError("pfqn_qzgblow: degenerate geometric ratio y = 1");
43 // N enters as an integer exponent, so this stays in the field.
44 const long Nl = static_cast<long>(num_traits<T>::to_double(N));
45 return yi / (one - yi) - num_pow_int(yi, static_cast<unsigned>(Nl + 1)) / (one - yi);
46}
47
48} // namespace pfqn
49} // namespace line
50
51#endif
InputError(const std::string &what)
Definition error.h:39
NumericError(const std::string &what)
Definition error.h:45
The exception types the port throws.
Dense matrix and non-owning view.
T pfqn_qzgblow(const std::vector< T > &L, const T &N, const T &Z, std::size_t i)
Qgb = y/(1-y) - y^(N+1)/(1-y) with y = N L_i / (Z + sum(L) + Lmax N).
T num_pow_int(const T &base, unsigned e)
Integer power, valid in any field (no transcendental requirement).
Definition number.h:192
Number-type abstraction for the templated API port.