LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
updateLayers.m
1function updateLayers(self, it)
2lqn = self.lqn;
3ensemble = self.ensemble;
4idxhash = self.idxhash;
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;
12
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;
17 else
18 ri = r;
19 end
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
28 switch class.type
29 case JobClassType.CLOSED
30 if self.options.config.interlocking
31 class.population = self.njobs(aidx,idx);
32 end
33 end
34 end
35 node = ensemble{idxhash(idx)}.nodes{nodeidx};
36 switch 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
41 % if it==1
42 node.setService(class, thinktproc{aidx});
43 % else
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);
47 % else
48 % node.setService(class, thinktproc{aidx});
49 % end
50 % end
51 end
52 else
53 % if it==1
54 node.setService(class, servtproc{aidx});
55 % else
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);
59 % else
60 % node.setService(class, servtproc{aidx});
61 % end
62 % end
63 end
64 else
65 % if it==1
66 node.setService(class, servtproc{aidx});
67 % else
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);
71 % else
72 % node.setService(class, servtproc{aidx});
73 % end
74 % end
75 end
76 case ensemble{idxhash(idx)}.attribute.serverIdx
77 node.setService(class, servtproc{aidx});
78 end
79end
80
81% reassign arrival rates
82for r=1:size(arvproc_classes_updmap,1)
83 %for r=1:0
84 if mod(it, 2)==1 % elevator
85 ri = size(arvproc_classes_updmap,1) - r + 1;
86 else
87 ri = r;
88 end
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};
95
96 if eidx_or_cidx < 0 % Entry-level arrival (negative index)
97 eidx = -eidx_or_cidx;
98 node.setArrival(class, lqn.arrival{eidx});
99 else % Async call arrival (positive index)
100 cidx = eidx_or_cidx;
101 node.setArrival(class, tputproc{lqn.callpair(cidx,1)});
102 end
103end
104
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;
109 else
110 ci = c;
111 end
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};
117 switch 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))
129 % if it==1
130
131 node.setService(class, servtproc{eidx});
132 % else
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);
136 % else
137 % node.setService(class, servtproc{eidx});
138 % end
139 % end
140
141 end
142end
143
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;
149 else
150 ri = r;
151 end
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});
161 end
162end
163end