1function [outspace, outrate, outprob, eventCache] = afterEventRouter(sn, ind, event,
class, isSimulation, eventCache, space_buf, space_srv, space_var, key)
2% [OUTSPACE, OUTRATE, OUTPROB, EVENTCACHE] = AFTEREVENTROUTER(SN, IND, EVENT, CLASS, ISSIMULATION, EVENTCACHE, SPACE_BUF, SPACE_SRV, SPACE_VAR, KEY)
4% Handle router afterEvent logic
6% Copyright (c) 2012-2026, Imperial College London
15 space_srv(:,class) = space_srv(:,class) + 1;
16 outspace = [space_srv, space_var]; % buf
is empty
17 outrate = -1*ones(size(outspace,1)); % passive action, rate
is unspecified
20 space_srv(:,class) = space_srv(:,class) - 1;
21 switch sn.routing(ind,
class)
22 case RoutingStrategy.RROBIN
23 idx = find(space_var(sum(sn.nvars(ind,1:(sn.nclasses+class)))) == sn.nodeparam{ind}{
class}.outlinks);
24 if idx < length(sn.nodeparam{ind}{class}.outlinks)
25 space_var(sum(sn.nvars(ind,1:(sn.nclasses+class)))) = sn.nodeparam{ind}{
class}.outlinks(idx+1);
27 space_var(sum(sn.nvars(ind,1:(sn.nclasses+class)))) = sn.nodeparam{ind}{
class}.outlinks(1);
30 outspace = [space_srv, space_var]; % buf
is empty
31 outrate = GlobalConstants.Immediate*ones(size(outspace,1)); % immediate action
36 if nargin>=8 && isobject(eventCache)
37 eventCache(key) = {outprob, outspace,outrate};
39 if size(outspace,1) > 1
40 tot_rate = sum(outrate);
41 cum_rate = cumsum(outrate) / tot_rate;
42 firing_ctr = 1 + max([0,find( rand > cum_rate
' )]); % select action
43 outspace = outspace(firing_ctr,:);
44 outrate = sum(outrate);
45 outprob = outprob(firing_ctr,:);