LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
MarkedMarkovProcess.m
1classdef MarkedMarkovProcess < MarkovProcess
2 % A class for continuous time Markov chain where transitions are labeled
3 %
4 % Copyright (c) 2012-2026, Imperial College London
5 % All rights reserved.
6
7 properties
8 eventFilt;
9 eventList;
10 end
11
12 methods
13 function self = MarkedMarkovProcess(InfGen, eventFilt, evs, isFinite, stateSpace)
14 % SELF = MARKEDMARKOVPROCESS(InfGen, eventFilt, events, isFinite, stateSpace)
15 if nargin<4
16 isFinite = true;
17 end
18 self@MarkovProcess(InfGen, isFinite);
19 self.name = 'MarkedMarkovProcess';
20 self.eventFilt = eventFilt;
21 self.eventList = evs;
22 if nargin>=5
23 self.setStateSpace(stateSpace);
24 end
25 end
26
27 function eMAP = toMAP(self, varargin)
28 % MAP = TOMAP(EVENT)
29
30 if length(varargin)==1
31 ev = varargin{1};
32 else
33 evtype = varargin{1};
34 node = varargin{2};
35 if ~isnumeric(node)
36 node = node.index;
37 end
38 class = varargin{3};
39 if ~isnumeric(class)
40 class = class.index;
41 end
42 ev = Event(evtype, node, class);
43 end
44
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});
48 break;
49 end
50 end
51 end
52
53 function pie = embeddedSolve(self, evset)
54 % PIE = EMBEDDEDSOLVE(EVENTSET)
55
56 if nargin<2
57 evset = 1:length(self.eventFilt);
58 end
59 for ev=evset % for every event
60 eMAP = MAP(self.infGen - self.eventFilt{ev}, self.eventFilt{ev});
61 pie{ev} = eMAP.getEmbeddedProb;
62 if issym(pie{ev})
63 pie{ev}=simplify(pie{ev})';
64 end
65 end
66 end
67 end
68
69 methods (Static)
70 function ctmcObj=fromSampleSysAggr(sa)
71 isFinite = true;
72 sampleState = sa.state{1};
73 for r=2:length(sa.state)
74 sampleState = State.cartesian(sampleState, sa.state{r});
75 end
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));
84 end
85 for i=2:length(stateHash)
86 e = evType(i-1);
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;
90 end
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);
94 end
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);
99 end
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)));
103 end
104 evList = cell(size(activeEvent,1),1);
105 for e=1:length(evList)
106 evList{e,1} = struct('active',sa.event{e},'passive',[]);
107 end
108 ctmcObj = MarkedMarkovProcess(infGen,eventFilt,evList,isFinite,stateSpace);
109 end
110 end
111end