LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
sn_get_product_form_params.m
1%{ @file sn_get_product_form_params.m
2 % @brief Extracts standard product-form parameters from the network structure
3 %
4 % @author LINE Development Team
5%}
6
7%{
8 % @brief Extracts standard product-form parameters from the network structure
9 %
10 % @details
11 % This function extracts class-level parameters from a network structure for
12 % use in product-form queueing network analysis. The mu parameter includes
13 % extra elements beyond population |N| as required by MVALDMX.
14 %
15 % @par Syntax:
16 % @code
17 % [lambda,D,N,Z,mu,S,V] = sn_get_product_form_params(sn)
18 % @endcode
19 %
20 % @par Parameters:
21 % <table>
22 % <tr><th>Name<th>Description
23 % <tr><td>sn<td>Network structure
24 % </table>
25 %
26 % @par Returns:
27 % <table>
28 % <tr><th>Name<th>Description
29 % <tr><td>lambda<td>Arrival rates for open classes
30 % <tr><td>D<td>Service demands at queuing stations
31 % <tr><td>N<td>Population vector
32 % <tr><td>Z<td>Think times (service demands at delay stations)
33 % <tr><td>mu<td>Load-dependent service capacity scaling factors
34 % <tr><td>S<td>Number of servers at queuing stations
35 % <tr><td>V<td>Visit ratios
36 % </table>
37%}
38function [lambda,D,N,Z,mu,S,V]= sn_get_product_form_params(sn)
39
40R = sn.nclasses;
41N = sn.njobs;
42queueIndices = find(sn.nodetype == NodeType.Queue);
43delayIndices = find(sn.nodetype == NodeType.Delay);
44sourceIndex = find(sn.nodetype == NodeType.Source);
45Mq = length(queueIndices); % number of queues
46Mz = length(delayIndices); % number of delays
47lambda = zeros(1,R);
48S = sn.nservers(sn.nodeToStation(queueIndices));
49for r=1:R
50 if isinf(N(r))
51 lambda(r) = sn.rates(sn.nodeToStation(sourceIndex),r);
52 end
53end
54
55D = zeros(Mq,R);
56Nct = sum(N(isfinite(N)));
57mu = ones(Mq, ceil(Nct)+max(S(isfinite(S))));
58for ist=1:Mq
59 for r=1:R
60 c = find(sn.chains(:,r),1);
61 if sn.refclass(c)>0
62 D(ist,r) = sn.visits{c}(sn.nodeToStateful(queueIndices(ist)),r) / sn.rates(sn.nodeToStation(queueIndices(ist)),r) / sn.visits{c}(sn.stationToStateful(sn.refstat(r)),sn.refclass(c));
63 else
64 D(ist,r) = sn.visits{c}(sn.nodeToStateful(queueIndices(ist)),r) / sn.rates(sn.nodeToStation(queueIndices(ist)),r);
65 end
66 end
67 mu(ist,1:size(mu,2)) = min(1:size(mu,2), sn.nservers(sn.nodeToStation(queueIndices(ist))));
68end
69Z = zeros(max(1,Mz),R);
70for ist=1:Mz
71 for r=1:R
72 c = find(sn.chains(:,r),1);
73 if sn.refclass(c)>0
74 Z(ist,r) = sn.visits{c}(sn.nodeToStateful(delayIndices(ist)),r) / sn.rates(sn.nodeToStation(delayIndices(ist)),r) / sn.visits{c}(sn.stationToStateful(sn.refstat(r)),sn.refclass(c));
75 else
76 Z(ist,r) = sn.visits{c}(sn.nodeToStateful(delayIndices(ist)),r) / sn.rates(sn.nodeToStation(delayIndices(ist)),r);
77 end
78 end
79end
80D(isnan(D))=0;
81Z(isnan(Z))=0;
82V=cellsum(sn.visits);
83end