1function solver = chooseSolverHeur(self, method)
2% SOLVER = CHOOSESOLVERHEUR(METHOD)
5 case {
'getAvgChainTable',
'getAvgTputTable',
'getAvgRespTTable', ...
6 'getAvgUtilTable',
'getAvgSysTable',
'getAvgNodeTable', ...
7 'getAvgTable',
'getAvg',
'getAvgChain',
'getAvgSys', ...
8 'getAvgNode',
'getAvgArvRChain',
'getAvgQLenChain', ...
9 'getAvgUtilChain',
'getAvgRespTChain',
'getAvgTputChain', ...
10 'getAvgSysRespT',
'getAvgSysTput', ...
11 'getAvgQLen',
'getAvgUtil',
'getAvgRespT',
'getAvgResidT', ...
12 'getAvgWaitT',
'getAvgTput',
'getAvgArvR',
'getAvgQLenTable', ...
13 'getAvgResidTChain',
'getAvgNodeQLenChain',
'getAvgNodeUtilChain', ...
14 'getAvgNodeRespTChain',
'getAvgNodeResidTChain',
'getAvgNodeTputChain', ...
15 'getAvgNodeArvRChain',
'getAvgNodeChainTable',
'getPerctRespT', ...
16 'getResults',
'hasResults',
'getAvgHandles',
'getTranHandles', ...
17 'getAvgQLenHandles',
'getAvgUtilHandles',
'getAvgRespTHandles', ...
18 'getAvgTputHandles',
'getAvgArvRHandles',
'getAvgResidTHandles'}
19 solver = chooseAvgSolverHeur(self);
20 case {
'getEnsembleAvg',
'getEnsembleAvgTables',
'getSolver',
'setSolver', ...
21 'getNumberOfModels',
'getIteration',
'get_state',
'set_state', ...
23 % LayeredNetwork/EnsembleSolver methods - use first available LayeredNetwork solver
24 this_model = self.model;
25 switch class(this_model)
27 % Try SolverLN with MVA first (fastest), then others
28 if ~isempty(self.solvers{self.CANDIDATE_LN_MVA})
29 solver = self.solvers{self.CANDIDATE_LN_MVA};
30 elseif ~isempty(self.solvers{self.CANDIDATE_LN_NC})
31 solver = self.solvers{self.CANDIDATE_LN_NC};
32 elseif ~isempty(self.solvers{self.CANDIDATE_LN_MAM})
33 solver = self.solvers{self.CANDIDATE_LN_MAM};
34 elseif ~isempty(self.solvers{self.CANDIDATE_LN_FLUID})
35 solver = self.solvers{self.CANDIDATE_LN_FLUID};
36 elseif ~isempty(self.solvers{self.CANDIDATE_LQNS})
37 solver = self.solvers{self.CANDIDATE_LQNS};
39 line_error(mfilename,
'No LayeredNetwork solver available');
42 line_error(mfilename,
'Method %s is only available for LayeredNetwork models', method);
45 this_model = self.model;
46 switch class(this_model)
48 if SolverFluid.supports(this_model)
49 solver = self.solvers{self.CANDIDATE_FLUID};
51 solver = self.solvers{self.CANDIDATE_JMT};
54 % Use SolverLN with Fluid sub-solver
for transient metrics
55 if ~isempty(self.solvers{self.CANDIDATE_LN_FLUID})
56 solver = self.solvers{self.CANDIDATE_LN_FLUID};
57 elseif ~isempty(self.solvers{self.CANDIDATE_LN_MVA})
58 solver = self.solvers{self.CANDIDATE_LN_MVA};
60 line_error(mfilename,
'No LayeredNetwork solver available for transient analysis');
64 this_model = self.model;
65 switch class(this_model)
67 if this_model.hasHomogeneousScheduling(SchedStrategy.FCFS) && SolverNC.supports(this_model) && this_model.hasProductFormSolution()
68 solver = self.solvers{self.CANDIDATE_NC};
69 elseif SolverFluid.supports(this_model)
70 solver = self.solvers{self.CANDIDATE_FLUID};
72 solver = self.solvers{self.CANDIDATE_JMT};
75 % Use SolverLN with Fluid sub-solver
for CDF metrics
76 if ~isempty(self.solvers{self.CANDIDATE_LN_FLUID})
77 solver = self.solvers{self.CANDIDATE_LN_FLUID};
78 elseif ~isempty(self.solvers{self.CANDIDATE_LN_MVA})
79 solver = self.solvers{self.CANDIDATE_LN_MVA};
81 line_error(mfilename,
'No LayeredNetwork solver available for CDF analysis');
84 case {
'getTranCdfPassT',
'getTranCdfRespT'}
85 this_model = self.model;
86 switch class(this_model)
88 if SolverFluid.supports(this_model)
89 solver = self.solvers{self.CANDIDATE_FLUID};
91 solver = self.solvers{self.CANDIDATE_JMT};
94 % Use SolverLN with Fluid sub-solver
for transient CDF metrics
95 if ~isempty(self.solvers{self.CANDIDATE_LN_FLUID})
96 solver = self.solvers{self.CANDIDATE_LN_FLUID};
97 elseif ~isempty(self.solvers{self.CANDIDATE_LN_MVA})
98 solver = self.solvers{self.CANDIDATE_LN_MVA};
100 line_error(mfilename,
'No LayeredNetwork solver available for transient CDF analysis');
103 case {
'getTranProb',
'getTranProbSys',
'getTranProbAggr',
'getTranProbSysAggr'}
104 this_model = self.model;
105 switch class(this_model)
107 solver = self.solvers{self.CANDIDATE_CTMC};
108 case 'LayeredNetwork'
109 % Use SolverLN with MVA sub-solver (closest available
for prob analysis)
110 if ~isempty(self.solvers{self.CANDIDATE_LN_MVA})
111 solver = self.solvers{self.CANDIDATE_LN_MVA};
112 elseif ~isempty(self.solvers{self.CANDIDATE_LN_NC})
113 solver = self.solvers{self.CANDIDATE_LN_NC};
115 line_error(mfilename,
'No LayeredNetwork solver available for probability analysis');
118 case {
'sample',
'sampleSys'}
119 this_model = self.model;
120 switch class(this_model)
122 solver = self.solvers{self.CANDIDATE_SSA};
123 case 'LayeredNetwork'
124 % Use LQNS or SolverLN
for sampling (best effort)
125 if ~isempty(self.solvers{self.CANDIDATE_LQNS})
126 solver = self.solvers{self.CANDIDATE_LQNS};
127 elseif ~isempty(self.solvers{self.CANDIDATE_LN_MVA})
128 solver = self.solvers{self.CANDIDATE_LN_MVA};
130 line_error(mfilename,
'No LayeredNetwork solver available for sampling');
133 case {
'sampleAggr',
'sampleSysAggr'}
134 this_model = self.model;
135 switch class(this_model)
137 solver = self.solvers{self.CANDIDATE_JMT};
138 case 'LayeredNetwork'
139 % Use LQNS or SolverLN
for aggregate sampling (best effort)
140 if ~isempty(self.solvers{self.CANDIDATE_LQNS})
141 solver = self.solvers{self.CANDIDATE_LQNS};
142 elseif ~isempty(self.solvers{self.CANDIDATE_LN_MVA})
143 solver = self.solvers{self.CANDIDATE_LN_MVA};
145 line_error(mfilename,
'No LayeredNetwork solver available for aggregate sampling');
148 case {
'getProb',
'getProbAggr',
'getProbSys',
'getProbSysAggr',
'getProbNormConstAggr'}
149 this_model = self.model;
150 switch class(this_model)
152 if SolverNC.supports(this_model) && this_model.hasProductFormSolution()
153 solver = self.solvers{self.CANDIDATE_NC};
155 solver = self.solvers{self.CANDIDATE_JMT};
157 case 'LayeredNetwork'
158 % Use SolverLN with NC sub-solver
for probability analysis
159 if ~isempty(self.solvers{self.CANDIDATE_LN_NC})
160 solver = self.solvers{self.CANDIDATE_LN_NC};
161 elseif ~isempty(self.solvers{self.CANDIDATE_LN_MVA})
162 solver = self.solvers{self.CANDIDATE_LN_MVA};
164 line_error(mfilename,
'No LayeredNetwork solver available for probability analysis');