5#ifndef LINE_API_SN_SN_PREDICATES_H
6#define LINE_API_SN_SN_PREDICATES_H
50 for (std::size_t i = 0; i < sn.stations.size(); ++i)
51 if (sn.stations[i].sched == s)
return true;
61 return detail::sn_any_sched(
sn, qn::SchedStrategy::DPS);
65 return detail::sn_any_sched(
sn, qn::SchedStrategy::DPSPRIO);
69 return detail::sn_any_sched(
sn, qn::SchedStrategy::FCFS);
73 return detail::sn_any_sched(
sn, qn::SchedStrategy::GPS);
77 return detail::sn_any_sched(
sn, qn::SchedStrategy::GPSPRIO);
81 return detail::sn_any_sched(
sn, qn::SchedStrategy::HOL);
85 return detail::sn_any_sched(
sn, qn::SchedStrategy::INF);
89 return detail::sn_any_sched(
sn, qn::SchedStrategy::LCFS);
93 return detail::sn_any_sched(
sn, qn::SchedStrategy::LCFSPI);
97 return detail::sn_any_sched(
sn, qn::SchedStrategy::LCFSPR);
101 return detail::sn_any_sched(
sn, qn::SchedStrategy::LEPT);
105 return detail::sn_any_sched(
sn, qn::SchedStrategy::LJF);
109 return detail::sn_any_sched(
sn, qn::SchedStrategy::LPS);
113 return detail::sn_any_sched(
sn, qn::SchedStrategy::POLLING);
117 return detail::sn_any_sched(
sn, qn::SchedStrategy::PS);
121 return detail::sn_any_sched(
sn, qn::SchedStrategy::PSPRIO);
125 return detail::sn_any_sched(
sn, qn::SchedStrategy::SEPT);
129 return detail::sn_any_sched(
sn, qn::SchedStrategy::SETF);
133 return detail::sn_any_sched(
sn, qn::SchedStrategy::SIRO);
137 return detail::sn_any_sched(
sn, qn::SchedStrategy::SJF);
141 return detail::sn_any_sched(
sn, qn::SchedStrategy::SRPT);
155 return sn.nstations == 1;
162 for (std::size_t k = 0; k <
sn.classes.size(); ++k)
163 if (std::isinf(
sn.classes[k].population))
return true;
169 for (std::size_t k = 0; k <
sn.classes.size(); ++k)
170 if (std::isfinite(
sn.classes[k].population))
return true;
177 for (std::size_t k = 0; k <
sn.classes.size(); ++k)
178 if (std::isfinite(
sn.classes[k].population)) ++n;
189 return sn.nchains > 1;
193 return sn.nchains == 1;
197 return sn.nclasses > 1;
201 return sn.nclasses == 1;
205 return sn.nclasses !=
sn.nchains;
211 for (std::size_t k = 0; k <
sn.classes.size(); ++k)
212 if (!std::isinf(
sn.classes[k].population))
return false;
219 for (std::size_t k = 0; k <
sn.classes.size(); ++k)
220 if (!std::isfinite(
sn.classes[k].population))
return false;
233 for (std::size_t k = 0; k <
sn.classes.size(); ++k)
234 if (
sn.classes[k].prio > 0)
return true;
240 for (std::size_t i = 0; i <
sn.stations.size(); ++i)
241 if (std::isfinite(
sn.stations[i].nservers) &&
sn.stations[i].nservers > 1.0)
return true;
248 for (std::size_t k = 0; k <
sn.classes.size(); ++k) {
249 const double n =
sn.classes[k].population;
250 if (std::isfinite(n) && n != std::floor(n + 0.5))
return true;
258 for (std::size_t i = 0; i <
sn.stations.size(); ++i)
259 if (!
sn.stations[i].lldscaling.empty())
return true;
272 return !
sn.fj.empty();
285 for (std::size_t a = 0; a <
sn.nodes.size(); ++a)
286 for (std::size_t r = 0; r <
sn.nodes[a].routing.size(); ++r) {
288 if (s == qn::RoutingStrategy::RROBIN || s == qn::RoutingStrategy::WRROBIN ||
289 s == qn::RoutingStrategy::JSQ || s == qn::RoutingStrategy::SQ ||
290 s == qn::RoutingStrategy::SDR)
300 for (std::size_t i = 0; i <
sn.nstations; ++i) {
301 if (
sn.stations[i].sched != qn::SchedStrategy::FCFS)
continue;
303 for (std::size_t r = 0; r <
sn.nclasses; ++r) {
304 if (!
sn.disabled.empty() &&
sn.disabled[i][r])
continue;
305 if (
sn.rates(i, r) > zero) ++n;
307 if (n > 1)
return true;
323 for (std::size_t i = 0; i <
sn.nstations; ++i) {
324 if (
sn.stations[i].sched != qn::SchedStrategy::FCFS)
continue;
326 double lo = 0.0, hi = 0.0;
327 for (std::size_t r = 0; r <
sn.nclasses; ++r) {
328 if (!
sn.disabled.empty() &&
sn.disabled[i][r])
continue;
330 if (!std::isfinite(v))
continue;
339 if (any && hi - lo > 0.0)
return true;
347 for (std::size_t i = 0; i <
sn.nstations; ++i) {
348 if (
sn.stations[i].sched != qn::SchedStrategy::FCFS)
continue;
353 double lo = 0.0, hi = 0.0;
354 for (std::size_t r = 0; r <
sn.nclasses; ++r) {
355 if (!
sn.disabled.empty() &&
sn.disabled[i][r])
continue;
357 if (std::isnan(v))
continue;
366 if (!(any && hi - lo > 0.0))
continue;
370 bool allone =
true, seen =
false;
371 for (std::size_t r = 0; r <
sn.nclasses && allone; ++r) {
372 if (!
sn.disabled.empty() &&
sn.disabled[i][r])
continue;
374 if (std::isnan(c))
continue;
379 if (seen && allone)
return true;
387 for (std::size_t i = 0; i <
sn.stations.size(); ++i) {
389 if (!(s == qn::SchedStrategy::INF || s == qn::SchedStrategy::PS ||
390 s == qn::SchedStrategy::FCFS || s == qn::SchedStrategy::LCFSPR ||
391 s == qn::SchedStrategy::LCFS || s == qn::SchedStrategy::EXT))
433 for (std::size_t i = 0; i <
sn.stations.size(); ++i) {
435 if (!(s == qn::SchedStrategy::INF || s == qn::SchedStrategy::PS ||
436 s == qn::SchedStrategy::FCFS || s == qn::SchedStrategy::LCFSPR ||
437 s == qn::SchedStrategy::EXT))
441 for (std::size_t i = 0; i <
sn.nstations; ++i) {
442 if (
sn.stations[i].sched != qn::SchedStrategy::FCFS)
continue;
455 for (std::size_t r = 0; r <
sn.nclasses; ++r) {
456 if (!
sn.disabled.empty() &&
sn.disabled[i][r])
continue;
458 if (std::isfinite(v) && v > 0.0 &&
462 if (!check_means ||
sn.visits.empty())
continue;
463 const std::size_t isf =
sn.stateful_of_station(i + 1) - 1;
464 double stmin = 0.0, stmax = 0.0;
465 bool anyserved =
false;
466 for (std::size_t c = 0; c <
sn.nchains && c <
sn.visits.size(); ++c) {
467 double num = 0.0, den = 0.0;
468 for (std::size_t r = 0; r <
sn.nclasses; ++r) {
469 if (!
sn.chains.empty() && !
sn.chains[c][r])
continue;
470 if (!
sn.disabled.empty() &&
sn.disabled[i][r])
continue;
479 const double st = num / den;
484 stmin = std::min(stmin, st);
485 stmax = std::max(stmax, st);
500 for (std::size_t i = 0; i <
sn.stations.size(); ++i) {
502 if (!(s == qn::SchedStrategy::INF || s == qn::SchedStrategy::PS ||
503 s == qn::SchedStrategy::PSPRIO || s == qn::SchedStrategy::DPS ||
504 s == qn::SchedStrategy::GPS || s == qn::SchedStrategy::GPSPRIO ||
505 s == qn::SchedStrategy::DPSPRIO || s == qn::SchedStrategy::EXT))
516 if (
sn.nclasses != 1)
return false;
518 for (std::size_t k = 0; k <
sn.classes.size(); ++k) {
519 if (std::isinf(
sn.classes[k].population))
return false;
520 closed +=
sn.classes[k].population;
522 if (!(closed > 0.0))
return false;
527 for (std::size_t i = 0; i <
sn.droprule.size(); ++i)
528 for (std::size_t r = 0; r <
sn.droprule[i].size(); ++r)
529 if (
sn.droprule[i][r] == qn::DropStrategy::BAS)
return true;
539 return sn.is_mm1k_loss();
563 return sn.has_blocking();
A network plus its refreshed NetworkStruct.
Enumerations and the minimal distribution descriptor shared by the model layer of the C++ port.
bool sn_has_siro(const qn::NetworkStruct< T > &sn)
bool sn_has_multi_class_heter_fcfs(const qn::NetworkStruct< T > &sn)
sn_has_multi_class_heter_fcfs: an FCFS station whose per-class rates differ.
bool sn_has_hol(const qn::NetworkStruct< T > &sn)
bool sn_has_mixed_classes(const qn::NetworkStruct< T > &sn)
bool sn_has_ljf(const qn::NetworkStruct< T > &sn)
bool sn_has_multi_chain(const qn::NetworkStruct< T > &sn)
bool sn_has_ps(const qn::NetworkStruct< T > &sn)
bool sn_has_multi_class_fcfs(const qn::NetworkStruct< T > &sn)
sum(sn.rates(i,:)>0)>1 at some FCFS station: more than one class is served there.
bool sn_is_open_model(const qn::NetworkStruct< T > &sn)
all(isinf(sn.njobs)): EVERY class is open, which a mixed model fails.
bool sn_has_lcfs_pi(const qn::NetworkStruct< T > &sn)
bool sn_has_closed_classes(const qn::NetworkStruct< T > &sn)
bool sn_has_product_form(const qn::NetworkStruct< T > &sn)
Port of sn_has_product_form.
bool sn_has_ps_prio(const qn::NetworkStruct< T > &sn)
bool sn_has_sept(const qn::NetworkStruct< T > &sn)
bool sn_has_homogeneous_scheduling(const qn::NetworkStruct< T > &sn, qn::SchedStrategy)
Port of sn_has_homogeneous_scheduling.
bool sn_has_dps(const qn::NetworkStruct< T > &sn)
bool sn_has_load_dependence(const qn::NetworkStruct< T > &sn)
size(sn.lldscaling,2)>0: some station carries a limited-load scaling row.
bool sn_has_single_class(const qn::NetworkStruct< T > &sn)
bool sn_has_multiple_closed_classes(const qn::NetworkStruct< T > &sn)
bool sn_has_srpt(const qn::NetworkStruct< T > &sn)
bool sn_has_lps(const qn::NetworkStruct< T > &sn)
bool sn_has_sd_routing(const qn::NetworkStruct< T > &sn)
sn_has_sd_routing: some node dispatches on the STATE of the network.
bool sn_is_population_model(const qn::NetworkStruct< T > &sn)
sn_is_population_model: every station is population dependent only, which is what lets the fluid and ...
bool sn_has_class_switching(const qn::NetworkStruct< T > &sn)
bool sn_is_closed_model(const qn::NetworkStruct< T > &sn)
all(isfinite(sn.njobs)): EVERY class is closed.
bool sn_is_mixed_model(const qn::NetworkStruct< T > &sn)
bool sn_has_product_form_not_het_fcfs(const qn::NetworkStruct< T > &sn, bool check_means=true)
Port of sn_has_product_form_not_het_fcfs: LCFS is out, and every enabled FCFS pair with a finite posi...
bool sn_has_sjf(const qn::NetworkStruct< T > &sn)
bool sn_is_bas_model(const qn::NetworkStruct< T > &sn)
sn_is_bas_model: a single-class closed model with blocking-after-service.
bool sn_has_lcfs_pr(const qn::NetworkStruct< T > &sn)
bool sn_has_fractional_populations(const qn::NetworkStruct< T > &sn)
any(sn.njobs ~= round(sn.njobs)); an infinite population rounds to itself.
bool sn_has_lcfs(const qn::NetworkStruct< T > &sn)
bool sn_has_multi_server(const qn::NetworkStruct< T > &sn)
bool sn_has_multi_class(const qn::NetworkStruct< T > &sn)
bool sn_has_priorities(const qn::NetworkStruct< T > &sn)
bool sn_has_dps_prio(const qn::NetworkStruct< T > &sn)
bool sn_has_multi_class_heter_exp_fcfs(const qn::NetworkStruct< T > &sn)
An FCFS station with heterogeneous rates whose SCVs are all one (exponential).
bool sn_has_fork_join(const qn::NetworkStruct< T > &sn)
any(sn.fj(:) > 0): the model has a Fork closed by a Join.
bool sn_has_blocking(const qn::NetworkStruct< T > &sn)
Defined below, after sn_is_mm1k_loss, which it exempts.
bool sn_has_setf(const qn::NetworkStruct< T > &sn)
bool sn_has_lept(const qn::NetworkStruct< T > &sn)
bool sn_has_gps_prio(const qn::NetworkStruct< T > &sn)
bool sn_has_inf(const qn::NetworkStruct< T > &sn)
bool sn_has_polling(const qn::NetworkStruct< T > &sn)
bool sn_has_single_chain(const qn::NetworkStruct< T > &sn)
bool sn_has_open_classes(const qn::NetworkStruct< T > &sn)
bool sn_has_fcfs(const qn::NetworkStruct< T > &sn)
bool sn_has_gps(const qn::NetworkStruct< T > &sn)
bool sn_sched_is_product_form(const qn::NetworkStruct< T > &sn)
The disciplines the reference admits in sn_has_product_form.
bool sn_is_mm1k_loss(const qn::NetworkStruct< T > &sn)
sn_is_mm1k_loss: the three-node Source/Queue/Sink model of an M/M/1/K with loss, the shape MVA answer...
SchedStrategy
Scheduling disciplines, with the values of MATLAB SchedStrategy.
RoutingStrategy
Routing strategies, with the values of MATLAB RoutingStrategy.
A queueing network and its refreshed NetworkStruct.
Number-type abstraction for the templated API port.
Physical buffer size of a station, in jobs, the one in service included.
static constexpr double FineTol
static constexpr double Zero
static constexpr double CoarseTol