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 self.servt(lqn.eshift+1:lqn.eshift+lqn.nentries) = entry_servt(lqn.eshift+1:lqn.eshift+lqn.nentries);
43 entry_servt((lqn.ashift+1):end) = 0;
44 for r=1:size(self.call_classes_updmap,1)
45 cidx = self.call_classes_updmap(r,2);
46 eidx = lqn.callpair(cidx,2);
47 if self.call_classes_updmap(r,3) > 1
48 self.servtproc{eidx} = Exp.fitMean(self.servt(eidx));
49 end
50 end
51
52 % determine call response times processes
53 for r=1:size(self.call_classes_updmap,1)
54 cidx = self.call_classes_updmap(r,2);
55 eidx = lqn.callpair(cidx,2);
56 if self.call_classes_updmap(r,3) > 1
57 if it==1
58 % note that respt is per visit, so number of calls is 1
59 self.callservt(cidx) = self.servt(eidx);
60 self.callservtproc{cidx} = self.servtproc{eidx};
61 else
62 % note that respt is per visit, so number of calls is 1
63 self.callservtproc{cidx} = Exp.fitMean(self.callservt(cidx));
64 end
65 end
66 end
67else
68 self.servtcdf = cell(lqn.nidx,1);
69 repo = [];
70
71 % first obtain servt of activities at hostlayers
72 self.servt = zeros(lqn.nidx,1);
73 for r=1:size(self.servt_classes_updmap,1)
74 idx = self.servt_classes_updmap(r,1);
75 aidx = self.servt_classes_updmap(r,2);
76 nodeidx = self.servt_classes_updmap(r,3);
77 classidx = self.servt_classes_updmap(r,4);
78 self.tput(aidx) = self.results{end,self.idxhash(idx)}.TN(nodeidx,classidx);
79
80 submodelidx = self.idxhash(idx);
81 if submodelidx>length(repo)
82 try
83 repo{submodelidx} = self.solvers{submodelidx}.getCdfRespT;
84 catch me
85 switch me.identifier
86 case 'MATLAB:class:undefinedMethod'
87 line_warning(mfilename,'The solver for layer %d does not allow response time distribution calculation, switching to fluid solver.\n');
88 repo{submodelidx} = SolverFluid(ensemble{submodelidx}).getCdfRespT;
89 end
90 end
91 end
92 self.servtcdf{aidx} = repo{submodelidx}{nodeidx,classidx};
93 end
94
95 self.callservtcdf = cell(lqn.ncalls,1);
96
97 % estimate call response times at hostlayers
98 self.callservt = zeros(lqn.ncalls,1);
99 for r=1:size(self.call_classes_updmap,1)
100 idx = self.call_classes_updmap(r,1);
101 cidx = self.call_classes_updmap(r,2);
102 nodeidx = self.call_classes_updmap(r,3);
103 classidx = self.call_classes_updmap(r,4);
104 if self.call_classes_updmap(r,3) > 1
105 submodelidx = self.idxhash(idx);
106 if submodelidx>length(repo)
107 % repo{submodelidx} = self.solvers{submodelidx}.getCdfRespT;
108 try
109 repo{submodelidx} = self.solvers{submodelidx}.getCdfRespT;
110 catch
111 repo{submodelidx} = [0,0;0.5,0;1,0]; % ??
112 end
113 end
114 % self.callservtcdf{cidx} = repo{submodelidx}{nodeidx,classidx};
115 try
116 self.callservtcdf{cidx} = repo{submodelidx}{nodeidx,classidx};
117 catch
118 self.callservtcdf{cidx} = repo{submodelidx};
119 end
120 end
121 end
122 cdf = [self.servtcdf;self.callservtcdf];
123
124 % then resolve the entry servt summing up these contributions
125 matrix = inv((eye(lqn.nidx+lqn.ncalls)-self.servtmatrix));
126 for i = 1:1:lqn.nentries
127 eidx = lqn.eshift+i;
128 convolidx = find(matrix(eidx,:)>0);
129 convolidx(find(convolidx<=lqn.eshift+lqn.nentries))=[];
130 num = 0;
131 ParamCell = {};
132 while num<length(convolidx)
133 fitidx = convolidx(num+1);
134 [m1,m2,m3,~,~] = EmpiricalCDF(cdf{fitidx}).getMoments;
135 if m1>GlobalConstants.FineTol
136 fitdist = APH.fitRawMoments(m1,m2,m3);
137 aphparam{1} = fitdist.params{1}.paramValue; % alpha
138 aphparam{2} = fitdist.params{2}.paramValue; % T
139 integerRepetitions = floor(matrix(eidx,fitidx));
140 fractionalPartRepetitions = matrix(eidx,fitidx)-integerRepetitions;
141 if fractionalPartRepetitions == 0
142 ParamCell = [ParamCell,repmat(aphparam,1,integerRepetitions)];
143 elseif integerRepetitions>0 && fractionalPartRepetitions>0
144 ParamCell = [ParamCell,repmat(aphparam,1,integerRepetitions)];
145 zerodist = APH.fitMeanAndSCV(GlobalConstants.FineTol,0.99);
146 zeroparam{1} = zerodist.params{1}.paramValue;
147 zeroparam{2} = zerodist.params{2}.paramValue;
148 aph_pattern = 3; % branch structure
149 [aphparam{1},aphparam{2}] = aph_simplify(aphparam{1},aphparam{2},zeroparam{1},zeroparam{2},fractionalPartRepetitions,1-fractionalPartRepetitions, aph_pattern);
150 ParamCell = [ParamCell,aphparam];
151 else
152 zerodist = APH.fitMeanAndSCV(GlobalConstants.FineTol,0.99);
153 zeroparam{1} = zerodist.params{1}.paramValue;
154 zeroparam{2} = zerodist.params{2}.paramValue;
155 aph_pattern = 3; % branch structure
156 [aphparam{1},aphparam{2}] = aph_simplify(aphparam{1},aphparam{2},zeroparam{1},zeroparam{2},fractionalPartRepetitions,1-fractionalPartRepetitions, aph_pattern);
157 ParamCell = [ParamCell,aphparam];
158 end
159 if fitidx <= lqn.nidx
160 self.servtproc{fitidx} = Exp.fitMean(m1);
161 self.servt(fitidx) = m1;
162 else
163 self.callservtproc{fitidx-lqn.nidx} = Exp.fitMean(m1);
164 self.callservt(fitidx-lqn.nidx) = m1;
165 end
166 end
167 num = num+1;
168 end
169 if isempty(ParamCell)
170 self.servt(eidx) = 0;
171 else
172 [alpha,T] = aph_convseq(ParamCell); % convolution of sequential activities
173 entry_dist = APH(alpha,T);
174 self.entryproc{eidx-(lqn.nhosts+lqn.ntasks)} = entry_dist;
175 self.servt(eidx) = entry_dist.getMean;
176 self.servtproc{eidx} = Exp.fitMean(self.servt(eidx));
177 self.entrycdfrespt{eidx-(lqn.nhosts+lqn.ntasks)} = entry_dist.evalCDF;
178 end
179 end
180
181 % determine call response times processes
182 for r=1:size(self.call_classes_updmap,1)
183 cidx = self.call_classes_updmap(r,2);
184 eidx = lqn.callpair(cidx,2);
185 if self.call_classes_updmap(r,3) > 1
186 if it==1
187 self.callservt(cidx) = self.servt(eidx);
188 self.callservtproc{cidx} = Exp.fitMean(self.servt(eidx));
189 end
190 end
191 end
192end
193self.ensemble = ensemble;
194end