1classdef ActivityPrecedence
2 % An auxiliary
class to specify precedence among Activity elements.
4 % Copyright (c) 2012-2026, Imperial College London
9 postActs; %
string array
12 preParams; %
double array
13 postParams; %
double array
17 %
public methods, including constructor
20 function obj = ActivityPrecedence(preActs, postActs, preType, postType, preParams, postParams)
21 % OBJ = ACTIVITYPRECEDENCE(PREACTS, POSTACTS, PRETYPE, POSTTYPE, PREPARAMS, POSTPARAMS)
23 if nargin<2 %~exist(
'preActs',
'var') || ~exist(
'postActs',
'var')
24 line_error(mfilename,'Constructor requires to specify at least pre and post activities.');
27 if nargin<3 %~exist('preType','var')
28 preType = ActivityPrecedenceType.PRE_SEQ;
30 if nargin<4 %~exist('postType','var')
31 postType = ActivityPrecedenceType.POST_SEQ;
33 if nargin<5 %~exist('preParams','var')
36 if nargin<6 %~exist('postParams','var')
39 for a=1:length(preActs)
40 if isa(preActs{a},
'Activity')
41 preActs{a} = preActs{a}.getName;
44 obj.preActs = preActs;
45 for a=1:length(postActs)
46 if isa(postActs{a},
'Activity')
47 postActs{a} = postActs{a}.getName;
50 obj.postActs = postActs;
51 obj.preType = preType;
52 obj.postType = postType;
53 obj.preParams = preParams;
54 obj.postParams = postParams;
59 methods (Static, Hidden)
60 function ap = Sequence(preAct, postAct)
61 % AP = SEQUENCE(PREACT, POSTACT)
63 % Auxiliary method, use Serial instead.
65 if isa(preAct,
'Activity')
68 if isa(postAct,'Activity')
69 postAct = postAct.name;
71 ap = ActivityPrecedence({preAct},{postAct});
76 function ap = Serial(varargin)
77 % AP = SERIAL(VARARGIN)
79 ap = cell(nargin-1,1);
81 ap{m} = ActivityPrecedence.Sequence(varargin{m},varargin{m+1});
85 function ap = AndJoin(preActs, postAct, quorum)
86 % AP = ANDJOIN(PREACTS, POSTACT, QUORUM)
88 for a = 1:length(preActs)
89 if isa(preActs{a},
'Activity')
90 preActs{a} = preActs{a}.name;
93 if isa(postAct,
'Activity')
94 postAct = postAct.name;
96 if nargin<3 %~exist('quorum','var')
99 ap = ActivityPrecedence(preActs,{postAct},ActivityPrecedenceType.PRE_AND,ActivityPrecedenceType.POST_SEQ,quorum,[]);
102 function ap = OrJoin(preActs, postAct)
103 % AP = ORJOIN(PREACTS, POSTACT)
105 for a = 1:length(preActs)
106 if isa(preActs{a},
'Activity')
107 preActs{a} = preActs{a}.name;
110 if isa(postAct,
'Activity')
111 postAct = postAct.name;
113 ap = ActivityPrecedence(preActs,{postAct},ActivityPrecedenceType.PRE_OR,ActivityPrecedenceType.POST_SEQ);
116 function ap = AndFork(preAct, postActs)
117 % AP = ANDFORK(PREACT, POSTACTS)
119 if isa(preAct,
'Activity')
120 preAct = preAct.name;
122 for a = 1:length(postActs)
123 if isa(postActs{a},
'Activity')
124 postActs{a} = postActs{a}.name;
127 ap = ActivityPrecedence({preAct},postActs,ActivityPrecedenceType.PRE_SEQ,ActivityPrecedenceType.POST_AND);
130 function ap = Xor(preAct, postActs, probs)
131 % AP = XOR(PREACT, POSTACTS, PROBS)
133 % This
is a pseudonym
for OrFork
134 ap = ActivityPrecedence.OrFork(preAct, postActs, probs);
137 function ap = OrFork(preAct, postActs, probs)
138 % AP = ORFORK(PREACT, POSTACTS, PROBS)
140 % OrFork
is the terminology used in LQNs
for a probabilistic
141 % or, where a call chooses a branch with given probability
143 if isa(preAct,
'Activity')
144 preAct = preAct.name;
146 for a = 1:length(postActs)
147 if isa(postActs{a},
'Activity')
148 postActs{a} = postActs{a}.name;
151 ap = ActivityPrecedence({preAct},postActs,ActivityPrecedenceType.PRE_SEQ,ActivityPrecedenceType.POST_OR,[],probs);
154 function ap = Loop4para(preAct, loopAct, endAct, loopCounts)
156 ap = ActivityPrecedence.Loop3para(preAct, {loopAct{:}, endAct}, loopCounts);
158 ap = ActivityPrecedence.Loop3para(preAct, {loopAct, endAct}, loopCounts);
162 function ap = Loop3para(preAct, postActs, counts)
163 % AP = LOOP(PREACT, POSTACTS, COUNTS)
165 % ActivityPrecedence.Loop(A20, {A21, A22}, 3)
166 % runs A20 once, then 3 times A21, then ends running A22 once.
168 if isa(preAct,
'Activity')
169 preAct = preAct.name;
171 for a = 1:length(postActs)
172 if isa(postActs{a},
'Activity')
173 postActs{a} = postActs{a}.name;
176 ap = ActivityPrecedence({preAct},postActs,ActivityPrecedenceType.PRE_SEQ,ActivityPrecedenceType.POST_LOOP,[],counts);
179 function ap = Loop(varargin)
180 if length(varargin)==3
181 ap = ActivityPrecedence.Loop3para(varargin{1}, varargin{2}, varargin{3});
182 elseif length(varargin)==4
183 ap = ActivityPrecedence.Loop4para(varargin{1}, varargin{2}, varargin{3}, varargin{4});
185 line_error(mfilename,
'Incorrect number of arguments to Loop construct.');
189 function ap = CacheAccess(preAct, postActs)
190 % AP = ORFORK(PREACT, POSTACTS, PROBS)
192 if isa(preAct,
'Activity')
193 preAct = preAct.name;
195 for a = 1:length(postActs)
196 if isa(postActs{a},
'Activity')
197 postActs{a} = postActs{a}.name;
200 ap = ActivityPrecedence({preAct},postActs,ActivityPrecedenceType.PRE_SEQ,ActivityPrecedenceType.POST_CACHE);