1classdef LayeredNetwork < Model & Ensemble
2 % LayeredNetwork Hierarchical software performance modeling framework
4 % LayeredNetwork implements Layered Queueing Networks (LQN)
for modeling
5 % hierarchical software systems with clients, application servers, and
6 % resource layers. It supports modeling of complex software architectures
7 % with tasks, entries, activities, and their interactions across multiple
10 % @brief Layered queueing network
for hierarchical software performance models
12 % Key characteristics:
13 % - Hierarchical multi-layer architecture modeling
14 % - Software-centric performance analysis
15 % - Task and entry abstraction levels
16 % - Activity-based detailed modeling
17 % - Host resource modeling
18 % - Client-server interaction patterns
20 % LQN model components:
21 % - Hosts: Physical or logical processing resources
22 % - Tasks: Software processes or services
23 % - Entries: Service request entry points
24 % - Activities: Detailed task execution steps
25 % - Reference tasks: External workload generators
27 % LayeredNetwork
is used
for:
28 % - Software performance engineering
29 % - Multi-tier application modeling
30 % - Microservice architecture analysis
31 % - Distributed system performance evaluation
32 % - Capacity planning
for software systems
36 % lqn = LayeredNetwork(
'WebApp');
37 % client = Host(lqn,
'ClientTier', Inf);
38 % server = Host(lqn,
'ServerTier', 4);
39 % web_task = Task(lqn,
'WebServer', 1, server);
40 % request_entry = Entry(lqn,
'ProcessRequest', web_task);
43 % Copyright (c) 2012-2026, Imperial College London
44 % All rights reserved.
48 usedFeatures; % cell with structures of booleans listing the used
classes
49 % it must be accessed via getUsedLangFeatures
61 %
public methods, including constructor
63 function self = reset(self, isHard)
78 function self = LayeredNetwork(name, filename)
79 % LAYEREDNETWORK Create a layered queueing network model
81 % @brief Creates a LayeredNetwork instance
for hierarchical modeling
82 % @param name String identifier
for the layered model
83 % @param filename Optional filename
for model
import/
export
84 % @
return self LayeredNetwork instance ready
for hierarchical modeling
87 if nargin<1 %~exist(
'name',
'var')
88 [~,name]=fileparts(lineTempName);
99 if nargin>=2 %exist(
'filename',
'var')
100 self = LayeredNetwork.parseXML(filename, false);
105 function sn = summary(self)
111 plot(self, showTaskGraph)
112 plotGraph(self, useNodes)
113 plotGraphSimple(self, useNodes)
114 plotTaskGraph(self, useNodes)
118 idx = getNodeIndex(self,node)
119 node = getNodeByName(self,name)
120 [names,hostnames,tasknames,entrynames,actnames] = getNodeNames(self)
122 writeXML(self,filename,useAbstractNames);
127 LQN = getStruct(self);
129 function E = getNumberOfLayers(self)
130 % E = GETNUMBEROFLAYERS()
132 E = getNumberOfModels(self);
135 function E = getNumberOfModels(self)
136 % E = GETNUMBEROFMODELS()
138 if isempty(self.ensemble)
139 self.ensemble = getEnsemble(self);
141 E = length(self.ensemble);
144 function layers = getLayers(self)
145 % LAYERS = GETLAYERS()
147 layers = getEnsemble(self);
150 % setUsedFeatures : records that a certain language feature has been used
151 function self = setUsedLangFeature(self,e,className)
152 % SELF = SETUSEDLANGFEATURE(SELF,E,CLASSNAME)
154 self.usedFeatures{e}.setTrue(className);
157 function self = initUsedFeatures(self)
158 % SELF = INITUSEDFEATURES()
160 for e=1:getNumberOfModels(self)
161 self.usedFeatures{e} = SolverFeatureSet;
165 function usedFeatures = getUsedLangFeatures(self)
166 % USEDFEATURES = GETUSEDLANGFEATURES()
168 E = getNumberOfLayers(self);
169 usedFeatures = cell(1,E);
171 usedFeatures{e} = self.ensemble{e}.getUsedLangFeatures;
173 self.usedFeatures = usedFeatures;
177 jlqnmodel = JLINE.from_line_layered_network(self);
181 function result = nodeIndex(self, varargin)
182 % NODEINDEX Kotlin-style alias for getNodeIndex
183 result = self.getNodeIndex(varargin{:});
186 function result = nodeByName(self, varargin)
187 % NODEBYNAME Kotlin-style alias for getNodeByName
188 result = self.getNodeByName(varargin{:});
191 function result = nodeNames(self, varargin)
192 % NODENAMES Kotlin-style alias for getNodeNames
193 result = self.getNodeNames(varargin{:});
196 function result =
struct(self, varargin)
197 % STRUCT Kotlin-style alias
for getStruct
198 result = self.getStruct(varargin{:});
201 function result = numberOfLayers(self, varargin)
202 % NUMBEROFLAYERS Kotlin-style alias for getNumberOfLayers
203 result = self.getNumberOfLayers(varargin{:});
206 function result = numberOfModels(self, varargin)
207 % NUMBEROFMODELS Kotlin-style alias for getNumberOfModels
208 result = self.getNumberOfModels(varargin{:});
211 function result = layers(self, varargin)
212 % LAYERS Kotlin-style alias for getLayers
213 result = self.getLayers(varargin{:});
216 function result = usedLangFeatures(self, varargin)
217 % USEDLANGFEATURES Kotlin-style alias for getUsedLangFeatures
218 result = self.getUsedLangFeatures(varargin{:});
221 function sanitize(self)
223 % Validates the LayeredNetwork configuration.
224 % Ensures that
if entries are defined, activities are also defined to serve those entries.
226 numEntries = length(self.entries);
227 numActivities = length(self.activities);
229 if numEntries > 0 && numActivities == 0
230 msg = sprintf(
'LayeredNetwork ''%s'' has %d entry(ies) but no activities. Entries must be bound to activities to form a valid LQN model. Use activity.boundTo(entry) to establish the binding.', self.name, numEntries);
231 line_error(mfilename, msg);
238 function myLN = readXML(filename, verbose)
242 myLN = LayeredNetwork.parseXML(filename, verbose);
245 function myLN = load(filename, verbose)
249 myLN = LayeredNetwork.parseXML(filename, verbose);
252 myLN = parseXML(filename, verbose)
254 function myLN = fromNetwork(model)
255 myLN = QN2LQN(model);