5#ifndef LINE_API_SN_SN_CONTRACT_H
6#define LINE_API_SN_SN_CONTRACT_H
45 static const std::array<SnContractField, 127> fields = {{
46 {
"arrivalbatch",
"required",
"station",
"arrival_batch",
"vector",
"MxK?",
""},
47 {
"balkingStrategy",
"required",
"station",
"balking",
"vector",
"MxK?",
""},
48 {
"balkingThresholds",
"required",
"station",
"balking",
"vector",
"MxK?",
""},
49 {
"batchRejectProb",
"required",
"station",
"batch_reject",
"vector",
"MxK?",
""},
50 {
"breakdownMu",
"required",
"member",
"breakdownparam",
"map",
"M?",
""},
51 {
"breakdownProc",
"required",
"member",
"breakdownparam",
"map",
"M?",
""},
52 {
"cap",
"required",
"member",
"cap",
"vector",
"M",
""},
53 {
"cdscaling",
"required",
"station",
"cdscaling",
"function",
"M",
""},
54 {
"cdscalingpeak",
"required",
"station",
"cdscalingpeak",
"vector",
"MxK?",
""},
55 {
"chains",
"required",
"member",
"chains",
"vector",
"CxK",
""},
56 {
"classcap",
"required",
"member",
"classcap",
"vector",
"MxK",
""},
57 {
"classdeadline",
"required",
"class",
"deadline",
"scalar",
"K",
""},
58 {
"classnames",
"required",
"class",
"name",
"string",
"K",
""},
59 {
"classprio",
"required",
"class",
"prio",
"scalar",
"K",
""},
60 {
"classspawn",
"required",
"class",
"spawn",
"scalar",
"K",
""},
61 {
"connmatrix",
"required",
"method",
"connmatrix",
"Matrix",
"NxN",
""},
62 {
"csmask",
"required",
"member",
"csmask",
"vector",
"KxK",
""},
63 {
"ctmcmapc",
"derived",
"member",
"ctmcmapc",
"map",
"",
""},
64 {
"downServiceRates",
"required",
"member",
"breakdownparam",
"map",
"M?",
""},
65 {
"droprule",
"required",
"member",
"droprule",
"vector",
"MxK",
""},
66 {
"fj",
"required",
"member",
"fj",
"vector",
"*",
""},
67 {
"fjauxclass",
"required",
"member",
"fjauxclass",
"vector",
"K",
""},
68 {
"fjclassmap",
"required",
"member",
"fjclassmap",
"vector",
"",
""},
69 {
"fjsync",
"required",
"",
"",
"",
"",
"carried by the FJ tag-augmented companion struct (FjTag.fjsync in lang/qn/fj_tag.h), not by NetworkStruct"},
70 {
"gdscaling",
"required",
"member",
"gdscaling",
"function",
"",
""},
71 {
"gdscalingcutoff",
"required",
"member",
"gdscalingcutoff",
"scalar",
"",
""},
72 {
"gdscalingpeak",
"required",
"member",
"gdscalingpeak",
"vector",
"MK",
""},
73 {
"gsync",
"required",
"",
"",
"",
"",
"a pure function of the struct, built per solve by refresh_global_sync(sn) in lang/qn/state_events.h, which includes network_struct.h, so it cannot be a NetworkStruct method"},
74 {
"hasbreakdown",
"required",
"method",
"hasbreakdown",
"vector",
"N",
""},
75 {
"hassetup",
"required",
"member",
"setupparam",
"map",
"M?",
""},
76 {
"immfeed",
"required",
"member",
"immfeed",
"vector",
"MxK",
""},
77 {
"impatienceClass",
"required",
"station",
"impatience",
"vector",
"MxK?",
""},
78 {
"impatienceMu",
"required",
"station",
"patience",
"vector",
"MxK?",
""},
79 {
"impatiencePhases",
"required",
"station",
"patience",
"vector",
"MxK?",
""},
80 {
"impatiencePhi",
"required",
"station",
"patience",
"vector",
"MxK?",
""},
81 {
"impatiencePie",
"required",
"station",
"patience",
"vector",
"MxK?",
""},
82 {
"impatienceProc",
"required",
"station",
"patience",
"vector",
"MxK?",
""},
83 {
"impatienceType",
"required",
"station",
"patience",
"vector",
"MxK?",
""},
84 {
"inchain",
"required",
"member",
"inchain",
"vector",
"C",
""},
85 {
"isbasblocking",
"required",
"member",
"isbasblocking",
"vector",
"N",
""},
86 {
"isbasdestination",
"required",
"member",
"isbasdestination",
"vector",
"MxK",
""},
87 {
"iscatastrophe",
"required",
"method",
"iscatastrophe",
"vector",
"K",
""},
88 {
"isfjaugmented",
"required",
"member",
"isfjaugmented",
"scalar",
"",
""},
89 {
"isph",
"required",
"method",
"isph",
"Matrix",
"MxK",
""},
90 {
"issignal",
"required",
"member",
"issignal",
"vector",
"K",
""},
91 {
"isslc",
"required",
"class",
"self_looping",
"scalar",
"K",
""},
92 {
"isstatedep",
"required",
"method",
"isstatedep",
"Matrix",
"Nx3",
""},
93 {
"isstateful",
"required",
"node",
"stateful",
"scalar",
"N",
""},
94 {
"isstation",
"required",
"node",
"station",
"scalar",
"N",
""},
95 {
"jdscaling",
"required",
"station",
"jdscaling",
"function",
"M",
""},
96 {
"jdscalingpeak",
"required",
"station",
"jdscalingpeak",
"vector",
"MxK?",
""},
97 {
"lldscaling",
"required",
"station",
"lldscaling",
"vector",
"Mx*",
""},
98 {
"lst",
"required",
"method",
"lst",
"vector",
"MxK",
""},
99 {
"markidx",
"required",
"station",
"marked_classes",
"vector",
"Mx*",
""},
100 {
"method",
"derived",
"",
"",
"",
"",
"SolverSSA records the method on its options, not on a copy of the struct"},
101 {
"mu",
"required",
"method",
"mu",
"vector",
"MxK",
""},
102 {
"nchains",
"required",
"member",
"nchains",
"scalar",
"",
""},
103 {
"nclasses",
"required",
"member",
"nclasses",
"scalar",
"",
""},
104 {
"nclosedjobs",
"required",
"method",
"nclosedjobs",
"scalar",
"",
""},
105 {
"njobs",
"required",
"method",
"njobs",
"vector",
"K",
""},
106 {
"nnodes",
"required",
"method",
"nof_nodes",
"scalar",
"",
""},
107 {
"nodenames",
"required",
"node",
"name",
"string",
"N",
""},
108 {
"nodeparam",
"required",
"member",
"nodeparam",
"map",
"N?",
""},
109 {
"nodeToStateful",
"required",
"method",
"node_to_stateful",
"vector",
"N",
""},
110 {
"nodeToStation",
"required",
"node",
"station",
"scalar",
"N",
""},
111 {
"nodetype",
"required",
"node",
"nodetype",
"scalar",
"N",
""},
112 {
"nodevisits",
"required",
"member",
"nodevisits",
"vector",
"C",
""},
113 {
"nregions",
"required",
"method",
"nregions",
"scalar",
"",
""},
114 {
"nservers",
"required",
"station",
"nservers",
"scalar",
"M",
""},
115 {
"nstateful",
"required",
"method",
"nof_stateful",
"scalar",
"",
""},
116 {
"nstations",
"required",
"member",
"nstations",
"scalar",
"",
""},
117 {
"nvars",
"required",
"member",
"nvars",
"vector",
"Nx*",
""},
118 {
"orbitImpatience",
"required",
"station",
"orbit_impatience",
"vector",
"MxK?",
""},
119 {
"orbitMaxJobs",
"required",
"member",
"retrialparam",
"map",
"M?",
""},
120 {
"patienceProc",
"required",
"station",
"patience",
"vector",
"MxK?",
""},
121 {
"phases",
"required",
"method",
"phases",
"Matrix",
"MxK",
""},
122 {
"phaseshift",
"required",
"method",
"phaseshift",
"Matrix",
"MxK+1",
""},
123 {
"phasessz",
"required",
"method",
"phasessz",
"Matrix",
"MxK",
""},
124 {
"phi",
"required",
"method",
"phi",
"vector",
"MxK",
""},
125 {
"pie",
"required",
"method",
"pie",
"vector",
"MxK",
""},
126 {
"proc",
"required",
"member",
"service",
"vector",
"MxK",
""},
127 {
"procid",
"required",
"method",
"procid",
"Matrix",
"MxK",
""},
128 {
"procidDeclared",
"derived",
"",
"",
"",
"",
"not stored: SolverMAM keeps the declared Distrib in service and converts a copy"},
129 {
"rates",
"required",
"member",
"rates",
"Matrix",
"MxK",
""},
130 {
"refclass",
"required",
"member",
"refclass",
"vector",
"C",
""},
131 {
"refstat",
"required",
"class",
"refstat",
"scalar",
"K",
""},
132 {
"region",
"required",
"member",
"regions",
"vector",
"R",
""},
133 {
"regionlincon",
"required",
"member",
"regions",
"vector",
"R",
""},
134 {
"regionmaxmem",
"required",
"member",
"regions",
"vector",
"R",
""},
135 {
"regionmembers",
"required",
"member",
"regions",
"vector",
"R",
""},
136 {
"regionrule",
"required",
"member",
"regions",
"vector",
"R",
""},
137 {
"regionsz",
"required",
"member",
"regions",
"vector",
"R",
""},
138 {
"regionweight",
"required",
"member",
"regions",
"vector",
"R",
""},
139 {
"repairMu",
"required",
"member",
"breakdownparam",
"map",
"M?",
""},
140 {
"repairProc",
"required",
"member",
"breakdownparam",
"map",
"M?",
""},
141 {
"replyblock",
"required",
"member",
"replyblock",
"vector",
"NxK",
""},
142 {
"retrialMaxAttempts",
"required",
"member",
"retrialparam",
"map",
"M?",
""},
143 {
"retrialMu",
"required",
"member",
"retrialparam",
"map",
"M?",
""},
144 {
"retrialPhi",
"required",
"member",
"retrialparam",
"map",
"M?",
""},
145 {
"retrialPolicy",
"required",
"member",
"retrialparam",
"map",
"M?",
""},
146 {
"retrialProc",
"required",
"member",
"retrialparam",
"map",
"M?",
""},
147 {
"retrialType",
"required",
"member",
"retrialparam",
"map",
"M?",
""},
148 {
"reward",
"required",
"member",
"reward",
"vector",
"*",
""},
149 {
"routing",
"required",
"node",
"routing",
"vector",
"NxK?",
""},
150 {
"rt",
"required",
"member",
"rt",
"Matrix",
"SKxSK",
""},
151 {
"rtfun",
"required",
"",
"",
"",
"",
"not stored: state-dependent routing is evaluated by route_eff, rr_dest and the SDR machinery (has_rtfun_routing)"},
152 {
"rtnodes",
"required",
"member",
"rtnodes",
"Matrix",
"NKxNK",
""},
153 {
"rtorig",
"required",
"member",
"P",
"map",
"KK?",
""},
154 {
"sched",
"required",
"station",
"sched",
"scalar",
"M",
""},
155 {
"schedparam",
"required",
"station",
"schedparam",
"vector",
"MxK?",
""},
156 {
"scv",
"required",
"member",
"scv",
"Matrix",
"MxK",
""},
157 {
"sdr",
"required",
"member",
"sdr",
"opaque",
"",
""},
158 {
"signalremdist",
"required",
"member",
"signalremdist",
"vector",
"K",
""},
159 {
"signalrempolicy",
"required",
"member",
"signalrempolicy",
"vector",
"K",
""},
160 {
"signaltarget",
"required",
"member",
"signaltarget",
"vector",
"K",
""},
161 {
"signaltype",
"required",
"member",
"signaltype",
"vector",
"K",
""},
162 {
"space",
"required",
"member",
"statespace",
"map",
"S?",
""},
163 {
"state",
"required",
"member",
"initmarking",
"map",
"S?",
""},
164 {
"statefulToNode",
"required",
"member",
"stateful_nodes",
"vector",
"S",
""},
165 {
"statefulToStation",
"required",
"method",
"stateful_to_station",
"vector",
"S",
""},
166 {
"stateprior",
"required",
"member",
"stateprior",
"map",
"S?",
""},
167 {
"stationToNode",
"required",
"member",
"station_to_node",
"vector",
"M",
""},
168 {
"stationToStateful",
"required",
"method",
"station_to_stateful",
"vector",
"M",
""},
169 {
"sync",
"required",
"",
"",
"",
"",
"a pure function of the struct, built per solve by refresh_sync(sn) in lang/qn/state_events.h; that header includes network_struct.h, so the table cannot be a NetworkStruct method, and solver_ctmc_getters rebuilds it on the pool-augmented solved struct rather than reading a stored copy"},
170 {
"syncreply",
"required",
"member",
"syncreply",
"vector",
"K",
""},
171 {
"varsparam",
"required",
"",
"",
"",
"",
"MATLAB only initializes it to -ones(nnodes,1) and no live MATLAB code reads it (its readers are commented out); a cache keeps its item state in nodeparam (CacheParam)"},
172 {
"visits",
"required",
"member",
"visits",
"vector",
"C",
""},
179 static const std::array<std::array<const char*, 2>, 18> fields = {{
180 {{
"classes",
"vector"}},
181 {{
"csmatrix",
"map"}},
182 {{
"ctmcpool",
"map"}},
183 {{
"disabled",
"vector"}},
184 {{
"fjjoinparam",
"map"}},
185 {{
"forkparam",
"map"}},
186 {{
"joindecl",
"map"}},
187 {{
"log_path",
"string"}},
188 {{
"name",
"string"}},
189 {{
"nodes",
"vector"}},
190 {{
"pasparam",
"map"}},
192 {{
"pollingparam",
"map"}},
193 {{
"sdr_nodes",
"opaque"}},
194 {{
"sinkNode",
"scalar"}},
195 {{
"sourceIdx",
"scalar"}},
196 {{
"stations",
"vector"}},
197 {{
"transparam",
"map"}},
210 v.
fields[
"arrivalbatch"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.arrival_batch); });
211 v.
fields[
"balkingStrategy"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.balking); });
212 v.
fields[
"balkingThresholds"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.balking); });
213 v.
fields[
"batchRejectProb"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.batch_reject); });
217 v.
fields[
"cdscaling"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.cdscaling); });
218 v.
fields[
"cdscalingpeak"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.cdscalingpeak); });
221 v.
fields[
"classdeadline"] =
sn_field_rows(
sn.classes, [](
const decltype(
sn.classes[0])& x) { return sn_field_view(x.deadline); });
222 v.
fields[
"classnames"] =
sn_field_rows(
sn.classes, [](
const decltype(
sn.classes[0])& x) { return sn_field_view(x.name); });
223 v.
fields[
"classprio"] =
sn_field_rows(
sn.classes, [](
const decltype(
sn.classes[0])& x) { return sn_field_view(x.prio); });
224 v.
fields[
"classspawn"] =
sn_field_rows(
sn.classes, [](
const decltype(
sn.classes[0])& x) { return sn_field_view(x.spawn); });
239 v.
fields[
"impatienceClass"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.impatience); });
240 v.
fields[
"impatienceMu"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.patience); });
241 v.
fields[
"impatiencePhases"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.patience); });
242 v.
fields[
"impatiencePhi"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.patience); });
243 v.
fields[
"impatiencePie"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.patience); });
244 v.
fields[
"impatienceProc"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.patience); });
245 v.
fields[
"impatienceType"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.patience); });
253 v.
fields[
"isslc"] =
sn_field_rows(
sn.classes, [](
const decltype(
sn.classes[0])& x) { return sn_field_view(x.self_looping); });
255 v.
fields[
"isstateful"] =
sn_field_rows(
sn.nodes, [](
const decltype(
sn.nodes[0])& x) { return sn_field_view(x.stateful); });
256 v.
fields[
"isstation"] =
sn_field_rows(
sn.nodes, [](
const decltype(
sn.nodes[0])& x) { return sn_field_view(x.station); });
257 v.
fields[
"jdscaling"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.jdscaling); });
258 v.
fields[
"jdscalingpeak"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.jdscalingpeak); });
259 v.
fields[
"lldscaling"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.lldscaling); });
261 v.
fields[
"markidx"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.marked_classes); });
268 v.
fields[
"nodenames"] =
sn_field_rows(
sn.nodes, [](
const decltype(
sn.nodes[0])& x) { return sn_field_view(x.name); });
271 v.
fields[
"nodeToStation"] =
sn_field_rows(
sn.nodes, [](
const decltype(
sn.nodes[0])& x) { return sn_field_view(x.station); });
272 v.
fields[
"nodetype"] =
sn_field_rows(
sn.nodes, [](
const decltype(
sn.nodes[0])& x) { return sn_field_view(x.nodetype); });
275 v.
fields[
"nservers"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.nservers); });
279 v.
fields[
"orbitImpatience"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.orbit_impatience); });
281 v.
fields[
"patienceProc"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.patience); });
291 v.
fields[
"refstat"] =
sn_field_rows(
sn.classes, [](
const decltype(
sn.classes[0])& x) { return sn_field_view(x.refstat); });
309 v.
fields[
"routing"] =
sn_field_rows(
sn.nodes, [](
const decltype(
sn.nodes[0])& x) { return sn_field_view(x.routing); });
313 v.
fields[
"sched"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.sched); });
314 v.
fields[
"schedparam"] =
sn_field_rows(
sn.stations, [](
const decltype(
sn.stations[0])& x) { return sn_field_view(x.schedparam); });
A network plus its refreshed NetworkStruct.
SnFieldView sn_field_view(const X &x)
The view of one value; the kind follows its C++ type.
SnFieldViews sn_contract_view(const qn::NetworkStruct< T > &sn)
The field view of a struct: one entry per contract field this port stores, keyed by the MATLAB name,...
SnFieldView sn_field_rows(const std::vector< R > &records, F member)
One field made of a member of every record (Station, JobClass, NodeDef), in record order.
std::map< char, double > sn_contract_dims(const qn::NetworkStruct< T > &sn)
The dimensions the contract's shapes are written in.
const std::array< std::array< const char *, 2 >, 18 > & sn_contract_native()
Port-only data members of NetworkStruct (no MATLAB twin), name -> kind.
const std::array< SnContractField, 127 > & sn_contract()
Conservation laws of a layered queueing network, enumerated from its structure.
A queueing network and its refreshed NetworkStruct.
The FIELD VIEW the NetworkStruct contract is checked on: for each value, its kind (Matrix,...
One NetworkStruct field; kinds and shapes are comma-separated.
const char * name
the MATLAB name
const char * shapes
admissible shapes of a non-empty value
const char * kinds
admissible sn_field_kind() values
const char * cpp
the member or method that carries it here
const char * absent
why this port does not store it; "" when it does
const char * via
member, method, station, class, node; "" when absent
const char * group
"required" or "derived"
The view of a whole struct: its dimensions and one view per contract field, by MATLAB name.
std::map< char, double > dims
std::map< std::string, SnFieldView > fields