1%
this macro will need refactoring to decouple the observation from the Model
class
2function [loggerBefore,loggerAfter] = linkAndLog(self,
P, isNodeLogged, logPath)
3% [LOGGERBEFORE,LOGGERAFTER] = LINKANDLOG(
P, ISNODELOGGED, LOGPATH)
5% Copyright (c) 2012-2026, Imperial College London
8self.resetStruct; % important to regenerate the sn with the loggers
11 line_warning(mfilename,
'The network state cannot be initialized, or must be reset, before calling linkAndLog.');
14if ~isempty(self.connections)
15 line_warning(mfilename,'Network topology already instantiated. Calling resetNetwork automatically before adding loggers.\n');
18R = self.getNumberOfClasses;
19Mnodes = self.getNumberOfNodes;
21if Mnodes ~= numel(isNodeLogged)
22 line_error(mfilename,'The size of the isNodeLogged vector does not match the number of
nodes.');
25isNodeLogged = [isNodeLogged(:)'];
26if ~isempty(self.getSource)
27 sinkIndex = self.getIndexSinkNode;
28 if isNodeLogged(sinkIndex)
29 line_warning(mfilename,'Sink station cannot be logged, ignoring.\n');
30 isNodeLogged(sinkIndex) = false;
33if ~isempty(self.getSource)
34 sourceIndex = self.getIndexSourceNode;
35 if isNodeLogged(sourceIndex)
36 line_warning(mfilename,'Source station cannot be logged, ignoring.\n');
37 isNodeLogged(sourceIndex) = false;
41if nargin>=4 %exist('logPath','var')
42 self.setLogPath(logPath);
44 logPath = getLogPath(self);
47loggerBefore = cell(1,0);
48loggerAfter = cell(1,0);
52 loggerBefore{end+1} = Logger(self,sprintf(
'Arv_%s',self.getNodeNames{ind}),[logPath,filesep,sprintf(
'%s-Arv.csv',self.getNodeNames{ind})]);
54 loggerBefore{end}.setRouting(self.classes{r}, RoutingStrategy.RAND);
57 loggerBefore{end+1} = Logger(self,sprintf(
'Arv_%s',self.getNodeNames{ind}),[logPath,filesep,sprintf(
'%s-Arv.csv',self.getNodeNames{ind})]);
59 loggerBefore{end}.setRouting(self.classes{r}, RoutingStrategy.RAND);
67 loggerAfter{end+1} = Logger(self,sprintf(
'Dep_%s',self.getNodeNames{ind}),[logPath,filesep,sprintf(
'%s-Dep.csv',self.getNodeNames{ind})]);
69 loggerAfter{end}.setRouting(self.classes{r}, RoutingStrategy.RAND);
72 loggerAfter{end+1} = Logger(self,sprintf(
'Dep_%s',self.getNodeNames{ind}),[logPath,filesep,sprintf(
'%s-Dep.csv',self.getNodeNames{ind})]);
74 loggerAfter{end}.setRouting(self.classes{r}, RoutingStrategy.RAND);
81newP = cellzeros(R,R,Mnodesnew,Mnodesnew);
87 if isNodeLogged(ind) && isNodeLogged(jnd)
88 % link loggerArvi to loggerDepj
89 newP{r,s}(2*Mnodes+ind,Mnodes+jnd) =
P{r,s}(ind,jnd);
90 elseif isNodeLogged(ind) && ~isNodeLogged(jnd)
92 newP{r,s}(2*Mnodes+ind,jnd) =
P{r,s}(ind,jnd);
93 elseif ~isNodeLogged(ind) && isNodeLogged(jnd)
95 newP{r,s}(ind,Mnodes+jnd) =
P{r,s}(ind,jnd);
98 newP{r,s}(ind,jnd) =
P{r,s}(ind,jnd);
105 newP{r,r}(Mnodes+ind,ind) = 1.0; % logBi -> i
106 newP{r,r}(ind,2*Mnodes+ind) = 1.0; % i -> logAi
113 idx = find(isNodeLogged);
114 newP{r,s} = newP{r,s}([1:Mnodes,Mnodes+idx,2*Mnodes+idx],[1:Mnodes,Mnodes+idx,2*Mnodes+idx]);