1function LossTable = getAvgLossTable(self)
2% LOSSTABLE = GETAVGLOSSTABLE()
4% Table of loss (drop) metrics
for every station-
class pair that receives
5% offered traffic. For each such pair it reports the offered arrival rate
6% (ArvR), the carried throughput (Tput), the loss rate (ArvR - Tput, i.e. the
7% rate of jobs dropped by finite capacity, blocking, or reneging) and the loss
8% ratio (LossRate / ArvR, the fraction of offered jobs that are lost).
10% Only station-
class pairs with ArvR > 0 are listed: the loss identity
11% LossRate = ArvR - Tput holds where a class
is actually offered to a station,
12% and it excludes the Source, whose offered arrival rate
is zero. A lossless
13% station has ArvR = Tput and therefore LossRate = LossRatio = 0.
15% See also NetworkSolver.getAvgTable, NetworkSolver.getAvg
17% Copyright (c) 2012-2026, Imperial College London
20[~,~,~,TN,AN] = self.getAvg();
21sn = self.model.getStruct();
23% Fork-Join quorum sibling-drop rate (LDES only), station-indexed. At a
24% synchronizing Join the identity LossRate = ArvR - Tput does not hold (Tput is
25% in parent units, discarded siblings in sibling units), so on Join rows the
26% explicit drop rate replaces ArvR - Tput. ArvR
is already the offered sibling
27% rate (flow balance over all forked siblings), so LossRatio = drop / ArvR.
29if isprop(self, 'result') && isstruct(self.result) && isfield(self.result, 'DropRateJoin')
30 DropRateJoin = self.result.DropRateJoin;
42 if ~(isfinite(a) && a > 0)
47 if ~isempty(DropRateJoin) && ist <= size(DropRateJoin,1) && r <= size(DropRateJoin,2)
48 d = DropRateJoin(ist,r);
50 if isfinite(d) && d > 0
57 Station{end+1,1} = sn.nodenames{sn.stationToNode(ist)}; %#ok<AGROW>
58 JobClass{end+1,1} = sn.classnames{r}; %#ok<AGROW>
59 ArvR(end+1,1) = a; %#ok<AGROW>
60 Tput(end+1,1) = t; %#ok<AGROW>
61 LossRate(end+1,1) = lr; %#ok<AGROW>
62 LossRatio(end+1,1) = lc; %#ok<AGROW>
66LossTable = Table(
Station, JobClass, ArvR, Tput, LossRate, LossRatio);
67LossTable = IndexedTable(LossTable);