5#ifndef LINE_LANG_QN_FEATURE_SET_H
6#define LINE_LANG_QN_FEATURE_SET_H
57#include <initializer_list>
80#define LINE_QN_FEATURE_LIST(X) \
137 X(MultivariateNormal) \
141 X(StatelessClassSwitcher) \
142 X(CacheClassSwitcher) \
162 X(RoutingStrategy_PROB) \
163 X(RoutingStrategy_RAND) \
164 X(RoutingStrategy_RROBIN) \
165 X(RoutingStrategy_WRROBIN) \
166 X(RoutingStrategy_JSQ) \
167 X(RoutingStrategy_SQ) \
168 X(RoutingStrategy_SDR) \
169 X(SchedStrategy_INF) \
170 X(SchedStrategy_FCFS) \
171 X(SchedStrategy_FCFSPR) \
172 X(SchedStrategy_FCFSPI) \
173 X(SchedStrategy_FCFSPRIO) \
174 X(SchedStrategy_FCFSPRPRIO) \
175 X(SchedStrategy_FCFSPIPRIO) \
176 X(SchedStrategy_LCFS) \
177 X(SchedStrategy_LCFSPR) \
178 X(SchedStrategy_LCFSPI) \
179 X(SchedStrategy_LCFSPRIO) \
180 X(SchedStrategy_LCFSPRPRIO) \
181 X(SchedStrategy_LCFSPIPRIO) \
182 X(SchedStrategy_SEPT) \
183 X(SchedStrategy_LEPT) \
184 X(SchedStrategy_SJF) \
185 X(SchedStrategy_LJF) \
186 X(SchedStrategy_SRPT) \
187 X(SchedStrategy_SRPTPRIO) \
188 X(SchedStrategy_PSJF) \
189 X(SchedStrategy_FB) \
190 X(SchedStrategy_LRPT) \
191 X(SchedStrategy_SETF) \
192 X(SchedStrategy_FSP) \
193 X(SchedStrategy_PAS) \
194 X(SchedStrategy_OI) \
195 X(SchedStrategy_PS) \
196 X(SchedStrategy_DPS) \
197 X(SchedStrategy_GPS) \
198 X(SchedStrategy_PSPRIO) \
199 X(SchedStrategy_DPSPRIO) \
200 X(SchedStrategy_GPSPRIO) \
201 X(SchedStrategy_SIRO) \
202 X(SchedStrategy_HOL) \
203 X(SchedStrategy_EXT) \
204 X(SchedStrategy_POLLING) \
205 X(SchedStrategy_EDD) \
206 X(SchedStrategy_EDF) \
207 X(SchedStrategy_LPS) \
208 X(ReplacementStrategy_RR) \
209 X(ReplacementStrategy_FIFO) \
210 X(ReplacementStrategy_SFIFO) \
211 X(ReplacementStrategy_LRU) \
212 X(ReplacementStrategy_HLRU) \
213 X(ReplacementStrategy_CLIMB) \
214 X(ReplacementStrategy_QLRU) \
217 X(SelfLoopingClass) \
220 X(SignalType_NEGATIVE) \
221 X(SignalType_REPLY) \
222 X(SignalType_CATASTROPHE) \
223 X(SignalBatchRemoval) \
224 X(SignalRemovalPolicy) \
229 X(GlobalDependence) \
231 X(ServerParallelism) \
237 X(DepartureDiscipline) \
246 X(ActivityPrecedence_PRE_SEQ) \
247 X(ActivityPrecedence_POST_SEQ) \
248 X(ActivityPrecedence_PRE_AND) \
249 X(ActivityPrecedence_POST_AND) \
250 X(ActivityPrecedence_PRE_OR) \
251 X(ActivityPrecedence_POST_OR) \
252 X(SchedStrategy_REF) \
261 X(ActivityPrecedence_POST_CACHE) \
271 X(ForkFanoutVector) \
272 X(ForkFanoutRandom) \
273 X(ForkBranchProbability) \
290#define LINE_QN_FEATURE_ENUM(id) id,
292#undef LINE_QN_FEATURE_ENUM
302#define LINE_QN_FEATURE_NAME(id) \
306#undef LINE_QN_FEATURE_NAME
320 case Feature::Region:
return "a Finite Capacity Region";
321 case Feature::Fork:
return "a Fork node";
322 case Feature::Join:
return "a Join node";
323 case Feature::Forker:
return "a fork output section";
324 case Feature::ForkFanoutVector:
325 return "a fork whose tasks per link differ by destination or by class";
326 case Feature::ForkFanoutRandom:
327 return "a fork whose tasks per link are drawn from a distribution";
328 case Feature::ForkBranchProbability:
329 return "a fork whose branches fire only with a probability";
330 case Feature::Joiner:
return "a join input section";
331 case Feature::Cache:
return "a Cache node";
332 case Feature::CacheRetrieval:
return "a delayed-hit cache retrieval system";
333 case Feature::CacheItemSize:
return "per-item storage costs with per-list cost caps";
334 case Feature::ClassSwitch:
return "a ClassSwitch node";
335 case Feature::Router:
return "a Router node";
336 case Feature::Logger:
return "a Logger node";
337 case Feature::Source:
return "a Source node";
338 case Feature::Sink:
return "a Sink node";
339 case Feature::Place:
return "an SPN Place";
340 case Feature::QueueingPlace:
return "a queueing SPN Place";
341 case Feature::Transition:
return "an SPN Transition";
342 case Feature::Inhibiting:
return "an SPN inhibitor arc";
343 case Feature::Retrial:
return "a retrial orbit";
344 case Feature::Balking:
return "job balking";
345 case Feature::Reneging:
return "job reneging";
346 case Feature::Breakdown:
return "server breakdowns";
347 case Feature::SetupDelayOff:
return "server setup and delay-off times";
348 case Feature::LoadDependence:
return "load-dependent service rates";
349 case Feature::ClassDependence:
return "class-dependent service rates";
350 case Feature::JointDependence:
return "joint-dependent service rates";
351 case Feature::GlobalDependence:
return "globally state-dependent (Whittle) service rates";
352 case Feature::BatchArrival:
return "batch arrivals";
353 case Feature::OpenSignal:
return "an open G-network signal class";
354 case Feature::ClosedSignal:
return "a closed G-network signal class";
355 case Feature::SignalBatchRemoval:
return "a signal batch-removal distribution";
356 case Feature::SignalRemovalPolicy:
return "a non-random signal removal policy";
357 case Feature::OpenClass:
return "an open job class";
358 case Feature::ClosedClass:
return "a closed job class";
359 case Feature::SelfLoopingClass:
return "a self-looping job class";
360 case Feature::Queue:
return "a Queue station";
362 case Feature::DelayStation:
return "a Delay station";
365 case Feature::MultiServer:
return "a multi-server station";
366 case Feature::FiniteCapacity:
return "a finite station or per-class buffer that binds";
370 const std::size_t us = nm.find(
'_');
371 if (us != std::string::npos) {
372 const std::string head = nm.substr(0, us), tail = nm.substr(us + 1);
373 if (head ==
"SchedStrategy")
return "the " + tail +
" scheduling discipline";
374 if (head ==
"RoutingStrategy")
return "the " + tail +
" routing strategy";
375 if (head ==
"ReplacementStrategy")
return "the " + tail +
" cache replacement policy";
376 if (head ==
"SignalType")
return tail +
" signals";
377 if (head ==
"ActivityPrecedence")
return "the " + tail +
" activity precedence";
379 return "the " + nm +
" feature";
392 if (f !=
Feature::COUNT) bits_[
static_cast<std::size_t
>(f)] =
true;
400 if (f !=
Feature::COUNT) bits_[
static_cast<std::size_t
>(f)] =
false;
407 std::vector<Feature>
list()
const {
408 std::vector<Feature> out;
409 for (std::size_t i = 0; i < bits_.size(); ++i)
410 if (bits_[i]) out.push_back(
static_cast<Feature>(i));
414 for (std::size_t i = 0; i < bits_.size(); ++i)
415 if (bits_[i])
return false;
420 std::vector<bool> bits_;
445 case Feature::Cox2:
return Feature::Coxian;
450 case Feature::Trace:
return Feature::Replayer;
473 if (!used.
has(f) || declared.
has(f))
continue;
480 if (r.
missing.empty())
return r;
484 ", which this solver does not support";
486 r.
reason = solver +
": this model uses features which this solver does not support: ";
487 for (std::size_t i = 0; i < r.
missing.size(); ++i) {
509 case ProcessType::EXP:
return Feature::Exp;
510 case ProcessType::ERLANG:
return Feature::Erlang;
511 case ProcessType::HYPEREXP:
return Feature::HyperExp;
512 case ProcessType::PH:
return Feature::PH;
513 case ProcessType::APH:
return Feature::APH;
514 case ProcessType::MAP:
return Feature::MAP;
515 case ProcessType::UNIFORM:
return Feature::Uniform;
516 case ProcessType::DET:
return Feature::Det;
517 case ProcessType::COXIAN:
return Feature::Coxian;
518 case ProcessType::GAMMA:
return Feature::Gamma;
519 case ProcessType::PARETO:
return Feature::Pareto;
520 case ProcessType::MMPP2:
return Feature::MMPP2;
521 case ProcessType::REPLAYER:
return Feature::Replayer;
522 case ProcessType::COX2:
return Feature::Cox2;
523 case ProcessType::WEIBULL:
return Feature::Weibull;
524 case ProcessType::LOGNORMAL:
return Feature::Lognormal;
525 case ProcessType::DUNIFORM:
return Feature::DiscreteUniform;
526 case ProcessType::BERNOULLI:
return Feature::Bernoulli;
527 case ProcessType::BINOMIAL:
return Feature::Binomial;
528 case ProcessType::POISSON:
return Feature::Poisson;
529 case ProcessType::GEOMETRIC:
return Feature::Geometric;
530 case ProcessType::BMAP:
return Feature::BMAP;
531 case ProcessType::ME:
return Feature::ME;
532 case ProcessType::RAP:
return Feature::RAP;
533 case ProcessType::DISCRETESAMPLER:
return Feature::DiscreteSampler;
534 case ProcessType::ZIPF:
return Feature::Zipf;
535 case ProcessType::DMAP:
return Feature::DMAP;
536 case ProcessType::MMAP:
return Feature::MMAP;
537 case ProcessType::EMPIRICALCDF:
return Feature::EmpiricalCdf;
541 case ProcessType::PRIOR:
return Feature::Prior;
542 case ProcessType::NHPP:
return Feature::NHPP;
543 case ProcessType::MAPT:
return Feature::MAPt;
544 case ProcessType::PHT:
return Feature::PHt;
555 case SchedStrategy::INF:
return Feature::SchedStrategy_INF;
556 case SchedStrategy::FCFS:
return Feature::SchedStrategy_FCFS;
557 case SchedStrategy::FCFSPR:
return Feature::SchedStrategy_FCFSPR;
558 case SchedStrategy::FCFSPI:
return Feature::SchedStrategy_FCFSPI;
559 case SchedStrategy::FCFSPRPRIO:
return Feature::SchedStrategy_FCFSPRPRIO;
560 case SchedStrategy::FCFSPIPRIO:
return Feature::SchedStrategy_FCFSPIPRIO;
561 case SchedStrategy::LCFS:
return Feature::SchedStrategy_LCFS;
562 case SchedStrategy::LCFSPR:
return Feature::SchedStrategy_LCFSPR;
563 case SchedStrategy::LCFSPI:
return Feature::SchedStrategy_LCFSPI;
564 case SchedStrategy::LCFSPRIO:
return Feature::SchedStrategy_LCFSPRIO;
565 case SchedStrategy::LCFSPRPRIO:
return Feature::SchedStrategy_LCFSPRPRIO;
566 case SchedStrategy::LCFSPIPRIO:
return Feature::SchedStrategy_LCFSPIPRIO;
567 case SchedStrategy::SEPT:
return Feature::SchedStrategy_SEPT;
568 case SchedStrategy::LEPT:
return Feature::SchedStrategy_LEPT;
569 case SchedStrategy::SJF:
return Feature::SchedStrategy_SJF;
570 case SchedStrategy::LJF:
return Feature::SchedStrategy_LJF;
571 case SchedStrategy::SRPT:
return Feature::SchedStrategy_SRPT;
572 case SchedStrategy::SRPTPRIO:
return Feature::SchedStrategy_SRPTPRIO;
573 case SchedStrategy::PSJF:
return Feature::SchedStrategy_PSJF;
574 case SchedStrategy::FB:
return Feature::SchedStrategy_FB;
575 case SchedStrategy::LRPT:
return Feature::SchedStrategy_LRPT;
576 case SchedStrategy::SETF:
return Feature::SchedStrategy_SETF;
577 case SchedStrategy::FSP:
return Feature::SchedStrategy_FSP;
578 case SchedStrategy::PAS:
return Feature::SchedStrategy_PAS;
579 case SchedStrategy::OI:
return Feature::SchedStrategy_OI;
580 case SchedStrategy::PS:
return Feature::SchedStrategy_PS;
581 case SchedStrategy::DPS:
return Feature::SchedStrategy_DPS;
582 case SchedStrategy::GPS:
return Feature::SchedStrategy_GPS;
583 case SchedStrategy::PSPRIO:
return Feature::SchedStrategy_PSPRIO;
584 case SchedStrategy::DPSPRIO:
return Feature::SchedStrategy_DPSPRIO;
585 case SchedStrategy::GPSPRIO:
return Feature::SchedStrategy_GPSPRIO;
586 case SchedStrategy::SIRO:
return Feature::SchedStrategy_SIRO;
587 case SchedStrategy::HOL:
return Feature::SchedStrategy_HOL;
588 case SchedStrategy::EXT:
return Feature::SchedStrategy_EXT;
589 case SchedStrategy::POLLING:
return Feature::SchedStrategy_POLLING;
590 case SchedStrategy::EDD:
return Feature::SchedStrategy_EDD;
591 case SchedStrategy::EDF:
return Feature::SchedStrategy_EDF;
592 case SchedStrategy::LPS:
return Feature::SchedStrategy_LPS;
593 case SchedStrategy::REF:
return Feature::SchedStrategy_REF;
604 case RoutingStrategy::PROB:
return Feature::RoutingStrategy_PROB;
605 case RoutingStrategy::RAND:
return Feature::RoutingStrategy_RAND;
606 case RoutingStrategy::RROBIN:
return Feature::RoutingStrategy_RROBIN;
607 case RoutingStrategy::WRROBIN:
return Feature::RoutingStrategy_WRROBIN;
608 case RoutingStrategy::JSQ:
return Feature::RoutingStrategy_JSQ;
609 case RoutingStrategy::SQ:
return Feature::RoutingStrategy_SQ;
610 case RoutingStrategy::SDR:
return Feature::RoutingStrategy_SDR;
618 case ReplacementStrategy::RR:
return Feature::ReplacementStrategy_RR;
619 case ReplacementStrategy::FIFO:
return Feature::ReplacementStrategy_FIFO;
620 case ReplacementStrategy::SFIFO:
return Feature::ReplacementStrategy_SFIFO;
621 case ReplacementStrategy::LRU:
return Feature::ReplacementStrategy_LRU;
622 case ReplacementStrategy::HLRU:
return Feature::ReplacementStrategy_HLRU;
623 case ReplacementStrategy::CLIMB:
return Feature::ReplacementStrategy_CLIMB;
624 case ReplacementStrategy::QLRU:
return Feature::ReplacementStrategy_QLRU;
640 case SchedStrategy::PS:
641 case SchedStrategy::DPS:
642 case SchedStrategy::GPS:
643 case SchedStrategy::PSPRIO:
644 case SchedStrategy::DPSPRIO:
645 case SchedStrategy::GPSPRIO:
646 case SchedStrategy::LPS:
return Feature::SharedServer;
647 case SchedStrategy::INF:
return Feature::InfiniteServer;
648 case SchedStrategy::LCFSPR:
649 case SchedStrategy::LCFSPRPRIO:
650 case SchedStrategy::LCFSPI:
651 case SchedStrategy::LCFSPIPRIO:
652 case SchedStrategy::FCFSPR:
653 case SchedStrategy::FCFSPRPRIO:
654 case SchedStrategy::FCFSPI:
655 case SchedStrategy::FCFSPIPRIO:
658 default:
return Feature::Server;
707 const std::size_t R =
sn.classes.size();
709 for (std::size_t r = 0; r < R; ++r) {
710 u.
set(
sn.classes[r].type == JobClassType::CLOSED ? Feature::ClosedClass
711 : Feature::OpenClass);
716 if (
sn.classes[r].self_looping) u.
set(Feature::SelfLoopingClass);
717 if (r <
sn.issignal.size() &&
sn.issignal[r]) {
721 u.
set(
sn.classes[r].type == JobClassType::CLOSED ? Feature::ClosedSignal
722 : Feature::OpenSignal);
723 if (r <
sn.signaltype.size()) {
724 switch (
sn.signaltype[r]) {
728 u.
set(Feature::SignalType_CATASTROPHE);
732 if (r <
sn.signalremdist.size() && !
sn.signalremdist[r].empty())
733 u.
set(Feature::SignalBatchRemoval);
734 if (r <
sn.signalrempolicy.size() &&
736 u.
set(Feature::SignalRemovalPolicy);
743 if (
static_cast<bool>(
sn.gdscaling)) u.
set(Feature::GlobalDependence);
745 if (!
sn.regions.empty()) u.
set(Feature::Region);
746 if (
sn.sourceIdx != 0) u.
set(Feature::Source);
747 if (
sn.sinkNode != 0) u.
set(Feature::Sink);
748 if (!
sn.fj.empty()) u.
set({Feature::Fork, Feature::Forker, Feature::Join, Feature::Joiner});
750 for (std::size_t i = 0; i <
sn.nodes.size(); ++i) {
752 const std::size_t ind = i + 1;
753 const std::size_t ist = nd.
station;
756 case NodeType::Queue:
757 case NodeType::Delay: {
758 u.
set({nd.
nodetype == NodeType::Delay ? Feature::Delay : Feature::Queue,
759 Feature::Buffer, Feature::Dispatcher});
763 bool any_class =
false;
764 for (std::size_t r = 0; r < R; ++r) {
767 if (ist - 1 <
sn.disabled.size() && r <
sn.disabled[ist - 1].size() &&
768 sn.disabled[ist - 1][r])
771 if (ist - 1 <
sn.service.size() && r <
sn.service[ist - 1].size())
777 if (
static_cast<bool>(st.
cdscaling)) u.
set(Feature::ClassDependence);
778 if (
static_cast<bool>(st.
jdscaling)) u.
set(Feature::JointDependence);
785 for (std::size_t r = 0; r < R; ++r) {
788 : Feature::Reneging);
790 u.
set(Feature::Reneging);
793 u.
set(Feature::Balking);
797 if (n > 1) { u.
set(Feature::ServerParallelism);
break; }
800 case NodeType::Source: {
801 u.
set({Feature::Source, Feature::RandomSource, Feature::ServiceTunnel,
802 Feature::Dispatcher});
805 if (ist == 0 || ist - 1 >=
sn.service.size())
break;
806 for (std::size_t r = 0; r < R && r <
sn.service[ist - 1].size(); ++r)
810 for (
const Distrib<T>& b :
sn.stations[ist - 1].arrival_batch)
811 if (!b.disabled) { u.
set(Feature::BatchArrival);
break; }
815 u.
set(Feature::Sink);
817 case NodeType::Router: {
831 for (std::size_t r = 0; r < R && r < nd.
routing.size(); ++r)
835 case NodeType::ClassSwitch:
836 u.
set({Feature::ClassSwitch, Feature::StatelessClassSwitcher, Feature::Buffer,
837 Feature::Dispatcher});
839 case NodeType::Cache: {
840 u.
set({Feature::Cache, Feature::CacheClassSwitcher, Feature::Buffer,
841 Feature::Dispatcher});
842 auto it =
sn.nodeparam.find(ind);
843 if (it ==
sn.nodeparam.end())
break;
845 if (it->second.retrieval_capacity > 0 || !it->second.retrieval_classes.empty())
846 u.
set(Feature::CacheRetrieval);
847 if (!it->second.costcap.empty()) u.
set(Feature::CacheItemSize);
850 case NodeType::Fork: {
851 u.
set({Feature::Fork, Feature::Forker, Feature::Buffer, Feature::ServiceTunnel});
858 const double tpl =
sn.nodes[i - 1].tasks_per_link;
859 bool vector_valued =
false, random_valued =
false, probabilistic =
false;
860 for (std::size_t k = 0; k < fp->
fan_out_link.rows(); ++k)
861 for (std::size_t r = 0; r < fp->
fan_out_link.cols(); ++r) {
863 if (p == 0.0)
continue;
864 if (p != 1.0) probabilistic =
true;
866 vector_valued =
true;
867 if (!fp->
fan_out_dist[k][r].disabled) random_valued =
true;
869 if (vector_valued) u.
set(Feature::ForkFanoutVector);
870 if (random_valued) u.
set(Feature::ForkFanoutRandom);
871 if (probabilistic) u.
set(Feature::ForkBranchProbability);
876 u.
set({Feature::Join, Feature::Joiner, Feature::Dispatcher,
877 Feature::ServiceTunnel});
879 case NodeType::Logger:
880 u.
set({Feature::Logger, Feature::LogTunnel, Feature::Buffer, Feature::Dispatcher});
882 case NodeType::Place:
883 u.
set({Feature::Place, Feature::Storage, Feature::Linkage,
884 Feature::ServiceTunnel});
886 case NodeType::Transition: {
887 u.
set({Feature::Transition, Feature::Enabling, Feature::Timing, Feature::Firing});
888 auto it =
sn.transparam.find(ind);
889 if (it ==
sn.transparam.end())
break;
892 for (
const auto& row : it->second.inhibiting) {
894 for (std::size_t p = 0; p < row.rows() && !finite; ++p)
895 for (std::size_t r = 0; r < row.cols(); ++r)
900 if (finite) { u.
set(Feature::Inhibiting);
break; }
904 case NodeType::Region:
905 u.
set(Feature::Region);
912 if (!
sn.csmatrix.empty())
913 u.
set({Feature::ClassSwitch, Feature::StatelessClassSwitcher, Feature::Buffer,
914 Feature::Dispatcher});
916 if (!
sn.retrialparam.empty()) u.
set(Feature::Retrial);
921 if (!
sn.breakdownparam.empty()) u.
set(Feature::Breakdown);
922 if (!
sn.setupparam.empty()) u.
set(Feature::SetupDelayOff);
926 for (
const auto& kv :
sn.joindecl)
931 for (
const auto& row :
sn.droprule)
933 if (d == DropStrategy::RETRIAL || d == DropStrategy::RETRIAL_WITH_LIMIT)
934 u.
set(Feature::Retrial);
940 if (
sn.has_multi_server()) u.
set(Feature::MultiServer);
980 const std::string& resolved_method =
"") {
981 const bool upgraded = !resolved_method.empty() && resolved_method != requested_method;
982 const std::string label = upgraded ? solver +
"'s '" + resolved_method +
"' method" : solver;
989 std::ostringstream os;
1035 return is_open_class ?
"Use SolverCTMC, SolverJMT or SolverLDES"
1036 :
"Use SolverCTMC, SolverSSA or SolverLDES";
1049 if (nd.
nodetype == NodeType::Cache)
return std::string();
1051 double totaljobs = 0.0;
1052 bool any_open =
false;
1055 if (std::isinf(c.
population)) any_open =
true;
1059 if (st.
nodetype == NodeType::Source || st.
nodetype == NodeType::Sink)
continue;
1060 if (std::isfinite(st.
cap) && st.
cap >= 0.0 && st.
cap < totaljobs)
1061 return solver +
": finite station capacity (setCapacity=" +
capacity_str(st.
cap) +
1062 ") at station '" + st.
name +
1063 "' is not supported by this solver, which has no "
1064 "representation of a finite buffer and would return the "
1065 "unconstrained answer. " +
1067 const std::size_t n = std::min(st.
classcap.size(),
sn.classes.size());
1068 for (std::size_t r = 0; r < n; ++r)
1071 return solver +
": finite per-class capacity (classCap=" +
1073 ") at station '" + st.
name +
1074 "' is not supported by this solver, which has no representation of a "
1075 "finite buffer and would return the unconstrained answer. " +
1078 return std::string();
UnsupportedError(const std::string &what)
A subset of the registry: MATLAB's SolverFeatureSet, whose list is a flag per field.
FeatureSet & set(Feature f)
FeatureSet & set(std::initializer_list< Feature > fs)
std::vector< Feature > list() const
The features held, in registry order.
FeatureSet & unset(Feature f)
bool has(Feature f) const
A network plus its refreshed NetworkStruct.
The exception types the port throws.
#define LINE_QN_FEATURE_LIST(X)
SolverFeatureSet.fields, in its order, as an X-list.
#define LINE_QN_FEATURE_ENUM(id)
#define LINE_QN_FEATURE_NAME(id)
Enumerations and the minimal distribution descriptor shared by the model layer of the C++ port.
SchedStrategy
Scheduling disciplines, with the values of MATLAB SchedStrategy.
DropStrategy
Blocking and loss rules, with the values of MATLAB DropStrategy.
@ REPLY
completes a synchronous call, releasing a held server
@ NEGATIVE
removes a batch of jobs (Gelenbe's negative customer)
@ CATASTROPHE
removes EVERY job at the station
RoutingStrategy
Routing strategies, with the values of MATLAB RoutingStrategy.
DepartureDiscipline
When a Place releases a served token, MATLAB DepartureDiscipline.
@ RANDOM
uniform over waiting AND in-service jobs
ProcessType
Distribution kinds, with the values of MATLAB ProcessType.
ReplacementStrategy
Cache replacement policies, with the values of MATLAB ReplacementStrategy.
Feature feature_of_server_section(SchedStrategy s)
The SERVER section a Queue gets for a discipline, MATLAB Queue.m:79-108.
FeatureSet used_lang_features(const NetworkStruct< T > &sn)
Feature feature_generalization(Feature f)
The registry name a specialization falls back to when it is not declared.
Feature
One language feature.
void check_binding_capacity(const std::string &solver, const NetworkStruct< T > &sn)
std::string feature_phrase(Feature f)
A human-readable phrase for the reason string, e.g.
std::string capacity_str(double v)
g for a capacity, so the message reads 2 and not 2.000000.
bool has_binding_capacity(const NetworkStruct< T > &sn)
getUsedLangFeatures: the features the MODEL uses.
Feature feature_of_process(ProcessType p)
The feature name of a distribution, MATLAB serviceProcess{r}{3}.name.
Feature feature_of_routing(RoutingStrategy r)
RoutingStrategy.toFeature.
Feature feature_of_replacement(ReplacementStrategy s)
ReplacementStrategy.toFeature.
SupportResult feature_set_supports(const std::string &solver, const FeatureSet &declared, const FeatureSet &used)
SolverFeatureSet.supports: is every feature the model uses declared?
std::string capacity_fallback_advice(bool is_open_class)
NetworkSolver.checkBindingCapacity (NetworkSolver.m:1172-1228): the shared structural gate for finite...
void feature_gate(const std::string &solver, const FeatureSet &declared, const NetworkStruct< T > &sn, const std::string &requested_method="", const std::string &resolved_method="")
runAnalyzerChecks: refuse a model the solver does not declare, by name.
constexpr std::size_t feature_count()
The number of registered features, MATLAB numel(SolverFeatureSet.fields).
Feature feature_of_sched(SchedStrategy s)
SchedStrategy.toFeature.
const char * feature_name(Feature f)
The canonical registry name, byte for byte the MATLAB field name.
std::string binding_capacity_reason(const std::string &solver, const NetworkStruct< T > &sn)
The refusal check_binding_capacity raises, as a string, or empty when no buffer binds.
A queueing network and its refreshed NetworkStruct.
Variable forking levels, the twin of MATLAB sn.nodeparam{f}.fanOutLink / .fanOutProb / ....
std::vector< std::vector< lang::Distrib< T > > > fan_out_dist
One job class of the network.
double population
infinite for an open class
std::vector< RoutingStrategy > routing
sn.routing, per class.
One station of the network.
std::vector< Distrib< T > > orbit_impatience
Queue.setOrbitImpatience(class, dist): abandonment from the RETRIAL ORBIT, which is a different popul...
double cap
Station capacity in Kendall's K, as setCapacity sets it.
std::vector< BalkingParam > balking
std::vector< std::size_t > server_parallelism
Queue.setServerParallelism(class, n): the servers a job seizes for the whole of its service,...
CdScaling< T > jdscaling
sn.jdscaling for this station: MATLAB's Station.ljdScaling, the JOINT dependence map eta_i(n),...
std::vector< T > lldscaling
sn.lldscaling for this station: the multiplier at population 1, 2, ... Empty when the station is not ...
std::vector< lang::ImpatienceType > impatience
CdScaling< T > cdscaling
sn.cdscaling for this station: the class-dependence map, empty when unset.
std::vector< double > classcap
Per-class buffer from setChainCapacity; infinite where unset.
std::vector< lang::DepartureDiscipline > departure_discipline
Place.departureDiscipline, per class.
std::vector< ServerType > server_types
The outcome of the gate: the verdict, the offending features, the message.
std::vector< Feature > missing
used but not declared, in registry order
std::string reason
empty when ok