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',
'SchedStrategy_LCFSPRPRIO',
'SchedStrategy_FCFSPRPRIO',...
113 'RoutingStrategy_RROBIN',...
114 'RoutingStrategy_PROB',
'RoutingStrategy_RAND',...
115 'ReplacementStrategy_RR',
'ReplacementStrategy_FIFO',
'ReplacementStrategy_SFIFO',
'ReplacementStrategy_LRU',...
116 'ClosedClass',
'SelfLoopingClass',
'OpenClass',
'Replayer',...
117 'Place',
'Transition',
'Linkage',
'Enabling',
'Timing',
'Firing',
'Storage'});
120 function [bool, featSupported, featUsed] = supports(model)
121 % [BOOL, FEATSUPPORTED, FEATUSED] = SUPPORTS(MODEL)
123 featUsed = model.getUsedLangFeatures();
124 featSupported = SolverCTMC.getFeatureSet();
125 bool = SolverFeatureSet.supports(featSupported, featUsed);
128 function options = defaultOptions()
129 % OPTIONS = DEFAULTOPTIONS()
130 options = SolverOptions('CTMC');
133 function printInfGen(Q,SS)
141 line_printf('\n%s->%s: %f',mat2str(SS(s,:)),mat2str(SS(sp,:)),
double(Q(s,sp)));
148 function printEventFilt(sync,D,SS,myevents)
149 % PRINTEVENTFILT(SYNC,D,SS,MYEVENTS)
151 if nargin<4 %~exist('events','var')
152 myevents = 1:length(sync);
160 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)));
167 function libs = getLibrariesUsed(sn, options)
168 % GETLIBRARIESUSED Get list of external libraries used by CTMC solver
170 if ~isempty(options) && isfield(options,
'method') && startsWith(options.method,
'qrf')
171 libs{end+1} =
'MATLAB Optimization Toolbox (fmincon)';