1classdef SolverMVA < NetworkSolver
2 % Mean Value Analysis solver
for queueing networks
4 % Implements MVA algorithms
for analyzing closed and open queueing networks.
6 % Copyright (c) 2012-2026, Imperial College London
10 function self = SolverMVA(model,varargin)
11 % SOLVERMVA Create an MVA solver instance
13 % @brief Creates a Mean Value Analysis solver
for the given model
14 % @param model Network model to be analyzed
15 % @param varargin Optional solver options (method, tolerance, etc.)
16 % @
return self SolverMVA instance configured with specified options
18 self@NetworkSolver(model, mfilename);
19 self.setOptions(Solver.parseOptions(varargin, SolverMVA.defaultOptions));
23 function sn = getStruct(self)
24 % GETSTRUCT Get model data structure
for analysis
26 % @brief Returns the internal data structure representing the model
27 % @
return sn Structured data representing the queueing network
28 sn = self.model.getStruct(
false);
31 [runtime, analyzer] = runAnalyzer(self, options);
32 [lNormConst] = getProbNormConstAggr(self);
33 [Pnir,logPnir] = getProbAggr(self, ist);
34 [Pnir,logPn] = getProbSysAggr(self);
36 function [allMethods] = listValidMethods(self)
37 % LISTVALIDMETHODS Get all valid MVA solution methods
39 % @brief Returns cell array of valid MVA methods
for the current model
40 % @
return allMethods Cell array of method names available
for this model
42 sn = self.model.getStruct;
44 allMethods = {
'default',...
45 'mva',
'exact',
'amva',
'qna', ...
46 'qdlin',
'amva.qdlin', ...
53 'schmidt',
'amva.schmidt', ...
54 'schmidt-ext',
'amva.schmidt-ext', ...
55 'lin',
'egflin',
'gflin',
'amva.lin'};
57 if ~sn_is_open_model(sn) && sn.nclasses == 1
58 bounds = {
'aba.upper',
'aba.lower',
'bjb.upper',
'bjb.lower', ...
59 'gb.upper',
'gb.lower',
'pb.upper',
'pb.lower',
'sb.upper',
'sb.lower'};
60 allMethods = {allMethods{:}, bounds{:}}; %#ok<CCAT>
63 if sn_is_open_model(sn) && sn.nstations == 2 && sn.nclasses == 1
64 % methods to add
for queueing systems
65 qsys = {
'mm1',
'mmk',
'mg1',
'mgi1',
'gm1',
'gig1',
'gim1',
'gig1.kingman', ...
66 'gigk',
'gigk.kingman_approx', ...
67 'gig1.gelenbe',
'gig1.heyman',
'gig1.kimura',
'gig1.allen', ...
68 'gig1.kobayashi',
'gig1.klb',
'gig1.marchal'};
69 % append, keeping original order and avoiding duplicates
70 allMethods = {allMethods{:}, qsys{:}}; %#ok<CCAT>
77 function featSupported = getFeatureSet()
78 % FEATSUPPORTED = GETFEATURESET()
80 featSupported = SolverFeatureSet;
81 featSupported.setTrue({
'Sink',
'Source',...
82 'ClassSwitch',
'Delay',
'DelayStation',
'Queue',...
83 'APH',
'Coxian',
'Erlang',
'Exp',
'HyperExp',...
84 'Pareto',
'Weibull',
'Lognormal',
'Uniform',
'Det', ...
85 'StatelessClassSwitcher',
'InfiniteServer',
'SharedServer',
'Buffer',
'Dispatcher',...
86 'CacheClassSwitcher',
'Cache', ...
87 'Server',
'JobSink',
'RandomSource',
'ServiceTunnel',...
88 'SchedStrategy_INF',
'SchedStrategy_PS',...
89 'SchedStrategy_DPS',
'SchedStrategy_FCFS',
'SchedStrategy_SIRO',
'SchedStrategy_HOL',...
90 'SchedStrategy_LCFS',
'SchedStrategy_LCFSPR',
'SchedStrategy_POLLING',...
91 'Fork',
'Forker',
'Join',
'Joiner',...
92 'RoutingStrategy_PROB',
'RoutingStrategy_RAND',...
93 'ReplacementStrategy_RR',
'ReplacementStrategy_FIFO',
'ReplacementStrategy_LRU',...
94 'ClosedClass',
'SelfLoopingClass',
'OpenClass',
'Replayer'});
97 function [bool, featSupported] = supports(model)
98 % [BOOL, FEATSUPPORTED] = SUPPORTS(MODEL)
100 featUsed = model.getUsedLangFeatures();
101 featSupported = SolverMVA.getFeatureSet();
102 bool = SolverFeatureSet.supports(featSupported, featUsed);
105 function options = defaultOptions
106 % OPTIONS = DEFAULTOPTIONS()
108 options = SolverOptions('MVA');
111 function libs = getLibrariesUsed(sn, options)
112 % GETLIBRARIESUSED Get list of external libraries used by MVA solver
113 % MVA uses internal algorithms, no external library attribution needed