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)
19 % obj.PropertyName and nested forms all delegate to builtin
20 [varargout{1:nargout}] = builtin(
'subsref',self,s);
22 % obj(indices) and nested forms all delegate to builtin
23 [varargout{1:nargout}] = builtin(
'subsref',self,s);
25 % obj{indices} and nested forms delegate to builtin on rt
26 [varargout{1:nargout}] = builtin(
'subsref',self.rt,s);
28 error(
'Not a valid indexing expression')
32 function self = subsasgn(self,s,varargin)
34 % Allow subscripted assignment to uninitialized variable
36 % obj = ClassName.empty;
41 % obj.PropertyName = ... and nested forms delegate to builtin
42 self = builtin('subsasgn',self,s,varargin{:});
45 % Implement obj(indices) = varargin{:};
46 elseif length(s) == 2 && strcmp(s(2).type,
'.')
47 % Implement obj(indices).PropertyName = varargin{:};
48 self = builtin(
'subsasgn',self,s,varargin{:});
49 elseif length(s) == 3 && strcmp(s(2).type,
'.') && strcmp(s(3).type,
'()')
50 % Implement obj(indices).PropertyName(indices) = varargin{:};
51 self = builtin(
'subsasgn',self,s,varargin{:});
53 % Use built-in
for any other expression
54 self = builtin(
'subsasgn',self,s,varargin{:});
58 % Implement obj{indices} = varargin{:}
59 if isa(varargin{1},
'jline.lang.RoutingMatrix')
60 jobclass = varargin{1}.getClass(s.subs{1}-1);
62 self.rt = builtin(
'subsasgn',self.rt,s,mat);
64 self.rt = builtin(
'subsasgn',self.rt,s,varargin{1});
66 elseif length(s) == 2 && strcmp(s(2).type,
'()')
67 % Implement obj{indices}(indices) = varargin{:}
68 self.rt = builtin(
'subsasgn',self.rt,s,varargin{:});
69 elseif length(s) == 2 && strcmp(s(2).type,
'.')
70 % Implement obj{indices}.PropertyName = varargin{:}
71 self = builtin(
'subsasgn',self.rt,s,varargin{:});
73 % Use built-in
for any other expression
74 self = builtin(
'subsasgn',self.rt,s,varargin{:});
77 error(
'Not a valid indexing expression')
81 function self = set(self, varargin)
82 jobclass1=varargin{1};
83 jobclass2=varargin{2};
84 if length(varargin)==5
88 self.rt{jobclass1,jobclass2}(node1, node2)=val;
89 elseif length(varargin)==3
91 self.rt{jobclass1,jobclass2}=mat;
92 elseif length(varargin)==2
94 self.rt{jobclass1,jobclass1}=mat;
96 line_error(mfilename,
'Invalid number of arguments.');
100 function
P = getCell(self)
105 for r = 1:size(self.rt,1)
106 for s = 1:size(self.rt,2)
107 fprintf(1,'Class %d -> Class %d:\n',r,s);
115 function [rtorigcell,rtorig] = rtnodes2rtorig(sn)
117 rtnodes = sn.rtnodes;
120 for ind = 1:sn.nnodes
121 if startsWith(sn.nodenames{ind},
'CS_')
130 colToKeep(end+1) = (ind-1)*K+k;
134 rtorig = dtmc_stochcomp(rtnodes, colToKeep);
135 rtorigcell = cellzeros(K,K,csshift,csshift);
137 % for cache rt, replace NaNs for unknown probabilities with 0
138 rtorig(isnan(rtorig)) = 0;
141 if sn.nodetype(ind) ~= NodeType.Sink
145 rtorigcell{r,s}(ind,jnd) = rtorig((ind-1)*K+r,(jnd-1)*K+s);