LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
qsys_mapdc.m
1function result = qsys_mapdc(D0, D1, s, c, varargin)
2% QSYS_MAPDC Analyzes a MAP/D/c queue using Q-MAM.
3%
4% RESULT = QSYS_MAPDC(D0, D1, S, C) analyzes a MAP/D/c queue with:
5% D0 - MAP hidden transition matrix (n x n)
6% D1 - MAP arrival transition matrix (n x n)
7% S - Deterministic service time (positive scalar)
8% C - Number of servers (positive integer)
9%
10% RESULT = QSYS_MAPDC(..., 'maxNumComp', N) sets max queue length components (default 1000)
11% RESULT = QSYS_MAPDC(..., 'numSteps', K) sets waiting time distribution granularity (default 1)
12%
13% Returns a struct with fields:
14% meanQueueLength - Mean number of customers in system
15% meanWaitingTime - Mean waiting time in queue
16% meanSojournTime - Mean sojourn time (waiting + service)
17% utilization - Server utilization (per server)
18% queueLengthDist - Queue length distribution P(Q=n)
19% waitingTimeDist - Waiting time CDF at discrete points
20% analyzer - Name of analyzer used
21%
22% The waiting time distribution is evaluated at points {0, s/numSteps, 2*s/numSteps, ...}
23% where s is the deterministic service time and numSteps controls the granularity.
24%
25% See also Q_CT_MAP_D_C, qsys_mapmc, qsys_mapd1
26
27% Copyright (c) 2012-2026, Imperial College London
28% All rights reserved.
29
30% Parse optional arguments
31p = inputParser;
32addParameter(p, 'maxNumComp', 1000);
33addParameter(p, 'numSteps', 1);
34parse(p, varargin{:});
35
36maxNumComp = p.Results.maxNumComp;
37numSteps = p.Results.numSteps;
38
39% Input validation
40if ~isnumeric(s) || ~isreal(s) || s <= 0
41 line_error(mfilename, 'Service time s must be a positive real number');
42end
43if ~isnumeric(c) || ~isreal(c) || c < 1 || floor(c) ~= c
44 line_error(mfilename, 'Number of servers c must be a positive integer');
45end
46
47% Call Q-MAM solver
48[ql, w] = Q_CT_MAP_D_C(D0, D1, s, c, 'MaxNumComp', maxNumComp, 'NumSteps', numSteps);
49
50% Compute arrival rate from MAP
51theta = ctmc_solve(D0 + D1);
52lambda = sum(theta * D1);
53
54% Compute utilization (note: s is service time, not rate)
55rho = lambda * s / c;
56
57% Compute mean queue length from distribution
58% ql(i) = Prob[(i-1) customers in the queue]
59n = length(ql);
60meanQL = sum((0:n-1) .* ql(:)');
61
62% see _kb/03-api-layer.md (qsys/ family) for rationale
63meanWT = max(0, meanQL / lambda - s);
64
65% Mean service time (deterministic)
66meanService = s;
67
68% Mean sojourn time = waiting + service
69meanST = meanWT + meanService;
70
71% Build result struct
72result = struct();
73result.meanQueueLength = meanQL;
74result.meanWaitingTime = meanWT;
75result.meanSojournTime = meanST;
76result.utilization = rho;
77result.queueLengthDist = ql;
78result.waitingTimeDist = w;
79result.analyzer = sprintf('Q-MAM:MAP/D/%d', c);
80
81end