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
4% [NI, NIR, SIR, KIR] = TOMARGINAL(SN, IND, STATE_I, PHASESZ, PHASESHIFT, SPACE_BUF, SPACE_SRV, SPACE_VAR)
6% @brief Extracts marginal job statistics from global state information
for a specific node
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.
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
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]
26% Copyright (c) 2012-2026, Imperial College London
29if ~isstruct(sn) % the input can be a Network object too
34if ~sn.isstation(ind) && sn.isstateful(ind) % if stateful node
35 if sn.nodetype(ind) == NodeType.Transition
36 R = sn.nodeparam{ind}.nmodes;
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);
43 if iscell(sn.nodeparam{ind}.firingproc) && ~isempty(sn.nodeparam{ind}.firingproc{m})
44 phasesz(m) = size(sn.nodeparam{ind}.firingproc{m}{1}, 1);
50 phaseshift = [0,cumsum(phasesz(1:end-1))];
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);
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
62 kir(:,r,k) = space_srv(:,phaseshift(r)+k);
63 sir(:,r) = sir(:,r) + kir(:,r,k);
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
79ist = sn.nodeToStation(ind);
80isf = sn.nodeToStateful(ind);
83 state_i = sn.state{isf};
87 phasesz = sn.phasessz(ist,:);
88 phaseshift = sn.phaseshift(ist,:);
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
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
111 kir(:,r,k) = space_srv(:,phaseshift(r)+k);
112 sir(:,r) = sir(:,r) + kir(:,r,k);
118 case SchedStrategy.INF
120 nir(:,r) = sir(:,r); %
class-r jobs in station
122 case {SchedStrategy.PS, SchedStrategy.PSPRIO}
124 nir(:,r) = sir(:,r) ; %
class-r jobs in station
126 case SchedStrategy.EXT
130 case {SchedStrategy.FCFS, SchedStrategy.FCFSPRIO, SchedStrategy.HOL}
132 nir(:,r) = sir(:,r) + sum(space_buf==r,2); %
class-r jobs in station
134 case {SchedStrategy.DPS, SchedStrategy.DPSPRIO}
136 nir(:,r) = sir(:,r) ; %
class-r jobs in station
138 case {SchedStrategy.GPS, SchedStrategy.GPSPRIO}
140 nir(:,r) = sir(:,r) ; %
class-r jobs in station
142 case {SchedStrategy.LCFS, SchedStrategy.LCFSPRIO}
144 nir(:,r) = sir(:,r) + sum(space_buf==r,2); %
class-r jobs in station
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);
151 nir(:,r) = sir(:,r) + sum(space_buf==r,2); %
class-r jobs in station
156 case SchedStrategy.SIRO
158 nir(:,r) = sir(:,r) + space_buf(:,r); %
class-r jobs in station
160 case SchedStrategy.SEPT
162 nir(:,r) = sir(:,r) + space_buf(:,r); %
class-r jobs in station
164 case SchedStrategy.LEPT
166 nir(:,r) = sir(:,r) + space_buf(:,r); %
class-r jobs in station
168 case SchedStrategy.SRPT
170 nir(:,r) = sir(:,r) + space_buf(:,r); %
class-r jobs in station
172 case SchedStrategy.SRPTPRIO
174 nir(:,r) = sir(:,r) + space_buf(:,r); %
class-r jobs in station
176 otherwise % possibly other stateful
nodes
178 nir(:,r) = sir(:,r) ; %
class-r jobs in station
182if sn.nodetype(ind) == NodeType.Place
183 % set all service and phase data to 0
185 if isnan(sn.rates(ist,r)) %
if disabled station
194 if isnan(sn.rates(ist,r)) %
if disabled station
204ni = sum(nir,2); % total jobs in station