LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
updateMetricsMomentBased.m
1function updateMetricsMomentBased(self,it)
2ensemble = self.ensemble;
3lqn = self.lqn;
4if ~self.hasconverged
5 % first obtain servt of activities at hostlayers
6 self.servt = zeros(lqn.nidx,1);
7 for r=1:size(self.servt_classes_updmap,1)
8 idx = self.servt_classes_updmap(r,1);
9 aidx = self.servt_classes_updmap(r,2);
10 nodeidx = self.servt_classes_updmap(r,3);
11 classidx = self.servt_classes_updmap(r,4);
12 % this requires debugging, it should be WN but it has been
13 % set temporarily to RN as bugs are left
14 self.servt(aidx) = self.results{end,self.idxhash(idx)}.RN(nodeidx,classidx);
15 %self.servt(aidx) = self.results{end,self.idxhash(idx)}.WN(nodeidx,classidx);
16 self.tput(aidx) = self.results{end,self.idxhash(idx)}.TN(nodeidx,classidx);
17 self.servtproc{aidx} = Exp.fitMean(self.servt(aidx));
18 end
19
20 % estimate call response times at hostlayers
21 self.callservt = zeros(lqn.ncalls,1);
22 for r=1:size(self.call_classes_updmap,1)
23 idx = self.call_classes_updmap(r,1);
24 cidx = self.call_classes_updmap(r,2);
25 nodeidx = self.call_classes_updmap(r,3);
26 classidx = self.call_classes_updmap(r,4);
27 if self.call_classes_updmap(r,3) > 1
28
29 % self.callservt(cidx) = self.results{end, self.idxhash(idx)}.RN(nodeidx,classidx);
30 if nodeidx == 1
31 self.callservt(cidx) = 0;
32 else
33 self.callservt(cidx) = self.results{end, self.idxhash(idx)}.RN(nodeidx,classidx);
34 %self.callservt(cidx) = self.results{end, self.idxhash(idx)}.WN(nodeidx,classidx);
35 end
36 end
37 end
38
39 % then resolve the entry servt summing up these contributions
40 entry_servt = (eye(lqn.nidx+lqn.ncalls)-self.servtmatrix)\[self.servt;self.callservt];
41 entry_servt(1:lqn.eshift) = 0;
42
43 % Propagate forwarding calls: add target entry's service time to source entry
44 for cidx = 1:lqn.ncalls
45 if lqn.calltype(cidx) == CallType.FWD
46 source_eidx = lqn.callpair(cidx, 1);
47 target_eidx = lqn.callpair(cidx, 2);
48 fwd_prob = lqn.callproc{cidx}.getMean();
49 entry_servt(source_eidx) = entry_servt(source_eidx) + fwd_prob * entry_servt(target_eidx);
50 end
51 end
52
53 self.servt(lqn.eshift+1:lqn.eshift+lqn.nentries) = entry_servt(lqn.eshift+1:lqn.eshift+lqn.nentries);
54 entry_servt((lqn.ashift+1):end) = 0;
55 for r=1:size(self.call_classes_updmap,1)
56 cidx = self.call_classes_updmap(r,2);
57 eidx = lqn.callpair(cidx,2);
58 if self.call_classes_updmap(r,3) > 1
59 self.servtproc{eidx} = Exp.fitMean(self.servt(eidx));
60 end
61 end
62
63 % determine call response times processes
64 for r=1:size(self.call_classes_updmap,1)
65 cidx = self.call_classes_updmap(r,2);
66 eidx = lqn.callpair(cidx,2);
67 if self.call_classes_updmap(r,3) > 1
68 if it==1
69 % note that respt is per visit, so number of calls is 1
70 self.callservt(cidx) = self.servt(eidx);
71 self.callservtproc{cidx} = self.servtproc{eidx};
72 else
73 % note that respt is per visit, so number of calls is 1
74 self.callservtproc{cidx} = Exp.fitMean(self.callservt(cidx));
75 end
76 end
77 end
78else
79 self.servtcdf = cell(lqn.nidx,1);
80 repo = [];
81
82 % first obtain servt of activities at hostlayers
83 self.servt = zeros(lqn.nidx,1);
84 for r=1:size(self.servt_classes_updmap,1)
85 idx = self.servt_classes_updmap(r,1);
86 aidx = self.servt_classes_updmap(r,2);
87 nodeidx = self.servt_classes_updmap(r,3);
88 classidx = self.servt_classes_updmap(r,4);
89 self.tput(aidx) = self.results{end,self.idxhash(idx)}.TN(nodeidx,classidx);
90
91 submodelidx = self.idxhash(idx);
92 if submodelidx>length(repo)
93 try
94 repo{submodelidx} = self.solvers{submodelidx}.getCdfRespT;
95 catch me
96 switch me.identifier
97 case 'MATLAB:class:undefinedMethod'
98 line_warning(mfilename,'The solver for layer %d does not allow response time distribution calculation, switching to fluid solver.\n');
99 repo{submodelidx} = SolverFluid(ensemble{submodelidx}).getCdfRespT;
100 end
101 end
102 end
103 self.servtcdf{aidx} = repo{submodelidx}{nodeidx,classidx};
104 end
105
106 self.callservtcdf = cell(lqn.ncalls,1);
107
108 % estimate call response times at hostlayers
109 self.callservt = zeros(lqn.ncalls,1);
110 for r=1:size(self.call_classes_updmap,1)
111 idx = self.call_classes_updmap(r,1);
112 cidx = self.call_classes_updmap(r,2);
113 nodeidx = self.call_classes_updmap(r,3);
114 classidx = self.call_classes_updmap(r,4);
115 if self.call_classes_updmap(r,3) > 1
116 submodelidx = self.idxhash(idx);
117 if submodelidx>length(repo)
118 % repo{submodelidx} = self.solvers{submodelidx}.getCdfRespT;
119 try
120 repo{submodelidx} = self.solvers{submodelidx}.getCdfRespT;
121 catch
122 repo{submodelidx} = [0,0;0.5,0;1,0]; % ??
123 end
124 end
125 % self.callservtcdf{cidx} = repo{submodelidx}{nodeidx,classidx};
126 try
127 self.callservtcdf{cidx} = repo{submodelidx}{nodeidx,classidx};
128 catch
129 self.callservtcdf{cidx} = repo{submodelidx};
130 end
131 end
132 end
133 cdf = [self.servtcdf;self.callservtcdf];
134
135 % then resolve the entry servt summing up these contributions
136 matrix = inv((eye(lqn.nidx+lqn.ncalls)-self.servtmatrix));
137 for i = 1:1:lqn.nentries
138 eidx = lqn.eshift+i;
139 convolidx = find(matrix(eidx,:)>0);
140 convolidx(find(convolidx<=lqn.eshift+lqn.nentries))=[];
141 num = 0;
142 ParamCell = {};
143 while num<length(convolidx)
144 fitidx = convolidx(num+1);
145 [m1,m2,m3,~,~] = EmpiricalCDF(cdf{fitidx}).getMoments;
146 if m1>GlobalConstants.FineTol
147 fitdist = APH.fitRawMoments(m1,m2,m3);
148 aphparam{1} = fitdist.params{1}.paramValue; % alpha
149 aphparam{2} = fitdist.params{2}.paramValue; % T
150 integerRepetitions = floor(matrix(eidx,fitidx));
151 fractionalPartRepetitions = matrix(eidx,fitidx)-integerRepetitions;
152 if fractionalPartRepetitions == 0
153 ParamCell = [ParamCell,repmat(aphparam,1,integerRepetitions)];
154 elseif integerRepetitions>0 && fractionalPartRepetitions>0
155 ParamCell = [ParamCell,repmat(aphparam,1,integerRepetitions)];
156 zerodist = APH.fitMeanAndSCV(GlobalConstants.FineTol,0.99);
157 zeroparam{1} = zerodist.params{1}.paramValue;
158 zeroparam{2} = zerodist.params{2}.paramValue;
159 aph_pattern = 3; % branch structure
160 [aphparam{1},aphparam{2}] = aph_simplify(aphparam{1},aphparam{2},zeroparam{1},zeroparam{2},fractionalPartRepetitions,1-fractionalPartRepetitions, aph_pattern);
161 ParamCell = [ParamCell,aphparam];
162 else
163 zerodist = APH.fitMeanAndSCV(GlobalConstants.FineTol,0.99);
164 zeroparam{1} = zerodist.params{1}.paramValue;
165 zeroparam{2} = zerodist.params{2}.paramValue;
166 aph_pattern = 3; % branch structure
167 [aphparam{1},aphparam{2}] = aph_simplify(aphparam{1},aphparam{2},zeroparam{1},zeroparam{2},fractionalPartRepetitions,1-fractionalPartRepetitions, aph_pattern);
168 ParamCell = [ParamCell,aphparam];
169 end
170 if fitidx <= lqn.nidx
171 self.servtproc{fitidx} = Exp.fitMean(m1);
172 self.servt(fitidx) = m1;
173 else
174 self.callservtproc{fitidx-lqn.nidx} = Exp.fitMean(m1);
175 self.callservt(fitidx-lqn.nidx) = m1;
176 end
177 end
178 num = num+1;
179 end
180 if isempty(ParamCell)
181 self.servt(eidx) = 0;
182 else
183 [alpha,T] = aph_convseq(ParamCell); % convolution of sequential activities
184 entry_dist = APH(alpha,T);
185 self.entryproc{eidx-(lqn.nhosts+lqn.ntasks)} = entry_dist;
186 self.servt(eidx) = entry_dist.getMean;
187 self.servtproc{eidx} = Exp.fitMean(self.servt(eidx));
188 self.entrycdfrespt{eidx-(lqn.nhosts+lqn.ntasks)} = entry_dist.evalCDF;
189 end
190 end
191
192 % Propagate forwarding calls: add target entry's service time to source entry
193 for cidx = 1:lqn.ncalls
194 if lqn.calltype(cidx) == CallType.FWD
195 source_eidx = lqn.callpair(cidx, 1);
196 target_eidx = lqn.callpair(cidx, 2);
197 fwd_prob = lqn.callproc{cidx}.getMean();
198 self.servt(source_eidx) = self.servt(source_eidx) + fwd_prob * self.servt(target_eidx);
199 self.servtproc{source_eidx} = Exp.fitMean(self.servt(source_eidx));
200 end
201 end
202
203 % determine call response times processes
204 for r=1:size(self.call_classes_updmap,1)
205 cidx = self.call_classes_updmap(r,2);
206 eidx = lqn.callpair(cidx,2);
207 if self.call_classes_updmap(r,3) > 1
208 if it==1
209 self.callservt(cidx) = self.servt(eidx);
210 self.callservtproc{cidx} = Exp.fitMean(self.servt(eidx));
211 end
212 end
213 end
214end
215self.ensemble = ensemble;
216end