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) \
297#define LINE_QN_FEATURE_ENUM(id) id,
299#undef LINE_QN_FEATURE_ENUM
309#define LINE_QN_FEATURE_NAME(id) \
313#undef LINE_QN_FEATURE_NAME
327 case Feature::Region:
return "a Finite Capacity Region";
328 case Feature::Fork:
return "a Fork node";
329 case Feature::Join:
return "a Join node";
330 case Feature::Forker:
return "a fork output section";
331 case Feature::ForkFanoutVector:
332 return "a fork whose tasks per link differ by destination or by class";
333 case Feature::ForkFanoutRandom:
334 return "a fork whose tasks per link are drawn from a distribution";
335 case Feature::ForkBranchProbability:
336 return "a fork whose branches fire only with a probability";
337 case Feature::Joiner:
return "a join input section";
338 case Feature::Cache:
return "a Cache node";
339 case Feature::CacheRetrieval:
return "a delayed-hit cache retrieval system";
340 case Feature::CacheItemSize:
return "per-item storage costs with per-list cost caps";
341 case Feature::ClassSwitch:
return "a ClassSwitch node";
342 case Feature::Router:
return "a Router node";
343 case Feature::Logger:
return "a Logger node";
344 case Feature::Source:
return "a Source node";
345 case Feature::Sink:
return "a Sink node";
346 case Feature::Place:
return "an SPN Place";
347 case Feature::QueueingPlace:
return "a queueing SPN Place";
348 case Feature::Transition:
return "an SPN Transition";
349 case Feature::Inhibiting:
return "an SPN inhibitor arc";
350 case Feature::FluidPlace:
return "an FSPN fluid place or fluid arc";
351 case Feature::Retrial:
return "a retrial orbit";
352 case Feature::Balking:
return "job balking";
353 case Feature::Reneging:
return "job reneging";
354 case Feature::Breakdown:
return "server breakdowns";
355 case Feature::SetupDelayOff:
return "server setup and delay-off times";
356 case Feature::LoadDependence:
return "load-dependent service rates";
357 case Feature::ClassDependence:
return "class-dependent service rates";
358 case Feature::JointDependence:
return "joint-dependent service rates";
359 case Feature::GlobalDependence:
return "globally state-dependent (Whittle) service rates";
360 case Feature::BatchArrival:
return "batch arrivals";
361 case Feature::OpenSignal:
return "an open G-network signal class";
362 case Feature::ClosedSignal:
return "a closed G-network signal class";
363 case Feature::SignalBatchRemoval:
return "a signal batch-removal distribution";
364 case Feature::SignalRemovalPolicy:
return "a non-random signal removal policy";
365 case Feature::OpenClass:
return "an open job class";
366 case Feature::ClosedClass:
return "a closed job class";
367 case Feature::SelfLoopingClass:
return "a self-looping job class";
368 case Feature::Queue:
return "a Queue station";
370 case Feature::DelayStation:
return "a Delay station";
373 case Feature::MultiServer:
return "a multi-server station";
374 case Feature::FiniteCapacity:
return "a finite station or per-class buffer that binds";
378 const std::size_t us = nm.find(
'_');
379 if (us != std::string::npos) {
380 const std::string head = nm.substr(0, us), tail = nm.substr(us + 1);
381 if (head ==
"SchedStrategy")
return "the " + tail +
" scheduling discipline";
382 if (head ==
"RoutingStrategy")
return "the " + tail +
" routing strategy";
383 if (head ==
"ReplacementStrategy")
return "the " + tail +
" cache replacement policy";
384 if (head ==
"SignalType")
return tail +
" signals";
385 if (head ==
"ActivityPrecedence")
return "the " + tail +
" activity precedence";
387 return "the " + nm +
" feature";
400 if (f !=
Feature::COUNT) bits_[
static_cast<std::size_t
>(f)] =
true;
408 if (f !=
Feature::COUNT) bits_[
static_cast<std::size_t
>(f)] =
false;
415 std::vector<Feature>
list()
const {
416 std::vector<Feature> out;
417 for (std::size_t i = 0; i < bits_.size(); ++i)
418 if (bits_[i]) out.push_back(
static_cast<Feature>(i));
422 for (std::size_t i = 0; i < bits_.size(); ++i)
423 if (bits_[i])
return false;
428 std::vector<bool> bits_;
453 case Feature::Cox2:
return Feature::Coxian;
458 case Feature::Trace:
return Feature::Replayer;
481 if (!used.
has(f) || declared.
has(f))
continue;
488 if (r.
missing.empty())
return r;
492 ", which this solver does not support";
494 r.
reason = solver +
": this model uses features which this solver does not support: ";
495 for (std::size_t i = 0; i < r.
missing.size(); ++i) {
528 case ProcessType::EXP:
return Feature::Exp;
529 case ProcessType::ERLANG:
return Feature::Erlang;
530 case ProcessType::HYPEREXP:
return Feature::HyperExp;
531 case ProcessType::PH:
return Feature::PH;
532 case ProcessType::APH:
return Feature::APH;
533 case ProcessType::MAP:
return Feature::MAP;
534 case ProcessType::UNIFORM:
return Feature::Uniform;
535 case ProcessType::DET:
return Feature::Det;
536 case ProcessType::COXIAN:
return Feature::Coxian;
537 case ProcessType::GAMMA:
return Feature::Gamma;
538 case ProcessType::PARETO:
return Feature::Pareto;
539 case ProcessType::MMPP2:
return Feature::MMPP2;
540 case ProcessType::REPLAYER:
return Feature::Replayer;
541 case ProcessType::COX2:
return Feature::Cox2;
542 case ProcessType::WEIBULL:
return Feature::Weibull;
543 case ProcessType::LOGNORMAL:
return Feature::Lognormal;
544 case ProcessType::DUNIFORM:
return Feature::DiscreteUniform;
545 case ProcessType::BERNOULLI:
return Feature::Bernoulli;
546 case ProcessType::BINOMIAL:
return Feature::Binomial;
547 case ProcessType::POISSON:
return Feature::Poisson;
548 case ProcessType::GEOMETRIC:
return Feature::Geometric;
549 case ProcessType::BMAP:
return Feature::BMAP;
550 case ProcessType::ME:
return Feature::ME;
551 case ProcessType::RAP:
return Feature::RAP;
552 case ProcessType::DISCRETESAMPLER:
return Feature::DiscreteSampler;
553 case ProcessType::ZIPF:
return Feature::Zipf;
554 case ProcessType::DMAP:
return Feature::DMAP;
555 case ProcessType::MMAP:
return Feature::MMAP;
556 case ProcessType::EMPIRICALCDF:
return Feature::EmpiricalCdf;
560 case ProcessType::PRIOR:
return Feature::Prior;
561 case ProcessType::NHPP:
return Feature::NHPP;
562 case ProcessType::MAPT:
return Feature::MAPt;
563 case ProcessType::PHT:
return Feature::PHt;
564 case ProcessType::MPH:
return Feature::MPH;
565 case ProcessType::MMAPT:
return Feature::MMAPt;
566 case ProcessType::MPHT:
return Feature::MPHt;
567 case ProcessType::BMMAPT:
return Feature::BMMAPt;
578 case SchedStrategy::INF:
return Feature::SchedStrategy_INF;
579 case SchedStrategy::FCFS:
return Feature::SchedStrategy_FCFS;
580 case SchedStrategy::FCFSPR:
return Feature::SchedStrategy_FCFSPR;
581 case SchedStrategy::FCFSPI:
return Feature::SchedStrategy_FCFSPI;
582 case SchedStrategy::FCFSPRPRIO:
return Feature::SchedStrategy_FCFSPRPRIO;
583 case SchedStrategy::FCFSPIPRIO:
return Feature::SchedStrategy_FCFSPIPRIO;
584 case SchedStrategy::LCFS:
return Feature::SchedStrategy_LCFS;
585 case SchedStrategy::LCFSPR:
return Feature::SchedStrategy_LCFSPR;
586 case SchedStrategy::LCFSPI:
return Feature::SchedStrategy_LCFSPI;
587 case SchedStrategy::LCFSPRIO:
return Feature::SchedStrategy_LCFSPRIO;
588 case SchedStrategy::LCFSPRPRIO:
return Feature::SchedStrategy_LCFSPRPRIO;
589 case SchedStrategy::LCFSPIPRIO:
return Feature::SchedStrategy_LCFSPIPRIO;
590 case SchedStrategy::SEPT:
return Feature::SchedStrategy_SEPT;
591 case SchedStrategy::LEPT:
return Feature::SchedStrategy_LEPT;
592 case SchedStrategy::SJF:
return Feature::SchedStrategy_SJF;
593 case SchedStrategy::LJF:
return Feature::SchedStrategy_LJF;
594 case SchedStrategy::SRPT:
return Feature::SchedStrategy_SRPT;
595 case SchedStrategy::SRPTPRIO:
return Feature::SchedStrategy_SRPTPRIO;
596 case SchedStrategy::PSJF:
return Feature::SchedStrategy_PSJF;
597 case SchedStrategy::FB:
return Feature::SchedStrategy_FB;
598 case SchedStrategy::LRPT:
return Feature::SchedStrategy_LRPT;
599 case SchedStrategy::SETF:
return Feature::SchedStrategy_SETF;
600 case SchedStrategy::FSP:
return Feature::SchedStrategy_FSP;
601 case SchedStrategy::PAS:
return Feature::SchedStrategy_PAS;
602 case SchedStrategy::OI:
return Feature::SchedStrategy_OI;
603 case SchedStrategy::PS:
return Feature::SchedStrategy_PS;
604 case SchedStrategy::DPS:
return Feature::SchedStrategy_DPS;
605 case SchedStrategy::GPS:
return Feature::SchedStrategy_GPS;
606 case SchedStrategy::PSPRIO:
return Feature::SchedStrategy_PSPRIO;
607 case SchedStrategy::DPSPRIO:
return Feature::SchedStrategy_DPSPRIO;
608 case SchedStrategy::GPSPRIO:
return Feature::SchedStrategy_GPSPRIO;
609 case SchedStrategy::SIRO:
return Feature::SchedStrategy_SIRO;
610 case SchedStrategy::HOL:
return Feature::SchedStrategy_HOL;
611 case SchedStrategy::EXT:
return Feature::SchedStrategy_EXT;
612 case SchedStrategy::POLLING:
return Feature::SchedStrategy_POLLING;
613 case SchedStrategy::EDD:
return Feature::SchedStrategy_EDD;
614 case SchedStrategy::EDF:
return Feature::SchedStrategy_EDF;
615 case SchedStrategy::LPS:
return Feature::SchedStrategy_LPS;
616 case SchedStrategy::REF:
return Feature::SchedStrategy_REF;
627 case RoutingStrategy::PROB:
return Feature::RoutingStrategy_PROB;
628 case RoutingStrategy::RAND:
return Feature::RoutingStrategy_RAND;
629 case RoutingStrategy::RROBIN:
return Feature::RoutingStrategy_RROBIN;
630 case RoutingStrategy::WRROBIN:
return Feature::RoutingStrategy_WRROBIN;
631 case RoutingStrategy::JSQ:
return Feature::RoutingStrategy_JSQ;
632 case RoutingStrategy::SQ:
return Feature::RoutingStrategy_SQ;
633 case RoutingStrategy::SDR:
return Feature::RoutingStrategy_SDR;
641 case ReplacementStrategy::RR:
return Feature::ReplacementStrategy_RR;
642 case ReplacementStrategy::FIFO:
return Feature::ReplacementStrategy_FIFO;
643 case ReplacementStrategy::SFIFO:
return Feature::ReplacementStrategy_SFIFO;
644 case ReplacementStrategy::LRU:
return Feature::ReplacementStrategy_LRU;
645 case ReplacementStrategy::HLRU:
return Feature::ReplacementStrategy_HLRU;
646 case ReplacementStrategy::CLIMB:
return Feature::ReplacementStrategy_CLIMB;
647 case ReplacementStrategy::QLRU:
return Feature::ReplacementStrategy_QLRU;
663 case SchedStrategy::PS:
664 case SchedStrategy::DPS:
665 case SchedStrategy::GPS:
666 case SchedStrategy::PSPRIO:
667 case SchedStrategy::DPSPRIO:
668 case SchedStrategy::GPSPRIO:
669 case SchedStrategy::LPS:
return Feature::SharedServer;
670 case SchedStrategy::INF:
return Feature::InfiniteServer;
671 case SchedStrategy::LCFSPR:
672 case SchedStrategy::LCFSPRPRIO:
673 case SchedStrategy::LCFSPI:
674 case SchedStrategy::LCFSPIPRIO:
675 case SchedStrategy::FCFSPR:
676 case SchedStrategy::FCFSPRPRIO:
677 case SchedStrategy::FCFSPI:
678 case SchedStrategy::FCFSPIPRIO:
681 default:
return Feature::Server;
732 const std::size_t R =
sn.classes.size();
734 for (std::size_t r = 0; r < R; ++r) {
735 u.
set(
sn.classes[r].type == JobClassType::CLOSED ? Feature::ClosedClass
736 : Feature::OpenClass);
741 if (
sn.classes[r].self_looping) u.
set(Feature::SelfLoopingClass);
742 if (r <
sn.issignal.size() &&
sn.issignal[r]) {
746 u.
set(
sn.classes[r].type == JobClassType::CLOSED ? Feature::ClosedSignal
747 : Feature::OpenSignal);
748 if (r <
sn.signaltype.size()) {
749 switch (
sn.signaltype[r]) {
753 u.
set(Feature::SignalType_CATASTROPHE);
757 if (r <
sn.signalremdist.size() && !
sn.signalremdist[r].empty())
758 u.
set(Feature::SignalBatchRemoval);
759 if (r <
sn.signalrempolicy.size() &&
761 u.
set(Feature::SignalRemovalPolicy);
768 if (
static_cast<bool>(
sn.gdscaling)) u.
set(Feature::GlobalDependence);
770 if (!
sn.regions.empty()) u.
set(Feature::Region);
771 if (
sn.sourceIdx != 0) u.
set(Feature::Source);
772 if (
sn.sinkNode != 0) u.
set(Feature::Sink);
773 if (!
sn.fj.empty()) u.
set({Feature::Fork, Feature::Forker, Feature::Join, Feature::Joiner});
775 for (std::size_t i = 0; i <
sn.nodes.size(); ++i) {
777 const std::size_t ind = i + 1;
778 const std::size_t ist = nd.
station;
781 case NodeType::Queue:
782 case NodeType::Delay: {
783 u.
set({nd.
nodetype == NodeType::Delay ? Feature::Delay : Feature::Queue,
784 Feature::Buffer, Feature::Dispatcher});
788 bool any_class =
false;
789 for (std::size_t r = 0; r < R; ++r) {
792 if (ist - 1 <
sn.disabled.size() && r <
sn.disabled[ist - 1].size() &&
793 sn.disabled[ist - 1][r])
796 if (ist - 1 <
sn.service.size() && r <
sn.service[ist - 1].size())
802 if (
static_cast<bool>(st.
cdscaling)) u.
set(Feature::ClassDependence);
803 if (
static_cast<bool>(st.
jdscaling)) u.
set(Feature::JointDependence);
810 for (std::size_t r = 0; r < R; ++r) {
813 : Feature::Reneging);
815 u.
set(Feature::Reneging);
818 u.
set(Feature::Balking);
822 if (n > 1) { u.
set(Feature::ServerParallelism);
break; }
825 case NodeType::Source: {
826 u.
set({Feature::Source, Feature::RandomSource, Feature::ServiceTunnel,
827 Feature::Dispatcher});
830 if (ist == 0 || ist - 1 >=
sn.service.size())
break;
831 for (std::size_t r = 0; r < R && r <
sn.service[ist - 1].size(); ++r)
835 for (
const Distrib<T>& b :
sn.stations[ist - 1].arrival_batch)
836 if (!b.disabled) { u.
set(Feature::BatchArrival);
break; }
840 u.
set(Feature::Sink);
842 case NodeType::Router: {
856 for (std::size_t r = 0; r < R && r < nd.
routing.size(); ++r)
860 case NodeType::ClassSwitch:
861 u.
set({Feature::ClassSwitch, Feature::StatelessClassSwitcher, Feature::Buffer,
862 Feature::Dispatcher});
864 case NodeType::Cache: {
865 u.
set({Feature::Cache, Feature::CacheClassSwitcher, Feature::Buffer,
866 Feature::Dispatcher});
867 auto it =
sn.nodeparam.find(ind);
868 if (it ==
sn.nodeparam.end())
break;
870 if (it->second.retrieval_capacity > 0 || !it->second.retrieval_classes.empty())
871 u.
set(Feature::CacheRetrieval);
872 if (!it->second.costcap.empty()) u.
set(Feature::CacheItemSize);
875 case NodeType::Fork: {
876 u.
set({Feature::Fork, Feature::Forker, Feature::Buffer, Feature::ServiceTunnel});
883 const double tpl =
sn.nodes[i - 1].tasks_per_link;
884 bool vector_valued =
false, random_valued =
false, probabilistic =
false;
885 for (std::size_t k = 0; k < fp->
fan_out_link.rows(); ++k)
886 for (std::size_t r = 0; r < fp->
fan_out_link.cols(); ++r) {
888 if (p == 0.0)
continue;
889 if (p != 1.0) probabilistic =
true;
891 vector_valued =
true;
892 if (!fp->
fan_out_dist[k][r].disabled) random_valued =
true;
894 if (vector_valued) u.
set(Feature::ForkFanoutVector);
895 if (random_valued) u.
set(Feature::ForkFanoutRandom);
896 if (probabilistic) u.
set(Feature::ForkBranchProbability);
901 u.
set({Feature::Join, Feature::Joiner, Feature::Dispatcher,
902 Feature::ServiceTunnel});
904 case NodeType::Logger:
905 u.
set({Feature::Logger, Feature::LogTunnel, Feature::Buffer, Feature::Dispatcher});
907 case NodeType::Place:
908 u.
set({Feature::Place, Feature::Storage, Feature::Linkage,
909 Feature::ServiceTunnel});
918 u.
set(Feature::QueueingPlace);
921 if (
sn.is_fluid_node(ind)) u.
set(Feature::FluidPlace);
923 case NodeType::Transition: {
924 u.
set({Feature::Transition, Feature::Enabling, Feature::Timing, Feature::Firing});
925 auto it =
sn.transparam.find(ind);
926 if (it ==
sn.transparam.end())
break;
929 for (
const auto& row : it->second.inhibiting) {
931 for (std::size_t p = 0; p < row.rows() && !finite; ++p)
932 for (std::size_t r = 0; r < row.cols(); ++r)
937 if (finite) { u.
set(Feature::Inhibiting);
break; }
940 if (it->second.has_fluid_arcs()) u.
set(Feature::FluidPlace);
943 case NodeType::Region:
944 u.
set(Feature::Region);
951 if (!
sn.csmatrix.empty())
952 u.
set({Feature::ClassSwitch, Feature::StatelessClassSwitcher, Feature::Buffer,
953 Feature::Dispatcher});
955 if (!
sn.retrialparam.empty()) u.
set(Feature::Retrial);
960 if (!
sn.breakdownparam.empty()) u.
set(Feature::Breakdown);
961 if (!
sn.setupparam.empty()) u.
set(Feature::SetupDelayOff);
965 for (
const auto& kv :
sn.joindecl)
970 for (
const auto& row :
sn.droprule)
972 if (d == DropStrategy::RETRIAL || d == DropStrategy::RETRIAL_WITH_LIMIT)
973 u.
set(Feature::Retrial);
979 if (
sn.has_multi_server()) u.
set(Feature::MultiServer);
1019 const std::string& resolved_method =
"") {
1020 const bool upgraded = !resolved_method.empty() && resolved_method != requested_method;
1021 const std::string label = upgraded ? solver +
"'s '" + resolved_method +
"' method" : solver;
1028 std::ostringstream os;
1047 return is_open_class ?
"Use SolverCTMC, SolverJMT or SolverLDES"
1048 :
"Use SolverCTMC, SolverSSA or SolverLDES";
1061 if (nd.
nodetype == NodeType::Cache)
return std::string();
1063 double totaljobs = 0.0;
1064 bool any_open =
false;
1067 if (std::isinf(c.
population)) any_open =
true;
1071 if (st.
nodetype == NodeType::Source || st.
nodetype == NodeType::Sink)
continue;
1072 if (std::isfinite(st.
cap) && st.
cap >= 0.0 && st.
cap < totaljobs)
1073 return solver +
": finite station capacity (setCapacity=" +
capacity_str(st.
cap) +
1074 ") at station '" + st.
name +
1075 "' is not supported by this solver, which has no "
1076 "representation of a finite buffer and would return the "
1077 "unconstrained answer. " +
1079 const std::size_t n = std::min(st.
classcap.size(),
sn.classes.size());
1080 for (std::size_t r = 0; r < n; ++r)
1083 return solver +
": finite per-class capacity (classCap=" +
1085 ") at station '" + st.
name +
1086 "' is not supported by this solver, which has no representation of a "
1087 "finite buffer and would return the unconstrained answer. " +
1090 return std::string();
A refusal: the feature, method or analysis is not covered: LINE:unsupported:<kind>.
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)
NetworkSolver.checkBindingCapacity (NetworkSolver.m:1172-1228): the shared structural gate for finite...
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.
UnsupportedError feature_refusal(const SupportResult &r)
The refusal a failed gate raises: LINE:unsupported:<kind>, where the kind is the FIRST missing featur...
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)
Which solvers to point at when a finite capacity is refused.
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.
Conservation laws of a layered queueing network, enumerated from its structure.
A queueing network and its refreshed NetworkStruct.
The <kind> part of a LINE:<category>:<kind> identifier (see _kb/17-error-vocabulary....
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