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 % obj.PropertyName and nested forms all delegate to builtin
20 [varargout{1:nargout}] = builtin('subsref',self,s);
21 case '()'
22 % obj(indices) and nested forms all delegate to builtin
23 [varargout{1:nargout}] = builtin('subsref',self,s);
24 case '{}'
25 % obj{indices} and nested forms delegate to builtin on rt
26 [varargout{1:nargout}] = builtin('subsref',self.rt,s);
27 otherwise
28 error('Not a valid indexing expression')
29 end
30 end
31
32 function self = subsasgn(self,s,varargin)
33
34 % Allow subscripted assignment to uninitialized variable
35 if isequal(self,[])
36 % obj = ClassName.empty;
37 end
38
39 switch s(1).type
40 case '.'
41 % obj.PropertyName = ... and nested forms delegate to builtin
42 self = builtin('subsasgn',self,s,varargin{:});
43 case '()'
44 if length(s) == 1
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{:});
52 else
53 % Use built-in for any other expression
54 self = builtin('subsasgn',self,s,varargin{:});
55 end
56 case '{}'
57 if length(s) == 1
58 % Implement obj{indices} = varargin{:}
59 if isa(varargin{1},'jline.lang.RoutingMatrix')
60 jobclass = varargin{1}.getClass(s.subs{1}-1);
61 mat = JLINE.from_jline_matrix(varargin{1}.get(jobclass,jobclass));
62 self.rt = builtin('subsasgn',self.rt,s,mat);
63 else
64 self.rt = builtin('subsasgn',self.rt,s,varargin{1});
65 end
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{:});
72 else
73 % Use built-in for any other expression
74 self = builtin('subsasgn',self.rt,s,varargin{:});
75 end
76 otherwise
77 error('Not a valid indexing expression')
78 end
79 end
80
81 function self = set(self, varargin)
82 jobclass1=varargin{1};
83 jobclass2=varargin{2};
84 if length(varargin)==5
85 node1=varargin{3};
86 node2=varargin{4};
87 val=varargin{5};
88 self.rt{jobclass1,jobclass2}(node1, node2)=val;
89 elseif length(varargin)==3
90 mat=varargin{3};
91 self.rt{jobclass1,jobclass2}=mat;
92 elseif length(varargin)==2
93 mat=varargin{2};
94 self.rt{jobclass1,jobclass1}=mat;
95 else
96 line_error(mfilename,'Invalid number of arguments.');
97 end
98 end
99
100 function P = getCell(self)
101 P = self.rt;
102 end
103
104 function print(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);
108 disp(self.rt{r,s});
109 end
110 end
111 end
112 end
113
114 methods (Static)
115 function [rtorigcell,rtorig] = rtnodes2rtorig(sn)
116 K = sn.nclasses;
117 rtnodes = sn.rtnodes;
118
119 csshift = sn.nnodes;
120 for ind = 1:sn.nnodes
121 if startsWith(sn.nodenames{ind}, 'CS_')
122 csshift = ind-1;
123 break
124 end
125 end
126
127 colToKeep=[];
128 for ind = 1:csshift
129 for k = 1:K
130 colToKeep(end+1) = (ind-1)*K+k;
131 end
132 end
133
134 rtorig = dtmc_stochcomp(rtnodes, colToKeep);
135 rtorigcell = cellzeros(K,K,csshift,csshift);
136
137 % for cache rt, replace NaNs for unknown probabilities with 0
138 rtorig(isnan(rtorig)) = 0;
139
140 for ind = 1:csshift
141 if sn.nodetype(ind) ~= NodeType.Sink
142 for jnd = 1:csshift
143 for r = 1:K
144 for s = 1:K
145 rtorigcell{r,s}(ind,jnd) = rtorig((ind-1)*K+r,(jnd-1)*K+s);
146 end
147 end
148 end
149 end
150 end
151
152 end
153 end
154end