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',
'Router',...
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',
'SchedStrategy_LCFSPRPRIO',
'SchedStrategy_FCFSPRPRIO',...
113 'SchedStrategy_PSPRIO',
'SchedStrategy_DPSPRIO',
'SchedStrategy_GPSPRIO',...
114 'RoutingStrategy_RROBIN',...
115 'RoutingStrategy_PROB',
'RoutingStrategy_RAND',...
116 'ReplacementStrategy_RR',
'ReplacementStrategy_FIFO',
'ReplacementStrategy_SFIFO',
'ReplacementStrategy_LRU',...
117 'ClosedClass',
'SelfLoopingClass',
'OpenClass',
'Replayer',...
118 'Place',
'Transition',
'Linkage',
'Enabling',
'Timing',
'Firing',
'Storage',...
122 function [bool, featSupported, featUsed] = supports(model)
123 % [BOOL, FEATSUPPORTED, FEATUSED] = SUPPORTS(MODEL)
125 featUsed = model.getUsedLangFeatures();
126 featSupported = SolverCTMC.getFeatureSet();
127 bool = SolverFeatureSet.supports(featSupported, featUsed);
130 function options = defaultOptions()
131 % OPTIONS = DEFAULTOPTIONS()
132 options = SolverOptions('CTMC');
135 function printInfGen(Q,SS)
143 line_printf('\n%s->%s: %f',mat2str(SS(s,:)),mat2str(SS(sp,:)),
double(Q(s,sp)));
150 function printEventFilt(sync,D,SS,myevents)
151 % PRINTEVENTFILT(SYNC,D,SS,MYEVENTS)
153 if nargin<4 %~exist('events','var')
154 myevents = 1:length(sync);
162 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)));
169 function libs = getLibrariesUsed(sn, options)
170 % GETLIBRARIESUSED Get list of external libraries used by CTMC solver
172 if ~isempty(options) && isfield(options,
'method') && startsWith(options.method,
'qrf')
173 libs{end+1} =
'MATLAB Optimization Toolbox (fmincon)';