1function tranSysState = sampleSysAggr(self, numEvents)
2% TRANSYSSTATE = SAMPLESYSAGGR(NUMSAMPLES)
3options = self.getOptions;
5if isempty(self.result) || ~isfield(self.result,
'infGen')
8[infGen, eventFilt] = getGenerator(self);
9[stateSpace, localStateSpace] = getStateSpace(self);
10stateSpaceAggr = getStateSpaceAggr(self);
14% see _kb/11-conventions-and-gotchas.md (CTMC state-vector padding) for rationale
15spaceWidths = zeros(1,length(initState));
17for isf=1:length(initState)
18 w = size(localStateSpace{isf},2);
20 s0 = [s0, zeros(1,w-length(initState{isf})), initState{isf}];
22nst = cumsum([1,spaceWidths]);
25pi0 = zeros(1,size(stateSpace,1));
26pi0(matchrow(stateSpace,s0))=1;
28% filter all CTMC events as a marked Markovian arrival process
29D1 = cellsum(eventFilt);
31MMAP = mmap_normalize([{D0},{D1},eventFilt(:)
']);
34[sjt,event,~,~,sts] = mmap_sample(MMAP,numEvents, pi0);
37tranSysState = struct();
38tranSysState.handle = self.model.getStatefulNodes';
39tranSysState.t = cumsum([0,sjt(1:end-1)
']');
40for isf=1:length(initState)
41 tranSysState.state{isf} = stateSpace(sts,(nst(isf):nst(isf+1)-1));
42 [~,tranSysState.state{isf}] = State.toMarginal(sn,sn.statefulToNode(isf),tranSysState.state{isf});
45tranSysState.event = {};
46for e = 1:length(event)
47 for a=1:length(sn.sync{event(e)}.active)
48 tranSysState.event{end+1} = sn.sync{event(e)}.active{a};
49 tranSysState.event{end}.t = tranSysState.t(e);
51 for p=1:length(sn.sync{event(e)}.passive)
52 tranSysState.event{end+1} = sn.sync{event(e)}.passive{p};
53 tranSysState.event{end}.t = tranSysState.t(e);
56tranSysState.isaggregate =
true;