1classdef RoutingMatrix < Copyable
2 % Class
for routing matrices
4 % Copyright (c) 2012-2026, Imperial College London
13 function self = RoutingMatrix(par)
16 function varargout = subsref(self,s)
20 % Implement obj.PropertyName
21 [varargout{1:nargout}] = builtin(
'subsref',self,s);
22 elseif length(s) == 2 && strcmp(s(2).type,
'()')
23 % Implement obj.PropertyName(indices)
24 [varargout{1:nargout}] = builtin(
'subsref',self,s);
26 [varargout{1:nargout}] = builtin(
'subsref',self,s);
30 % Implement obj(indices)
31 [varargout{1:nargout}] = builtin(
'subsref',self,s);
32 elseif length(s) == 2 && strcmp(s(2).type,
'.')
33 % Implement obj(ind).PropertyName
34 [varargout{1:nargout}] = builtin(
'subsref',self,s);
35 elseif length(s) == 3 && strcmp(s(2).type,
'.') && strcmp(s(3).type,
'()')
36 % Implement obj(indices).PropertyName(indices)
37 [varargout{1:nargout}] = builtin(
'subsref',self,s);
39 % Use built-in
for any other expression
40 [varargout{1:nargout}] = builtin(
'subsref',self,s);
44 % Implement obj{indices}
45 [varargout{1:nargout}] = builtin(
'subsref',self.rt,s);
46 elseif length(s) == 2 && strcmp(s(2).type,
'.')
47 % Implement obj{indices}.PropertyName
48 [varargout{1:nargout}] = builtin(
'subsref',self.rt,s);
50 % Use built-in
for any other expression
51 [varargout{1:nargout}] = builtin(
'subsref',self.rt,s);
54 error(
'Not a valid indexing expression')
58 function self = subsasgn(self,s,varargin)
60 % Allow subscripted assignment to uninitialized variable
62 % obj = ClassName.empty;
68 % Implement obj.PropertyName = varargin{:};
69 self = builtin(
'subsasgn',self,s,varargin{:});
70 elseif length(s) == 2 && strcmp(s(2).type,
'()')
71 % Implement obj.PropertyName(indices) = varargin{:};
72 self = builtin(
'subsasgn',self,s,varargin{:});
74 % Call built-in
for any other
case
75 self = builtin(
'subsasgn',self,s,varargin{:});
79 % Implement obj(indices) = varargin{:};
80 elseif length(s) == 2 && strcmp(s(2).type,
'.')
81 % Implement obj(indices).PropertyName = varargin{:};
82 self = builtin(
'subsasgn',self,s,varargin{:});
83 elseif length(s) == 3 && strcmp(s(2).type,
'.') && strcmp(s(3).type,
'()')
84 % Implement obj(indices).PropertyName(indices) = varargin{:};
85 self = builtin(
'subsasgn',self,s,varargin{:});
87 % Use built-in
for any other expression
88 self = builtin(
'subsasgn',self,s,varargin{:});
92 % Implement obj{indices} = varargin{:}
93 if isa(varargin{1},
'jline.lang.RoutingMatrix')
94 jobclass = varargin{1}.getClass(s.subs{1}-1);
96 self.rt = builtin(
'subsasgn',self.rt,s,mat);
98 self.rt = builtin(
'subsasgn',self.rt,s,varargin{1});
100 elseif length(s) == 2 && strcmp(s(2).type,
'.')
101 % Implement obj{indices}.PropertyName = varargin{:}
102 self = builtin(
'subsasgn',self.rt,s,varargin{:});
104 % Use built-in
for any other expression
105 self = builtin(
'subsasgn',self.rt,s,varargin{:});
108 error(
'Not a valid indexing expression')
112 function self = set(self, varargin)
113 jobclass1=varargin{1};
114 jobclass2=varargin{2};
115 if length(varargin)==5
119 self.rt{jobclass1,jobclass2}(node1, node2)=val;
120 elseif length(varargin)==3
122 self.rt{jobclass1,jobclass2}=mat;
123 elseif length(varargin)==2
125 self.rt{jobclass1,jobclass1}=mat;
127 line_error(mfilename,
'Invalid number of arguments.');
131 function
P = getCell(self)
136 for r = 1:size(self.rt,1)
137 for s = 1:size(self.rt,2)
138 fprintf(1,'Class %d -> Class %d:\n',r,s);
146 function [rtorigcell,rtorig] = rtnodes2rtorig(sn)
148 rtnodes = sn.rtnodes;
151 for ind = 1:sn.nnodes
152 if startsWith(sn.nodenames{ind},
'CS_')
161 colToKeep(end+1) = (ind-1)*K+k;
165 rtorig = dtmc_stochcomp(rtnodes, colToKeep);
166 rtorigcell = cellzeros(K,K,csshift,csshift);
168 % for cache rt, replace NaNs for unknown probabilities with 0
169 rtorig(isnan(rtorig)) = 0;
172 if sn.nodetype(ind) ~= NodeType.Sink
176 rtorigcell{r,s}(ind,jnd) = rtorig((ind-1)*K+r,(jnd-1)*K+s);