LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
solver_mva_analyzer.m
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)
3
4% Copyright (c) 2012-2026, Imperial College London
5% All rights reserved.
6
7iter = NaN;
8Tstart = tic;
9method = options.method;
10method = regexprep(method, '^amva\.', '');
11
12line_debug(options, 'MVA analyzer starting: method=%s, nclasses=%d, njobs=%s, nchains=%d', method, sn.nclasses, mat2str(sn.njobs), sn.nchains);
13
14switch method
15 case {'exact','mva'}
16 line_debug(options, 'Using exact MVA method, calling solver_mva');
17 [Q,U,R,T,C,X,lG] = solver_mva(sn, options);
18 case {'qna'}
19 line_debug(options, 'Using QNA method, calling solver_qna');
20 [Q,U,R,T,C,X] = solver_qna(sn, options);
21 lG = NaN;
22 case {'default'}
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);
28 % lG = NaN;
29 %else
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);
40 method = 'exact';
41 else
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);
45 end
46 %end
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);
50 otherwise
51 Q=[];
52 U=[];
53 R=[];
54 T=[];
55 C=[];
56 X=[];
57 lG=[];
58 iter=[];
59 if options.verbose
60 line_warning(mfilename,'Unsupported SolverMVA method.');
61 end
62end
63runtime = toc(Tstart);
64
65if options.verbose
66 %line_printf('\nMVA analysis completed. Runtime: %f seconds.\n',runtime);
67end
68
69end