LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
spaceGeneratorNodes.m
1function [nodeStateSpace, sn, capacityc] = spaceGeneratorNodes(sn, cutoff, options)
2if nargin<3
3 options = Solver.defaultOptions;
4end
5N = sn.njobs';
6sn.space = {};
7capacityc = zeros(sn.nnodes, sn.nclasses);
8% Draft SPN support
9% for n=1:sn.nnodes
10% if isfield(sn.varsparam{n}, "capacityc")
11% capacityc(n) = sn.varsparam{n}.capacityc;
12% end
13% end
14for ind=1:sn.nnodes
15 if sn.isstation(ind) % place jobs across stations
16 ist = sn.nodeToStation(ind);
17 isf = sn.nodeToStateful(ind);
18 for r=1:sn.nclasses %cut-off open classes to finite capacity
19 c = find(sn.chains(:,r));
20 if ~isempty(sn.visits{c}) && sn.visits{c}(ist,r) == 0
21 capacityc(ind,r) = 0;
22 % Draft SPN support
23 %elseif isfield(sn.varsparam{ind}, 'capacityc')
24 % capacityc(ind,r) = min(cutoff(ist,r), sn.classcap(ist,r));
25 elseif ~isempty(sn.proc) && ~isempty(sn.proc{ist}{r}) && any(any(isnan(sn.proc{ist}{r}{1}))) % disabled
26 capacityc(ind,r) = 0;
27 else
28 if isinf(N(r))
29 capacityc(ind,r) = min(cutoff(ist,r), sn.classcap(ist,r));
30 else
31 capacityc(ind,r) = sum(sn.njobs(sn.chains(c,:)));
32 end
33 end
34 end
35 if sn.isstation(ind)
36 % in this case, the local variables are produced within
37 % fromMarginalBounds, e.g., for RROBIN routing
38 sn.space{isf} = State.fromMarginalBounds(sn, ind, [], capacityc(ind,:), sn.cap(ist), options);
39 else
40 % this is the case for example of cache nodes
41 state_bufsrv = State.fromMarginalBounds(sn, ind, [], capacityc(ind,:), sn.cap(ist), options);
42 state_var = State.spaceLocalVars(sn, ind);
43 sn.space{isf} = State.cartesian(state_bufsrv,state_var); % generate all possible states for local variables
44 end
45 if isinf(sn.nservers(ist))
46 sn.nservers(ist) = sum(capacityc(ind,:));
47 end
48 elseif sn.isstateful(ind) % generate state space of other stateful nodes that are not stations
49 %ist = sn.nodeToStation(ind);
50 isf = sn.nodeToStateful(ind);
51 switch sn.nodetype(ind)
52 case NodeType.Cache
53 for r=1:sn.nclasses % restrict state space generation to immediate events
54 if isnan(sn.nodeparam{ind}.pread{r})
55 capacityc(ind,r) = 1; %
56 else
57 capacityc(ind,r) = 1; %
58 end
59 end
60 otherwise
61 capacityc(ind,:) = 1; %
62 end
63 state_bufsrv = State.fromMarginalBounds(sn, ind, [], capacityc(ind,:), 1, options);
64 state_var = State.spaceLocalVars(sn, ind);
65 sn.space{isf} = State.cartesian(state_bufsrv,state_var); % generate all possible states for local variables
66 end
67end
68nodeStateSpace = sn.space;
69end