1classdef MarkedMarkovProcess < MarkovProcess
2 % A
class for continuous time Markov chain where transitions are labeled
4 % Copyright (c) 2012-2026, Imperial College London
13 function self = MarkedMarkovProcess(InfGen, eventFilt, evs, isFinite, stateSpace)
14 % SELF = MARKEDMARKOVPROCESS(InfGen, eventFilt, events, isFinite, stateSpace)
18 self@MarkovProcess(InfGen, isFinite);
19 self.name =
'MarkedMarkovProcess';
20 self.eventFilt = eventFilt;
23 self.setStateSpace(stateSpace);
27 function eMAP = toMAP(self, varargin)
30 if length(varargin)==1
42 ev = Event(evtype, node, class);
45 for e=1:length(self.eventList) % for every event
46 if self.eventList{e}.active{1}.node == ev.node && self.eventList{e}.active{1}.class == ev.class && self.eventList{e}.active{1}.event == ev.event
47 eMAP = MAP(self.infGen - self.eventFilt{e}, self.eventFilt{e});
53 function pie = embeddedSolve(self, evset)
54 % PIE = EMBEDDEDSOLVE(EVENTSET)
57 evset = 1:length(self.eventFilt);
59 for ev=evset %
for every
event
60 eMAP = MAP(self.infGen - self.eventFilt{ev}, self.eventFilt{ev});
61 pie{ev} = eMAP.getEmbeddedProb;
63 pie{ev}=simplify(pie{ev})
';
70 function ctmcObj=fromSampleSysAggr(sa)
72 sampleState = sa.state{1};
73 for r=2:length(sa.state)
74 sampleState = State.cartesian(sampleState, sa.state{r});
76 [stateSpace,~,stateHash] = unique(sampleState,'rows
');
77 dtmc = spalloc(length(stateSpace),length(stateSpace),length(stateSpace));
78 holdTime = zeros(length(stateSpace),1);
79 activeEvent = cell2mat(cellfun(@(c) c.getProcess, sa.event, 'UniformOutput
', false));
80 [uniqueActiveEvents,~,evType] = unique(activeEvent,'rows
');
81 eventFilt = cell(1,size(uniqueActiveEvents,1));
82 for e=1:size(uniqueActiveEvents,1)
83 eventFilt{e} = spalloc(length(stateSpace),length(stateSpace),length(stateSpace));
85 for i=2:length(stateHash)
87 if isempty(dtmc(stateHash(i-1),stateHash(i)))
88 dtmc(stateHash(i-1),stateHash(i)) = 0;
89 eventFilt{e}(stateHash(i-1),stateHash(i)) = 0;
91 dtmc(stateHash(i-1),stateHash(i)) = dtmc(stateHash(i-1),stateHash(i)) + 1;
92 eventFilt{e}(stateHash(i-1),stateHash(i)) = eventFilt{e}(stateHash(i-1),stateHash(i)) + 1;
93 holdTime(stateHash(i-1)) = holdTime(stateHash(i-1)) + sa.t(i) - sa.t(i-1);
95 % at this point, dtmc has absolute counts so not yet normalized
96 holdTime = holdTime ./ sum(dtmc,2);
97 for e=1:size(uniqueActiveEvents,1)
98 eventFilt{e} = eventFilt{e} ./ sum(dtmc,2);
100 infGen = ctmc_makeinfgen(dtmc_makestochastic(dtmc)./(holdTime*ones(1,length(stateSpace))));
101 for e=1:size(uniqueActiveEvents,1)
102 eventFilt{e} = eventFilt{e} .* (-diag(infGen)*ones(1,length(stateSpace)));
104 evList = cell(size(activeEvent,1),1);
105 for e=1:length(evList)
106 evList{e,1} = struct('active
',sa.event{e},'passive
',[]);
108 ctmcObj = MarkedMarkovProcess(infGen,eventFilt,evList,isFinite,stateSpace);