LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
parseXMLResults.m
1function [result, iterations] = parseXMLResults(self, filename)
2% [RESULT, ITERATIONS] = PARSEXMLRESULTS(FILENAME)
3
4import javax.xml.parsers.*; %#ok<JAPIEXT629>
5import org.w3c.dom.*; %#ok<JAPIEXT161>
6import java.io.*;
7
8lqn = self.getStruct;
9numOfNodes = lqn.nidx;
10numOfCalls = lqn.ncalls;
11Avg.Nodes.Utilization = NaN*ones(numOfNodes,1);
12Avg.Nodes.Phase1Utilization = NaN*ones(numOfNodes,1);
13Avg.Nodes.Phase2Utilization = NaN*ones(numOfNodes,1);
14Avg.Nodes.Phase1ServiceTime = NaN*ones(numOfNodes,1);
15Avg.Nodes.Phase2ServiceTime = NaN*ones(numOfNodes,1);
16Avg.Nodes.Throughput = NaN*ones(numOfNodes,1);
17Avg.Nodes.ProcWaiting = NaN*ones(numOfNodes,1);
18Avg.Nodes.ProcUtilization = NaN*ones(numOfNodes,1);
19Avg.Edges.Waiting = NaN*ones(numOfCalls,1);
20
21% init Java XML parser and load file
22dbFactory = DocumentBuilderFactory.newInstance();
23dBuilder = dbFactory.newDocumentBuilder();
24
25[fpath,fname,~] = fileparts(filename);
26resultFilename = [fpath,filesep,fname,'.lqxo'];
27
28if self.options.verbose
29 line_printf('\nParsing LQNS result file: %s\n',resultFilename);
30 if self.options.keep
31 %line_printf('\nLQNS result file available at: %s',resultFilename);
32 end
33end
34
35doc = dBuilder.parse(resultFilename);
36doc.getDocumentElement().normalize();
37
38%solver-params
39solverParams = doc.getElementsByTagName('solver-params');
40for i = 0:solverParams.getLength()-1
41 solverParam = solverParams.item(i);
42 result = solverParam.getElementsByTagName('result-general');
43 iterations = str2double(result.item(0).getAttribute('iterations'));
44end
45
46procList = doc.getElementsByTagName('processor');
47for i = 0:procList.getLength()-1
48 %Element - Host
49 procNode = procList.item(i);
50 if (procNode.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) %#ok<JAPIEXT161>
51 procElement = procNode;
52 procName = char(procElement.getAttribute('name'));
53 procPos = findstring(lqn.names,procName);
54 procResult = procElement.getElementsByTagName('result-processor');
55 uRes = str2double(procResult.item(0).getAttribute('utilization'));
56 Avg.Nodes.ProcUtilization(procPos) = uRes;
57
58 taskList = procElement.getElementsByTagName('task');
59 for j = 0:taskList.getLength()-1
60 %Element - Task
61 taskElement = taskList.item(j);
62 taskName = char(taskElement.getAttribute('name'));
63 taskPos = findstring(lqn.names,taskName);
64 taskResult = taskElement.getElementsByTagName('result-task');
65 uRes = str2double(taskResult.item(0).getAttribute('utilization'));
66 p1uRes = str2double(taskResult.item(0).getAttribute('phase1-utilization'));
67 p2uRes = str2double(taskResult.item(0).getAttribute('phase2-utilization'));
68 tRes = str2double(taskResult.item(0).getAttribute('throughput'));
69 puRes = str2double(taskResult.item(0).getAttribute('proc-utilization'));
70 Avg.Nodes.Utilization(taskPos) = uRes;
71 Avg.Nodes.Phase1Utilization(taskPos) = p1uRes;
72 Avg.Nodes.Phase2Utilization(taskPos) = ifthenelse(isempty(p2uRes),NaN,p2uRes);
73 Avg.Nodes.Throughput(taskPos) = tRes;
74 Avg.Nodes.ProcUtilization(taskPos) = puRes;
75
76 entryList = taskElement.getElementsByTagName('entry');
77 for k = 0:entryList.getLength()-1
78 %Element - Entry
79 entryElement = entryList.item(k);
80 entryName = char(entryElement.getAttribute('name'));
81 entryPos = findstring(lqn.names,entryName);
82 entryResult = entryElement.getElementsByTagName('result-entry');
83 uRes = str2double(entryResult.item(0).getAttribute('utilization'));
84 p1uRes = str2double(entryResult.item(0).getAttribute('phase1-utilization'));
85 p2uRes = str2double(entryResult.item(0).getAttribute('phase2-utilization'));
86 p1stRes = str2double(entryResult.item(0).getAttribute('phase1-service-time'));
87 p2stRes = str2double(entryResult.item(0).getAttribute('phase2-service-time'));
88 tRes = str2double(entryResult.item(0).getAttribute('throughput'));
89 puRes = str2double(entryResult.item(0).getAttribute('proc-utilization'));
90 Avg.Nodes.Utilization(entryPos) = uRes;
91 Avg.Nodes.Phase1Utilization(entryPos) = p1uRes;
92 Avg.Nodes.Phase2Utilization(entryPos) = ifthenelse(isempty(p2uRes),NaN,p2uRes);
93 Avg.Nodes.Phase1ServiceTime(entryPos) = p1stRes;
94 Avg.Nodes.Phase2ServiceTime(entryPos) = ifthenelse(isempty(p2stRes),NaN,p2stRes);
95 Avg.Nodes.Throughput(entryPos) = tRes;
96 Avg.Nodes.ProcUtilization(entryPos) = puRes;
97
98 %entry-phase-activities (PH1PH2 format): fill the phase
99 %activity rows, which are otherwise left NaN (JLINE parity)
100 epaList = entryElement.getElementsByTagName('entry-phase-activities');
101 if epaList.getLength > 0
102 epaElement = epaList.item(0);
103 phActList = epaElement.getElementsByTagName('activity');
104 for l = 0:phActList.getLength()-1
105 actElement = phActList.item(l);
106 actName = char(actElement.getAttribute('name'));
107 actPos = findstring(lqn.names,actName);
108 if actPos <= 0
109 continue;
110 end
111 actResult = actElement.getElementsByTagName('result-activity');
112 if actResult.getLength == 0
113 continue;
114 end
115 uResAct = str2double(actResult.item(0).getAttribute('utilization'));
116 stRes = str2double(actResult.item(0).getAttribute('service-time'));
117 tResAct = str2double(actResult.item(0).getAttribute('throughput'));
118 pwRes = str2double(actResult.item(0).getAttribute('proc-waiting'));
119 puResAct = str2double(actResult.item(0).getAttribute('proc-utilization'));
120 hdRes = str2double(actElement.getAttribute('host-demand-mean'));
121 Avg.Nodes.Utilization(actPos) = uResAct;
122 Avg.Nodes.Phase1ServiceTime(actPos) = stRes;
123 Avg.Nodes.ProcWaiting(actPos) = pwRes;
124 if ~isnan(tResAct)
125 Avg.Nodes.Throughput(actPos) = tResAct;
126 else
127 % LQNS omits throughput from entry-phase result-activity
128 % elements; each phase executes once per entry invocation
129 Avg.Nodes.Throughput(actPos) = tRes;
130 end
131 if ~isnan(puResAct)
132 Avg.Nodes.ProcUtilization(actPos) = puResAct;
133 elseif ~isnan(tRes) && ~isnan(hdRes)
134 % LQNS omits proc-utilization from entry-phase
135 % result-activity elements; the per-phase value is
136 % the entry throughput times the phase host demand
137 Avg.Nodes.ProcUtilization(actPos) = tRes * hdRes;
138 end
139 actID = lqn.names{actPos};
140 %synch-call
141 synchCalls = actElement.getElementsByTagName('synch-call');
142 for m = 0:synchCalls.getLength()-1
143 callElement = synchCalls.item(m);
144 destName = char(callElement.getAttribute('dest'));
145 destPos = findstring(lqn.names,destName);
146 destID = lqn.names{destPos};
147 callPos = findstring(lqn.callnames,[actID,'=>',destID]);
148 callResult = callElement.getElementsByTagName('result-call');
149 if callPos > 0 && callResult.getLength > 0
150 wRes = str2double(callResult.item(0).getAttribute('waiting'));
151 Avg.Edges.Waiting(callPos) = wRes;
152 end
153 end
154 %asynch-call
155 asynchCalls = actElement.getElementsByTagName('asynch-call');
156 for m = 0:asynchCalls.getLength()-1
157 callElement = asynchCalls.item(m);
158 destName = char(callElement.getAttribute('dest'));
159 destPos = findstring(lqn.names,destName);
160 destID = lqn.names{destPos};
161 callPos = findstring(lqn.callnames,[actID,'->',destID]);
162 callResult = callElement.getElementsByTagName('result-call');
163 if callPos > 0 && callResult.getLength > 0
164 wRes = str2double(callResult.item(0).getAttribute('waiting'));
165 Avg.Edges.Waiting(callPos) = wRes;
166 end
167 end
168 end
169 end
170 end
171
172 %task-activities
173 taskActsList = taskElement.getElementsByTagName('task-activities');
174 if taskActsList.getLength > 0
175 taskActsElement = taskActsList.item(0);
176 actList = taskActsElement.getElementsByTagName('activity');
177 for l = 0:actList.getLength()-1
178 %Element - Activity
179 actElement = actList.item(l);
180 if strcmp(char(actElement.getParentNode().getNodeName()),'task-activities')
181 actName = char(actElement.getAttribute('name'));
182 actPos = findstring(lqn.names,actName);
183 actResult = actElement.getElementsByTagName('result-activity');
184 uRes = str2double(actResult.item(0).getAttribute('utilization'));
185 stRes = str2double(actResult.item(0).getAttribute('service-time'));
186 tRes = str2double(actResult.item(0).getAttribute('throughput'));
187 pwRes = str2double(actResult.item(0).getAttribute('proc-waiting'));
188 puRes = str2double(actResult.item(0).getAttribute('proc-utilization'));
189 Avg.Nodes.Utilization(actPos) = uRes;
190 Avg.Nodes.Phase1ServiceTime(actPos) = stRes;
191 Avg.Nodes.Throughput(actPos) = tRes;
192 Avg.Nodes.ProcWaiting(actPos) = pwRes;
193 Avg.Nodes.ProcUtilization(actPos) = puRes;
194
195 actID = lqn.names{actPos};
196 %synch-call
197 synchCalls = actElement.getElementsByTagName('synch-call');
198 for m = 0:synchCalls.getLength()-1
199 callElement = synchCalls.item(m);
200 destName = char(callElement.getAttribute('dest'));
201 destPos = findstring(lqn.names,destName);
202 destID = lqn.names{destPos};
203 callPos = findstring(lqn.callnames,[actID,'=>',destID]);
204 callResult = callElement.getElementsByTagName('result-call');
205 wRes = str2double(callResult.item(0).getAttribute('waiting'));
206 Avg.Edges.Waiting(callPos) = wRes;
207 end
208 %asynch-call
209 asynchCalls = actElement.getElementsByTagName('asynch-call');
210 for m = 0:asynchCalls.getLength()-1
211 callElement = asynchCalls.item(m);
212 destName = char(callElement.getAttribute('dest'));
213 destPos = findstring(lqn.names,destName);
214 destID = lqn.names{destPos};
215 callPos = findstring(lqn.callnames,[actID,'->',destID]);
216 callResult = callElement.getElementsByTagName('result-call');
217 wRes = str2double(callResult.item(0).getAttribute('waiting'));
218 Avg.Edges.Waiting(callPos) = wRes;
219 end
220 end
221 end
222 end
223 end
224 end
225end
226
227self.result.RawAvg = Avg;
228self.result.Avg.ProcUtil = Avg.Nodes.ProcUtilization(:);
229self.result.Avg.SvcT = Avg.Nodes.Phase1ServiceTime(:);
230self.result.Avg.Tput = Avg.Nodes.Throughput(:);
231self.result.Avg.Util = Avg.Nodes.Utilization(:);
232self.result.Avg.RespT = NaN*Avg.Nodes.ProcWaiting(:);
233self.result.Avg.QLen = NaN*Avg.Nodes.ProcWaiting(:);
234result = self.result;
235end
Definition Station.m:245