1function updateLayers(self, it)
3ensemble = self.ensemble;
5thinktproc = self.thinktproc;
6servtproc = self.servtproc;
7thinkt_classes_updmap = self.thinkt_classes_updmap;
8arvproc_classes_updmap = self.arvproc_classes_updmap;
9tputproc = self.tputproc;
10call_classes_updmap = self.call_classes_updmap;
11callservtproc = self.callservtproc;
13% reassign service times
14for r=1:size(thinkt_classes_updmap,1)
15 if mod(it, 2)==1 % elevator
16 ri = size(thinkt_classes_updmap,1) - r + 1;
20 idx = thinkt_classes_updmap(ri,1);
21 aidx = thinkt_classes_updmap(ri,2);
22 nodeidx = thinkt_classes_updmap(ri,3);
23 classidx = thinkt_classes_updmap(ri,4);
24 class = ensemble{idxhash(thinkt_classes_updmap(ri,1))}.classes{classidx};
25 % here update the number of jobs in the task chain
26 if aidx <= lqn.tshift + lqn.ntasks
27 % aidx here
is actually set to tidx in buildLayersRecursive
29 case JobClassType.CLOSED
30 if self.options.config.interlocking
31 class.population = self.njobs(aidx,idx);
35 node = ensemble{idxhash(idx)}.nodes{nodeidx};
37 case ensemble{idxhash(idx)}.attribute.clientIdx
38 if lqn.type(aidx) == LayeredNetworkElement.TASK
39 if lqn.sched(aidx) ~= SchedStrategy.REF
40 if ~isempty(thinktproc{aidx}) %
this is empty
for isolated components, which can be ignored
42 node.setService(
class, thinktproc{aidx});
44 %
if ~node.serviceProcess{
class.index}.isImmediate()
45 % node.serviceProcess{
class.index}.setMean(thinktproc{aidx}.getMean);
46 % node.server.serviceProcess{
class.index}{end}.setMean(thinktproc{aidx}.getMean);
48 % node.setService(
class, thinktproc{aidx});
54 node.setService(
class, servtproc{aidx});
56 %
if ~node.serviceProcess{
class.index}.isImmediate()
57 % node.serviceProcess{
class.index}.setMean(servtproc{aidx}.getMean);
58 % node.server.serviceProcess{
class.index}{end}.setMean(servtproc{aidx}.getMean);
60 % node.setService(
class, servtproc{aidx});
66 node.setService(
class, servtproc{aidx});
68 %
if ~node.serviceProcess{
class.index}.isImmediate()
69 % node.serviceProcess{
class.index}.setMean(servtproc{aidx}.getMean);
70 % node.server.serviceProcess{
class.index}{end}.setMean(servtproc{aidx}.getMean);
72 % node.setService(
class, servtproc{aidx});
76 case ensemble{idxhash(idx)}.attribute.serverIdx
77 node.setService(
class, servtproc{aidx});
81% reassign arrival rates
82for r=1:size(arvproc_classes_updmap,1)
84 if mod(it, 2)==1 % elevator
85 ri = size(arvproc_classes_updmap,1) - r + 1;
89 idx = arvproc_classes_updmap(ri,1);
90 eidx_or_cidx = arvproc_classes_updmap(ri,2);
91 nodeidx = arvproc_classes_updmap(ri,3);
92 classidx = arvproc_classes_updmap(ri,4);
93 class = ensemble{idxhash(arvproc_classes_updmap(ri,1))}.classes{classidx};
94 node = ensemble{idxhash(idx)}.nodes{nodeidx};
96 if eidx_or_cidx < 0 % Entry-level arrival (negative index)
98 node.setArrival(
class, lqn.arrival{eidx});
99 else % Async call arrival (positive index)
101 node.setArrival(
class, tputproc{lqn.callpair(cidx,1)});
105% reassign call service time / response time
106for c=1:size(call_classes_updmap,1)
107 if mod(it, 2)==1 % elevator
108 ci = size(call_classes_updmap,1) - c + 1;
112 idx = call_classes_updmap(ci,1);
113 cidx = call_classes_updmap(ci,2);
114 nodeidx = call_classes_updmap(ci,3);
115 class = ensemble{idxhash(call_classes_updmap(ci,1))}.classes{call_classes_updmap(ci,4)};
116 node = ensemble{idxhash(idx)}.nodes{nodeidx};
118 case ensemble{idxhash(idx)}.attribute.clientIdx % client
119 node.setService(
class, callservtproc{cidx});
120 case ensemble{idxhash(idx)}.attribute.serverIdx % the call
is processed by the server, then replace with the svc time
121 eidx = lqn.callpair(cidx,2);
122 %tidx = lqn.parent(eidx);
123 %eidxclass = self.ensemble{self.idxhash(tidx)}.attribute.calls(find(self.ensemble{self.idxhash(tidx)}.attribute.calls(:,4) == eidx),1);
124 %eidxchain = find(self.ensemble{self.idxhash(tidx)}.getStruct.chains(:,eidxclass)>0);
125 %qn = self.ensemble{self.idxhash(tidx)}.getStruct;
126 %servtproc{eidx}.setMean(servtproc{eidx}.getMean * qn.visits{eidxchain}(1,qn.refclass(eidxchain)) / qn.visits{eidxchain}(2,eidxclass))
127 %%task_tput = sum(self.results{end,self.idxhash(tidx)}.TN(self.ensemble{self.idxhash(tidx)}.attribute.serverIdx,eidxclass))
128 %%entry_tput = sum(self.results{end,self.idxhash(tidx)}.TN(self.ensemble{self.idxhash(tidx)}.attribute.serverIdx,eidxclass))
131 node.setService(
class, servtproc{eidx});
133 %
if ~node.serviceProcess{
class.index}.isImmediate()
134 % node.serviceProcess{
class.index}.setMean(servtproc{eidx}.getMean);
135 % node.server.serviceProcess{
class.index}{end}.setMean(servtproc{eidx}.getMean);
137 % node.setService(
class, servtproc{eidx});
144% reassign activity think times
145actthinkt_classes_updmap = self.actthinkt_classes_updmap;
146for r=1:size(actthinkt_classes_updmap,1)
147 if mod(it, 2)==1 % elevator
148 ri = size(actthinkt_classes_updmap,1) - r + 1;
152 idx = actthinkt_classes_updmap(ri,1);
153 aidx = actthinkt_classes_updmap(ri,2);
154 nodeidx = actthinkt_classes_updmap(ri,3);
155 classidx = actthinkt_classes_updmap(ri,4);
156 class = ensemble{idxhash(actthinkt_classes_updmap(ri,1))}.classes{classidx};
157 node = ensemble{idxhash(idx)}.nodes{nodeidx};
158 % Activity think-time
is at client delay node
159 if ~isempty(lqn.actthink{aidx})
160 node.setService(class, lqn.actthink{aidx});