1function [state, evtype, evclass, evjob] = parseTranState(fileArv, fileDep, nodePreload)
2% [STATE, EVTYPE, EVCLASS, EVJOB] = PARSETRANSTATE(FILEARV, FILEDEP, NODEPRELOAD)
4% Copyright (c) 2012-2026, Imperial College London
7load(fileArv,
'jobArvTS',
'jobArvClassID',
'jobArvID');
8load(fileDep,
'jobDepTS',
'jobDepClassID',
'jobDepID');
10%% compute joint state at station
11nClasses = length(nodePreload);
12state = [jobArvTS,zeros(length(jobArvTS),nClasses);
13 jobDepTS,zeros(length(jobDepTS),nClasses)];
15evtype = nan(size(state,1),1);
16evclass = zeros(size(state,1),1);
17evjob = zeros(size(state,1),1);
19for i=1:size(jobArvTS,1)
20 state(i,1+jobArvClassID(i)) = +1;
21 evtype(i) = EventType.ARV;
22 evclass(i) = jobArvClassID(i);
23 evjob(i) = jobArvID(i);
26for i=1:size(jobDepTS,1)
27 state(length(jobArvTS)+i,1+jobDepClassID(i)) = -1;
28 evtype(length(jobArvTS)+i) = EventType.DEP;
29 evclass(length(jobArvTS)+i) = jobDepClassID(i);
30 evjob(length(jobArvTS)+i) = jobDepID(i);
32[state,I] = sortrows(state,1); % sort on timestamps
33state = [0,nodePreload;state];
34evtype = [EventType.INIT; evtype(I)];
35evclass = [NaN;evclass(I)];
36evjob = [NaN;evjob(I)];
38ev_inst = find(diff(state(:,1)) == 0); % instantaneous events
39%evjobs_inst = unique(evjob(ev_inst)); % determine jobs involved in instantaneous events
42 ej = evjob(ev); % find job involved in the instantaneous event;
43 prev_ev_ej = find(evjob(1:(ev-1))==ej,1,'last'); % find last event in which this job was involved
44 next_ev_ej = ev+find(evjob((ev+1):end)==ej,1); % find next event in which this job was involved
45 et = evtype(ev); % find type of instantaneous event
46 if ~isempty(prev_ev_ej)
49 if evtype(prev_ev_ej) == EventType.ARV
50 % causality error, two successive arrivals, swap position
51 % with next instantaneous event for this job
54 state(ev,:) = state(next_ev_ej,:);
55 state(next_ev_ej,:) = tmp;
58 evjob(ev,:) = evjob(next_ev_ej,:);
59 evjob(next_ev_ej,:) = tmp;
62 evtype(ev,:) = evtype(next_ev_ej,:);
63 evtype(next_ev_ej,:) = tmp;
66 if evtype(prev_ev_ej) == EventType.DEP
67 % causality error, two successive departures, swap position
68 % with next instantaneous event for this job
71 state(ev,:) = state(next_ev_ej,:);
72 state(next_ev_ej,:) = tmp;
75 evjob(ev,:) = evjob(next_ev_ej,:);
76 evjob(next_ev_ej,:) = tmp;
79 evtype(ev,:) = evtype(next_ev_ej,:);
80 evtype(next_ev_ej,:) = tmp;
87 state(:,j) = cumsum(state(:,j)); %+nodePreload(j-1);