LINE Solver (C++)
Templated C++ port of the LINE queueing solver
Loading...
Searching...
No Matches
sn_contract.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012-2026, QORE Lab, Imperial College London
3 * All rights reserved.
4 */
5#ifndef LINE_API_SN_SN_CONTRACT_H
6#define LINE_API_SN_SN_CONTRACT_H
7
8/**
9 * @file
10 * @ingroup api_sn
11 * The NetworkStruct contract: every field a NetworkStruct may carry, keyed by
12 * its MATLAB name, and the field view of a struct that the contract validator
13 * (sn_validate_contract.h) checks against it.
14 *
15 * GENERATED by doc/generate-sn-contract.py from doc/line-sn-contract.json. Do not edit.
16 *
17 * This struct is OBJECT-SHAPED: many MATLAB fields live on the Station, JobClass
18 * and NodeDef records or are derived by an accessor. `via` says where each one
19 * is: a data member, a const method, or a member of every station / class /
20 * node record collected in index order. A field this port does not store has an
21 * empty `via` and `absent` says why.
22 */
23
24#include <array>
25#include <string>
26
29
30namespace line {
31namespace api {
32
33/** One NetworkStruct field; kinds and shapes are comma-separated. */
35 const char* name; ///< the MATLAB name
36 const char* group; ///< "required" or "derived"
37 const char* via; ///< member, method, station, class, node; "" when absent
38 const char* cpp; ///< the member or method that carries it here
39 const char* kinds; ///< admissible sn_field_kind() values
40 const char* shapes; ///< admissible shapes of a non-empty value
41 const char* absent; ///< why this port does not store it; "" when it does
42};
43
44inline const std::array<SnContractField, 127>& sn_contract() {
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", ""},
173 }};
174 return fields;
175}
176
177/** Port-only data members of NetworkStruct (no MATLAB twin), name -> kind. */
178inline const std::array<std::array<const char*, 2>, 18>& sn_contract_native() {
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"}},
191 {{"Peff", "map"}},
192 {{"pollingparam", "map"}},
193 {{"sdr_nodes", "opaque"}},
194 {{"sinkNode", "scalar"}},
195 {{"sourceIdx", "scalar"}},
196 {{"stations", "vector"}},
197 {{"transparam", "map"}},
198 }};
199 return fields;
200}
201
202/**
203 * The field view of a struct: one entry per contract field this port stores,
204 * keyed by the MATLAB name, plus the dimensions the shapes are written in.
205 */
206template <class T>
208 SnFieldViews v;
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); });
214 v.fields["breakdownMu"] = sn_field_view(sn.breakdownparam);
215 v.fields["breakdownProc"] = sn_field_view(sn.breakdownparam);
216 v.fields["cap"] = sn_field_view(sn.cap);
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); });
219 v.fields["chains"] = sn_field_view(sn.chains);
220 v.fields["classcap"] = sn_field_view(sn.classcap);
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); });
225 v.fields["connmatrix"] = sn_field_view(sn.connmatrix());
226 v.fields["csmask"] = sn_field_view(sn.csmask);
227 v.fields["ctmcmapc"] = sn_field_view(sn.ctmcmapc);
228 v.fields["downServiceRates"] = sn_field_view(sn.breakdownparam);
229 v.fields["droprule"] = sn_field_view(sn.droprule);
230 v.fields["fj"] = sn_field_view(sn.fj);
231 v.fields["fjauxclass"] = sn_field_view(sn.fjauxclass);
232 v.fields["fjclassmap"] = sn_field_view(sn.fjclassmap);
233 v.fields["gdscaling"] = sn_field_view(sn.gdscaling);
234 v.fields["gdscalingcutoff"] = sn_field_view(sn.gdscalingcutoff);
235 v.fields["gdscalingpeak"] = sn_field_view(sn.gdscalingpeak);
236 v.fields["hasbreakdown"] = sn_field_view(sn.hasbreakdown());
237 v.fields["hassetup"] = sn_field_view(sn.setupparam);
238 v.fields["immfeed"] = sn_field_view(sn.immfeed);
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); });
246 v.fields["inchain"] = sn_field_view(sn.inchain);
247 v.fields["isbasblocking"] = sn_field_view(sn.isbasblocking);
248 v.fields["isbasdestination"] = sn_field_view(sn.isbasdestination);
249 v.fields["iscatastrophe"] = sn_field_view(sn.iscatastrophe());
250 v.fields["isfjaugmented"] = sn_field_view(sn.isfjaugmented);
251 v.fields["isph"] = sn_field_view(sn.isph());
252 v.fields["issignal"] = sn_field_view(sn.issignal);
253 v.fields["isslc"] = sn_field_rows(sn.classes, [](const decltype(sn.classes[0])& x) { return sn_field_view(x.self_looping); });
254 v.fields["isstatedep"] = sn_field_view(sn.isstatedep());
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); });
260 v.fields["lst"] = sn_field_view(sn.lst());
261 v.fields["markidx"] = sn_field_rows(sn.stations, [](const decltype(sn.stations[0])& x) { return sn_field_view(x.marked_classes); });
262 v.fields["mu"] = sn_field_view(sn.mu());
263 v.fields["nchains"] = sn_field_view(sn.nchains);
264 v.fields["nclasses"] = sn_field_view(sn.nclasses);
265 v.fields["nclosedjobs"] = sn_field_view(sn.nclosedjobs());
266 v.fields["njobs"] = sn_field_view(sn.njobs());
267 v.fields["nnodes"] = sn_field_view(sn.nof_nodes());
268 v.fields["nodenames"] = sn_field_rows(sn.nodes, [](const decltype(sn.nodes[0])& x) { return sn_field_view(x.name); });
269 v.fields["nodeparam"] = sn_field_view(sn.nodeparam);
270 v.fields["nodeToStateful"] = sn_field_view(sn.node_to_stateful());
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); });
273 v.fields["nodevisits"] = sn_field_view(sn.nodevisits);
274 v.fields["nregions"] = sn_field_view(sn.nregions());
275 v.fields["nservers"] = sn_field_rows(sn.stations, [](const decltype(sn.stations[0])& x) { return sn_field_view(x.nservers); });
276 v.fields["nstateful"] = sn_field_view(sn.nof_stateful());
277 v.fields["nstations"] = sn_field_view(sn.nstations);
278 v.fields["nvars"] = sn_field_view(sn.nvars);
279 v.fields["orbitImpatience"] = sn_field_rows(sn.stations, [](const decltype(sn.stations[0])& x) { return sn_field_view(x.orbit_impatience); });
280 v.fields["orbitMaxJobs"] = sn_field_view(sn.retrialparam);
281 v.fields["patienceProc"] = sn_field_rows(sn.stations, [](const decltype(sn.stations[0])& x) { return sn_field_view(x.patience); });
282 v.fields["phases"] = sn_field_view(sn.phases());
283 v.fields["phaseshift"] = sn_field_view(sn.phaseshift());
284 v.fields["phasessz"] = sn_field_view(sn.phasessz());
285 v.fields["phi"] = sn_field_view(sn.phi());
286 v.fields["pie"] = sn_field_view(sn.pie());
287 v.fields["proc"] = sn_field_view(sn.service);
288 v.fields["procid"] = sn_field_view(sn.procid());
289 v.fields["rates"] = sn_field_view(sn.rates);
290 v.fields["refclass"] = sn_field_view(sn.refclass);
291 v.fields["refstat"] = sn_field_rows(sn.classes, [](const decltype(sn.classes[0])& x) { return sn_field_view(x.refstat); });
292 v.fields["region"] = sn_field_view(sn.regions);
293 v.fields["regionlincon"] = sn_field_view(sn.regions);
294 v.fields["regionmaxmem"] = sn_field_view(sn.regions);
295 v.fields["regionmembers"] = sn_field_view(sn.regions);
296 v.fields["regionrule"] = sn_field_view(sn.regions);
297 v.fields["regionsz"] = sn_field_view(sn.regions);
298 v.fields["regionweight"] = sn_field_view(sn.regions);
299 v.fields["repairMu"] = sn_field_view(sn.breakdownparam);
300 v.fields["repairProc"] = sn_field_view(sn.breakdownparam);
301 v.fields["replyblock"] = sn_field_view(sn.replyblock);
302 v.fields["retrialMaxAttempts"] = sn_field_view(sn.retrialparam);
303 v.fields["retrialMu"] = sn_field_view(sn.retrialparam);
304 v.fields["retrialPhi"] = sn_field_view(sn.retrialparam);
305 v.fields["retrialPolicy"] = sn_field_view(sn.retrialparam);
306 v.fields["retrialProc"] = sn_field_view(sn.retrialparam);
307 v.fields["retrialType"] = sn_field_view(sn.retrialparam);
308 v.fields["reward"] = sn_field_view(sn.reward);
309 v.fields["routing"] = sn_field_rows(sn.nodes, [](const decltype(sn.nodes[0])& x) { return sn_field_view(x.routing); });
310 v.fields["rt"] = sn_field_view(sn.rt);
311 v.fields["rtnodes"] = sn_field_view(sn.rtnodes);
312 v.fields["rtorig"] = sn_field_view(sn.P);
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); });
315 v.fields["scv"] = sn_field_view(sn.scv);
316 v.fields["sdr"] = sn_field_view(sn.sdr);
317 v.fields["signalremdist"] = sn_field_view(sn.signalremdist);
318 v.fields["signalrempolicy"] = sn_field_view(sn.signalrempolicy);
319 v.fields["signaltarget"] = sn_field_view(sn.signaltarget);
320 v.fields["signaltype"] = sn_field_view(sn.signaltype);
321 v.fields["space"] = sn_field_view(sn.statespace);
322 v.fields["state"] = sn_field_view(sn.initmarking);
323 v.fields["statefulToNode"] = sn_field_view(sn.stateful_nodes);
324 v.fields["statefulToStation"] = sn_field_view(sn.stateful_to_station());
325 v.fields["stateprior"] = sn_field_view(sn.stateprior);
326 v.fields["stationToNode"] = sn_field_view(sn.station_to_node);
327 v.fields["stationToStateful"] = sn_field_view(sn.station_to_stateful());
328 v.fields["syncreply"] = sn_field_view(sn.syncreply);
329 v.fields["visits"] = sn_field_view(sn.visits);
330 return v;
331}
332
333} // namespace api
334} // namespace line
335
336#endif // LINE_API_SN_SN_CONTRACT_H
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()
Definition sn_contract.h:44
Conservation laws of a layered queueing network, enumerated from its structure.
Definition aoi_dist2ph.h:52
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.
Definition sn_contract.h:34
const char * name
the MATLAB name
Definition sn_contract.h:35
const char * shapes
admissible shapes of a non-empty value
Definition sn_contract.h:40
const char * kinds
admissible sn_field_kind() values
Definition sn_contract.h:39
const char * cpp
the member or method that carries it here
Definition sn_contract.h:38
const char * absent
why this port does not store it; "" when it does
Definition sn_contract.h:41
const char * via
member, method, station, class, node; "" when absent
Definition sn_contract.h:37
const char * group
"required" or "derived"
Definition sn_contract.h:36
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