1function solver = chooseAvgSolverHeur(self)
2% SOLVER = CHOOSEAVGSOLVER()
4this_model = self.model;
5switch class(this_model)
7 if this_model.hasSingleChain
8 solver = self.solvers{self.CANDIDATE_NC}; % exact O(1) solution
10 if this_model.hasHomogeneousScheduling(SchedStrategy.INF)
11 solver = self.solvers{self.CANDIDATE_MVA}; % all infinite servers
12 elseif this_model.hasProductFormSolution() && ~this_model.hasMultiServer
13 solver = self.solvers{self.CANDIDATE_NC};
14 elseif this_model.hasHomogeneousScheduling(SchedStrategy.FCFS) && ~this_model.hasMultiServer
15 if sum(this_model.getNumberOfJobs) / sum(this_model.getNumberOfChains) > 30 % likely fluid regime
16 solver = self.solvers{self.CANDIDATE_FLUID};
17 elseif sum(this_model.getNumberOfJobs) / sum(this_model.getNumberOfChains) > 10 % mid/heavy load
18 solver = self.solvers{self.CANDIDATE_MVA};
19 elseif sum(this_model.getNumberOfJobs) < 5 % light load, avoid errors of AMVA in low populations
20 solver = self.solvers{self.CANDIDATE_NC};
22 elseif (this_model.hasHomogeneousScheduling(SchedStrategy.PS)||this_model.hasHomogeneousScheduling(SchedStrategy.PSPRIO)) && this_model.hasMultiServer
23 solver = self.solvers{self.CANDIDATE_MVA};
24 elseif this_model.hasHomogeneousScheduling(SchedStrategy.FCFS) && this_model.hasMultiServer
25 if sum(this_model.getNumberOfJobs) < 5 % light load, avoid errors of AMVA in low populations
26 solver = self.solvers{self.CANDIDATE_NC};
28 solver = self.solvers{self.CANDIDATE_MVA};
31 solver = self.solvers{self.CANDIDATE_MVA};
35 %
if the LQN has caches use LN
36 for t=1:length(self.model.tasks)
37 if isa(self.model.tasks{t},
'CacheTask')
38 solver = self.solvers{self.CANDIDATE_LN_NC};
42 % Try LQNS first
if available, otherwise fall back to SolverLN variants
43 if ~isempty(self.solvers{self.CANDIDATE_LQNS}) && SolverLQNS.isAvailable()
44 solver = self.solvers{self.CANDIDATE_LQNS};
45 elseif ~isempty(self.solvers{self.CANDIDATE_LN_MVA})
46 solver = self.solvers{self.CANDIDATE_LN_MVA};
47 elseif ~isempty(self.solvers{self.CANDIDATE_LN_NC})
48 solver = self.solvers{self.CANDIDATE_LN_NC};
49 elseif ~isempty(self.solvers{self.CANDIDATE_LN_MAM})
50 solver = self.solvers{self.CANDIDATE_LN_MAM};
51 elseif ~isempty(self.solvers{self.CANDIDATE_LN_FLUID})
52 solver = self.solvers{self.CANDIDATE_LN_FLUID};
54 line_error(mfilename,
'No LayeredNetwork solver available');