LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
toMarginal.m
1function [ni, nir, sir, kir] = toMarginal(sn, ind, state_i, phasesz, phaseshift, space_buf, space_srv, space_var) %#ok<INUSD>
2% TOMARGINAL Compute marginal distributions for a specific node
3%
4% [NI, NIR, SIR, KIR] = TOMARGINAL(SN, IND, STATE_I, PHASESZ, PHASESHIFT, SPACE_BUF, SPACE_SRV, SPACE_VAR)
5%
6% @brief Extracts marginal job statistics from global state information for a specific node
7%
8% This function processes the global network state to compute marginal
9% distributions and job counts for a specific node, considering different
10% scheduling strategies, service phases, and node types.
11%
12% @param sn Network structure or Network object
13% @param ind Node index to extract marginal information for
14% @param state_i Global state matrix or vector
15% @param phasesz Vector of phase sizes for each class
16% @param phaseshift Phase shift parameters for state extraction
17% @param space_buf Buffer space configuration
18% @param space_srv Service space configuration
19% @param space_var Variable space configuration
20%
21% @return ni Total jobs in node IND
22% @return nir Total jobs per class in node IND [matrix: states x classes]
23% @return sir Total jobs in service per class in node IND [matrix: states x classes]
24% @return kir Total jobs in service per class and per phase in node IND [3D array: states x classes x phases]
25
26% Copyright (c) 2012-2026, Imperial College London
27% All rights reserved.
28
29if ~isstruct(sn) % the input can be a Network object too
30 sn=sn.getStruct();
31end
32
33% ind: node index
34if ~sn.isstation(ind) && sn.isstateful(ind) % if stateful node
35 if sn.nodetype(ind) == NodeType.Transition
36 R = sn.nodeparam{ind}.nmodes;
37 sir = zeros(size(state_i,1),R); % class-r jobs in service
38 kir = zeros(size(state_i,1),R,max(phasesz)); % class-r jobs in service in phase k
39 for r=1:R
40 for k=1:phasesz(r)
41 kir(:,r,k) = space_srv(:,phaseshift(r)+k);
42 sir(:,r) = sir(:,r) + kir(:,r,k);
43 end
44 end
45 nir = sir;
46 ni = sum(nir);
47 else
48 ni = sum(state_i(1:(end-sum(sn.nvars(ind,:)))));
49 nir = state_i(1:(end-sum(sn.nvars(ind,:))));
50 sir = nir; % jobs in service
51 kir = sir; % jobs per phase
52 end
53 return
54end
55
56R = sn.nclasses;
57
58ist = sn.nodeToStation(ind);
59isf = sn.nodeToStateful(ind);
60
61if nargin < 3
62 state_i = sn.state{isf};
63end
64
65if nargin < 5
66 phasesz = sn.phasessz(ist,:);
67 phaseshift = sn.phaseshift(ist,:);
68end
69
70isExponential = false;
71if max(phasesz)==1
72 isExponential = true;
73end
74
75if nargin < 8
76 space_var = state_i(:,(end-sum(sn.nvars(ind,:))+1):end); % local variables
77 space_srv = state_i(:,(end-sum(phasesz)-sum(sn.nvars(ind,:))+1):(end-sum(sn.nvars(ind,:)))); % server state
78 space_buf = state_i(:,1:(end-sum(phasesz)-sum(sn.nvars(ind,:)))); % buffer state
79end
80
81if isExponential
82 sir = space_srv;
83 kir = space_srv;
84else
85 nir = zeros(size(state_i,1),R);
86 sir = zeros(size(state_i,1),R); % class-r jobs in service
87 kir = zeros(size(state_i,1),R,max(phasesz)); % class-r jobs in service in phase k
88 for r=1:R
89 for k=1:phasesz(r)
90 kir(:,r,k) = space_srv(:,phaseshift(r)+k);
91 sir(:,r) = sir(:,r) + kir(:,r,k);
92 end
93 end
94end
95
96switch sn.sched(ist)
97 case SchedStrategy.INF
98 for r=1:R
99 nir(:,r) = sir(:,r); % class-r jobs in station
100 end
101 case {SchedStrategy.PS, SchedStrategy.PSPRIO}
102 for r=1:R
103 nir(:,r) = sir(:,r) ; % class-r jobs in station
104 end
105 case SchedStrategy.EXT
106 for r=1:R
107 nir(:,r) = Inf;
108 end
109 case {SchedStrategy.FCFS, SchedStrategy.FCFSPRIO, SchedStrategy.HOL}
110 for r=1:R
111 nir(:,r) = sir(:,r) + sum(space_buf==r,2); % class-r jobs in station
112 end
113 case {SchedStrategy.DPS, SchedStrategy.DPSPRIO}
114 for r=1:R
115 nir(:,r) = sir(:,r) ; % class-r jobs in station
116 end
117 case {SchedStrategy.GPS, SchedStrategy.GPSPRIO}
118 for r=1:R
119 nir(:,r) = sir(:,r) ; % class-r jobs in station
120 end
121 case {SchedStrategy.LCFS, SchedStrategy.LCFSPRIO}
122 for r=1:R
123 nir(:,r) = sir(:,r) + sum(space_buf==r,2); % class-r jobs in station
124 end
125 case {SchedStrategy.FCFSPI, SchedStrategy.FCFSPIPRIO, SchedStrategy.FCFSPR, SchedStrategy.FCFSPRPRIO, SchedStrategy.LCFSPI, SchedStrategy.LCFSPIPRIO, SchedStrategy.LCFSPR, SchedStrategy.LCFSPRPRIO}
126 if length(space_buf)>1
127 space_buf = space_buf(1:2:end);
128 %space_bufphase = space_buf(2:2:end);
129 for r=1:R
130 nir(:,r) = sir(:,r) + sum(space_buf==r,2); % class-r jobs in station
131 end
132 else
133 nir = sir;
134 end
135 case SchedStrategy.SIRO
136 for r=1:R
137 nir(:,r) = sir(:,r) + space_buf(:,r); % class-r jobs in station
138 end
139 case SchedStrategy.SEPT
140 for r=1:R
141 nir(:,r) = sir(:,r) + space_buf(:,r); % class-r jobs in station
142 end
143 case SchedStrategy.LEPT
144 for r=1:R
145 nir(:,r) = sir(:,r) + space_buf(:,r); % class-r jobs in station
146 end
147 case SchedStrategy.SRPT
148 for r=1:R
149 nir(:,r) = sir(:,r) + space_buf(:,r); % class-r jobs in station
150 end
151 case SchedStrategy.SRPTPRIO
152 for r=1:R
153 nir(:,r) = sir(:,r) + space_buf(:,r); % class-r jobs in station
154 end
155 otherwise % possibly other stateful nodes
156 for r=1:R
157 nir(:,r) = sir(:,r) ; % class-r jobs in station
158 end
159end
160
161if sn.nodetype(ind) == NodeType.Place
162 % set all service and phase data to 0
163 for r=1:R
164 if isnan(sn.rates(ist,r)) % if disabled station
165 for k=1:phasesz(r)
166 kir(:,r,k) = 0;
167 end
168 sir(:,r)=0;
169 end
170 end
171else
172 for r=1:R
173 if isnan(sn.rates(ist,r)) % if disabled station
174 nir(:,r) = 0;
175 for k=1:phasesz(r)
176 kir(:,r,k) = 0;
177 end
178 sir(:,r)=0;
179 end
180 end
181end
182
183ni = sum(nir,2); % total jobs in station
184end
Definition mmt.m:92