LINE Solver (C++)
Templated C++ port of the LINE queueing solver
Toggle main menu visibility
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
28
namespace
line
{
29
namespace
pfqn
{
30
31
/** Qgb = y/(1-y) - y^(N+1)/(1-y) with y = N L_i / (Z + sum(L) + Lmax N). */
32
template
<
class
T>
33
T
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
line::InputError::InputError
InputError(const std::string &what)
Definition
error.h:39
line::NumericError::NumericError
NumericError(const std::string &what)
Definition
error.h:45
error.h
The exception types the port throws.
matrix.h
Dense matrix and non-owning view.
line::pfqn
Definition
cd_peak_scaling.h:43
line::pfqn::pfqn_qzgblow
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).
Definition
pfqn_qzgblow.h:33
line
Definition
aoi_dist2ph.h:52
line::num_pow_int
T num_pow_int(const T &base, unsigned e)
Integer power, valid in any field (no transcendental requirement).
Definition
number.h:192
number.h
Number-type abstraction for the templated API port.
line::num_traits
Definition
number.h:111
include
line
api
pfqn
pfqn_qzgblow.h
Generated by
1.18.0