LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
RoutingMatrix.m
1classdef RoutingMatrix < Copyable
2 % Class for routing matrices
3 %
4 % Copyright (c) 2012-2026, Imperial College London
5 % All rights reserved.
6
7 properties (Hidden)
8 rt;
9 end
10
11 methods
12 %Constructor
13 function self = RoutingMatrix(par)
14 self.rt = par;
15 end
16 function varargout = subsref(self,s)
17 switch s(1).type
18 case '.'
19 if length(s) == 1
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);
25 else
26 [varargout{1:nargout}] = builtin('subsref',self,s);
27 end
28 case '()'
29 if length(s) == 1
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);
38 else
39 % Use built-in for any other expression
40 [varargout{1:nargout}] = builtin('subsref',self,s);
41 end
42 case '{}'
43 if length(s) == 1
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);
49 else
50 % Use built-in for any other expression
51 [varargout{1:nargout}] = builtin('subsref',self.rt,s);
52 end
53 otherwise
54 error('Not a valid indexing expression')
55 end
56 end
57
58 function self = subsasgn(self,s,varargin)
59
60 % Allow subscripted assignment to uninitialized variable
61 if isequal(self,[])
62 % obj = ClassName.empty;
63 end
64
65 switch s(1).type
66 case '.'
67 if length(s) == 1
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{:});
73 else
74 % Call built-in for any other case
75 self = builtin('subsasgn',self,s,varargin{:});
76 end
77 case '()'
78 if length(s) == 1
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{:});
86 else
87 % Use built-in for any other expression
88 self = builtin('subsasgn',self,s,varargin{:});
89 end
90 case '{}'
91 if length(s) == 1
92 % Implement obj{indices} = varargin{:}
93 if isa(varargin{1},'jline.lang.RoutingMatrix')
94 jobclass = varargin{1}.getClass(s.subs{1}-1);
95 mat = JLINE.from_jline_matrix(varargin{1}.get(jobclass,jobclass));
96 self.rt = builtin('subsasgn',self.rt,s,mat);
97 else
98 self.rt = builtin('subsasgn',self.rt,s,varargin{1});
99 end
100 elseif length(s) == 2 && strcmp(s(2).type,'.')
101 % Implement obj{indices}.PropertyName = varargin{:}
102 self = builtin('subsasgn',self.rt,s,varargin{:});
103 else
104 % Use built-in for any other expression
105 self = builtin('subsasgn',self.rt,s,varargin{:});
106 end
107 otherwise
108 error('Not a valid indexing expression')
109 end
110 end
111
112 function self = set(self, varargin)
113 jobclass1=varargin{1};
114 jobclass2=varargin{2};
115 if length(varargin)==5
116 node1=varargin{3};
117 node2=varargin{4};
118 val=varargin{5};
119 self.rt{jobclass1,jobclass2}(node1, node2)=val;
120 elseif length(varargin)==3
121 mat=varargin{3};
122 self.rt{jobclass1,jobclass2}=mat;
123 elseif length(varargin)==2
124 mat=varargin{2};
125 self.rt{jobclass1,jobclass1}=mat;
126 else
127 line_error(mfilename,'Invalid number of arguments.');
128 end
129 end
130
131 function P = getCell(self)
132 P = self.rt;
133 end
134
135 function print(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);
139 disp(self.rt{r,s});
140 end
141 end
142 end
143 end
144
145 methods (Static)
146 function [rtorigcell,rtorig] = rtnodes2rtorig(sn)
147 K = sn.nclasses;
148 rtnodes = sn.rtnodes;
149
150 csshift = sn.nnodes;
151 for ind = 1:sn.nnodes
152 if startsWith(sn.nodenames{ind}, 'CS_')
153 csshift = ind-1;
154 break
155 end
156 end
157
158 colToKeep=[];
159 for ind = 1:csshift
160 for k = 1:K
161 colToKeep(end+1) = (ind-1)*K+k;
162 end
163 end
164
165 rtorig = dtmc_stochcomp(rtnodes, colToKeep);
166 rtorigcell = cellzeros(K,K,csshift,csshift);
167
168 % for cache rt, replace NaNs for unknown probabilities with 0
169 rtorig(isnan(rtorig)) = 0;
170
171 for ind = 1:csshift
172 if sn.nodetype(ind) ~= NodeType.Sink
173 for jnd = 1:csshift
174 for r = 1:K
175 for s = 1:K
176 rtorigcell{r,s}(ind,jnd) = rtorig((ind-1)*K+r,(jnd-1)*K+s);
177 end
178 end
179 end
180 end
181 end
182
183 end
184 end
185end