1function [Gres, iterations] =parseLQNSResults(G, filename, filename_sim, verbose)
2% [GRES, ITERATIONS] =PARSELQNSRESULTS(G, FILENAME, FILENAME_SIM, VERBOSE)
4% Copyright (c) 2012-2021, Imperial College London
7[Gres, iterations] = aux_results(G, filename, verbose);
8Gres.Nodes = movevars(Gres.Nodes,
'Wlqns',
'Before',
'U');
9Gres.Nodes = movevars(Gres.Nodes,
'Ulqns',
'Before',
'T');
10Gres.Nodes = movevars(Gres.Nodes,
'Tlqns',
'Before',
'Q');
11Gres.Nodes.RespT(Gres.Nodes.RespT<1e-4)=0;
12Gres.Nodes.Util(Gres.Nodes.Util<1e-4)=0;
13Gres.Nodes.Tput(Gres.Nodes.Tput<1e-4)=0;
14Gres.Nodes.QLen(Gres.Nodes.QLen<1e-4)=0;
17Gsim = aux_results(G, filename_sim,
false);
18Gsim.Nodes = movevars(Gsim.Nodes,
'Wlqns',
'Before',
'U');
19Gsim.Nodes = movevars(Gsim.Nodes,
'Ulqns',
'Before',
'T');
20Gsim.Nodes = movevars(Gsim.Nodes,
'Tlqns',
'Before',
'Q');
21Gsim.Nodes.RespT(Gsim.Nodes.RespT<1e-4)=0;
22Gsim.Nodes.Util(Gsim.Nodes.Util<1e-4)=0;
23Gsim.Nodes.Tput(Gsim.Nodes.Tput<1e-4)=0;
24Gsim.Nodes.QLen(Gsim.Nodes.QLen<1e-4)=0;
26Gres.Nodes.RespTsim = Gsim.Nodes.RespTlqns;
27Gres.Nodes.Utilsim = Gsim.Nodes.Utillqns;
28Gres.Nodes.Tputsim = Gsim.Nodes.Tputlqns;
29Gres.Nodes.QLensim = Gsim.Nodes.QLenlqns;
30Gres.Nodes = movevars(Gres.Nodes,
'Wsim',
'Before',
'U');
31Gres.Nodes = movevars(Gres.Nodes,
'Usim',
'Before',
'T');
32Gres.Nodes = movevars(Gres.Nodes,
'Tsim',
'Before',
'Q');
35function [Gres, iterations] = aux_results(G, filename, verbose)
36% [GRES, ITERATIONS] = AUX_RESULTS(G, FILENAME, VERBOSE)
38import javax.xml.parsers.DocumentBuilderFactory;
39import javax.xml.parsers.DocumentBuilder;
40import org.w3c.dom.Document;
41import org.w3c.dom.NodeList;
42import org.w3c.dom.Node;
43import org.w3c.dom.Element;
46import LayeredNetwork.*;
54Gres.Nodes.Object = [];
56Gres.Nodes.MaxJobs = [];
58Gres.Nodes.RespTlqns(:) = 0;
59Gres.Nodes.Utillqns(:) = 0;
60Gres.Nodes.Tputlqns(:) = 0;
61Gres.Nodes.QLenlqns(:) = 0;
64myLN = LayeredNetwork(filename);
70% init Java XML parser and load file
71dbFactory = DocumentBuilderFactory.newInstance();
72dBuilder = dbFactory.newDocumentBuilder();
74 doc = dBuilder.parse(filename);
75catch exception %java.io.FileNotFoundException
76 if ~exist(filename,
'file')
77 line_printf(['Error: Input XML file ', filename, ' not found']);
85 %myLN.entries = entries;
93doc.getDocumentElement().normalize();
95 line_printf(['Parsing LQN file: ', filename] );
96 line_printf(['Root element :',
char(doc.getDocumentElement().getNodeName()) ] );
100solverPara = doc.getElementsByTagName('solver-params');
101for i = 0:solverPara.getLength()-1
102 procNode = solverPara.item(i);
103 result = procNode.getElementsByTagName('result-general');
104 iterations = str2num(result.item(0).getAttribute('iterations'));
107procList = doc.getElementsByTagName('processor');
109%providers = cell(0); % list of entries that provide services - Entry, Task, Proc
110requesters = cell(0); % list of activities that request services - Act, Task, Proc
111tasks = cell(0); %list of tasks - Task, task ID, Proc, ProcID - Row Index as task ID
112entries = cell(0); %list of entries - Entry, Task ID
114physical = cell(0); %list of actual hosts, those thata receive demand for resources
115%demand
is always indicated in an entry activity
118clients = []; % list of tasks that act as pure clients (think time)
119for i = 0:procList.getLength()-1
121 procNode = procList.item(i);
123 if procNode.getNodeType() == Node.ELEMENT_NODE
126 procElement = procNode;
127 name =
char(procElement.getAttribute('name'));
128 result = procNode.getElementsByTagName('result-processor');
129 Gres.Nodes.Tputlqns(findstring(G.Nodes.Node,name)) = 0;
130 utilizationRes = str2num(result.item(0).getAttribute('utilization'));
131 Gres.Nodes.Utillqns(findstring(G.Nodes.Node,name)) = utilizationRes;
133 taskList = procNode.getElementsByTagName('task');
134 for j = 0:taskList.getLength()-1
136 taskNode = taskList.item(j);
137 if taskNode.getNodeType() == Node.ELEMENT_NODE
139 taskElement = taskNode;
140 name =
char(taskElement.getAttribute('name'));
141 result = taskNode.getElementsByTagName('result-task');
142 utilizationRes = str2num(result.item(0).getAttribute('proc-utilization'));
143 Gres.Nodes.Utillqns(findstring(G.Nodes.Node,name)) = utilizationRes;
144 qlenRes = str2num(result.item(0).getAttribute('utilization'));
145 Gres.Nodes.QLenlqns(findstring(G.Nodes.Node,name)) = qlenRes;
146 tputRes = str2num(result.item(0).getAttribute('throughput'));
147 Gres.Nodes.Tputlqns(findstring(G.Nodes.Node,name)) = tputRes;
148 entryList = taskNode.getElementsByTagName('entry');
149 for k = 0:entryList.getLength()-1
151 entryNode = entryList.item(k);
152 if entryNode.getNodeType() == Node.ELEMENT_NODE
154 entryElement = entryNode;
155 name =
char(entryElement.getAttribute('name'));
156 result = entryNode.getElementsByTagName('result-entry');
157 utilizationRes = str2num(result.item(0).getAttribute('proc-utilization'));
158 Gres.Nodes.Utillqns(findstring(G.Nodes.Node,name)) = utilizationRes*NaN; % ignore as this different in LINE
159 qlenRes = str2num(result.item(0).getAttribute('utilization'));
160 Gres.Nodes.QLenlqns(findstring(G.Nodes.Node,name)) = qlenRes;
161 tputRes = str2num(result.item(0).getAttribute('throughput'));
162 Gres.Nodes.Tputlqns(findstring(G.Nodes.Node,name)) = tputRes;
163 rtRes = str2num(result.item(0).getAttribute('phase1-service-time'));
165 Gres.Nodes.RespTlqns(findstring(G.Nodes.Node,name)) = rtRes;
171 if taskElement.getElementsByTagName('task-activities').getLength > 0
172 %actNames = cell(0); iterActNames = 1;
174 actList = taskElement.getElementsByTagName('task-activities').item(0).getElementsByTagName('activity');
175 for l = 0:actList.getLength()-1
177 actNode = actList.item(l);
178 if actNode.getNodeType() == Node.ELEMENT_NODE && strcmp(
char(actNode.getParentNode().getNodeName()),'task-activities')
180 actElement = actNode;
181 name =
char(actElement.getAttribute('name'));
183 result = actNode.getElementsByTagName('result-activity');
184 rtRes = str2num(result.item(0).getAttribute('service-time'));
185 Gres.Nodes.RespTlqns(findstring(G.Nodes.Node,name)) = rtRes;
186 utilizationRes = str2num(result.item(0).getAttribute('proc-utilization'));
187 Gres.Nodes.Utillqns(findstring(G.Nodes.Node,name)) = utilizationRes;
188 qlenRes = str2num(result.item(0).getAttribute('utilization'));
189 Gres.Nodes.QLenlqns(findstring(G.Nodes.Node,name)) = qlenRes;
190 tputRes = str2num(result.item(0).getAttribute('throughput'));
191 Gres.Nodes.Tputlqns(findstring(G.Nodes.Node,name)) = tputRes;
193 % synchCalls = actElement.getElementsByTagName('synch-call');
194 % asynchCalls = actElement.getElementsByTagName('asynch-call');
195 % %add synch calls if any
196 % if synchCalls.getLength() > 0
197 % for m = 0:synchCalls.getLength()-1
198 % callElement = synchCalls.item(m);
199 % dest =
char(callElement.getAttribute('dest'));
200 % mean = str2double(
char(callElement.getAttribute('calls-mean')));
201 % tempAct = tempAct.synchCall(dest,mean);
202 % actCalls{iterActNames,1} = dest;
203 % requesters{size(requesters,1)+1,1} = tempAct.name;
204 % requesters{size(requesters,1),2} = taskID;
205 % requesters{size(requesters,1),3} = tempProc.name;
206 % requesters{size(requesters,1),4} = dest;
207 % requesters{size(requesters,1),5} = procID;
209 % % activity - task - processor - dest (entry) - procID
212 % % actCalls{iterActNames,1} = [];
214 % %iterActNames = iterActNames + 1;
215 % %add asynch calls
if any
216 % elseif asynchCalls.getLength() > 0
217 %
for m = 0:asynchCalls.getLength()-1
218 % callElement = asynchCalls.item(m);
219 % dest = char(callElement.getAttribute(
'dest'));
220 % mean = str2double(
char(callElement.getAttribute(
'calls-mean')));
221 % tempAct = tempAct.asynchCall(dest,mean);
222 % actCalls{iterActNames,1} = dest;
223 % requesters{size(requesters,1)+1,1} = tempAct.name;
224 % requesters{size(requesters,1),2} = taskID;
225 % requesters{size(requesters,1),3} = tempProc.name;
226 % requesters{size(requesters,1),4} = dest;
227 % requesters{size(requesters,1),5} = procID;
230 % actCalls{iterActNames,1} = [];
232 %iterActNames = iterActNames + 1;
240for edge=1:height(G.Edges)
241 if G.Edges.Type(edge) == 1 % add contribution of sync-calls
242 syncSource = G.Edges.EndNodes{edge,1};
243 aidx = findstring(Gres.Nodes.Name,syncSource);
244 if G.Edges.Weight(edge) >= 1
245 Gres.Nodes.RespT(aidx) = Gres.Nodes.RespT(aidx) + G.Edges.RespT(edge) * G.Edges.Weight(edge);
247 Gres.Nodes.RespT(aidx) = Gres.Nodes.RespT(aidx) + G.Edges.RespT(edge);