LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
Transition.m
1classdef Transition < StatefulNode
2 % A class for a stochastic Petri net transition
3 %
4 % Copyright (c) 2012-2026, Imperial College London
5 % All rights reserved.
6
7 properties
8 enablingConditions;
9 inhibitingConditions;
10 modes;
11 modeNames;
12 numberOfServers;
13 timingStrategies;
14 distributions;
15 firingPriorities;
16 firingWeights;
17 firingOutcomes;
18 cap;
19 end
20
21 methods
22 function self = Transition(model,name)
23 % TRANSITION(MODEL, NAME)
24
25 self@StatefulNode(name);
26 if model.isMatlabNative()
27 classes = model.getClasses();
28 self.input = Enabling(classes);
29 self.output = Firing(classes);
30 self.cap = Inf; % Compatible with other nodes
31
32 self.setModel(model);
33 self.model.addNode(self);
34
35 self.server = Timing();
36
37 self.enablingConditions = [];
38 self.inhibitingConditions = [];
39 self.modeNames = {};
40 self.numberOfServers = [];
41 self.timingStrategies = [];
42 self.distributions = {};
43 self.firingPriorities = [];
44 self.firingWeights = [];
45 self.firingOutcomes = [];
46 elseif model.isJavaNative()
47 self.setModel(model);
48 self.obj = jline.lang.nodes.Transition(model.obj, name);
49 self.index = model.obj.getNodeIndex(self.obj);
50 end
51 end
52
53 function self = init(self)
54 % SELF = INIT()
55
56 nclasses = length(self.model.getClasses());
57 nnodes = length(self.model.getNodes());
58
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);
66 end
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)};
73 end
74
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;
89 end
90
91 function self = setEnablingConditions(self, mode, class, inputNode, enablingCondition)
92 % SELF = SETENABLINGCONDITIONS(MODE, CLASS, NODE, ENABLINGCONDITIONS)
93
94 if isa(inputNode, 'Place')
95 inputNode = self.model.getNodeIndex(inputNode.name);
96 self.enablingConditions{mode}(inputNode,class) = enablingCondition;
97 else
98 error('Node must be a Place node.');
99 end
100 end
101
102 function self = setInhibitingConditions(self, mode, class, inputNode, inhibitingCondition)
103 % SELF = SETINHIBITINGCONDITIONS(MODE, CLASS, NODE, INHIBITINGCONDITIONS)
104
105 if isa(inputNode, 'Place')
106 inputNode = self.model.getNodeIndex(inputNode.name);
107 self.inhibitingConditions{mode}(inputNode,class) = inhibitingCondition;
108 else
109 error('Node must be a Place node.');
110 end
111 end
112
113 function self = setModeNames(self, mode, modeName)
114 % SELF = SETMODENAMES(MODE, MODENAMES)
115
116 self.modeNames{mode} = modeName;
117 end
118
119 function self = setNumberOfServers(self, mode, numberOfServers)
120 % SELF = SETNUMBEROFSERVERS(MODE, NUMOFSERVERS)
121
122 self.numberOfServers(mode) = numberOfServers;
123 end
124
125 function self = setTimingStrategy(self, mode, timingStrategy)
126 % SELF = SETTIMINGSTRATEGY(MODE, TIMINGSTRATEGY)
127
128 self.timingStrategies(mode) = timingStrategy;
129 end
130
131 function self = setFiringPriorities(self, mode, firingPriority)
132 % SELF = SETFIRINGPRIORITIES(MODE, FIRINGPRIORITIES)
133
134 self.firingPriorities(mode) = firingPriority;
135 end
136
137 function self = setFiringWeights(self, mode, firingWeight)
138 % SELF = SETFIRINGWEIGHTS(MODE, FIRINGWEIGHTS)
139
140 self.firingWeights(mode) = firingWeight;
141 end
142
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;
147 end
148
149 function self = setDistribution(self, mode, distribution)
150 self.distributions{mode} = distribution;
151 end
152
153 function nmodes = getNumberOfModes(self)
154 nmodes = length(self.modeNames);
155 end
156
157 function modes = getModes(self)
158 modes = self.modes;
159 end
160
161 function [map,mu,phi] = getServiceRates(self)
162 % [PH,MU,PHI] = GETPHSERVICERATES()
163
164 map = cell(1,self.getNumberOfModes);
165 mu = cell(1,self.getNumberOfModes);
166 phi = cell(1,self.getNumberOfModes);
167
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();
173 mu{r} = aph.getMu;
174 phi{r} = aph.getPhi;
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;
179 case 'MMPP2'
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];
186 phi{r} = [1];
187 otherwise
188 map{r} = {[NaN],[NaN]};
189 mu{r} = NaN;
190 phi{r} = NaN;
191 end
192 end
193 end
194 end
195end
Definition mmt.m:92