1classdef ClassSwitch < Node
2 % A node to change the
class of visiting jobs
4 % Copyright (c) 2012-2026, Imperial College London
19 function self = ClassSwitch(model, name, csMatrix)
20 % SELF = CLASSSWITCH(MODEL, NAME, CSMATRIX)
23 if isa(model,
'Network')
24 % Handle the
new delegation pattern
25 if model.isMatlabNative()
26 classes = model.getClasses();
28 csMatrix = eye(length(classes));
31 self.autoAdded =
false;
32 self.input = Buffer(classes);
33 self.output = Dispatcher(classes);
35 self.schedPolicy = SchedStrategyType.NP;
36 self.schedStrategy = SchedStrategy.FCFS;
37 self.server = StatelessClassSwitcher(classes, csMatrix);
41 % Java implementation through delegation
44 self.obj = jline.lang.nodes.ClassSwitch(model.implementation.obj, name);
46 self.obj = jline.lang.nodes.ClassSwitch(model.implementation.obj, name, csMatrix);
48 self.index = model.implementation.obj.getNodeIndex(self.obj);
50 elseif isa(model,
'MNetwork') || (isa(model,
'Network') && model.isMatlabNative())
51 classes = model.getClasses();
53 csMatrix = eye(length(classes));
56 self.autoAdded =
false;
57 self.input = Buffer(classes);
58 self.output = Dispatcher(classes);
60 self.schedPolicy = SchedStrategyType.NP;
61 self.schedStrategy = SchedStrategy.FCFS;
62 self.server = StatelessClassSwitcher(classes, csMatrix);
64 self.model.addNode(self);
65 elseif isa(model,
'JNetwork') || (isa(model,
'Network') && model.isJavaNative())
68 self.obj = jline.lang.nodes.ClassSwitch(model.obj, name);
70 self.obj = jline.lang.nodes.ClassSwitch(model.obj, name, csMatrix);
72 self.index = model.obj.getNodeIndex(self.obj);
76 function C = initClassSwitchMatrix(self)
77 % C = INITCLASSSWITCHMATRIX()
79 K = self.model.getNumberOfClasses;
83 function setClassSwitchingMatrix(self, csMatrix)
84 self.server.updateClasses(self.model.getClasses());
85 self.server.updateClassSwitch(csMatrix);
88 function self = removeJobClass(self,
jobclass)
89 % SELF = REMOVEJOBCLASS(JOBCLASS)
91 % Slice the class-switching matrix, which
is indexed by class
92 % position, on top of the routing configuration handled by Node.
94 remaining = self.remainingClassIndexes(
jobclass);
96 if ~isempty(self.server) && isprop(self.server, 'csFun')
97 % csFun
is the handle @(r,s,...) csMatrix(r,s), so calling it
98 % with the surviving index vectors returns the submatrix
99 self.server.updateClassSwitch(self.server.csFun(remaining, remaining));
100 if isprop(self.server, 'classes') && numel(self.server.classes) == numel(remaining) + 1
101 self.server.updateClasses(self.server.classes(remaining));
106 function setProbRouting(self, class, destination, probability)
107 % SETPROBROUTING(CLASS, DESTINATION, PROBABILITY)
109 setRouting(self, class, RoutingStrategy.PROB, destination, probability);
112 function summary(self)
115 line_printf('\nNode: <strong>%s</strong>',self.getName);
117 %classes = self.model.getClasses();
118 %line_printf('Routing %s: %s',classes{r}.name,self.output.outputStrategy{r}{2});
119 for s=1:length(self.output.outputStrategy)
120 if self.server.csMatrix(r,s)>0
121 classes = self.model.getClasses();
122 line_printf('Routing %s->%s: %g',classes{r}.name,classes{s}.name,self.server.csMatrix(r,s));
126 % self.input.summary;
127 % self.server.summary;
128 % self.output.summary;