LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
refreshPetriNetNodes.m
1function refreshPetriNetNodes(self)
2% REFRESHPETRINETNODES()
3
4for ind=1:self.getNumberOfNodes
5 node = self.getNodeByIndex(ind);
6 switch class(node)
7 case 'Place'
8 % noop
9 case 'Transition'
10 self.sn.nodeparam{ind}.nmodes = length(node.modeNames);
11 self.sn.nodeparam{ind}.modenames = node.modeNames;
12 self.sn.nodeparam{ind}.enabling = {};
13 self.sn.nodeparam{ind}.inhibiting = {};
14 self.sn.nodeparam{ind}.firing = {};
15 nnodes = self.getNumberOfNodes();
16 nclasses = self.getNumberOfClasses();
17 for m = 1:self.sn.nodeparam{ind}.nmodes
18 % Pad enabling/inhibiting/firing to (nnodes x nclasses) since
19 % addMode initializes with node count at creation time
20 en = node.enablingConditions{m};
21 inh = node.inhibitingConditions{m};
22 fir = node.firingOutcomes{m};
23 if size(en,1) < nnodes || size(en,2) < nclasses
24 en_full = zeros(nnodes, nclasses);
25 en_full(1:size(en,1), 1:size(en,2)) = en;
26 en = en_full;
27 end
28 if size(inh,1) < nnodes || size(inh,2) < nclasses
29 inh_full = Inf*ones(nnodes, nclasses);
30 inh_full(1:size(inh,1), 1:size(inh,2)) = inh;
31 inh = inh_full;
32 end
33 if size(fir,1) < nnodes || size(fir,2) < nclasses
34 fir_full = zeros(nnodes, nclasses);
35 fir_full(1:size(fir,1), 1:size(fir,2)) = fir;
36 fir = fir_full;
37 end
38 self.sn.nodeparam{ind}.enabling{m} = en;
39 self.sn.nodeparam{ind}.inhibiting{m} = inh;
40 self.sn.nodeparam{ind}.firing{m} = fir;
41 end
42 self.sn.nodeparam{ind}.nmodeservers = node.numberOfServers;
43 self.sn.nodeparam{ind}.firingprio = node.firingPriorities;
44 self.sn.nodeparam{ind}.fireweight = node.firingWeights;
45 self.sn.nodeparam{ind}.timing = node.timingStrategies;
46 for m = 1:self.sn.nodeparam{ind}.nmodes
47 if isa(node.distributions{m},'Markovian')
48 self.sn.nodeparam{ind}.firingproc{m} = node.distributions{m}.getProcess;
49 self.sn.nodeparam{ind}.firingpie{m} = node.distributions{m}.getInitProb;
50 self.sn.nodeparam{ind}.firingphases(m) = node.distributions{m}.getNumberOfPhases;
51 elseif isa(node.distributions{m},'ContinuousDistribution')
52 % For non-Markovian distributions, store actual parameters
53 self.sn.nodeparam{ind}.firingproc{m} = node.distributions{m}.getProcess();
54 self.sn.nodeparam{ind}.firingpie{m} = {};
55 self.sn.nodeparam{ind}.firingphases(m) = NaN;
56 else
57 % Fallback for other distribution types
58 self.sn.nodeparam{ind}.firingproc{m} = {};
59 self.sn.nodeparam{ind}.firingpie{m} = {};
60 self.sn.nodeparam{ind}.firingphases(m) = NaN;
61 end
62 self.sn.nodeparam{ind}.firingprocid(m) = ProcessType.toId(ProcessType.fromText(class(node.distributions{m})));
63 end
64 end
65end
66end