1function [Q,U,R,T,C,X,lG,runtime,iter,method] = solver_mva_analyzer(sn, options)
2% [Q,U,R,T,C,X,LG,RUNTIME] = SOLVER_MVA_ANALYZER(QN, OPTIONS)
4% Copyright (c) 2012-2026, Imperial College London
9method = options.method;
10method = regexprep(method,
'^amva\.',
'');
12line_debug(options,
'MVA analyzer starting: method=%s, nclasses=%d, njobs=%s, nchains=%d', method, sn.nclasses, mat2str(sn.njobs), sn.nchains);
16 line_debug(options,
'Using exact MVA method, calling solver_mva');
17 [Q,U,R,T,C,X,lG] = solver_mva(sn, options);
19 line_debug(options,
'Using QNA method, calling solver_qna');
20 [Q,U,R,T,C,X] = solver_qna(sn, options);
23 %
for non-exponential open queueing networks, use qna
24 % (commented as not ready yet, it fails on example_cacheModel_3.m)
25 %
if all(isinf(sn.njobs)) && any(any(sn.scv ~= 1.0))
26 % line_warning(mfilename,
'QNA implementation is still in beta version.')
27 % [Q,U,R,T,C,X] = solver_qna(sn, options);
30 % Force AMVA
for joint-dependent (LJD/LJCD) models - exact MVA doesn
't support it
31 if sn_has_joint_dependence(sn)
32 line_debug('Default method:
using AMVA
for joint-dependent model\n
');
33 line_debug(options, 'Model has joint dependence (LJD/LJCD), calling solver_amva
');
34 [Q,U,R,T,C,X,lG,iter,method] = solver_amva(sn, options);
35 elseif sn.nchains <= 4 && sum(sn.njobs) <= 20 && sn_has_product_form(sn) && ~sn_has_fractional_populations(sn)
36 line_debug('Default method:
using exact MVA\n
');
37 % The parameters above take in the worst case a handful of ms
38 line_debug(options, 'Model qualifies
for exact MVA (nchains=%d, njobs=%d, product-form=%d), calling solver_mva
', sn.nchains, sum(sn.njobs), sn_has_product_form(sn));
39 [Q,U,R,T,C,X,lG] = solver_mva(sn, options);
42 line_debug('Default method:
using approximate MVA\n
');
43 line_debug(options, 'Model
requires approximation (nchains=%d, njobs=%d, product-form=%d), calling solver_amva
', sn.nchains, sum(sn.njobs), sn_has_product_form(sn));
44 [Q,U,R,T,C,X,lG,iter,method] = solver_amva(sn, options);
47 case {'amva
','bs
','qd
','qli
','fli
','lin
','qdlin
','sqni
','egflin
','gflin
','ab
','schmidt
','schmidt-ext
'} %,'aql
','qdaql
'
48 line_debug(options, 'Using approximate MVA method: %s, calling solver_amva
', method);
49 [Q,U,R,T,C,X,lG,iter] = solver_amva(sn, options);
60 line_warning(mfilename,'Unsupported SolverMVA method.
');
66 %line_printf('\nMVA analysis completed. Runtime: %f seconds.\n
',runtime);