1classdef Transition < StatefulNode
2 % A
class for a stochastic Petri net transition
4 % Copyright (c) 2012-2026, Imperial College London
22 function self = Transition(model,name)
23 % TRANSITION(MODEL, NAME)
25 self@StatefulNode(name);
26 if model.isMatlabNative()
30 self.cap = Inf; % Compatible with other
nodes
33 self.model.addNode(self);
35 self.server = Timing();
37 self.enablingConditions = [];
38 self.inhibitingConditions = [];
40 self.numberOfServers = [];
41 self.timingStrategies = [];
42 self.distributions = {};
43 self.firingPriorities = [];
44 self.firingWeights = [];
45 self.firingOutcomes = [];
46 elseif model.isJavaNative()
48 self.obj = jline.lang.nodes.Transition(model.obj, name);
49 self.index = model.obj.getNodeIndex(self.obj);
53 function self = init(self)
56 nclasses = length(self.model.getClasses());
57 nnodes = length(self.model.getNodes());
59 self.enablingConditions = cell(self.getNumberOfModes);
60 self.inhibitingConditions = cell(self.getNumberOfModes);
61 self.firingOutcomes = cell(self.getNumberOfModes);
62 for m=1:self.getNumberOfModes
63 self.enablingConditions{m} = zeros(nnodes,nclasses);
64 self.inhibitingConditions{m} = zeros(nnodes,nclasses);
65 self.firingOutcomes{m} = zeros(nnodes,nclasses);
67 self.numberOfServers = ones(1,self.getNumberOfModes);
68 self.timingStrategies = repmat(TimingStrategy.TIMED,1,self.getNumberOfModes);
69 self.firingWeights = ones(1,self.getNumberOfModes);
70 self.firingPriorities = ones(1,self.getNumberOfModes);
71 self.distributions = cell(1, self.getNumberOfModes);
72 self.distributions(:) = {Exp(1)};
75 function mode = addMode(self, modeName)
76 nclasses = length(self.model.getClasses());
77 nnodes = length(self.model.getNodes());
78 self.modeNames{end+1} = modeName;
79 self.enablingConditions{end+1} = zeros(nnodes,nclasses);
80 self.inhibitingConditions{end+1} = Inf*ones(nnodes,nclasses);
81 self.numberOfServers(end+1) = 1;
82 self.timingStrategies(end+1) = TimingStrategy.TIMED;
83 self.firingWeights(end+1) = 1.0;
84 self.firingPriorities(end+1) = 1.0;
85 self.distributions{end+1} = Exp(1);
86 self.firingOutcomes{end+1} = zeros(nnodes,nclasses);
87 mode = Mode(self,modeName);
88 self.modes{end+1} = mode;
91 function self = setEnablingConditions(self, mode,
class, inputNode, enablingCondition)
92 % SELF = SETENABLINGCONDITIONS(MODE, CLASS, NODE, ENABLINGCONDITIONS)
94 if isa(inputNode,
'Place')
95 inputNode = self.model.getNodeIndex(inputNode.name);
96 self.enablingConditions{mode}(inputNode,
class) = enablingCondition;
98 error(
'Node must be a Place node.');
102 function self = setInhibitingConditions(self, mode,
class, inputNode, inhibitingCondition)
103 % SELF = SETINHIBITINGCONDITIONS(MODE, CLASS, NODE, INHIBITINGCONDITIONS)
105 if isa(inputNode,
'Place')
106 inputNode = self.model.getNodeIndex(inputNode.name);
107 self.inhibitingConditions{mode}(inputNode,
class) = inhibitingCondition;
109 error(
'Node must be a Place node.');
113 function self = setModeNames(self, mode, modeName)
114 % SELF = SETMODENAMES(MODE, MODENAMES)
116 self.modeNames{mode} = modeName;
119 function self = setNumberOfServers(self, mode, numberOfServers)
120 % SELF = SETNUMBEROFSERVERS(MODE, NUMOFSERVERS)
122 self.numberOfServers(mode) = numberOfServers;
125 function self = setTimingStrategy(self, mode, timingStrategy)
126 % SELF = SETTIMINGSTRATEGY(MODE, TIMINGSTRATEGY)
128 self.timingStrategies(mode) = timingStrategy;
131 function self = setFiringPriorities(self, mode, firingPriority)
132 % SELF = SETFIRINGPRIORITIES(MODE, FIRINGPRIORITIES)
134 self.firingPriorities(mode) = firingPriority;
137 function self = setFiringWeights(self, mode, firingWeight)
138 % SELF = SETFIRINGWEIGHTS(MODE, FIRINGWEIGHTS)
140 self.firingWeights(mode) = firingWeight;
143 function self = setFiringOutcome(self, mode,
class, node, firingOutcome)
144 % SELF = SETFIRINGOUTCOMES(MODE, NODE, CLASS,FIRINGOUTCOME)
145 ind = self.model.getNodeIndex(node);
146 self.firingOutcomes{mode}(ind,
class) = firingOutcome;
149 function self = setDistribution(self, mode, distribution)
150 self.distributions{mode} = distribution;
153 function nmodes = getNumberOfModes(self)
154 nmodes = length(self.modeNames);
157 function modes = getModes(self)
161 function [
map,mu,phi] = getServiceRates(self)
162 % [PH,MU,PHI] = GETPHSERVICERATES()
164 map = cell(1,self.getNumberOfModes);
165 mu = cell(1,self.getNumberOfModes);
166 phi = cell(1,self.getNumberOfModes);
168 for r=1:self.getNumberOfModes
169 switch class(self.distributions{r})
170 case {
'Replayer',
'Trace'}
171 aph = self.distributions{r}.fitAPH;
172 map{r} =
aph.getProcess();
175 case {
'Exp',
'Coxian',
'Erlang',
'HyperExp',
'Markovian',
'APH',
'MAP'}
176 map{r} = self.distributions{r}.getProcess();
177 mu{r} = self.distributions{r}.getMu;
178 phi{r} = self.distributions{r}.getPhi;
180 map{r} = self.distributions{r}.getProcess();
181 mu{r} = self.distributions{r}.getMu;
182 phi{r} = self.distributions{r}.getPhi;
183 case {
'Det',
'Uniform',
'Pareto',
'Gamma',
'Weibull',
'Lognormal'}
184 map{r} = self.distributions{r}.getProcess();
185 mu{r} = [self.distributions{r}.getRate];
188 map{r} = {[NaN],[NaN]};