155 const std::size_t I =
sn.nodes.size(), C =
sn.nchains, M =
sn.nstations, R =
sn.nclasses;
157 if (TN.
rows() == 0 || AN.
rows() == 0)
return ANn;
159 for (std::size_t ist = 0; ist < M; ++ist) {
160 const std::size_t ind =
sn.station_to_node[ist];
161 if (ind == 0)
continue;
162 for (std::size_t r = 0; r < R; ++r) ANn(ind - 1, r) = AN(ist, r);
164 for (std::size_t ind = 1; ind <= I; ++ind) {
165 if (
sn.nodes[ind - 1].nodetype == qn::NodeType::Source)
continue;
166 const bool is_cache =
sn.nodes[ind - 1].nodetype == qn::NodeType::Cache;
167 const bool is_station =
sn.nodes[ind - 1].station != 0;
168 for (std::size_t c = 0; c < C; ++c) {
169 const std::vector<std::size_t>& inchain =
sn.inchain[c];
170 const std::size_t refstat = detail::sn_chain_refstat(
sn, c);
171 const T den = detail::sn_chain_refvisits(
sn, c, refstat, inchain);
172 if (!(den > zero))
continue;
173 const T tot = detail::sn_chain_tput(
sn, TN, c, refstat, inchain);
174 for (std::size_t r : inchain) {
176 typename std::map<std::size_t, qn::CacheParam<T>>::const_iterator it =
177 sn.nodeparam.find(ind);
178 if (it !=
sn.nodeparam.end() &&
179 detail::sn_is_cache_class(it->second.hitclass, it->second.missclass, r))
181 }
else if (is_station) {
184 ANn(ind - 1, r - 1) = T(
sn.nodevisits[c](ind - 1, r - 1) / den * tot);
208 const std::size_t I =
sn.nodes.size(), C =
sn.nchains, M =
sn.nstations, R =
sn.nclasses;
210 if (TN.
rows() == 0)
return TNn;
213 for (std::size_t ind = 1; ind <= I; ++ind) {
214 if (
sn.nodes[ind - 1].nodetype != qn::NodeType::Cache)
continue;
215 typename std::map<std::size_t, qn::CacheParam<T>>::const_iterator np =
216 sn.nodeparam.find(ind);
217 if (np ==
sn.nodeparam.end())
continue;
218 const std::vector<std::size_t>& hitclass = np->second.hitclass;
219 const std::vector<std::size_t>& missclass = np->second.missclass;
220 typename std::map<std::size_t, CacheActualProb<T>>::const_iterator cp =
221 cache_prob.find(ind);
222 const bool have_actual = cp != cache_prob.end() && !cp->second.hit.empty();
223 for (std::size_t c = 0; c < C; ++c) {
224 const std::vector<std::size_t>& inchain =
sn.inchain[c];
225 const std::size_t refstat = detail::sn_chain_refstat(
sn, c);
226 const T tot = detail::sn_chain_tput(
sn, TN, c, refstat, inchain);
227 for (std::size_t r : inchain) {
229 for (std::size_t o = 0; o < hitclass.size(); ++o) {
231 if (ANn.
rows() == I && o < R) {
232 arv = ANn(ind - 1, o);
235 for (std::size_t q : inchain)
236 if (q == o + 1) in =
true;
237 if (in && refstat >= 1 && refstat <= M) arv = TN(refstat - 1, o);
239 if (hitclass[o] == r && o < cp->second.hit.size()) {
240 T p = cp->second.hit[o];
241 if (o < cp->second.delayed_hit.size())
242 p = T(p + cp->second.delayed_hit[o]);
243 TNn(ind - 1, r - 1) = T(TNn(ind - 1, r - 1) + arv * p);
244 }
else if (o < missclass.size() && missclass[o] == r &&
245 o < cp->second.miss.size()) {
246 TNn(ind - 1, r - 1) = T(TNn(ind - 1, r - 1) + arv * cp->second.miss[o]);
249 }
else if (detail::sn_is_cache_class(hitclass, missclass, r)) {
250 const T den = detail::sn_chain_refvisits(
sn, c, refstat, inchain);
252 TNn(ind - 1, r - 1) =
253 T(
sn.nodevisits[c](ind - 1, r - 1) / den * tot);
260 for (std::size_t ist = 0; ist < M; ++ist) {
261 const std::size_t ind =
sn.station_to_node[ist];
262 if (ind == 0)
continue;
263 for (std::size_t r = 0; r < R; ++r) TNn(ind - 1, r) = TN(ist, r);
267 if (ANn.
rows() != I ||
sn.rtnodes.rows() != I * R)
return TNn;
268 for (std::size_t ind = 1; ind <= I; ++ind) {
270 if (nt == qn::NodeType::Sink)
continue;
271 if (nt == qn::NodeType::Source) {
272 const std::size_t ist =
sn.nodes[ind - 1].station;
274 for (std::size_t s = 0; s < R; ++s) TNn(ind - 1, s) = TN(ist - 1, s);
280 if (nt != qn::NodeType::Join &&
sn.nodes[ind - 1].station != 0)
continue;
281 for (std::size_t c = 0; c < C; ++c) {
282 const std::vector<std::size_t>& inchain =
sn.inchain[c];
283 for (std::size_t r : inchain) {
284 bool anystateful =
false;
285 if (c <
sn.visits.size())
286 for (std::size_t a = 0; a <
sn.visits[c].rows(); ++a)
287 if (
sn.visits[c](a, r - 1) != zero) anystateful =
true;
288 if (!anystateful)
continue;
289 for (std::size_t s : inchain)
290 for (std::size_t jnd = 1; jnd <= I; ++jnd) {
291 if (nt == qn::NodeType::Cache && ind == jnd)
continue;
292 TNn(ind - 1, s - 1) =
293 T(TNn(ind - 1, s - 1) +
294 ANn(ind - 1, r - 1) *
295 sn.rtnodes((ind - 1) * R + (r - 1), (jnd - 1) * R + (s - 1)));
Matrix< T > sn_get_node_tput_from_tput(const qn::NetworkStruct< T > &sn, const Matrix< T > &TN, const Matrix< T > &ANn, const std::map< std::size_t, CacheActualProb< T > > &cache_prob=std::map< std::size_t, CacheActualProb< T > >())
Port of sn_get_node_tput_from_tput.