LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
chooseSolverHeur.m
1function solver = chooseSolverHeur(self, method)
2% SOLVER = CHOOSESOLVERHEUR(METHOD)
3%
4switch 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', ...
22 'update_solver'}
23 % LayeredNetwork/EnsembleSolver methods - use first available LayeredNetwork solver
24 this_model = self.model;
25 switch class(this_model)
26 case 'LayeredNetwork'
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};
38 else
39 line_error(mfilename,'No LayeredNetwork solver available');
40 end
41 case 'Network'
42 line_error(mfilename,'Method %s is only available for LayeredNetwork models', method);
43 end
44 case {'getTranAvg'}
45 this_model = self.model;
46 switch class(this_model)
47 case 'Network'
48 if SolverFluid.supports(this_model)
49 solver = self.solvers{self.CANDIDATE_FLUID};
50 else
51 solver = self.solvers{self.CANDIDATE_JMT};
52 end
53 case 'LayeredNetwork'
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};
59 else
60 line_error(mfilename,'No LayeredNetwork solver available for transient analysis');
61 end
62 end
63 case {'getCdfRespT'}
64 this_model = self.model;
65 switch class(this_model)
66 case 'Network'
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};
71 else
72 solver = self.solvers{self.CANDIDATE_JMT};
73 end
74 case 'LayeredNetwork'
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};
80 else
81 line_error(mfilename,'No LayeredNetwork solver available for CDF analysis');
82 end
83 end
84 case {'getTranCdfPassT','getTranCdfRespT'}
85 this_model = self.model;
86 switch class(this_model)
87 case 'Network'
88 if SolverFluid.supports(this_model)
89 solver = self.solvers{self.CANDIDATE_FLUID};
90 else
91 solver = self.solvers{self.CANDIDATE_JMT};
92 end
93 case 'LayeredNetwork'
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};
99 else
100 line_error(mfilename,'No LayeredNetwork solver available for transient CDF analysis');
101 end
102 end
103 case {'getTranProb','getTranProbSys','getTranProbAggr','getTranProbSysAggr'}
104 this_model = self.model;
105 switch class(this_model)
106 case 'Network'
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};
114 else
115 line_error(mfilename,'No LayeredNetwork solver available for probability analysis');
116 end
117 end
118 case {'sample','sampleSys'}
119 this_model = self.model;
120 switch class(this_model)
121 case 'Network'
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};
129 else
130 line_error(mfilename,'No LayeredNetwork solver available for sampling');
131 end
132 end
133 case {'sampleAggr','sampleSysAggr'}
134 this_model = self.model;
135 switch class(this_model)
136 case 'Network'
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};
144 else
145 line_error(mfilename,'No LayeredNetwork solver available for aggregate sampling');
146 end
147 end
148 case {'getProb','getProbAggr','getProbSys','getProbSysAggr','getProbNormConstAggr'}
149 this_model = self.model;
150 switch class(this_model)
151 case 'Network'
152 if SolverNC.supports(this_model) && this_model.hasProductFormSolution()
153 solver = self.solvers{self.CANDIDATE_NC};
154 else
155 solver = self.solvers{self.CANDIDATE_JMT};
156 end
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};
163 else
164 line_error(mfilename,'No LayeredNetwork solver available for probability analysis');
165 end
166 end
167end
168end