LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
resolveSignals.m
1function resolveSignals(self)
2% RESOLVESIGNALS Resolve Signal placeholders to OpenSignal or ClosedSignal
3%
4% This method is called during model finalization (refreshStruct) to
5% convert Signal placeholder objects to their concrete types (OpenSignal
6% or ClosedSignal) based on the network structure.
7%
8% For open networks (with Source node): Signal -> OpenSignal
9% For closed networks (no Source node): Signal -> ClosedSignal
10%
11% Copyright (c) 2012-2026, Imperial College London
12% All rights reserved.
13
14% Check if there are any Signal placeholders to resolve
15hasSignals = false;
16for r = 1:length(self.classes)
17 % Check for Signal that is NOT already OpenSignal or ClosedSignal
18 if isa(self.classes{r}, 'Signal') && ...
19 ~isa(self.classes{r}, 'OpenSignal') && ...
20 ~isa(self.classes{r}, 'ClosedSignal')
21 hasSignals = true;
22 break;
23 end
24end
25
26if ~hasSignals
27 return; % No Signal placeholders to resolve
28end
29
30% Determine if the network is open (has Source node) or closed
31isOpen = false;
32for i = 1:length(self.nodes)
33 if isa(self.nodes{i}, 'Source')
34 isOpen = true;
35 break;
36 end
37end
38
39% For closed networks, find a default reference station
40defaultRefstat = [];
41if ~isOpen
42 % Look for first Delay node, then first Queue node
43 for i = 1:length(self.stations)
44 if isa(self.stations{i}, 'Delay')
45 defaultRefstat = self.stations{i};
46 break;
47 end
48 end
49 if isempty(defaultRefstat)
50 for i = 1:length(self.stations)
51 if isa(self.stations{i}, 'Queue')
52 defaultRefstat = self.stations{i};
53 break;
54 end
55 end
56 end
57 if isempty(defaultRefstat) && ~isempty(self.stations)
58 % Fallback to first station
59 defaultRefstat = self.stations{1};
60 end
61end
62
63% Collect Signal placeholders to resolve (indices will shift during resolution)
64signalsToResolve = {};
65for r = 1:length(self.classes)
66 if isa(self.classes{r}, 'Signal') && ...
67 ~isa(self.classes{r}, 'OpenSignal') && ...
68 ~isa(self.classes{r}, 'ClosedSignal')
69 signalsToResolve{end+1} = self.classes{r}; %#ok<AGROW>
70 end
71end
72
73% Resolve each Signal placeholder
74% Note: resolve() removes the placeholder and creates concrete signal
75for s = 1:length(signalsToResolve)
76 sig = signalsToResolve{s};
77
78 % Determine reference station for closed signals
79 if ~isOpen
80 % Prefer the reference station of the targetJobClass if available
81 if ~isempty(sig.targetJobClass) && isprop(sig.targetJobClass, 'refstat')
82 refstat = sig.targetJobClass.refstat;
83 else
84 refstat = defaultRefstat;
85 end
86 else
87 refstat = []; % Not used for open signals
88 end
89
90 % Resolve the Signal to its concrete type
91 % This removes the placeholder from model.classes and adds the concrete
92 sig.resolve(isOpen, refstat);
93end
94
95end
Definition mmt.m:92