LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
SolverCTMC.m
1classdef SolverCTMC < NetworkSolver
2 % Continuous-Time Markov Chain solver for exact state-space analysis
3 %
4 % Implements exact analysis of queueing networks via CTMC formulation.
5 %
6 % Copyright (c) 2012-2026, Imperial College London
7 % All rights reserved.
8
9 methods
10 function self = SolverCTMC(model,varargin)
11 % SOLVERCTMC Create a CTMC solver instance
12 %
13 % @brief Creates a CTMC solver for exact Markov chain analysis
14 % @param model Network model to be analyzed via CTMC formulation
15 % @param varargin Optional parameters (cutoff, method, etc.)
16 % @return self SolverCTMC instance configured for exact analysis
17 self@NetworkSolver(model, mfilename);
18 self.setOptions(Solver.parseOptions(varargin, self.defaultOptions));
19 self.setLang();
20 end
21
22 runtime = runAnalyzer(self, options)
23 Pnir = getProb(self, node, state)
24 Pn = getProbSys(self)
25 Pnir = getProbAggr(self, ist)
26
27 Pn = getProbSysAggr(self)
28 [Pi_t, SSsysa] = getTranProbSysAggr(self)
29 [Pi_t, SSnode_a] = getTranProbAggr(self, node)
30 [Pi_t, SSsys] = getTranProbSys(self)
31 [Pi_t, SSnode] = getTranProb(self, node)
32 RD = getCdfRespT(self, R)
33 RD = getCdfSysRespT(self)
34
35 [stateSpace,nodeStateSpace] = getStateSpace(self, options)
36 stateSpaceAggr = getStateSpaceAggr(self)
37
38 % Reward computation methods
39 [t, V, names, stateSpace] = getReward(self, rewardName)
40 [R, names] = getAvgReward(self)
41 [V, t, names, stateSpace] = runRewardAnalyzer(self)
42
43 function [state_space, local_states] = stateSpace(self)
44 % STATESPACE Kotlin-style alias for getStateSpace
45 if nargout <= 1
46 state_space = self.getStateSpace();
47 else
48 [state_space, local_states] = self.getStateSpace();
49 end
50 end
51
52 function Q = generator(self)
53 % GENERATOR Kotlin-style alias for getGenerator
54 Q = self.getGenerator();
55 end
56
57 [infGen, eventFilt, synchInfo, stateSpace, nodeStateSpace] = getSymbolicGenerator(self, invertSymbol, primeNumbers)
58 [infGen, eventFilt, synchInfo] = getInfGen(self, options)
59 [infGen, eventFilt, synchInfo] = getGenerator(self, options)
60
61 tstate = sampleSys(self, numevents)
62 sampleAggr = sampleAggr(self, node, numEvents)
63
64 function MCTMC = getMarkedCTMC(self, options)
65 % MCTMC = GETMARKEDCTMC(options)
66
67 if nargin < 2
68 [infGen, eventFilt, synchInfo] = self.getInfGen();
69 else
70 [infGen, eventFilt, synchInfo] = getInfGen(self, options);
71 end
72
73 MCTMC = MarkedMarkovProcess(infGen, eventFilt, synchInfo);
74 end
75
76 function sn = getStruct(self)
77 % QN = GETSTRUCT()
78
79 % Get data structure summarizing the model
80 sn = self.model.getStruct(true);
81 end
82
83
84 function [allMethods] = listValidMethods(self)
85 % allMethods = LISTVALIDMETHODS()
86 % List valid methods for this solver
87 sn = self.model.getStruct();
88 allMethods = {'default','gpu',...
89 'qrf.mmi','qrf.mem','qrf.mmi.ld','qrf.mmi.linear',...
90 'qrf.bas.mmi','qrf.bas.mem','qrf.bas','qrf.rsrd'};
91 end
92 end
93
94 methods (Static)
95
96 function featSupported = getFeatureSet()
97 % FEATSUPPORTED = GETFEATURESET()
98
99 featSupported = SolverFeatureSet;
100 featSupported.setTrue({'Source','Sink',...
101 'ClassSwitch','Delay','DelayStation','Queue',...
102 'MAP','APH','MMPP2','PH','Coxian','Erlang','Exp','HyperExp',...
103 'Det','Gamma','Lognormal','Pareto','Uniform','Weibull',...
104 'StatelessClassSwitcher','InfiniteServer','SharedServer','Buffer','Dispatcher',...
105 'Cache','CacheClassSwitcher', ...
106 'Server','JobSink','RandomSource','ServiceTunnel',...
107 'SchedStrategy_INF','SchedStrategy_PS',...
108 'SchedStrategy_DPS','SchedStrategy_GPS',...
109 'SchedStrategy_SIRO','SchedStrategy_SEPT',...
110 'SchedStrategy_LEPT','SchedStrategy_FCFS',...
111 'SchedStrategy_HOL','SchedStrategy_LCFS',...
112 'SchedStrategy_LCFSPR',...
113 'RoutingStrategy_RROBIN',...
114 'RoutingStrategy_PROB','RoutingStrategy_RAND',...
115 'ReplacementStrategy_RR', 'ReplacementStrategy_FIFO','ReplacementStrategy_SFIFO','ReplacementStrategy_LRU',...
116 'ClosedClass','SelfLoopingClass','OpenClass','Replayer'});
117 end
118
119 function [bool, featSupported, featUsed] = supports(model)
120 % [BOOL, FEATSUPPORTED, FEATUSED] = SUPPORTS(MODEL)
121
122 featUsed = model.getUsedLangFeatures();
123 featSupported = SolverCTMC.getFeatureSet();
124 bool = SolverFeatureSet.supports(featSupported, featUsed);
125 end
126
127 function options = defaultOptions()
128 % OPTIONS = DEFAULTOPTIONS()
129 options = SolverOptions('CTMC');
130 end
131
132 function printInfGen(Q,SS)
133 % PRINTINFGEN(Q,SS)
134
135 SS=full(SS);
136 Q=full(Q);
137 for s=1:size(SS,1)
138 for sp=1:size(SS,1)
139 if Q(s,sp)>0
140 line_printf('\n%s->%s: %f',mat2str(SS(s,:)),mat2str(SS(sp,:)),double(Q(s,sp)));
141 end
142 end
143 end
144 line_printf('\n');
145 end
146
147 function printEventFilt(sync,D,SS,myevents)
148 % PRINTEVENTFILT(SYNC,D,SS,MYEVENTS)
149
150 if nargin<4 %~exist('events','var')
151 myevents = 1:length(sync);
152 end
153 SS=full(SS);
154 for e=myevents
155 D{e}=full(D{e});
156 for s=1:size(SS,1)
157 for sp=1:size(SS,1)
158 if D{e}(s,sp)>0
159 line_printf('\n%s-- %d: (%d,%d) => (%d,%d) -->%s: %f',mat2str(SS(s,:)),e,sync{e}.active{1}.node,sync{e}.active{1}.class,sync{e}.passive{1}.node,sync{e}.passive{1}.class,mat2str(SS(sp,:)),double(D{e}(s,sp)));
160 end
161 end
162 end
163 end
164 end
165
166 function libs = getLibrariesUsed(sn, options)
167 % GETLIBRARIESUSED Get list of external libraries used by CTMC solver
168 libs = {};
169 if ~isempty(options) && isfield(options,'method') && startsWith(options.method,'qrf')
170 libs{end+1} = 'MATLAB Optimization Toolbox (fmincon)';
171 end
172 end
173 end
174end