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 if nargin < 5
38 % Initialize phasesz/phaseshift for Transition nodes from firingphases
39 phasesz = sn.nodeparam{ind}.firingphases;
40 if any(isnan(phasesz))
41 phasesz = zeros(1, R);
42 for m = 1:R
43 if iscell(sn.nodeparam{ind}.firingproc) && ~isempty(sn.nodeparam{ind}.firingproc{m})
44 phasesz(m) = size(sn.nodeparam{ind}.firingproc{m}{1}, 1);
45 else
46 phasesz(m) = 1;
47 end
48 end
49 end
50 phaseshift = [0,cumsum(phasesz(1:end-1))];
51 end
52 if nargin < 8
53 nmodes = R;
54 space_buf = state_i(:,1:nmodes);
55 space_srv = state_i(:,(nmodes+1):(nmodes+sum(phasesz)));
56 space_var = state_i(:,(nmodes+sum(phasesz)+1):end);
57 end
58 sir = zeros(size(state_i,1),R); % class-r jobs in service
59 kir = zeros(size(state_i,1),R,max(phasesz)); % class-r jobs in service in phase k
60 for r=1:R
61 for k=1:phasesz(r)
62 kir(:,r,k) = space_srv(:,phaseshift(r)+k);
63 sir(:,r) = sir(:,r) + kir(:,r,k);
64 end
65 end
66 nir = sir;
67 ni = sum(nir);
68 else
69 ni = sum(state_i(1:(end-sum(sn.nvars(ind,:)))));
70 nir = state_i(1:(end-sum(sn.nvars(ind,:))));
71 sir = nir; % jobs in service
72 kir = sir; % jobs per phase
73 end
74 return
75end
76
77R = sn.nclasses;
78
79ist = sn.nodeToStation(ind);
80isf = sn.nodeToStateful(ind);
81
82if nargin < 3
83 state_i = sn.state{isf};
84end
85
86if nargin < 5
87 phasesz = sn.phasessz(ist,:);
88 phaseshift = sn.phaseshift(ist,:);
89end
90
91isExponential = false;
92if max(phasesz)==1
93 isExponential = true;
94end
95
96if nargin < 8
97 space_var = state_i(:,(end-sum(sn.nvars(ind,:))+1):end); % local variables
98 space_srv = state_i(:,(end-sum(phasesz)-sum(sn.nvars(ind,:))+1):(end-sum(sn.nvars(ind,:)))); % server state
99 space_buf = state_i(:,1:(end-sum(phasesz)-sum(sn.nvars(ind,:)))); % buffer state
100end
101
102if isExponential
103 sir = space_srv;
104 kir = space_srv;
105else
106 nir = zeros(size(state_i,1),R);
107 sir = zeros(size(state_i,1),R); % class-r jobs in service
108 kir = zeros(size(state_i,1),R,max(phasesz)); % class-r jobs in service in phase k
109 for r=1:R
110 for k=1:phasesz(r)
111 kir(:,r,k) = space_srv(:,phaseshift(r)+k);
112 sir(:,r) = sir(:,r) + kir(:,r,k);
113 end
114 end
115end
116
117switch sn.sched(ist)
118 case SchedStrategy.INF
119 for r=1:R
120 nir(:,r) = sir(:,r); % class-r jobs in station
121 end
122 case {SchedStrategy.PS, SchedStrategy.PSPRIO}
123 for r=1:R
124 nir(:,r) = sir(:,r) ; % class-r jobs in station
125 end
126 case SchedStrategy.EXT
127 for r=1:R
128 nir(:,r) = Inf;
129 end
130 case {SchedStrategy.FCFS, SchedStrategy.FCFSPRIO, SchedStrategy.HOL}
131 for r=1:R
132 nir(:,r) = sir(:,r) + sum(space_buf==r,2); % class-r jobs in station
133 end
134 case {SchedStrategy.DPS, SchedStrategy.DPSPRIO}
135 for r=1:R
136 nir(:,r) = sir(:,r) ; % class-r jobs in station
137 end
138 case {SchedStrategy.GPS, SchedStrategy.GPSPRIO}
139 for r=1:R
140 nir(:,r) = sir(:,r) ; % class-r jobs in station
141 end
142 case {SchedStrategy.LCFS, SchedStrategy.LCFSPRIO}
143 for r=1:R
144 nir(:,r) = sir(:,r) + sum(space_buf==r,2); % class-r jobs in station
145 end
146 case {SchedStrategy.FCFSPI, SchedStrategy.FCFSPIPRIO, SchedStrategy.FCFSPR, SchedStrategy.FCFSPRPRIO, SchedStrategy.LCFSPI, SchedStrategy.LCFSPIPRIO, SchedStrategy.LCFSPR, SchedStrategy.LCFSPRPRIO}
147 if length(space_buf)>1
148 space_buf = space_buf(1:2:end);
149 %space_bufphase = space_buf(2:2:end);
150 for r=1:R
151 nir(:,r) = sir(:,r) + sum(space_buf==r,2); % class-r jobs in station
152 end
153 else
154 nir = sir;
155 end
156 case SchedStrategy.SIRO
157 for r=1:R
158 nir(:,r) = sir(:,r) + space_buf(:,r); % class-r jobs in station
159 end
160 case SchedStrategy.SEPT
161 for r=1:R
162 nir(:,r) = sir(:,r) + space_buf(:,r); % class-r jobs in station
163 end
164 case SchedStrategy.LEPT
165 for r=1:R
166 nir(:,r) = sir(:,r) + space_buf(:,r); % class-r jobs in station
167 end
168 case SchedStrategy.SRPT
169 for r=1:R
170 nir(:,r) = sir(:,r) + space_buf(:,r); % class-r jobs in station
171 end
172 case SchedStrategy.SRPTPRIO
173 for r=1:R
174 nir(:,r) = sir(:,r) + space_buf(:,r); % class-r jobs in station
175 end
176 otherwise % possibly other stateful nodes
177 for r=1:R
178 nir(:,r) = sir(:,r) ; % class-r jobs in station
179 end
180end
181
182if sn.nodetype(ind) == NodeType.Place
183 % set all service and phase data to 0
184 for r=1:R
185 if isnan(sn.rates(ist,r)) % if disabled station
186 for k=1:phasesz(r)
187 kir(:,r,k) = 0;
188 end
189 sir(:,r)=0;
190 end
191 end
192else
193 for r=1:R
194 if isnan(sn.rates(ist,r)) % if disabled station
195 nir(:,r) = 0;
196 for k=1:phasesz(r)
197 kir(:,r,k) = 0;
198 end
199 sir(:,r)=0;
200 end
201 end
202end
203
204ni = sum(nir,2); % total jobs in station
205end
Definition mmt.m:124