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}(indices) = varargin{:}
102 self.rt = builtin(
'subsasgn',self.rt,s,varargin{:});
103 elseif length(s) == 2 && strcmp(s(2).type,
'.')
104 % Implement obj{indices}.PropertyName = varargin{:}
105 self = builtin(
'subsasgn',self.rt,s,varargin{:});
107 % Use built-in
for any other expression
108 self = builtin(
'subsasgn',self.rt,s,varargin{:});
111 error(
'Not a valid indexing expression')
115 function self = set(self, varargin)
116 jobclass1=varargin{1};
117 jobclass2=varargin{2};
118 if length(varargin)==5
122 self.rt{jobclass1,jobclass2}(node1, node2)=val;
123 elseif length(varargin)==3
125 self.rt{jobclass1,jobclass2}=mat;
126 elseif length(varargin)==2
128 self.rt{jobclass1,jobclass1}=mat;
130 line_error(mfilename,
'Invalid number of arguments.');
134 function
P = getCell(self)
139 for r = 1:size(self.rt,1)
140 for s = 1:size(self.rt,2)
141 fprintf(1,'Class %d -> Class %d:\n',r,s);
149 function [rtorigcell,rtorig] = rtnodes2rtorig(sn)
151 rtnodes = sn.rtnodes;
154 for ind = 1:sn.nnodes
155 if startsWith(sn.nodenames{ind},
'CS_')
164 colToKeep(end+1) = (ind-1)*K+k;
168 rtorig = dtmc_stochcomp(rtnodes, colToKeep);
169 rtorigcell = cellzeros(K,K,csshift,csshift);
171 % for cache rt, replace NaNs for unknown probabilities with 0
172 rtorig(isnan(rtorig)) = 0;
175 if sn.nodetype(ind) ~= NodeType.Sink
179 rtorigcell{r,s}(ind,jnd) = rtorig((ind-1)*K+r,(jnd-1)*K+s);