LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
solver_nc_lossn_analyzer.m
1function [Q,U,R,T,C,X,lG,runtime,iter,method] = solver_nc_lossn_analyzer(sn, options)
2% SOLVER_NC_LOSSN_ANALYZER Analyzes open loss networks with FCR using Erlang FP
3%
4% This analyzer handles open queueing networks with a single multiclass
5% Delay node inside a Finite Capacity Region (FCR) with DROP policy.
6% It uses the Erlang fixed-point approximation for loss networks.
7
8Tstart = tic;
9K = sn.nclasses; % number of classes
10M = sn.nstations;
11
12line_debug('NC loss network analyzer starting: method=%s, nstations=%d, nclasses=%d', options.method, M, K);
13
14% 1. Extract arrival rates from Source
15nu = zeros(1, K);
16for r = 1:K
17 sourceIdx = sn.refstat(r);
18 nu(r) = sn.rates(sourceIdx, r); % arrival rate
19end
20
21% 2. Find delay station in FCR and extract constraints
22regionMatrix = sn.region{1};
23stationsInFCR = find(any(regionMatrix(:,1:end-1) >= 0, 2) | regionMatrix(:,end) >= 0);
24delayIdx = stationsInFCR(1);
25
26globalMax = regionMatrix(delayIdx, K+1);
27classMax = regionMatrix(delayIdx, 1:K);
28
29% Handle unbounded constraints (replace -1 with large value for Erlang)
30if globalMax < 0
31 globalMax = 1e6;
32end
33classMax(classMax < 0) = 1e6;
34
35% 3. Build A matrix (J x K) where J = K+1 links
36% Link 1: global constraint (all classes contribute)
37% Links 2..K+1: per-class constraints (only class r contributes to link r+1)
38J = K + 1;
39A = zeros(J, K);
40A(1, :) = 1; % global link: all classes contribute
41for r = 1:K
42 A(r+1, r) = 1; % per-class link: only class r contributes
43end
44
45% 4. Build C vector (J x 1)
46C_vec = zeros(J, 1);
47C_vec(1) = globalMax;
48C_vec(2:end) = classMax(:);
49
50% 5. Call lossn_erlangfp
51[QLen, Loss, E, niter] = lossn_erlangfp(nu, A, C_vec);
52
53% 6. Convert to standard outputs
54Q = zeros(M, K);
55U = zeros(M, K);
56T = zeros(M, K);
57R = zeros(M, K);
58
59% At delay node: QLen is effective throughput (after loss)
60for r = 1:K
61 T(delayIdx, r) = QLen(r); % effective throughput = arrival rate * (1-loss)
62 mu_r = sn.rates(delayIdx, r); % service rate at delay
63 Q(delayIdx, r) = QLen(r) / mu_r; % Little's law: Q = X * S
64 R(delayIdx, r) = 1 / mu_r; % response time = service time (infinite server)
65 U(delayIdx, r) = T(delayIdx, r) / mu_r; % "utilization" for delay
66end
67
68X = QLen(:)'; % system throughput per class (row vector)
69C = zeros(1, K); % cycle time not applicable
70lG = NaN; % no normalizing constant for loss networks
71iter = niter;
72method = 'erlangfp';
73runtime = toc(Tstart);
74end