1classdef SolverCTMC < NetworkSolver
2 % Continuous-Time Markov Chain solver
for exact state-space analysis
4 % Implements exact analysis of queueing networks via CTMC formulation.
6 % Copyright (c) 2012-2026, Imperial College London
10 function self = SolverCTMC(model,varargin)
11 % SOLVERCTMC Create a CTMC solver instance
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));
22 runtime = runAnalyzer(self, options)
23 Pnir = getProb(self, node, state)
25 Pnir = getProbAggr(self, ist)
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)
35 [stateSpace,nodeStateSpace] = getStateSpace(self, options)
36 stateSpaceAggr = getStateSpaceAggr(self)
38 % Reward computation methods
39 [t, V, names, stateSpace] = getReward(self, rewardName)
40 [R, names] = getAvgReward(self)
41 [V, t, names, stateSpace] = runRewardAnalyzer(self)
43 function [state_space, local_states] = stateSpace(self)
44 % STATESPACE Kotlin-style alias
for getStateSpace
46 state_space = self.getStateSpace();
48 [state_space, local_states] = self.getStateSpace();
52 function Q = generator(self)
53 % GENERATOR Kotlin-style alias
for getGenerator
54 Q = self.getGenerator();
57 [infGen, eventFilt, synchInfo, stateSpace, nodeStateSpace] = getSymbolicGenerator(self, invertSymbol, primeNumbers)
58 [infGen, eventFilt, synchInfo] = getInfGen(self, options)
59 [infGen, eventFilt, synchInfo] = getGenerator(self, options)
61 tstate = sampleSys(self, numevents)
62 sampleAggr = sampleAggr(self, node, numEvents)
64 function MCTMC = getMarkedCTMC(self, options)
65 % MCTMC = GETMARKEDCTMC(options)
68 [infGen, eventFilt, synchInfo] = self.getInfGen();
70 [infGen, eventFilt, synchInfo] = getInfGen(self, options);
73 MCTMC = MarkedMarkovProcess(infGen, eventFilt, synchInfo);
76 function sn = getStruct(self)
79 % Get data structure summarizing the model
80 sn = self.model.getStruct(
true);
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'};
96 function featSupported = getFeatureSet()
97 % FEATSUPPORTED = GETFEATURESET()
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'});
119 function [bool, featSupported, featUsed] = supports(model)
120 % [BOOL, FEATSUPPORTED, FEATUSED] = SUPPORTS(MODEL)
122 featUsed = model.getUsedLangFeatures();
123 featSupported = SolverCTMC.getFeatureSet();
124 bool = SolverFeatureSet.supports(featSupported, featUsed);
127 function options = defaultOptions()
128 % OPTIONS = DEFAULTOPTIONS()
129 options = SolverOptions('CTMC');
132 function printInfGen(Q,SS)
140 line_printf('\n%s->%s: %f',mat2str(SS(s,:)),mat2str(SS(sp,:)),
double(Q(s,sp)));
147 function printEventFilt(sync,D,SS,myevents)
148 % PRINTEVENTFILT(SYNC,D,SS,MYEVENTS)
150 if nargin<4 %~exist('events','var')
151 myevents = 1:length(sync);
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)));
166 function libs = getLibrariesUsed(sn, options)
167 % GETLIBRARIESUSED Get list of external libraries used by CTMC solver
169 if ~isempty(options) && isfield(options,
'method') && startsWith(options.method,
'qrf')
170 libs{end+1} =
'MATLAB Optimization Toolbox (fmincon)';