1function [result, iterations] = parseXMLResults(self, filename)
2% [RESULT, ITERATIONS] = PARSEXMLRESULTS(FILENAME)
4import javax.xml.parsers.*; %#ok<JAPIEXT629>
5import org.w3c.dom.*; %#ok<JAPIEXT161>
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);
21% init Java XML parser and load file
22dbFactory = DocumentBuilderFactory.newInstance();
23dBuilder = dbFactory.newDocumentBuilder();
25[fpath,fname,~] = fileparts(filename);
26resultFilename = [fpath,filesep,fname,
'.lqxo'];
28if self.options.verbose
29 line_printf(
'\nParsing LQNS result file: %s\n',resultFilename);
31 %line_printf(
'\nLQNS result file available at: %s',resultFilename);
35doc = dBuilder.parse(resultFilename);
36doc.getDocumentElement().normalize();
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'));
46procList = doc.getElementsByTagName(
'processor');
47for i = 0:procList.getLength()-1
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;
58 taskList = procElement.getElementsByTagName(
'task');
59 for j = 0:taskList.getLength()-1
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;
76 entryList = taskElement.getElementsByTagName(
'entry');
77 for k = 0:entryList.getLength()-1
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;
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);
111 actResult = actElement.getElementsByTagName(
'result-activity');
112 if actResult.getLength == 0
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;
125 Avg.Nodes.Throughput(actPos) = tResAct;
127 % LQNS omits throughput from entry-phase result-activity
128 % elements; each phase executes once per entry invocation
129 Avg.Nodes.Throughput(actPos) = tRes;
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;
139 actID = lqn.names{actPos};
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;
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;
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
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;
195 actID = lqn.names{actPos};
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;
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;
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(:);