1classdef ServerType < Element
2 % ServerType Represents a type of server within a heterogeneous multiserver queue
4 % ServerType defines a group of identical servers with:
5 % - A unique name identifying
this server type
6 % - A count of servers of
this type
7 % - A list of job
classes that are compatible with (can be served by)
this type
9 % Server types enable modeling of heterogeneous multiserver queues where different
10 % servers may have different service rates and serve different subsets of job
classes.
14 % fastServer = ServerType(
'Fast', 2);
15 % fastServer.setCompatible([classA, classB]);
16 % queue.addServerType(fastServer);
17 % queue.setService(classA, fastServer, Exp(2.0));
20 % Copyright (c) 2012-2026, Imperial College London
21 % All rights reserved.
24 id; % Unique identifier within the queue
25 numOfServers; % Number of servers of
this type
26 compatibleClasses; % Cell array of compatible JobClass objects
27 parentQueue; % The Queue
this server type belongs to
31 function self = ServerType(name, numOfServers, compatibleClasses)
32 % SERVERTYPE Create a
new server type
34 % self = SERVERTYPE(name, numOfServers) creates a server type with
35 % the specified name and number of servers. Compatible
classes can
36 % be added later
using setCompatible() or addCompatible().
38 % self = SERVERTYPE(name, numOfServers, compatibleClasses) creates
39 % a server type with initial compatible
classes.
41 % @param name String name identifying
this server type
42 % @param numOfServers Number of servers of
this type (must be >= 1)
43 % @param compatibleClasses (optional) Cell array or array of JobClass objects
48 line_error(mfilename,
'Number of servers must be at least 1');
51 self.id = -1; % Will be set when added to a queue
52 self.numOfServers = numOfServers;
53 self.parentQueue = [];
56 self.compatibleClasses = {};
58 if iscell(compatibleClasses)
59 self.compatibleClasses = compatibleClasses;
61 % Convert array to cell array
62 self.compatibleClasses = cell(1, length(compatibleClasses));
63 for i = 1:length(compatibleClasses)
64 self.compatibleClasses{i} = compatibleClasses(i);
70 function
id = getId(self)
71 % GETID Get the server type ID
73 %
id = GETID() returns the unique identifier of this server type
74 % within its queue, or -1 if not yet added to a queue.
79 function self = setId(self,
id)
80 % SETID Set the server type ID
82 % self = SETID(
id) sets the unique identifier. This
is typically
83 % called by the Queue when the server type
is added.
88 function n = getNumOfServers(self)
89 % GETNUMOFSERVERS Get the number of servers of this type
91 % n = GETNUMOFSERVERS() returns the number of servers.
93 n = self.numOfServers;
96 function self = setNumOfServers(self, n)
97 % SETNUMOFSERVERS Set the number of servers of this type
99 % self = SETNUMOFSERVERS(n) sets the number of servers (must be >= 1).
102 line_error(mfilename, 'Number of servers must be at least 1');
104 self.numOfServers = n;
107 function
classes = getCompatibleClasses(self)
108 % GETCOMPATIBLECLASSES Get the list of compatible job
classes
110 %
classes = GETCOMPATIBLECLASSES() returns a cell array of
111 % compatible JobClass objects.
113 classes = self.compatibleClasses;
116 function self = setCompatible(self,
classes)
117 % SETCOMPATIBLE Set the list of compatible job
classes
120 % can be served by this server type.
122 % @param
classes Array or cell array of JobClass objects
125 self.compatibleClasses =
classes;
127 % Convert array to cell array
128 self.compatibleClasses = cell(1, length(
classes));
130 self.compatibleClasses{i} =
classes(i);
135 function self = addCompatible(self, jobClass)
136 % ADDCOMPATIBLE Add a job
class to the compatible list
138 % self = ADDCOMPATIBLE(jobClass) adds a job
class to the list of
139 %
classes that can be served by
this server type.
141 % @param jobClass The JobClass to add
143 if ~self.isCompatible(jobClass)
144 self.compatibleClasses{end+1} = jobClass;
148 function self = removeCompatible(self, jobClass)
149 % REMOVECOMPATIBLE Remove a job
class from the compatible list
151 % self = REMOVECOMPATIBLE(jobClass) removes a job
class from the
154 % @param jobClass The JobClass to remove
157 for i = 1:length(self.compatibleClasses)
158 if self.compatibleClasses{i} == jobClass
164 self.compatibleClasses(idx) = [];
168 function result = isCompatible(self, jobClass)
169 % ISCOMPATIBLE Check
if a job
class is compatible with this server type
171 % result = ISCOMPATIBLE(jobClass) returns
true if the job
class
172 % can be served by
this server type.
174 % @param jobClass The JobClass to check
175 % @
return result Boolean indicating compatibility
178 for i = 1:length(self.compatibleClasses)
179 if self.compatibleClasses{i} == jobClass
186 function n = getNumCompatibleClasses(self)
187 % GETNUMCOMPATIBLECLASSES Get the number of compatible
classes
189 % n = GETNUMCOMPATIBLECLASSES() returns the count of compatible
classes.
191 n = length(self.compatibleClasses);
194 function result = hasCompatibleClasses(self)
195 % HASCOMPATIBLECLASSES Check if any compatible
classes are defined
197 % result = HASCOMPATIBLECLASSES() returns true if at least one
198 % compatible class
is defined.
200 result = ~isempty(self.compatibleClasses);
203 function queue = getParentQueue(self)
204 % GETPARENTQUEUE Get the parent queue
206 % queue = GETPARENTQUEUE() returns the Queue this server type
207 % belongs to, or [] if not yet added to a queue.
209 queue = self.parentQueue;
212 function self = setParentQueue(self, queue)
213 % SETPARENTQUEUE Set the parent queue
215 % self = SETPARENTQUEUE(queue) sets the parent queue. This
is
216 % typically called by the Queue when the server type
is added.
218 self.parentQueue = queue;
221 function summary(self)
222 % SUMMARY Print a summary of this server type
224 % SUMMARY() displays information about this server type.
226 line_printf('ServerType: <strong>%s</strong>', self.name);
227 line_printf(' ID: %d', self.
id);
228 line_printf(' Number of servers: %d', self.numOfServers);
229 line_printf(' Compatible
classes: %d', length(self.compatibleClasses));
230 for i = 1:length(self.compatibleClasses)
231 line_printf(' - %s', self.compatibleClasses{i}.getName());