83 bool tput_is_tokens) {
85 const std::size_t R =
sn.nclasses, I =
sn.nodes.size();
86 std::vector<std::size_t> places, trans;
87 for (std::size_t a = 1; a <= I; ++a) {
88 if (
sn.nodes[a - 1].nodetype == qn::NodeType::Place) places.push_back(a);
89 if (
sn.nodes[a - 1].nodetype == qn::NodeType::Transition) trans.push_back(a);
91 if (places.empty() || trans.empty() || TN.
rows() == 0)
return out;
92 for (std::size_t a = 0; a < I; ++a)
93 if (
sn.nodes[a].nodetype == qn::NodeType::Source ||
94 sn.nodes[a].nodetype == qn::NodeType::Sink)
97 const std::size_t S =
sn.nof_stateful();
98 if (
sn.rt.rows() != S * R)
return out;
99 for (std::size_t pp = 0; pp < places.size(); ++pp) {
100 const std::size_t sfp =
sn.stateful_index(places[pp]);
101 if (sfp == 0)
return out;
102 for (std::size_t sfj = 1; sfj <= S; ++sfj) {
103 if (sfj == sfp)
continue;
104 bool touches =
false;
105 for (std::size_t r = 0; r < R && !touches; ++r)
106 for (std::size_t s = 0; s < R; ++s)
107 if (
sn.rt((sfp - 1) * R + r, (sfj - 1) * R + s) >
109 sn.rt((sfj - 1) * R + s, (sfp - 1) * R + r) >
114 if (touches &&
sn.nodes[
sn.stateful_nodes[sfj - 1] - 1].nodetype !=
115 qn::NodeType::Transition)
120 std::vector<std::size_t> mode_trans, mode_idx;
121 std::vector<bool> mode_timed;
122 for (std::size_t tt = 0; tt < trans.size(); ++tt) {
123 const std::size_t ind = trans[tt];
124 typename std::map<std::size_t, qn::TransitionParam<T>>::const_iterator it =
125 sn.transparam.find(ind);
126 if (it ==
sn.transparam.end() || it->second.nmodes == 0)
return out;
127 for (std::size_t m = 0; m < it->second.nmodes; ++m) {
128 mode_trans.push_back(ind);
129 mode_idx.push_back(m);
131 if (m < it->second.timing.size())
133 mode_timed.push_back(timed);
136 const std::size_t nModes = mode_trans.size();
137 if (nModes == 0)
return out;
141 out.
consumed.assign(nModes, std::vector<double>(places.size() * R, 0.0));
142 out.
produced.assign(nModes, std::vector<double>(places.size() * R, 0.0));
143 for (std::size_t mm = 0; mm < nModes; ++mm) {
147 for (std::size_t pp = 0; pp < places.size(); ++pp) {
148 const std::size_t p = places[pp] - 1;
149 for (std::size_t k = 0; k < R; ++k) {
150 if (p < enab.
rows() && k < enab.
cols())
153 if (p < fire.
rows() && k < fire.
cols())
160 const std::size_t nEq = 2 * places.size() * R;
162 std::vector<double> b(nEq, 0.0);
163 std::size_t row = 0, nMeasured = 0;
164 for (std::size_t pp = 0; pp < places.size(); ++pp) {
165 const std::size_t ist =
sn.nodes[places[pp] - 1].station;
166 for (std::size_t k = 0; k < R; ++k) {
167 std::vector<double> arow(nModes, 0.0);
169 for (std::size_t mm = 0; mm < nModes; ++mm) {
170 const double c = out.
consumed[mm][pp * R + k];
171 double v = tput_is_tokens ? c : (c > 0.0 ? 1.0 : 0.0);
172 if (!mode_timed[mm]) v = 0.0;
174 if (v != 0.0) any =
true;
177 for (std::size_t mm = 0; mm < nModes; ++mm) A(row, mm) = arow[mm];
182 for (std::size_t mm = 0; mm < nModes; ++mm)
188 if (nMeasured == 0)
return out;
191 for (std::size_t a = 0; a < row; ++a)
192 for (std::size_t m = 0; m < nModes; ++m) At(a, m) = A(a, m);
194 std::vector<double> xfit(nModes, 0.0);
195 for (std::size_t m = 0; m < nModes; ++m) {
197 for (std::size_t a = 0; a < row; ++a) acc += Ap(m, a) * b[a];
201 for (std::size_t m = 0; m < nModes; ++m) mx = std::max(mx, std::fabs(xfit[m]));
202 for (std::size_t m = 0; m < nModes; ++m)
203 if (xfit[m] < -1e-6 * mx)
return out;