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}(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{:});
106 else
107 % Use built-in for any other expression
108 self = builtin('subsasgn',self.rt,s,varargin{:});
109 end
110 otherwise
111 error('Not a valid indexing expression')
112 end
113 end
114
115 function self = set(self, varargin)
116 jobclass1=varargin{1};
117 jobclass2=varargin{2};
118 if length(varargin)==5
119 node1=varargin{3};
120 node2=varargin{4};
121 val=varargin{5};
122 self.rt{jobclass1,jobclass2}(node1, node2)=val;
123 elseif length(varargin)==3
124 mat=varargin{3};
125 self.rt{jobclass1,jobclass2}=mat;
126 elseif length(varargin)==2
127 mat=varargin{2};
128 self.rt{jobclass1,jobclass1}=mat;
129 else
130 line_error(mfilename,'Invalid number of arguments.');
131 end
132 end
133
134 function P = getCell(self)
135 P = self.rt;
136 end
137
138 function print(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);
142 disp(self.rt{r,s});
143 end
144 end
145 end
146 end
147
148 methods (Static)
149 function [rtorigcell,rtorig] = rtnodes2rtorig(sn)
150 K = sn.nclasses;
151 rtnodes = sn.rtnodes;
152
153 csshift = sn.nnodes;
154 for ind = 1:sn.nnodes
155 if startsWith(sn.nodenames{ind}, 'CS_')
156 csshift = ind-1;
157 break
158 end
159 end
160
161 colToKeep=[];
162 for ind = 1:csshift
163 for k = 1:K
164 colToKeep(end+1) = (ind-1)*K+k;
165 end
166 end
167
168 rtorig = dtmc_stochcomp(rtnodes, colToKeep);
169 rtorigcell = cellzeros(K,K,csshift,csshift);
170
171 % for cache rt, replace NaNs for unknown probabilities with 0
172 rtorig(isnan(rtorig)) = 0;
173
174 for ind = 1:csshift
175 if sn.nodetype(ind) ~= NodeType.Sink
176 for jnd = 1:csshift
177 for r = 1:K
178 for s = 1:K
179 rtorigcell{r,s}(ind,jnd) = rtorig((ind-1)*K+r,(jnd-1)*K+s);
180 end
181 end
182 end
183 end
184 end
185
186 end
187 end
188end